talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 587f99eceae540a9a3bd48008cfc8d8d1608bb76
parent 6fabb95705a44bd0ab9df39eaa026dcb84a98dcb
Author: Michael Rasmussen <mir@datanom.net>
Date:   Mon, 30 Nov 2009 20:35:29 +0000

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.

Diffstat:
MChangeLog | 8++++++++
MPATCHSETS | 1+
Mconfigure.ac | 2+-
Msrc/compose.c | 60++++++++++++++++++++++++++++++++++++++++++++++++++++--------
4 files changed, 62 insertions(+), 9 deletions(-)

diff --git 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 @@ -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 @@ -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 @@ -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)