/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2008 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2009 Hiroyuki Yamamoto and the Claws Mail team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
static GtkRadioActionEntry compose_radio_enc_entries[] =
{
- ENC_ACTION(CS_AUTO, C_AUTO, "_Automatic"), /* RADIO compose_set_encoding_cb */
- ENC_ACTION(CS_US_ASCII, C_US_ASCII, "7bit ASCII (US-ASC_II)"), /* RADIO compose_set_encoding_cb */
- ENC_ACTION(CS_UTF_8, C_UTF_8, "Unicode (_UTF-8)"), /* RADIO compose_set_encoding_cb */
+ ENC_ACTION(CS_AUTO, C_AUTO, N_("_Automatic")), /* RADIO compose_set_encoding_cb */
+ ENC_ACTION(CS_US_ASCII, C_US_ASCII, N_("7bit ASCII (US-ASC_II)")), /* RADIO compose_set_encoding_cb */
+ ENC_ACTION(CS_UTF_8, C_UTF_8, N_("Unicode (_UTF-8)")), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Western/"CS_ISO_8859_1, C_ISO_8859_1, "ISO-8859-_1"), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Western/"CS_ISO_8859_15, C_ISO_8859_15, "ISO-8859-15"), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Western/"CS_WINDOWS_1252, C_WINDOWS_1252, "Windows-1252"), /* RADIO compose_set_encoding_cb */
- ENC_ACTION(CS_ISO_8859_2, C_ISO_8859_2, "Central European (ISO-8859-_2)"), /* RADIO compose_set_encoding_cb */
+ ENC_ACTION(CS_ISO_8859_2, C_ISO_8859_2, N_("Central European (ISO-8859-_2)")), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Baltic/"CS_ISO_8859_13, C_ISO_8859_13, "ISO-8859-13"), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Baltic/"CS_ISO_8859_4, C_ISO_8859_14, "ISO-8859-_4"), /* RADIO compose_set_encoding_cb */
- ENC_ACTION(CS_ISO_8859_7, C_ISO_8859_7, "Greek (ISO-8859-_7)"), /* RADIO compose_set_encoding_cb */
+ ENC_ACTION(CS_ISO_8859_7, C_ISO_8859_7, N_("Greek (ISO-8859-_7)")), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Hebrew/"CS_ISO_8859_8, C_ISO_8859_8, "ISO-8859-_8"), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Hebrew/"CS_WINDOWS_1255, C_WINDOWS_1255, "Windows-1255"), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Arabic/"CS_ISO_8859_6, C_ISO_8859_6, "ISO-8859-_6"), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Arabic/"CS_WINDOWS_1256, C_WINDOWS_1256, "Windows-1256"), /* RADIO compose_set_encoding_cb */
- ENC_ACTION(CS_ISO_8859_9, C_ISO_8859_9, "Turkish (ISO-8859-_9)"), /* RADIO compose_set_encoding_cb */
+ ENC_ACTION(CS_ISO_8859_9, C_ISO_8859_9, N_("Turkish (ISO-8859-_9)")), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Cyrillic/"CS_ISO_8859_5, C_ISO_8859_5, "ISO-8859-_5"), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Cyrillic/"CS_KOI8_R, C_KOI8_R, "KOI8-_R"), /* RADIO compose_set_encoding_cb */
ENC_ACTION("Cyrillic/"CS_KOI8_U, C_KOI8_U, "KOI8-_U"), /* RADIO compose_set_encoding_cb */
cmark); \
}
+static void compose_set_save_to(Compose *compose, const gchar *folderidentifier)
+{
+ GtkEditable *entry;
+ if (folderidentifier) {
+ combobox_unset_popdown_strings(GTK_COMBO_BOX(compose->savemsg_combo));
+ prefs_common.compose_save_to_history = add_history(
+ prefs_common.compose_save_to_history, folderidentifier);
+ combobox_set_popdown_strings(GTK_COMBO_BOX(compose->savemsg_combo),
+ prefs_common.compose_save_to_history);
+ }
+
+ entry = GTK_EDITABLE(gtk_bin_get_child(GTK_BIN(compose->savemsg_combo)));
+ if (folderidentifier)
+ gtk_entry_set_text(GTK_ENTRY(entry), folderidentifier);
+ else
+ gtk_entry_set_text(GTK_ENTRY(entry), "");
+}
+
+static gchar *compose_get_save_to(Compose *compose)
+{
+ GtkEditable *entry;
+ gchar *result = NULL;
+ entry = GTK_EDITABLE(gtk_bin_get_child(GTK_BIN(compose->savemsg_combo)));
+ result = gtk_editable_get_chars(entry, 0, -1);
+
+ if (result) {
+ combobox_unset_popdown_strings(GTK_COMBO_BOX(compose->savemsg_combo));
+ prefs_common.compose_save_to_history = add_history(
+ prefs_common.compose_save_to_history, result);
+ combobox_set_popdown_strings(GTK_COMBO_BOX(compose->savemsg_combo),
+ prefs_common.compose_save_to_history);
+ }
+ return result;
+}
+
Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderItem *item,
GPtrArray *attach_files, GList *listAddress )
{
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), prefs_common.savemsg);
folderidentifier = folder_item_get_identifier(item);
- gtk_entry_set_text(GTK_ENTRY(compose->savemsg_entry), folderidentifier);
+ compose_set_save_to(compose, folderidentifier);
g_free(folderidentifier);
}
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), TRUE);
folderidentifier = folder_item_get_identifier(msginfo->folder);
- gtk_entry_set_text(GTK_ENTRY(compose->savemsg_entry), folderidentifier);
+ compose_set_save_to(compose, folderidentifier);
g_free(folderidentifier);
}
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), TRUE);
folderidentifier = folder_item_get_identifier(msginfo->folder);
- gtk_entry_set_text(GTK_ENTRY(compose->savemsg_entry), folderidentifier);
+ compose_set_save_to(compose, folderidentifier);
g_free(folderidentifier);
}
/* Set message save folder */
if (!procheader_get_header_from_msginfo(msginfo, queueheader_buf, sizeof(queueheader_buf), "SCF:")) {
- gint startpos = 0;
-
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), TRUE);
- gtk_editable_delete_text(GTK_EDITABLE(compose->savemsg_entry), 0, -1);
- gtk_editable_insert_text(GTK_EDITABLE(compose->savemsg_entry), &queueheader_buf[4], strlen(&queueheader_buf[4]), &startpos);
+ compose_set_save_to(compose, &queueheader_buf[4]);
}
if (!procheader_get_header_from_msginfo(msginfo, queueheader_buf, sizeof(queueheader_buf), "RRCPT:")) {
gint active = atoi(&queueheader_buf[strlen("RRCPT:")]);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn), prefs_common.savemsg);
folderidentifier = folder_item_get_identifier(item);
- gtk_entry_set_text(GTK_ENTRY(compose->savemsg_entry), folderidentifier);
+ compose_set_save_to(compose, folderidentifier);
g_free(folderidentifier);
}
else
gtk_text_buffer_get_iter_at_offset(buffer, &iter,
compose->set_cursor_pos);
-
+
+ compose->set_cursor_pos = -1;
gtk_text_buffer_place_cursor(buffer, &iter);
g_signal_handlers_unblock_by_func(G_OBJECT(buffer),
G_CALLBACK(compose_changed_cb),
MimeInfo *mimemsg, *mimetext;
gint line;
const gchar *src_codeset = CS_INTERNAL;
+ gchar *from_addr = NULL;
+ gchar *from_name = NULL;
if (action == COMPOSE_WRITE_FOR_SEND)
attach_parts = TRUE;
g_free(buf);
+ if (strlen(gtk_entry_get_text(GTK_ENTRY(compose->from_name))) != 0) {
+ gchar *spec = gtk_editable_get_chars(GTK_EDITABLE(compose->from_name), 0, -1);
+ /* extract name and address */
+ if (strstr(spec, " <") && strstr(spec, ">")) {
+ from_addr = g_strdup(strrchr(spec, '<')+1);
+ *(strrchr(from_addr, '>')) = '\0';
+ from_name = g_strdup(spec);
+ *(strrchr(from_name, '<')) = '\0';
+ } else {
+ from_name = NULL;
+ from_addr = NULL;
+ }
+ g_free(spec);
+ }
/* sign message if sending */
if (action == COMPOSE_WRITE_FOR_SEND && compose->use_signing &&
privacy_system_can_sign(compose->privacy_system))
- if (!privacy_sign(compose->privacy_system, mimemsg, compose->account))
+ if (!privacy_sign(compose->privacy_system, mimemsg,
+ compose->account, from_addr)) {
+ g_free(from_name);
+ g_free(from_addr);
return -2;
-
+ }
+ g_free(from_name);
+ g_free(from_addr);
procmime_write_mimeinfo(mimemsg, fp);
procmime_mimeinfo_free_all(mimemsg);
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn))) {
gchar *savefolderid;
- savefolderid = gtk_editable_get_chars(GTK_EDITABLE(compose->savemsg_entry), 0, -1);
+ savefolderid = compose_get_save_to(compose);
err |= (fprintf(fp, "SCF:%s\n", savefolderid) < 0);
g_free(savefolderid);
}
mimepart->tmp = FALSE; /* or we destroy our attachment */
mimepart->offset = 0;
- stat(ainfo->file, &statbuf);
+ g_stat(ainfo->file, &statbuf);
mimepart->length = statbuf.st_size;
type = g_strdup(ainfo->content_type);
mimepart->disposition = DISPOSITIONTYPE_INLINE;
} else {
if (ainfo->name) {
- g_hash_table_insert(mimepart->typeparameters,
- g_strdup("name"), g_strdup(ainfo->name));
+ if (mimepart->type == MIMETYPE_APPLICATION &&
+ !strcmp2(mimepart->subtype, "octet-stream"))
+ g_hash_table_insert(mimepart->typeparameters,
+ g_strdup("name"), g_strdup(ainfo->name));
g_hash_table_insert(mimepart->dispositionparameters,
g_strdup("filename"), g_strdup(ainfo->name));
mimepart->disposition = DISPOSITIONTYPE_ATTACHMENT;
{
GtkWidget *table;
GtkWidget *savemsg_checkbtn;
- GtkWidget *savemsg_entry;
+ GtkWidget *savemsg_combo;
GtkWidget *savemsg_select;
guint rowcount = 0;
g_signal_connect(G_OBJECT(savemsg_checkbtn), "toggled",
G_CALLBACK(compose_savemsg_checkbtn_cb), compose);
- savemsg_entry = gtk_entry_new();
- gtk_widget_show(savemsg_entry);
- gtk_table_attach_defaults(GTK_TABLE(table), savemsg_entry, 1, 2, rowcount, rowcount + 1);
- gtk_editable_set_editable(GTK_EDITABLE(savemsg_entry), prefs_common.savemsg);
- g_signal_connect_after(G_OBJECT(savemsg_entry), "grab_focus",
+ savemsg_combo = gtk_combo_box_entry_new_text();
+ compose->savemsg_checkbtn = savemsg_checkbtn;
+ compose->savemsg_combo = savemsg_combo;
+ gtk_widget_show(savemsg_combo);
+
+ if (prefs_common.compose_save_to_history)
+ combobox_set_popdown_strings(GTK_COMBO_BOX(savemsg_combo),
+ prefs_common.compose_save_to_history);
+
+ gtk_table_attach(GTK_TABLE(table), savemsg_combo, 1, 2, rowcount, rowcount + 1, GTK_FILL|GTK_EXPAND, GTK_SHRINK, 0, 0);
+ gtk_widget_set_sensitive(GTK_WIDGET(savemsg_combo), prefs_common.savemsg);
+ g_signal_connect_after(G_OBJECT(savemsg_combo), "grab_focus",
G_CALLBACK(compose_grab_focus_cb), compose);
if (account_get_special_folder(compose->account, F_OUTBOX)) {
folderidentifier = folder_item_get_identifier(account_get_special_folder
(compose->account, F_OUTBOX));
- gtk_entry_set_text(GTK_ENTRY(savemsg_entry), folderidentifier);
+ compose_set_save_to(compose, folderidentifier);
g_free(folderidentifier);
}
rowcount++;
- compose->savemsg_checkbtn = savemsg_checkbtn;
- compose->savemsg_entry = savemsg_entry;
-
return table;
}
static void compose_savemsg_checkbtn_cb(GtkWidget *widget, Compose *compose)
{
- gtk_editable_set_editable(GTK_EDITABLE(compose->savemsg_entry),
+ gtk_widget_set_sensitive(GTK_WIDGET(compose->savemsg_combo),
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn)));
}
path = folder_item_get_identifier(dest);
- gtk_entry_set_text(GTK_ENTRY(compose->savemsg_entry), path);
+ compose_set_save_to(compose, path);
g_free(path);
}
&geometry, GDK_HINT_MAX_SIZE);
if (!geometry.min_width) {
geometry.min_width = 600;
- geometry.min_height = 480;
+ geometry.min_height = 440;
}
gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL,
&geometry, GDK_HINT_MIN_SIZE);
#ifndef MAEMO
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_MENUBAR)
#else
- MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_MENU)
+ MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_POPUP)
#endif
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu", "Message", "Message", GTK_UI_MANAGER_MENU)
*cancelled = TRUE;
gtk_main_quit();
}
+ if (event && event->keyval == GDK_Return) {
+ *cancelled = FALSE;
+ gtk_main_quit();
+ }
return FALSE;
}
compose_set_ext_editor_sensitive(compose, FALSE);
+#ifndef G_OS_WIN32
compose->exteditor_ch = g_io_channel_unix_new(pipe_fds[0]);
+#else
+ compose->exteditor_ch = g_io_channel_win32_new_fd(pipe_fds[0]);
+#endif
compose->exteditor_tag = g_io_add_watch(compose->exteditor_ch,
G_IO_IN,
compose_input_cb,
g_snprintf(buf, sizeof(buf), prefs_common_get_ext_editor_cmd(), file);
} else {
if (prefs_common_get_ext_editor_cmd())
- g_warning("External editor command line is invalid: '%s'\n",
+ g_warning("External editor command-line is invalid: '%s'\n",
prefs_common_get_ext_editor_cmd());
g_snprintf(buf, sizeof(buf), DEFAULT_EDITOR_CMD, file);
}
gtk_text_buffer_set_text(buffer, "", -1);
compose_insert_file(compose, compose->exteditor_file);
compose_changed_cb(NULL, compose);
+ compose_draft((gpointer)compose, COMPOSE_AUTO_SAVE);
if (claws_unlink(compose->exteditor_file) < 0)
FILE_OP_ERROR(compose->exteditor_file, "unlink");
g_signal_connect(G_OBJECT(compose->savemsg_checkbtn), "toggled",
G_CALLBACK(compose_savemsg_checkbtn_cb), compose);
- gtk_editable_delete_text(GTK_EDITABLE(compose->savemsg_entry), 0, -1);
+ compose_set_save_to(compose, NULL);
if (account_get_special_folder(compose->account, F_OUTBOX)) {
folderidentifier = folder_item_get_identifier(account_get_special_folder
(compose->account, F_OUTBOX));
- gtk_entry_set_text(GTK_ENTRY(compose->savemsg_entry), folderidentifier);
+ compose_set_save_to(compose, folderidentifier);
g_free(folderidentifier);
}
}
{
gchar *filepath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
DRAFTED_AT_EXIT, NULL);
- FILE *fp = fopen(filepath, "ab");
+ FILE *fp = g_fopen(filepath, "ab");
if (fp) {
fprintf(fp, "%s\t%d\n", folder_item_get_identifier(info->folder),
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(compose->savemsg_checkbtn))) {
gchar *savefolderid;
- savefolderid = gtk_editable_get_chars(GTK_EDITABLE(compose->savemsg_entry), 0, -1);
+ savefolderid = compose_get_save_to(compose);
err |= (fprintf(fp, "SCF:%s\n", savefolderid) < 0);
g_free(savefolderid);
}
{
gchar *filepath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
DRAFTED_AT_EXIT, NULL);
- FILE *fp = fopen(filepath, "rb");
+ FILE *fp = g_fopen(filepath, "rb");
gchar buf[1024];
if (fp) {
static void compose_save_cb(GtkAction *action, gpointer data)
{
- compose_draft(data, COMPOSE_KEEP_EDITING);
+ Compose *compose = (Compose *)data;
+ compose_draft(compose, COMPOSE_KEEP_EDITING);
+ compose->rmode = COMPOSE_REEDIT;
}
static void compose_attach_from_list(Compose *compose, GList *file_list, gboolean free_data)
* used for mid-click-pasting */
start = gtk_text_iter_get_offset(insert_place);
gtk_text_buffer_insert(buffer, insert_place, contents, strlen(contents));
+ if (prefs_common.primary_paste_unselects)
+ gtk_text_buffer_select_range(buffer, insert_place, insert_place);
}
if (!wrap) {
Compose *compose = (Compose *)user_data;
GList *list, *tmp;
- if (gdk_atom_name(data->type) &&
- !strcmp(gdk_atom_name(data->type), "text/uri-list")
- && gtk_drag_get_source_widget(context) !=
+ if (((gdk_atom_name(data->type) && !strcmp(gdk_atom_name(data->type), "text/uri-list"))
+#ifdef G_OS_WIN32
+ || (gdk_atom_name(data->type) && !strcmp(gdk_atom_name(data->type), "DROPFILES_DND"))
+#endif
+ ) && gtk_drag_get_source_widget(context) !=
summary_get_main_widget(mainwindow_get_mainwindow()->summaryview)) {
list = uri_list_extract_filenames((const gchar *)data->data);
for (tmp = list; tmp != NULL; tmp = tmp->next) {
/* strangely, testing data->type == gdk_atom_intern("text/uri-list", TRUE)
* does not work */
+ debug_print("drop: %s (%s)\n", gdk_atom_name(data->type)?gdk_atom_name(data->type):"nul",
+ (gchar *)(data->data?data->data:"nul"));
+#ifndef G_OS_WIN32
if (gdk_atom_name(data->type) && !strcmp(gdk_atom_name(data->type), "text/uri-list")) {
+#else
+ if (gdk_atom_name(data->type) && !strcmp(gdk_atom_name(data->type), "DROPFILES_DND")) {
+#endif
AlertValue val = G_ALERTDEFAULT;
list = uri_list_extract_filenames((const gchar *)data->data);
-
+ debug_print("list: %p (%s)\n", list,
+ (gchar *)(data->data?data->data:"nul"));
if (list == NULL && strstr((gchar *)(data->data), "://")) {
/* Assume a list of no files, and data has ://, is a remote link */
gchar *tmpdata = g_strstrip(g_strdup((const gchar *)data->data));