menu_set_active(ifactory, "/Options/Remove references", FALSE);
menu_set_sensitive(ifactory, "/Options/Remove references", TRUE);
+ compose->updating = TRUE;
compose->replyinfo = procmsg_msginfo_get_full_info(msginfo);
-
if (!compose->replyinfo)
compose->replyinfo = procmsg_msginfo_copy(msginfo);
-
+ compose->updating = FALSE;
+
+ if (compose->deferred_destroy) {
+ compose_destroy(compose);
+ return NULL;
+ }
+
compose_extract_original_charset(compose);
if (msginfo->folder && msginfo->folder->ret_rcpt)
compose = compose_create(account, COMPOSE_FORWARD, batch);
+ compose->updating = TRUE;
compose->fwdinfo = procmsg_msginfo_get_full_info(msginfo);
if (!compose->fwdinfo)
compose->fwdinfo = procmsg_msginfo_copy(msginfo);
+ compose->updating = FALSE;
+
+ if (compose->deferred_destroy) {
+ compose_destroy(compose);
+ return NULL;
+ }
compose_extract_original_charset(compose);
gchar *qmark;
MsgInfo *full_msginfo;
+ compose->updating = TRUE;
full_msginfo = procmsg_msginfo_get_full_info(msginfo);
if (!full_msginfo)
full_msginfo = procmsg_msginfo_copy(msginfo);
+ compose->updating = FALSE;
+
+ if (compose->deferred_destroy) {
+ compose_destroy(compose);
+ return NULL;
+ }
if (prefs_common.fw_quotemark &&
*prefs_common.fw_quotemark)
undo_block(compose->undostruct);
for (msginfo = msginfo_list; msginfo != NULL; msginfo = msginfo->next) {
+ compose->updating = TRUE;
msgfile = procmsg_get_message_file_path((MsgInfo *)msginfo->data);
+ compose->updating = FALSE;
+ if (compose->deferred_destroy) {
+ compose_destroy(compose);
+ g_free(msgfile);
+ return NULL;
+ }
if (!is_file_exist(msgfile))
g_warning("%s: file not exist\n", msgfile);
else
g_return_if_fail(msginfo != NULL);
g_return_if_fail(msginfo->folder != NULL);
- if (compose_put_existing_to_front(msginfo))
+ if (compose_put_existing_to_front(msginfo)) {
return;
+ }
if (folder_has_parent_of_type(msginfo->folder, F_QUEUE) ||
folder_has_parent_of_type(msginfo->folder, F_DRAFT)) {
param = atoi(&queueheader_buf[strlen("X-Priority: ")]); /* mind the space */
compose->priority = param;
}
- } else
+ } else {
account = msginfo->folder->folder->account;
+ }
if (!account && prefs_common.reedit_account_autosel) {
gchar from[BUFFSIZE];
- if (!procheader_get_header_from_msginfo(msginfo, from, sizeof(from), "FROM:")){
+ if (!procheader_get_header_from_msginfo(msginfo, from, sizeof(from), "FROM:")) {
extract_address(from);
account = account_find_from_address(from);
}
}
- if (!account) account = cur_account;
+ if (!account) {
+ account = cur_account;
+ }
g_return_if_fail(account != NULL);
compose = compose_create(account, COMPOSE_REEDIT, FALSE);
} else {
activate_privacy_system(compose, account, FALSE);
}
+
+ compose->updating = TRUE;
compose->targetinfo = procmsg_msginfo_copy(msginfo);
+ compose->updating = FALSE;
+
+ if (compose->deferred_destroy) {
+ compose_destroy(compose);
+ return;
+ }
compose_extract_original_charset(compose);
}
}
- if (compose_parse_header(compose, msginfo) < 0) return;
+ if (compose_parse_header(compose, msginfo) < 0) {
+ return;
+ }
compose_reedit_set_entry(compose, msginfo);
textview = GTK_TEXT_VIEW(compose->text);
if (procmime_msginfo_is_encrypted(msginfo)) {
fp = procmime_get_first_encrypted_text_content(msginfo);
- if (fp)
+ if (fp) {
compose_force_encryption(compose, account, TRUE);
- } else
+ }
+ } else {
fp = procmime_get_first_text_content(msginfo);
- if (fp == NULL)
+ }
+ if (fp == NULL) {
g_warning("Can't get text part\n");
+ }
if (fp != NULL) {
gboolean prev_autowrap = compose->autowrap;
gtk_widget_grab_focus(compose->text);
- if (prefs_common.auto_exteditor)
+ if (prefs_common.auto_exteditor) {
compose_exec_ext_editor(compose);
+ }
compose->modified = FALSE;
compose_set_title(compose);
}
gtk_widget_grab_focus(compose->header_last->entry);
+ compose->updating = TRUE;
filename = procmsg_get_message_file_path(msginfo);
+ compose->updating = FALSE;
+
+ if (compose->deferred_destroy) {
+ compose_destroy(compose);
+ g_free(filename);
+ return NULL;
+ }
+
if (filename == NULL)
return NULL;
gchar *folderid;
folderid = folder_item_get_identifier(compose->replyinfo->folder);
- fprintf(fp, "RMID:%s\x7f%d\x7f%s\n", folderid, compose->replyinfo->msgnum, compose->replyinfo->msgid);
+ fprintf(fp, "RMID:%s\t%d\t%s\n", folderid, compose->replyinfo->msgnum, compose->replyinfo->msgid);
g_free(folderid);
}
/* Message-ID of message forwarding to */
gchar *folderid;
folderid = folder_item_get_identifier(compose->fwdinfo->folder);
- fprintf(fp, "FMID:%s\x7f%d\x7f%s\n", folderid, compose->fwdinfo->msgnum, compose->fwdinfo->msgid);
+ fprintf(fp, "FMID:%s\t%d\t%s\n", folderid, compose->fwdinfo->msgnum, compose->fwdinfo->msgid);
g_free(folderid);
}
fprintf(fp, "\n");
}
static void entry_paste_clipboard(Compose *compose, GtkWidget *entry, gboolean wrap,
- GdkAtom clip);
+ GdkAtom clip, GtkTextIter *insert_place);
#define BLOCK_WRAP() { \
prev_autowrap = compose->autowrap; \
}
#endif
if (event->button == 2) {
+ GtkTextIter iter;
+ gint x, y;
BLOCK_WRAP();
- entry_paste_clipboard(compose, compose->focused_editable,
+
+ /* get the middle-click position to paste at the correct place */
+ gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(text),
+ GTK_TEXT_WINDOW_TEXT, event->x, event->y,
+ &x, &y);
+ gtk_text_view_get_iter_at_location (GTK_TEXT_VIEW(text),
+ &iter, x, y);
+
+ entry_paste_clipboard(compose, text,
prefs_common.linewrap_pastes,
- GDK_SELECTION_PRIMARY);
+ GDK_SELECTION_PRIMARY, &iter);
UNBLOCK_WRAP();
return TRUE;
}
static GtkWidget *compose_account_option_menu_create(Compose *compose)
{
GList *accounts;
- GtkWidget *hbox;
GtkWidget *optmenu;
GtkWidget *menu;
gint num = 0, def_menu = 0;
accounts = account_get_list();
g_return_val_if_fail(accounts != NULL, NULL);
- hbox = gtk_hbox_new(FALSE, 0);
optmenu = gtk_option_menu_new();
- gtk_box_pack_start(GTK_BOX(hbox), optmenu, FALSE, FALSE, 0);
menu = gtk_menu_new();
for (; accounts != NULL; accounts = accounts->next, num++) {
if (ac == compose->account) def_menu = num;
if (ac->name)
- name = g_strdup_printf("%s: %s <%s>",
+ name = g_markup_printf_escaped("<i>%s</i> : %s <<b>%s</b>>",
ac->account_name,
ac->name, ac->address);
else
- name = g_strdup_printf("%s: %s",
+ name = g_markup_printf_escaped("<i>%s</i> : <<b>%s</b>>",
ac->account_name, ac->address);
MENUITEM_ADD(menu, menuitem, name, ac->account_id);
+ gtk_label_set_use_markup (
+ GTK_LABEL (gtk_bin_get_child (GTK_BIN (menuitem))),
+ TRUE);
g_free(name);
g_signal_connect(G_OBJECT(menuitem), "activate",
G_CALLBACK(account_activated),
gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu);
gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), def_menu);
- return hbox;
+ return optmenu;
}
static void compose_set_priority_cb(gpointer data,
{
compose_list = g_list_remove(compose_list, compose);
+ if (compose->updating) {
+ debug_print("danger, not destroying anything now\n");
+ compose->deferred_destroy = TRUE;
+ return;
+ }
/* NOTE: address_completion_end() does nothing with the window
* however this may change. */
address_completion_end(compose->window);
{
Compose *compose = (Compose *)data;
- if (prefs_common.work_offline && !inc_offline_should_override())
+ if (prefs_common.work_offline &&
+ !inc_offline_should_override(
+ _("Sylpheed-Claws needs network access in order "
+ "to send this email.")))
return;
if (compose->draft_timeout_tag != -1) { /* CLAWS: disable draft timeout */
}
static void entry_paste_clipboard(Compose *compose, GtkWidget *entry,
- gboolean wrap, GdkAtom clip)
+ gboolean wrap, GdkAtom clip, GtkTextIter *insert_place)
{
if (GTK_IS_TEXT_VIEW(entry)) {
GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(entry));
if (contents == NULL)
return;
- gtk_text_buffer_delete_selection(buffer, FALSE, TRUE);
- gtk_text_buffer_get_iter_at_mark(buffer, &start_iter, mark_start);
+ /* we shouldn't delete the selection when middle-click-pasting, or we
+ * can't mid-click-paste our own selection */
+ if (clip != GDK_SELECTION_PRIMARY)
+ gtk_text_buffer_delete_selection(buffer, FALSE, TRUE);
- start = gtk_text_iter_get_offset(&start_iter);
-
- gtk_text_buffer_insert(buffer, &start_iter, contents, strlen(contents));
+ if (insert_place == NULL) {
+ /* if insert_place isn't specified, insert at the cursor.
+ * used for Ctrl-V pasting */
+ gtk_text_buffer_get_iter_at_mark(buffer, &start_iter, mark_start);
+ start = gtk_text_iter_get_offset(&start_iter);
+ gtk_text_buffer_insert(buffer, &start_iter, contents, strlen(contents));
+ } else {
+ /* if insert_place is specified, paste here.
+ * used for mid-click-pasting */
+ start = gtk_text_iter_get_offset(insert_place);
+ gtk_text_buffer_insert(buffer, insert_place, contents, strlen(contents));
+ }
if (!wrap) {
+ /* paste unwrapped: mark the paste so it's not wrapped later */
end = start + strlen(contents);
gtk_text_buffer_get_iter_at_offset(buffer, &start_iter, start);
gtk_text_buffer_get_iter_at_offset(buffer, &end_iter, end);
gtk_text_buffer_apply_tag_by_name(buffer, "no_wrap", &start_iter, &end_iter);
} else if (wrap && clip == GDK_SELECTION_PRIMARY) {
+ /* rewrap paragraph now (after a mid-click-paste) */
mark_start = gtk_text_buffer_get_insert(buffer);
gtk_text_buffer_get_iter_at_mark(buffer, &start_iter, mark_start);
gtk_text_iter_backward_char(&start_iter);
GTK_WIDGET_HAS_FOCUS(compose->focused_editable))
entry_paste_clipboard(compose, compose->focused_editable,
prefs_common.linewrap_pastes,
- GDK_SELECTION_CLIPBOARD);
+ GDK_SELECTION_CLIPBOARD, NULL);
UNBLOCK_WRAP();
}
prefs_common.linewrap_quote = prefs_common.linewrap_pastes;
entry_paste_clipboard(compose, compose->focused_editable,
prefs_common.linewrap_pastes,
- GDK_SELECTION_CLIPBOARD);
+ GDK_SELECTION_CLIPBOARD, NULL);
prefs_common.linewrap_quote = wrap_quote;
}
}
if (compose->focused_editable &&
GTK_WIDGET_HAS_FOCUS(compose->focused_editable))
entry_paste_clipboard(compose, compose->focused_editable, FALSE,
- GDK_SELECTION_CLIPBOARD);
+ GDK_SELECTION_CLIPBOARD, NULL);
UNBLOCK_WRAP();
}
if (compose->focused_editable &&
GTK_WIDGET_HAS_FOCUS(compose->focused_editable))
entry_paste_clipboard(compose, compose->focused_editable, TRUE,
- GDK_SELECTION_CLIPBOARD);
+ GDK_SELECTION_CLIPBOARD, NULL);
UNBLOCK_WRAP();
}