Fix 534 quick-search bar not accepting certain letters
authorColin Leroy <colin@colino.net>
Sat, 17 Jul 2004 21:15:07 +0000 (21:15 +0000)
committerColin Leroy <colin@colino.net>
Sat, 17 Jul 2004 21:15:07 +0000 (21:15 +0000)
ChangeLog-gtk2.claws
PATCHSETS
configure.ac
src/folderview.c
src/gtk/quicksearch.c
src/gtk/quicksearch.h
src/mainwindow.c
src/mimeview.c
src/summaryview.c

index db90dd6ec89729c852154e6b6d4dca6779cf2e2e..3a7c310639235e3c02774f124dd138de77657c41 100644 (file)
@@ -1,3 +1,15 @@
+2004-07-17 [colin]     0.9.12cvs30.2
+
+       * src/folderview.c
+       * src/mainwindow.c
+       * src/mimeview.c
+       * src/summaryview.c
+       * src/gtk/quicksearch.c
+       * src/gtk/quicksearch.h
+               Block key events handlers *and* accels while
+               quicksearch is focused
+       (Fixes Bug 534 quick-search bar not accepting certain letters)
+
 2004-07-17 [colin]     0.9.12cvs30.1
 
        * src/folder.h
index 6cdb1364d0ff55d15e7b7712dba2746fca8c0858..1e20d4b0b5bcacd15018a3d9c58681042fd6079a 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
@@ -33,3 +33,4 @@
 ( cvs diff -u -r 1.2504.2.7 -r 1.2504.2.8 ChangeLog.claws; cvs diff -u -r 1.654.2.60 -r 1.654.2.61 configure.ac; cvs diff -u -r 1.83.2.9 -r 1.83.2.10 src/mimeview.c; ) > 0.9.12cvs28.1.patchset
 ( cvs diff -u -r 1.83.2.10 -r 1.83.2.11 src/mimeview.c; cvs diff -u -r 1.49.2.7 -r 1.49.2.8 src/procmime.c; cvs diff -u -r 1.395.2.18 -r 1.395.2.19 src/summaryview.c; cvs diff -u -r 1.5.2.6 -r 1.5.2.7 src/gtk/menu.c; ) > 0.9.12cvs28.2.patchset
 ( cvs diff -u -r 1.29.2.1 -r 1.29.2.2 INSTALL; cvs diff -u -r 1.1.2.3 -r 1.1.2.4 commitHelper; cvs diff -u -r 1.87.2.7 -r 1.87.2.8 src/folder.h; cvs diff -u -r 1.207.2.6 -r 1.207.2.7 src/folderview.c; cvs diff -u -r 1.395.2.19 -r 1.395.2.20 src/summaryview.c; ) > 0.9.12cvs28.3.patchset
+( cvs diff -u -r 1.207.2.7 -r 1.207.2.8 src/folderview.c; cvs diff -u -r 1.274.2.9 -r 1.274.2.10 src/mainwindow.c; cvs diff -u -r 1.83.2.11 -r 1.83.2.12 src/mimeview.c; cvs diff -u -r 1.395.2.20 -r 1.395.2.21 src/summaryview.c; cvs diff -u -r 1.1.2.10 -r 1.1.2.11 src/gtk/quicksearch.c; cvs diff -u -r 1.1.2.3 -r 1.1.2.4 src/gtk/quicksearch.h; ) > 0.9.12cvs30.2.patchset
index f7e63261e6606bdd7cbc35b24a9f898af2eac442..f848ccb6d5297f856688637a8a855ca8aea33401 100644 (file)
@@ -13,7 +13,7 @@ INTERFACE_AGE=0
 BINARY_AGE=0
 EXTRA_VERSION=30
 EXTRA_RELEASE=
-EXTRA_GTK2_VERSION=.1
+EXTRA_GTK2_VERSION=.2
 
 if test \( $EXTRA_VERSION -eq 0 \) -o \( "x$EXTRA_RELEASE" != "x" \); then
     VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}${EXTRA_RELEASE}${EXTRA_GTK2_VERSION}
