From 587f99eceae540a9a3bd48008cfc8d8d1608bb76 Mon Sep 17 00:00:00 2001 From: Michael Rasmussen Date: Mon, 30 Nov 2009 20:35:29 +0000 Subject: [PATCH] 2009-11-30 [mir] 3.7.3cvs24 * src/compose.c Place cursor in compose window according to provided input If to: is present place cursor in subject field and if both to: and subject: is present place cursor in body. If body: is present insert a new line after text and place cursor there. --- ChangeLog | 8 +++++++ PATCHSETS | 1 + configure.ac | 2 +- src/compose.c | 60 ++++++++++++++++++++++++++++++++++++++++++++------- 4 files changed, 62 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0bcf7abd0..87a8716d6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-11-30 [mir] 3.7.3cvs24 + + * src/compose.c + Place cursor in compose window according to provided input + If to: is present place cursor in subject field and if both + to: and subject: is present place cursor in body. If body: is + present insert a new line after text and place cursor there. + 2009-11-27 [mones] 3.7.3cvs23 * src/gtk/quicksearch.c diff --git a/PATCHSETS b/PATCHSETS index ec16199a6..86cf53925 100644 --- a/PATCHSETS +++ b/PATCHSETS @@ -3897,3 +3897,4 @@ ( cvs diff -u -r 1.179.2.248 -r 1.179.2.249 src/imap.c; ) > 3.7.3cvs21.patchset ( cvs diff -u -r 1.24.2.28 -r 1.24.2.29 Makefile.am; cvs diff -u -r 1.24.2.19 -r 1.24.2.20 src/common/Makefile.am; cvs diff -u -r 1.36.2.179 -r 1.36.2.180 src/common/utils.c; cvs diff -u -r 1.20.2.72 -r 1.20.2.73 src/common/utils.h; ) > 3.7.3cvs22.patchset ( cvs diff -u -r 1.1.2.87 -r 1.1.2.88 src/gtk/quicksearch.c; ) > 3.7.3cvs23.patchset +( cvs diff -u -r 1.382.2.525 -r 1.382.2.526 src/compose.c; ) > 3.7.3cvs24.patchset diff --git a/configure.ac b/configure.ac index e9396028e..1e88f5811 100644 --- a/configure.ac +++ b/configure.ac @@ -12,7 +12,7 @@ MINOR_VERSION=7 MICRO_VERSION=3 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=23 +EXTRA_VERSION=24 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/compose.c b/src/compose.c index 97056e26a..3cd2f2d40 100644 --- a/src/compose.c +++ b/src/compose.c @@ -162,6 +162,13 @@ typedef enum COMPOSE_QUOTE_SKIP } ComposeQuoteMode; +typedef enum { + TO_FIELD_PRESENT, + SUBJECT_FIELD_PRESENT, + BODY_FIELD_PRESENT, + NO_FIELD_PRESENT +} MailField; + #define B64_LINE_SIZE 57 #define B64_BUFFSIZE 77 @@ -207,7 +214,7 @@ static void compose_set_out_encoding (Compose *compose); static void compose_set_template_menu (Compose *compose); static void compose_destroy (Compose *compose); -static void compose_entries_set (Compose *compose, +static MailField compose_entries_set (Compose *compose, const gchar *mailto, ComposeEntryType to_type); static gint compose_parse_header (Compose *compose, @@ -936,6 +943,9 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI gchar *mailto_from = NULL; PrefsAccount *mailto_account = NULL; MsgInfo* dummyinfo = NULL; + MailField mfield = NO_FIELD_PRESENT; + gchar* buf; + GtkTextMark *mark; /* check if mailto defines a from */ if (mailto && *mailto != '\0') { @@ -1017,7 +1027,7 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI if (account->protocol != A_NNTP) { if (mailto && *mailto != '\0') { - compose_entries_set(compose, mailto, COMPOSE_TO); + mfield = compose_entries_set(compose, mailto, COMPOSE_TO); } else if (item && item->prefs) { if (item->prefs->enable_default_bcc) { @@ -1044,9 +1054,9 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI } else { if (mailto && *mailto != '\0') { if (!strchr(mailto, '@')) - compose_entries_set(compose, mailto, COMPOSE_NEWSGROUPS); + mfield = compose_entries_set(compose, mailto, COMPOSE_NEWSGROUPS); else - compose_entries_set(compose, mailto, COMPOSE_TO); + mfield = compose_entries_set(compose, mailto, COMPOSE_TO); } else if (item && FOLDER_CLASS(item->folder) == news_get_class()) { compose_entry_append(compose, item->path, COMPOSE_NEWSGROUPS, PREF_FOLDER); } @@ -1158,8 +1168,35 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI compose_set_save_to(compose, folderidentifier); g_free(folderidentifier); } - - gtk_widget_grab_focus(compose->header_last->entry); + + /* Place cursor according to provided input (mfield) */ + switch (mfield) { + case NO_FIELD_PRESENT: + gtk_widget_grab_focus(compose->header_last->entry); + break; + case TO_FIELD_PRESENT: + buf = g_strdup(""); + gtk_entry_set_text(GTK_ENTRY(compose->subject_entry), buf); + gtk_widget_grab_focus(compose->subject_entry); + break; + case SUBJECT_FIELD_PRESENT: + textview = GTK_TEXT_VIEW(compose->text); + textbuf = gtk_text_view_get_buffer(textview); + mark = gtk_text_buffer_get_insert(textbuf); + gtk_text_buffer_get_iter_at_mark(textbuf, &iter, mark); + gtk_text_buffer_insert(textbuf, &iter, "", -1); + /* + * SUBJECT_FIELD_PRESENT and BODY_FIELD_PRESENT + * only defers where it comes to the variable body + * is not null. If no body is present compose->text + * will be null in which case you cannot place the + * cursor inside the component so. An empty component + * is therefore created before placing the cursor + */ + case BODY_FIELD_PRESENT: + gtk_widget_grab_focus(compose->text); + break; + } undo_unblock(compose->undostruct); @@ -2532,7 +2569,7 @@ void compose_toolbar_cb(gint action, gpointer data) } } -static void compose_entries_set(Compose *compose, const gchar *mailto, ComposeEntryType to_type) +static MailField compose_entries_set(Compose *compose, const gchar *mailto, ComposeEntryType to_type) { gchar *to = NULL; gchar *cc = NULL; @@ -2542,12 +2579,15 @@ static void compose_entries_set(Compose *compose, const gchar *mailto, ComposeEn gchar *temp = NULL; gsize len = 0; gchar **attach = NULL; + MailField mfield = NO_FIELD_PRESENT; /* get mailto parts but skip from */ scan_mailto_url(mailto, NULL, &to, &cc, &bcc, &subject, &body, &attach); - if (to) + if (to) { compose_entry_append(compose, to, to_type, PREF_MAILTO); + mfield = TO_FIELD_PRESENT; + } if (cc) compose_entry_append(compose, cc, COMPOSE_CC, PREF_MAILTO); if (bcc) @@ -2560,6 +2600,7 @@ static void compose_entries_set(Compose *compose, const gchar *mailto, ComposeEn } else { gtk_entry_set_text(GTK_ENTRY(compose->subject_entry), subject); } + mfield = SUBJECT_FIELD_PRESENT; } if (body) { GtkTextView *text = GTK_TEXT_VIEW(compose->text); @@ -2585,6 +2626,7 @@ static void compose_entries_set(Compose *compose, const gchar *mailto, ComposeEn compose->autowrap = prev_autowrap; if (compose->autowrap) compose_wrap_all(compose); + mfield = BODY_FIELD_PRESENT; } if (attach) { @@ -2620,6 +2662,8 @@ static void compose_entries_set(Compose *compose, const gchar *mailto, ComposeEn g_free(subject); g_free(body); g_strfreev(attach); + + return mfield; } static gint compose_parse_header(Compose *compose, MsgInfo *msginfo) -- 2.25.1