X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=blobdiff_plain;f=src%2Fcompose.c;h=c2c91ecd3b91913d6a98a35e71f75f2c7d54ac6f;hp=a05059d356d72c4909d2fe3f8d4933ce5199a063;hb=ae706ee0f7354bacac74c77f00862ddf3dc00a7a;hpb=5214768ee878208a9a21b48a0b431bb174dfef07 diff --git a/src/compose.c b/src/compose.c index a05059d35..c2c91ecd3 100644 --- a/src/compose.c +++ b/src/compose.c @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -67,6 +66,9 @@ # include #endif + +#include "gtkstext.h" + #include "intl.h" #include "main.h" #include "mainwindow.h" @@ -77,6 +79,7 @@ #include "menu.h" #include "send.h" #include "news.h" +#include "customheader.h" #include "prefs_common.h" #include "prefs_account.h" #include "account.h" @@ -149,7 +152,7 @@ static void compose_attach_append (Compose *compose, static void compose_wrap_line (Compose *compose); static void compose_set_title (Compose *compose); -static gint compose_send (Compose *compose); +/* static gint compose_send (Compose *compose); */ static gint compose_write_to_file (Compose *compose, const gchar *file, gboolean is_draft); @@ -200,7 +203,7 @@ static void compose_input_cb (gpointer data, static void compose_set_ext_editor_sensitive (Compose *compose, gboolean sensitive); -static gint calc_cursor_xpos (GtkText *text, +static gint calc_cursor_xpos (GtkSText *text, gint extra, gint char_width); @@ -327,6 +330,8 @@ static void compose_toggle_encrypt_cb (gpointer data, guint action, GtkWidget *widget); #endif +static void compose_toggle_return_receipt_cb(gpointer data, guint action, + GtkWidget *widget); static void compose_attach_drag_received_cb (GtkWidget *widget, GdkDragContext *drag_context, @@ -411,6 +416,8 @@ static GtkItemFactoryEntry compose_entries[] = {N_("/_Message/Si_gn"), NULL, compose_toggle_sign_cb, 0, ""}, {N_("/_Message/_Encrypt"), NULL, compose_toggle_encrypt_cb, 0, ""}, #endif /* USE_GPGME */ + {N_("/_Message/---"), NULL, NULL, 0, ""}, + {N_("/_Message/_Request Return Receipt"), NULL, compose_toggle_return_receipt_cb, 0, ""}, {N_("/_Tool"), NULL, NULL, 0, ""}, {N_("/_Tool/Show _ruler"), NULL, compose_toggle_ruler_cb, 0, ""}, {N_("/_Tool/_Address book"), "A", compose_address_cb, 0, NULL}, @@ -423,12 +430,12 @@ static GtkTargetEntry compose_mime_types[] = {"text/uri-list", 0, 0} }; -void compose_new(PrefsAccount *account) +Compose * compose_new(PrefsAccount *account) { - compose_new_with_recipient(account, NULL); + return compose_new_with_recipient(account, NULL); } -void compose_new_with_recipient(PrefsAccount *account, const gchar *to) +Compose * compose_new_with_recipient(PrefsAccount *account, const gchar *to) { Compose *compose; @@ -441,7 +448,7 @@ void compose_new_with_recipient(PrefsAccount *account, const gchar *to) if (prefs_common.auto_sig) compose_insert_sig(compose); gtk_editable_set_position(GTK_EDITABLE(compose->text), 0); - gtk_text_set_point(GTK_TEXT(compose->text), 0); + gtk_stext_set_point(GTK_STEXT(compose->text), 0); if (account->protocol != A_NNTP) { if (to) { @@ -451,13 +458,15 @@ void compose_new_with_recipient(PrefsAccount *account, const gchar *to) gtk_widget_grab_focus(compose->to_entry); } else gtk_widget_grab_focus(compose->newsgroups_entry); + + return compose; } void compose_reply(MsgInfo *msginfo, gboolean quote, gboolean to_all) { Compose *compose; PrefsAccount *account; - GtkText *text; + GtkSText *text; g_return_if_fail(msginfo != NULL); g_return_if_fail(msginfo->folder != NULL); @@ -475,8 +484,8 @@ void compose_reply(MsgInfo *msginfo, gboolean quote, gboolean to_all) if (compose_parse_header(compose, msginfo) < 0) return; compose_reply_set_entry(compose, msginfo, to_all); - text = GTK_TEXT(compose->text); - gtk_text_freeze(text); + text = GTK_STEXT(compose->text); + gtk_stext_freeze(text); if (quote) { FILE *fp; @@ -487,7 +496,7 @@ void compose_reply(MsgInfo *msginfo, gboolean quote, gboolean to_all) else { quote_str = compose_quote_parse_fmt (compose, msginfo, prefs_common.quotefmt); - gtk_text_insert(text, NULL, NULL, NULL, quote_str, -1); + gtk_stext_insert(text, NULL, NULL, NULL, quote_str, -1); g_free(quote_str); compose_quote_file(compose, msginfo, fp); fclose(fp); @@ -497,32 +506,35 @@ void compose_reply(MsgInfo *msginfo, gboolean quote, gboolean to_all) if (prefs_common.auto_sig) compose_insert_sig(compose); gtk_editable_set_position(GTK_EDITABLE(text), 0); - gtk_text_set_point(text, 0); + gtk_stext_set_point(text, 0); - gtk_text_thaw(text); + gtk_stext_thaw(text); gtk_widget_grab_focus(compose->text); } #define INSERT_FW_HEADER(var, hdr) \ if (msginfo->var && *msginfo->var) { \ - gtk_text_insert(text, NULL, NULL, NULL, hdr, -1); \ - gtk_text_insert(text, NULL, NULL, NULL, msginfo->var, -1); \ - gtk_text_insert(text, NULL, NULL, NULL, "\n", 1); \ + gtk_stext_insert(text, NULL, NULL, NULL, hdr, -1); \ + gtk_stext_insert(text, NULL, NULL, NULL, msginfo->var, -1); \ + gtk_stext_insert(text, NULL, NULL, NULL, "\n", 1); \ } -void compose_forward(MsgInfo *msginfo, gboolean as_attach) +Compose * compose_forward(PrefsAccount * account, MsgInfo *msginfo, + gboolean as_attach) { Compose *compose; - PrefsAccount *account; - GtkText *text; + /* PrefsAccount *account; */ + GtkSText *text; FILE *fp; gchar buf[BUFFSIZE]; g_return_if_fail(msginfo != NULL); g_return_if_fail(msginfo->folder != NULL); - account = msginfo->folder->folder->account; - if (!account) account = cur_account; + if (account == NULL) { + account = msginfo->folder->folder->account; + if (!account) account = cur_account; + } g_return_if_fail(account != NULL); MSG_UNSET_FLAGS(msginfo->flags, MSG_REPLIED); @@ -537,8 +549,8 @@ void compose_forward(MsgInfo *msginfo, gboolean as_attach) msginfo->subject); } - text = GTK_TEXT(compose->text); - gtk_text_freeze(text); + text = GTK_STEXT(compose->text); + gtk_stext_freeze(text); if (as_attach) { gchar *msgfile; @@ -556,18 +568,18 @@ void compose_forward(MsgInfo *msginfo, gboolean as_attach) g_warning(_("Can't get text part\n")); else { /* insert header */ - gtk_text_insert(text, NULL, NULL, NULL, + gtk_stext_insert(text, NULL, NULL, NULL, _("\n\nBegin forwarded message:\n\n"), -1); INSERT_FW_HEADER(date, "Date: "); INSERT_FW_HEADER(from, "From: "); INSERT_FW_HEADER(to, "To: "); INSERT_FW_HEADER(newsgroups, "Newsgroups: "); INSERT_FW_HEADER(subject, "Subject: "); - gtk_text_insert(text, NULL, NULL, NULL, "\n\n", 2); + gtk_stext_insert(text, NULL, NULL, NULL, "\n\n", 2); /* forward body */ while (fgets(buf, sizeof(buf), fp) != NULL) - gtk_text_insert(text, NULL, NULL, NULL, + gtk_stext_insert(text, NULL, NULL, NULL, buf, -1); fclose(fp); } @@ -576,20 +588,24 @@ void compose_forward(MsgInfo *msginfo, gboolean as_attach) if (prefs_common.auto_sig) compose_insert_sig(compose); gtk_editable_set_position(GTK_EDITABLE(compose->text), 0); - gtk_text_set_point(GTK_TEXT(compose->text), 0); + gtk_stext_set_point(GTK_STEXT(compose->text), 0); - gtk_text_thaw(text); + gtk_stext_thaw(text); if (account->protocol != A_NNTP) gtk_widget_grab_focus(compose->to_entry); else gtk_widget_grab_focus(compose->newsgroups_entry); + + return compose; } +#undef INSERT_FW_HEADER + void compose_reedit(MsgInfo *msginfo) { Compose *compose; PrefsAccount *account; - GtkText *text; + GtkSText *text; FILE *fp; gchar buf[BUFFSIZE]; @@ -607,18 +623,18 @@ void compose_reedit(MsgInfo *msginfo) if (compose_parse_header(compose, msginfo) < 0) return; compose_reedit_set_entry(compose, msginfo); - text = GTK_TEXT(compose->text); - gtk_text_freeze(text); + text = GTK_STEXT(compose->text); + gtk_stext_freeze(text); if ((fp = procmime_get_text_part(msginfo)) == NULL) g_warning(_("Can't get text part\n")); else { while (fgets(buf, sizeof(buf), fp) != NULL) - gtk_text_insert(text, NULL, NULL, NULL, buf, -1); + gtk_stext_insert(text, NULL, NULL, NULL, buf, -1); fclose(fp); } - gtk_text_thaw(text); + gtk_stext_thaw(text); gtk_widget_grab_focus(compose->text); } @@ -642,6 +658,9 @@ void compose_entry_append(Compose *compose, const gchar *address, case COMPOSE_BCC: entry = GTK_ENTRY(compose->bcc_entry); break; + case COMPOSE_NEWSGROUPS: + entry = GTK_ENTRY(compose->newsgroups_entry); + break; case COMPOSE_TO: default: entry = GTK_ENTRY(compose->to_entry); @@ -794,7 +813,7 @@ static gchar *compose_parse_references(const gchar *ref, const gchar *msgid) static void compose_quote_file(Compose *compose, MsgInfo *msginfo, FILE *fp) { - GtkText *text = GTK_TEXT(compose->text); + GtkSText *text = GTK_STEXT(compose->text); gchar *qmark; gchar *quote_str; GdkColor *qcolor = NULL; @@ -818,9 +837,9 @@ static void compose_quote_file(Compose *compose, MsgInfo *msginfo, FILE *fp) if (!prefs_common.linewrap_quote || prefs_common.linewrap_len <= qlen) { while (fgets(buf, sizeof(buf), fp) != NULL) { - gtk_text_insert(text, NULL, qcolor, NULL, + gtk_stext_insert(text, NULL, qcolor, NULL, quote_str, -1); - gtk_text_insert(text, NULL, qcolor, NULL, buf, -1); + gtk_stext_insert(text, NULL, qcolor, NULL, buf, -1); } g_free(quote_str); return; @@ -833,10 +852,10 @@ static void compose_quote_file(Compose *compose, MsgInfo *msginfo, FILE *fp) str_len = strlen(buf); if (str_len <= wrap_len) { - gtk_text_insert(text, NULL, qcolor, NULL, + gtk_stext_insert(text, NULL, qcolor, NULL, quote_str, -1); - gtk_text_insert(text, NULL, qcolor, NULL, buf, -1); - gtk_text_insert(text, NULL, NULL, NULL, "\n", 1); + gtk_stext_insert(text, NULL, qcolor, NULL, buf, -1); + gtk_stext_insert(text, NULL, NULL, NULL, "\n", 1); continue; } @@ -853,18 +872,18 @@ static void compose_quote_file(Compose *compose, MsgInfo *msginfo, FILE *fp) } if (cur_len + ch_len > wrap_len && line_len > 0) { - gtk_text_insert(text, NULL, qcolor, NULL, + gtk_stext_insert(text, NULL, qcolor, NULL, quote_str, -1); if (isspace(*(linep - 1))) - gtk_text_insert(text, NULL, + gtk_stext_insert(text, NULL, qcolor, NULL, leftp, line_len - 1); else - gtk_text_insert(text, NULL, + gtk_stext_insert(text, NULL, qcolor, NULL, leftp, line_len); - gtk_text_insert(text, NULL, NULL, NULL, + gtk_stext_insert(text, NULL, NULL, NULL, "\n", 1); leftp = linep; @@ -883,10 +902,10 @@ static void compose_quote_file(Compose *compose, MsgInfo *msginfo, FILE *fp) } if (*leftp) { - gtk_text_insert(text, NULL, qcolor, NULL, + gtk_stext_insert(text, NULL, qcolor, NULL, quote_str, -1); - gtk_text_insert(text, NULL, qcolor, NULL, leftp, -1); - gtk_text_insert(text, NULL, NULL, NULL, "\n", 1); + gtk_stext_insert(text, NULL, qcolor, NULL, leftp, -1); + gtk_stext_insert(text, NULL, NULL, NULL, "\n", 1); } } @@ -1161,6 +1180,8 @@ static void compose_reedit_set_entry(Compose *compose, MsgInfo *msginfo) } } +#undef SET_ENTRY + static void compose_insert_sig(Compose *compose) { gchar *sigfile; @@ -1168,7 +1189,7 @@ static void compose_insert_sig(Compose *compose) if (compose->account && compose->account->sig_path) sigfile = g_strdup(compose->account->sig_path); else { - sigfile = g_strconcat(g_get_home_dir(), G_DIR_SEPARATOR_S, + sigfile = g_strconcat(get_home_dir(), G_DIR_SEPARATOR_S, DEFAULT_SIGNATURE, NULL); } @@ -1177,11 +1198,11 @@ static void compose_insert_sig(Compose *compose) return; } - gtk_text_insert(GTK_TEXT(compose->text), NULL, NULL, NULL, "\n\n", 2); + gtk_stext_insert(GTK_STEXT(compose->text), NULL, NULL, NULL, "\n\n", 2); if (prefs_common.sig_sep) { - gtk_text_insert(GTK_TEXT(compose->text), NULL, NULL, NULL, + gtk_stext_insert(GTK_STEXT(compose->text), NULL, NULL, NULL, prefs_common.sig_sep, -1); - gtk_text_insert(GTK_TEXT(compose->text), NULL, NULL, NULL, + gtk_stext_insert(GTK_STEXT(compose->text), NULL, NULL, NULL, "\n", 1); } @@ -1191,7 +1212,7 @@ static void compose_insert_sig(Compose *compose) static void compose_insert_file(Compose *compose, const gchar *file) { - GtkText *text = GTK_TEXT(compose->text); + GtkSText *text = GTK_STEXT(compose->text); gchar buf[BUFFSIZE]; FILE *fp; @@ -1202,12 +1223,12 @@ static void compose_insert_file(Compose *compose, const gchar *file) return; } - gtk_text_freeze(text); + gtk_stext_freeze(text); while (fgets(buf, sizeof(buf), fp) != NULL) - gtk_text_insert(text, NULL, NULL, NULL, buf, -1); + gtk_stext_insert(text, NULL, NULL, NULL, buf, -1); - gtk_text_thaw(text); + gtk_stext_thaw(text); fclose(fp); } @@ -1275,23 +1296,23 @@ static void compose_attach_append(Compose *compose, const gchar *file, static void compose_wrap_line(Compose *compose) { - GtkText *text = GTK_TEXT(compose->text); + GtkSText *text = GTK_STEXT(compose->text); guint text_len; guint line_pos = 0, cur_pos = 0; gint line_len = 0, cur_len = 0; gint ch_len; gchar cbuf[MB_CUR_MAX]; - gtk_text_freeze(text); + gtk_stext_freeze(text); - text_len = gtk_text_get_length(text); + text_len = gtk_stext_get_length(text); for (; cur_pos < text_len; cur_pos++) { if (text->use_wchar) ch_len = wctomb - (cbuf, (wchar_t)GTK_TEXT_INDEX(text, cur_pos)); + (cbuf, (wchar_t)GTK_STEXT_INDEX(text, cur_pos)); else { - cbuf[0] = GTK_TEXT_INDEX(text, cur_pos); + cbuf[0] = GTK_STEXT_INDEX(text, cur_pos); ch_len = 1; } @@ -1316,14 +1337,14 @@ static void compose_wrap_line(Compose *compose) gint tlen; if (text->use_wchar) - tlen = wctomb(cbuf, (wchar_t)GTK_TEXT_INDEX(text, line_pos - 1)); + tlen = wctomb(cbuf, (wchar_t)GTK_STEXT_INDEX(text, line_pos - 1)); else { - cbuf[0] = GTK_TEXT_INDEX(text, line_pos - 1); + cbuf[0] = GTK_STEXT_INDEX(text, line_pos - 1); tlen = 1; } if (tlen == 1 && isspace(*cbuf)) { - gtk_text_set_point(text, line_pos); - gtk_text_backward_delete(text, 1); + gtk_stext_set_point(text, line_pos); + gtk_stext_backward_delete(text, 1); text_len--; cur_pos--; line_pos--; @@ -1331,8 +1352,8 @@ static void compose_wrap_line(Compose *compose) line_len--; } - gtk_text_set_point(text, line_pos); - gtk_text_insert(text, NULL, NULL, NULL, "\n", 1); + gtk_stext_set_point(text, line_pos); + gtk_stext_insert(text, NULL, NULL, NULL, "\n", 1); text_len++; cur_pos++; line_pos++; @@ -1348,7 +1369,7 @@ static void compose_wrap_line(Compose *compose) cur_len += ch_len; } - gtk_text_thaw(text); + gtk_stext_thaw(text); } static void compose_set_title(Compose *compose) @@ -1366,7 +1387,7 @@ static void compose_set_title(Compose *compose) g_free(str); } -static gint compose_send(Compose *compose) +gint compose_send(Compose *compose) { gchar tmp[MAXPATHLEN + 1]; gchar *to, *newsgroups; @@ -1474,7 +1495,7 @@ static gint compose_send(Compose *compose) (_("Can't save the message to outbox.")); } - if (unlink(tmp) < 0) FILE_OP_ERROR(tmp, "unlink"); + unlink(tmp); lock = FALSE; return ok; } @@ -1654,12 +1675,15 @@ static gint compose_save_to_outbox(Compose *compose, const gchar *file) outbox = folder_get_default_outbox(); folder_item_scan(outbox); - if ((num = folder_item_add_msg(outbox, file)) < 0) { + if ((num = folder_item_add_msg(outbox, file, FALSE)) < 0) { g_warning(_("can't save message\n")); return -1; } path = folder_item_get_path(outbox); + if (!is_dir_exist(path)) + make_dir_hier(path); + if ((fp = procmsg_open_mark_file(path, TRUE)) == NULL) g_warning(_("can't open mark file\n")); else { @@ -1758,16 +1782,18 @@ static gint compose_queue(Compose *compose, const gchar *file) queue = folder_get_default_queue(); folder_item_scan(queue); - if ((num = folder_item_add_msg(queue, tmp)) < 0) { + if ((num = folder_item_add_msg(queue, tmp, TRUE)) < 0) { g_warning(_("can't queue the message\n")); unlink(tmp); g_free(tmp); return -1; } - unlink(tmp); g_free(tmp); queue_path = folder_item_get_path(queue); + if (!is_dir_exist(queue_path)) + make_dir_hier(queue_path); + if ((fp = procmsg_open_mark_file(queue_path, TRUE)) == NULL) g_warning(_("can't open mark file\n")); else { @@ -1855,6 +1881,10 @@ static void compose_write_attach(Compose *compose, FILE *fp) fprintf(fp, "\n--%s--\n", compose->boundary); } +#define IS_IN_CUSTOM_HEADER(header) \ + (compose->account->add_customhdr && \ + custom_header_find(compose->account->customhdr_list, header) != NULL) + static gint compose_write_headers(Compose *compose, FILE *fp, const gchar *charset, EncodingType encoding, gboolean is_draft) @@ -1873,16 +1903,19 @@ static gint compose_write_headers(Compose *compose, FILE *fp, get_rfc822_date(buf, sizeof(buf)); fprintf(fp, "Date: %s\n", buf); } - + /* From */ - if (compose->account->name && *compose->account->name) { - compose_convert_header - (buf, sizeof(buf), compose->account->name, - strlen("From: ")); - fprintf(fp, "From: %s <%s>\n", buf, compose->account->address); - } else - fprintf(fp, "From: %s\n", compose->account->address); - + if (!IS_IN_CUSTOM_HEADER("From")) { + if (compose->account->name && *compose->account->name) { + compose_convert_header + (buf, sizeof(buf), compose->account->name, + strlen("From: ")); + fprintf(fp, "From: %s <%s>\n", + buf, compose->account->address); + } else + fprintf(fp, "From: %s\n", compose->account->address); + } + slist_free_strings(compose->to_list); g_slist_free(compose->to_list); compose->to_list = NULL; @@ -1896,13 +1929,16 @@ static gint compose_write_headers(Compose *compose, FILE *fp, if (*str != '\0') { compose->to_list = address_list_append (compose->to_list, str); - compose_convert_header(buf, sizeof(buf), str, - strlen("To: ")); - fprintf(fp, "To: %s\n", buf); + if (!IS_IN_CUSTOM_HEADER("To")) { + compose_convert_header + (buf, sizeof(buf), str, + strlen("To: ")); + fprintf(fp, "To: %s\n", buf); + } } } } - + slist_free_strings(compose->newsgroup_list); g_slist_free(compose->newsgroup_list); compose->newsgroup_list = NULL; @@ -1917,9 +1953,11 @@ static gint compose_write_headers(Compose *compose, FILE *fp, compose->newsgroup_list = newsgroup_list_append(compose->newsgroup_list, str); - compose_convert_header(buf, sizeof(buf), str, - strlen("Newsgroups: ")); - fprintf(fp, "Newsgroups: %s\n", buf); + if (!IS_IN_CUSTOM_HEADER("Newsgroups")) { + compose_convert_header(buf, sizeof(buf), str, + strlen("Newsgroups: ")); + fprintf(fp, "Newsgroups: %s\n", buf); + } } } @@ -1935,13 +1973,16 @@ static gint compose_write_headers(Compose *compose, FILE *fp, if (*str != '\0') { compose->to_list = address_list_append (compose->to_list, str); - compose_convert_header(buf, sizeof(buf), str, - strlen("Cc: ")); - fprintf(fp, "Cc: %s\n", buf); + if (!IS_IN_CUSTOM_HEADER("Cc")) { + compose_convert_header + (buf, sizeof(buf), str, + strlen("Cc: ")); + fprintf(fp, "Cc: %s\n", buf); + } } } } - + /* Bcc */ if (compose->use_bcc) { str = gtk_entry_get_text(GTK_ENTRY(compose->bcc_entry)); @@ -1963,7 +2004,7 @@ static gint compose_write_headers(Compose *compose, FILE *fp, /* Subject */ str = gtk_entry_get_text(GTK_ENTRY(compose->subject_entry)); - if (*str != '\0') { + if (*str != '\0' && !IS_IN_CUSTOM_HEADER("Subject")) { Xstrdup_a(str, str, return -1); g_strstrip(str); if (*str != '\0') { @@ -1989,7 +2030,7 @@ static gint compose_write_headers(Compose *compose, FILE *fp, fprintf(fp, "References: %s\n", compose->references); /* Followup-To */ - if (compose->use_followupto) { + if (compose->use_followupto && !IS_IN_CUSTOM_HEADER("Followup-To")) { str = gtk_entry_get_text(GTK_ENTRY(compose->followup_entry)); if (*str != '\0') { Xstrdup_a(str, str, return -1); @@ -2004,7 +2045,7 @@ static gint compose_write_headers(Compose *compose, FILE *fp, } /* Reply-To */ - if (compose->use_replyto) { + if (compose->use_replyto && !IS_IN_CUSTOM_HEADER("Reply-To")) { str = gtk_entry_get_text(GTK_ENTRY(compose->reply_entry)); if (*str != '\0') { Xstrdup_a(str, str, return -1); @@ -2017,10 +2058,19 @@ static gint compose_write_headers(Compose *compose, FILE *fp, } } + /* Organization */ + if (compose->account->organization && + !IS_IN_CUSTOM_HEADER("Organization")) { + compose_convert_header(buf, sizeof(buf), + compose->account->organization, + strlen("Organization: ")); + fprintf(fp, "Organization: %s\n", buf); + } + /* Program version and system info */ /* uname(&utsbuf); */ str = gtk_entry_get_text(GTK_ENTRY(compose->to_entry)); - if (*str != '\0') { + if (*str != '\0' && !IS_IN_CUSTOM_HEADER("X-Mailer")) { fprintf(fp, "X-Mailer: %s (GTK+ %d.%d.%d; %s)\n", prog_version, gtk_major_version, gtk_minor_version, gtk_micro_version, @@ -2028,7 +2078,7 @@ static gint compose_write_headers(Compose *compose, FILE *fp, /* utsbuf.sysname, utsbuf.release, utsbuf.machine); */ } str = gtk_entry_get_text(GTK_ENTRY(compose->newsgroups_entry)); - if (*str != '\0') { + if (*str != '\0' && !IS_IN_CUSTOM_HEADER("X-Newsreader")) { fprintf(fp, "X-Newsreader: %s (GTK+ %d.%d.%d; %s)\n", prog_version, gtk_major_version, gtk_minor_version, gtk_micro_version, @@ -2036,14 +2086,33 @@ static gint compose_write_headers(Compose *compose, FILE *fp, /* utsbuf.sysname, utsbuf.release, utsbuf.machine); */ } - /* Organization */ - if (compose->account->organization) { - compose_convert_header(buf, sizeof(buf), - compose->account->organization, - strlen("Organization: ")); - fprintf(fp, "Organization: %s\n", buf); + /* custom headers */ + if (compose->account->add_customhdr) { + GSList *cur; + + for (cur = compose->account->customhdr_list; cur != NULL; + cur = cur->next) { + CustomHeader *chdr = (CustomHeader *)cur->data; + + if (strcasecmp(chdr->name, "Date") != 0 && + strcasecmp(chdr->name, "From") != 0 && + strcasecmp(chdr->name, "To") != 0 && + strcasecmp(chdr->name, "Sender") != 0 && + strcasecmp(chdr->name, "Message-Id") != 0 && + strcasecmp(chdr->name, "In-Reply-To") != 0 && + strcasecmp(chdr->name, "References") != 0 && + strcasecmp(chdr->name, "Mime-Version") != 0 && + strcasecmp(chdr->name, "Content-Type") != 0 && + strcasecmp(chdr->name, "Content-Transfer-Encoding") + != 0) + compose_convert_header + (buf, sizeof(buf), + chdr->value ? chdr->value : "", + strlen(chdr->name) + 2); + fprintf(fp, "%s: %s\n", chdr->name, buf); + } } - + /* MIME */ fprintf(fp, "Mime-Version: 1.0\n"); if (compose->use_attach) { @@ -2061,12 +2130,26 @@ static gint compose_write_headers(Compose *compose, FILE *fp, procmime_get_encoding_str(encoding)); } + /* Request Return Receipt */ + if (!IS_IN_CUSTOM_HEADER("Disposition-Notification-To")) { + if (compose->return_receipt) { + if (compose->account->name + && *compose->account->name) { + compose_convert_header(buf, sizeof(buf), compose->account->name, strlen("Disposition-Notification-To: ")); + fprintf(fp, "Disposition-Notification-To: %s <%s>\n", buf, compose->account->address); + } else + fprintf(fp, "Disposition-Notification-To: %s\n", compose->account->address); + } + } + /* separator between header and body */ fputs("\n", fp); return 0; } +#undef IS_IN_CUSTOM_HEADER + static void compose_convert_header(gchar *dest, gint len, gchar *src, gint header_len) { @@ -2367,12 +2450,14 @@ static Compose *compose_create(PrefsAccount *account) gtk_box_pack_start(GTK_BOX(edit_vbox), scrolledwin, TRUE, TRUE, 0); gtk_widget_set_usize(scrolledwin, prefs_common.compose_width, -1); - text = gtk_text_new(gtk_scrolled_window_get_hadjustment + text = gtk_stext_new(gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW(scrolledwin)), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW(scrolledwin))); - gtk_text_set_editable(GTK_TEXT(text), TRUE); - gtk_text_set_word_wrap(GTK_TEXT(text), TRUE); + gtk_stext_set_editable(GTK_STEXT(text), TRUE); + gtk_stext_set_word_wrap(GTK_STEXT(text), TRUE); + gtk_stext_set_wrap_rmargin(GTK_STEXT(text), prefs_common.linewrap_len); + gtk_container_add(GTK_CONTAINER(scrolledwin), text); gtk_signal_connect(GTK_OBJECT(text), "changed", @@ -2402,7 +2487,7 @@ static Compose *compose_create(PrefsAccount *account) style = gtk_widget_get_style(text); - /* workaround for the slow down of GtkText when using Pixmap theme */ + /* workaround for the slow down of GtkSText when using Pixmap theme */ if (style->engine) { GtkThemeEngine *engine; @@ -2564,6 +2649,8 @@ static Compose *compose_create(PrefsAccount *account) compose->modified = FALSE; + compose->return_receipt = FALSE; + compose->to_list = NULL; compose->newsgroup_list = NULL; @@ -2590,19 +2677,22 @@ static Compose *compose_create(PrefsAccount *account) gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(menuitem), TRUE); } - if (account->set_autobcc && account->auto_bcc) { - gtk_entry_set_text(GTK_ENTRY(bcc_entry), account->auto_bcc); + if (account->set_autobcc) { menuitem = gtk_item_factory_get_item(ifactory, "/Message/Bcc"); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(menuitem), TRUE); + if (account->auto_bcc) + gtk_entry_set_text(GTK_ENTRY(bcc_entry), + account->auto_bcc); } - if (account->set_autoreplyto && account->auto_replyto) { - gtk_entry_set_text(GTK_ENTRY(reply_entry), - account->auto_replyto); + if (account->set_autoreplyto) { menuitem = gtk_item_factory_get_item(ifactory, "/Message/Reply to"); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(menuitem), TRUE); + if (account->auto_replyto) + gtk_entry_set_text(GTK_ENTRY(reply_entry), + account->auto_replyto); } menuitem = gtk_item_factory_get_item(ifactory, "/Tool/Show ruler"); @@ -2761,6 +2851,8 @@ static void compose_toolbar_create(Compose *compose, GtkWidget *container) gtk_widget_show_all(toolbar); } +#undef CREATE_TOOLBAR_ICON + static GtkWidget *compose_account_option_menu_create(Compose *compose) { GList *accounts; @@ -3091,6 +3183,8 @@ static void compose_attach_property_create(gboolean *cancelled) attach_prop.cancel_btn = cancel_btn; } +#undef SET_LABEL_AND_ENTRY + static void attach_property_ok(GtkWidget *widget, gboolean *cancelled) { *cancelled = FALSE; @@ -3163,20 +3257,20 @@ static void compose_exec_ext_editor(Compose *compose) close(pipe_fds[0]); if (compose_write_body_to_file(compose, tmp) < 0) { - sock_write(pipe_fds[1], "2\n", 2); + fd_write(pipe_fds[1], "2\n", 2); _exit(1); } pid_ed = compose_exec_ext_editor_real(tmp); if (pid_ed < 0) { - sock_write(pipe_fds[1], "1\n", 2); + fd_write(pipe_fds[1], "1\n", 2); _exit(1); } /* wait until editor is terminated */ waitpid(pid_ed, NULL, 0); - sock_write(pipe_fds[1], "0\n", 2); + fd_write(pipe_fds[1], "0\n", 2); close(pipe_fds[1]); _exit(0); @@ -3296,14 +3390,14 @@ static void compose_input_cb(gpointer data, gint source, waitpid(compose->exteditor_pid, NULL, 0); if (buf[0] == '0') { /* success */ - GtkText *text = GTK_TEXT(compose->text); + GtkSText *text = GTK_STEXT(compose->text); - gtk_text_freeze(text); - gtk_text_set_point(text, 0); - gtk_text_forward_delete(text, gtk_text_get_length(text)); + gtk_stext_freeze(text); + gtk_stext_set_point(text, 0); + gtk_stext_forward_delete(text, gtk_stext_get_length(text)); compose_insert_file(compose, compose->exteditor_file); compose_changed_cb(NULL, compose); - gtk_text_thaw(text); + gtk_stext_thaw(text); if (unlink(compose->exteditor_file) < 0) FILE_OP_ERROR(compose->exteditor_file, "unlink"); @@ -3355,7 +3449,7 @@ static void compose_set_ext_editor_sensitive(Compose *compose, gtk_widget_set_sensitive(compose->linewrap_btn, sensitive); } -static gint calc_cursor_xpos(GtkText *text, gint extra, gint char_width) +static gint calc_cursor_xpos(GtkSText *text, gint extra, gint char_width) { gint cursor_pos; @@ -3387,7 +3481,7 @@ static gboolean compose_edit_size_alloc(GtkEditable *widget, /* got the maximum */ gtk_ruler_set_range(GTK_RULER(shruler), 0.0, line_width_in_chars, - calc_cursor_xpos(GTK_TEXT(widget), + calc_cursor_xpos(GTK_STEXT(widget), allocation->x, char_width), /*line_width_in_chars*/ char_width); @@ -3581,13 +3675,12 @@ static void compose_draft_cb(gpointer data, guint action, GtkWidget *widget) return; } - if (folder_item_add_msg(draft, tmp) < 0) { + if (folder_item_add_msg(draft, tmp, TRUE) < 0) { unlink(tmp); g_free(tmp); return; } - unlink(tmp); g_free(tmp); //folderview_scan_folder_a(DRAFT_DIR, TRUE); @@ -3723,7 +3816,7 @@ static void compose_changed_cb(GtkEditable *editable, Compose *compose) static void compose_button_press_cb(GtkWidget *widget, GdkEventButton *event, Compose *compose) { - gtk_text_set_point(GTK_TEXT(widget), + gtk_stext_set_point(GTK_STEXT(widget), gtk_editable_get_position(GTK_EDITABLE(widget))); } @@ -3731,7 +3824,7 @@ static void compose_button_press_cb(GtkWidget *widget, GdkEventButton *event, static void compose_key_press_cb(GtkWidget *widget, GdkEventKey *event, Compose *compose) { - gtk_text_set_point(GTK_TEXT(widget), + gtk_stext_set_point(GTK_STEXT(widget), gtk_editable_get_position(GTK_EDITABLE(widget))); } #endif @@ -4015,3 +4108,14 @@ static void followupto_activated(GtkWidget *widget, Compose *compose) { gtk_widget_grab_focus(compose->text); } + +static void compose_toggle_return_receipt_cb(gpointer data, guint action, + GtkWidget *widget) +{ + Compose *compose = (Compose *)data; + + if (GTK_CHECK_MENU_ITEM(widget)->active) + compose->return_receipt = TRUE; + else + compose->return_receipt = FALSE; +}