index 6fafb4773ca0900f50944b562bdb92678fe5f60e..821320e00b2a850986a8eb99c31ddc27cac91c6f 100644 (file)
@@ -1430,6 +1430,9 @@ static gboolean folderview_key_pressed(GtkWidget *widget, GdkEventKey *event,
 {
        if (!event) return FALSE;
 
+       if (quicksearch_has_focus(folderview->summaryview->quicksearch))
+               return FALSE;
+
        switch (event->keyval) {
        case GDK_Return:
                if (folderview->selected) {
index 26a9037b829a8ce3a461dc680c4d9611a3a3591a..9f88fc54247e6c107d6f942a53e07fd3897006ec 100644 (file)
@@ -48,6 +48,7 @@ struct _QuickSearch
        QuickSearchExecuteCallback       callback;
        gpointer                         callback_data;
        gboolean                         running;
+       gboolean                         has_focus;
 };
 
 static void quicksearch_set_running(QuickSearch *quicksearch, gboolean run);
@@ -103,6 +104,18 @@ static void update_extended_button (QuickSearch *quicksearch)
        
 }
 
+static gboolean searchbar_focus_evt(GtkWidget *widget, GdkEventFocus *event,
+                                 QuickSearch *quicksearch)
+{
+       quicksearch->has_focus = (event && event->in);
+       return FALSE;
+}
+
+gboolean quicksearch_has_focus(QuickSearch *quicksearch)
+{
+       return quicksearch->has_focus;
+}
+
 static gboolean searchbar_pressed(GtkWidget *widget, GdkEventKey *event,
                                  QuickSearch *quicksearch)
 {
@@ -229,21 +242,6 @@ static gboolean clear_search_cb(GtkMenuItem *widget, gpointer data)
        return TRUE;
 };
 
-/*
-static void summary_searchbar_focus_evt(GtkWidget *widget, GdkEventFocus *event,
-                                       SummaryView *summaryview)
-{
-       if (event != NULL && event->in)
-               gtk_signal_handler_block_by_func(GTK_OBJECT(summaryview->mainwin->window), 
-                                                GTK_SIGNAL_FUNC(mainwindow_key_pressed),
-                                                summaryview->mainwin);
-       else
-               gtk_signal_handler_unblock_by_func(GTK_OBJECT(summaryview->mainwin->window), 
-                                                  GTK_SIGNAL_FUNC(mainwindow_key_pressed),
-                                                  summaryview->mainwin);
-}
-*/
-
 QuickSearch *quicksearch_new()
 {
        QuickSearch *quicksearch;
@@ -336,17 +334,17 @@ QuickSearch *quicksearch_new()
                           G_CALLBACK(searchbar_pressed),
                           quicksearch);
 
-       /*
-       gtk_signal_connect(GTK_OBJECT(GTK_COMBO(search_string_entry)->entry), 
+       
+       g_signal_connect(GTK_OBJECT(GTK_COMBO(search_string_entry)->entry), 
                           "focus_in_event",
                           GTK_SIGNAL_FUNC(searchbar_focus_evt),
                           quicksearch);
 
-       gtk_signal_connect(GTK_OBJECT(GTK_COMBO(search_string_entry)->entry), 
+       g_signal_connect(GTK_OBJECT(GTK_COMBO(search_string_entry)->entry), 
                           "focus_out_event",
                           GTK_SIGNAL_FUNC(searchbar_focus_evt),
                           quicksearch);
-       */
+       
 
        quicksearch->hbox_search = hbox_search;
        quicksearch->search_type = search_type;
@@ -631,3 +629,30 @@ gboolean quicksearch_is_running(QuickSearch *quicksearch)
        return quicksearch->running;
 }
 
+void quicksearch_pass_key(QuickSearch *quicksearch, guint val, GdkModifierType mod)
+{
+       GtkEntry *entry = GTK_ENTRY(GTK_COMBO(quicksearch->search_string_entry)->entry);
+       gint curpos = gtk_editable_get_position(GTK_EDITABLE(entry));
+       char *str = g_strdup(gtk_entry_get_text(entry));
+       char *begin = str;
+       char *end = NULL;
+       char *new = NULL;
+       
+       if (mod == GDK_SHIFT_MASK)
+               val = toupper(val);
+       
+       if (curpos < strlen(str)-1) {
+               end = g_strdup(str+curpos);
+               *(str+curpos) = '\0';
+               new = g_strdup_printf("%s%c%s", begin, val, end);
+               gtk_entry_set_text(entry, new);
+               g_free(end);
+       } else {
+               new = g_strdup_printf("%s%c", begin, val);
+               gtk_entry_set_text(entry, new);
+       }
+       g_free(str);
+       g_free(new);
+       gtk_editable_set_position(GTK_EDITABLE(entry), curpos+1);
+       
+}
index 0458b5160657b4f040997de1528107e23d9791ad..5aa55439d0f0910549be7dd9547312246132b439 100644 (file)
@@ -45,5 +45,7 @@ void quicksearch_set_execute_callback(QuickSearch *quicksearch,
 gboolean quicksearch_match(QuickSearch *quicksearch, MsgInfo *msginfo);
 gchar *expand_search_string(const gchar *str);
 gboolean quicksearch_is_running(QuickSearch *quicksearch);
+gboolean quicksearch_has_focus(QuickSearch *quicksearch);
+void quicksearch_pass_key(QuickSearch *quicksearch, guint val, GdkModifierType mod);
 
 #endif /* QUICKSEARCH_H */
index 946f6a0b68d90b02a4cd2ae461b3c0be0734074d..5f821da39de604a2b12288e9d9088ffff5cee7ba 100644 (file)
@@ -750,6 +750,24 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {N_("/_Help/_About"),                   NULL, about_show, 0, NULL}
 };
 
+static gboolean main_window_accel_activate (GtkAccelGroup *accelgroup,
+                                            GObject *arg1,
+                                            guint value,
+                                            GdkModifierType mod,
+                                            gpointer user_data) 
+{
+       MainWindow *mainwin = (MainWindow *)user_data;
+
+       if (mainwin->summaryview &&
+           mainwin->summaryview->quicksearch &&
+           quicksearch_has_focus(mainwin->summaryview->quicksearch) &&
+           (mod == 0 || mod == GDK_SHIFT_MASK)) {
+               quicksearch_pass_key(mainwin->summaryview->quicksearch, value, mod);
+               return TRUE;
+       }
+       return FALSE;
+}
+
 MainWindow *main_window_create(SeparateType type)
 {
        MainWindow *mainwin;
@@ -1029,10 +1047,14 @@ MainWindow *main_window_create(SeparateType type)
        main_window_update_actions_menu(mainwin);
 
        /* attach accel groups to main window */
-#define        ADD_MENU_ACCEL_GROUP_TO_WINDOW(menu,win)        \
-       gtk_window_add_accel_group                      \
-               (GTK_WINDOW(win),                       \
-                gtk_item_factory_from_widget(menu)->accel_group)                
+#define        ADD_MENU_ACCEL_GROUP_TO_WINDOW(menu,win)                        \
+       gtk_window_add_accel_group                                      \
+               (GTK_WINDOW(win),                                       \
+                gtk_item_factory_from_widget(menu)->accel_group);      \
+       g_signal_connect(G_OBJECT(gtk_item_factory_from_widget(menu)->accel_group), \
+                       "accel_activate",                               \
+                       G_CALLBACK(main_window_accel_activate), mainwin);
+                        
        
        ADD_MENU_ACCEL_GROUP_TO_WINDOW(summaryview->popupmenu, mainwin->window);
        
@@ -3004,14 +3026,18 @@ gboolean mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
 {
        MainWindow *mainwin = (MainWindow*) data;
        
-       if (!mainwin || !event) return;
-               
+       if (!mainwin || !event) 
+               return FALSE;
+
+       if (quicksearch_has_focus(mainwin->summaryview->quicksearch))
+               return FALSE;
+
        switch (event->keyval) {
        case GDK_Q:             /* Quit */
                BREAK_ON_MODIFIER_KEY();
 
                app_exit_cb(mainwin, 0, NULL);
-               return;
+               return FALSE;
        case GDK_space:
                if (mainwin->folderview && mainwin->summaryview
                    && !mainwin->summaryview->displayed) {
index 33fa522fb844705904aca31e6de0a9db866257e7..8361bf0805151979bb7fbc3d56e01e4d79827100 100644 (file)
@@ -868,6 +868,11 @@ static gint mimeview_key_pressed(GtkWidget *widget, GdkEventKey *event,
        if (!event) return FALSE;
        if (!mimeview->opened) return FALSE;
 
+       summaryview = mimeview->messageview->mainwin->summaryview;
+       
+       if (summaryview && quicksearch_has_focus(summaryview->quicksearch))
+               return FALSE;
+               
        switch (event->keyval) {
        case GDK_space:
                if (textview_scroll_page(mimeview->textview, FALSE))
@@ -928,7 +933,7 @@ static gint mimeview_key_pressed(GtkWidget *widget, GdkEventKey *event,
        }
 
        if (!mimeview->messageview->mainwin) return FALSE;
-       summaryview = mimeview->messageview->mainwin->summaryview;
+
        summary_pass_key_press_event(summaryview, event);
        return TRUE;
 }
index 177ece37ee0b408935d8c0e5cc2e683044a3039c..563961829ff5a04dff57b2768e75c84ab36c367b 100644 (file)
@@ -4333,6 +4333,9 @@ static gboolean summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
        if (summary_is_locked(summaryview)) return TRUE;
        if (!event) return TRUE;
 
+       if (quicksearch_has_focus(summaryview->quicksearch))
+               return FALSE;
+
        switch (event->keyval) {
        case GDK_Left:          /* Move focus */
                adj = gtk_scrolled_window_get_hadjustment