implement RFC 3196, 'When changing quicksearch Search Type, set focus to search input...
[claws.git] / src / gtk / quicksearch.c
index 342d061f46ba370c47bb9fb763c1a131c74d55b5..f10948b9ee507021879558ba07f558e20b29b213 100644 (file)
@@ -167,10 +167,19 @@ static void quicksearch_invoke_execute(QuickSearch *quicksearch, gboolean run_on
 gboolean quicksearch_run_on_folder(QuickSearch* quicksearch, FolderItem *folderItem, MsgInfoList **result)
 {
        if (quicksearch_has_sat_predicate(quicksearch)) {
+               gboolean was_running = quicksearch_is_running(quicksearch);
                gboolean searchres;
+
+               if (!was_running)
+                       quicksearch_set_running(quicksearch, TRUE);
+
                main_window_cursor_wait(mainwindow_get_mainwindow());
                searchres = advsearch_search_msgs_in_folders(quicksearch->asearch, result, folderItem, FALSE);
                main_window_cursor_normal(mainwindow_get_mainwindow());
+
+               if (!was_running)
+                       quicksearch_set_running(quicksearch, FALSE);
+
                if (quicksearch->want_reexec) {
                        advsearch_set(quicksearch->asearch, quicksearch->request.type, "");
                }
@@ -294,7 +303,7 @@ static void searchbar_changed_cb(GtkWidget *widget, QuickSearch *qs)
        }
 
        if (prefs_common.summary_quicksearch_dynamic) {
-               if (qs->press_timeout_id != -1) {
+               if (qs->press_timeout_id != 0) {
                        g_source_remove(qs->press_timeout_id);
                }
                qs->press_timeout_id = g_timeout_add(500,
@@ -331,9 +340,9 @@ static gboolean searchbar_pressed(GtkWidget *widget, GdkEventKey *event,
        }
 
        if (event != NULL && (event->keyval == GDK_KEY_Return || event->keyval == GDK_KEY_KP_Enter)) {
-               if (quicksearch->press_timeout_id != -1) {
+               if (quicksearch->press_timeout_id != 0) {
                        g_source_remove(quicksearch->press_timeout_id);
-                       quicksearch->press_timeout_id = -1;
+                       quicksearch->press_timeout_id = 0;
                }
                quicksearch->in_typing = FALSE;
                /* add expression to history list and exec quicksearch */
@@ -367,6 +376,7 @@ static gboolean searchtype_changed(GtkMenuItem *widget, gpointer data)
        quicksearch_set_popdown_strings(quicksearch);
 
        quicksearch_invoke_execute(quicksearch, FALSE);
+       gtk_widget_grab_focus(quicksearch->search_string_entry);
 
        return TRUE;
 }
@@ -463,7 +473,7 @@ static gchar *search_descr_strings[] = {
        "N",     N_("new messages"),
        "O",     N_("old messages"),
        "p",     N_("incomplete messages (not entirely downloaded)"),
-       "r",     N_("messages which have been replied to"),
+       "r",     N_("messages which you have replied to"),
        "R",     N_("read messages"),
        "s S",   N_("messages which contain S in subject"),
        "se #",  N_("messages whose score is equal to # points"),
@@ -505,7 +515,7 @@ static DescriptionWindow search_descr = {
 
 static void search_description_cb(GtkWidget *widget)
 {
-       search_descr.parent = mainwindow_get_mainwindow()->window;
+       search_descr.parent = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "description_window");
        description_window_create(&search_descr);
 };
 
@@ -628,7 +638,7 @@ QuickSearch *quicksearch_new()
        quicksearch->active = FALSE;
        quicksearch->running = FALSE;
        quicksearch->in_typing = FALSE;
-       quicksearch->press_timeout_id = -1;
+       quicksearch->press_timeout_id = 0;
        quicksearch->normal_search_strings = NULL;
        quicksearch->extended_search_strings = NULL;
 
@@ -800,12 +810,12 @@ QuickSearch *quicksearch_new()
        quicksearch->running = FALSE;
        quicksearch->clear_search = clear_search;
        quicksearch->in_typing = FALSE;
-       quicksearch->press_timeout_id = -1;
+       quicksearch->press_timeout_id = 0;
        quicksearch->normal_search_strings = NULL;
        quicksearch->extended_search_strings = NULL;
 
        quicksearch_set_button(GTK_BUTTON(quicksearch->search_description), GTK_STOCK_INFO, _("_Information"));
-       quicksearch_set_button(GTK_BUTTON(quicksearch->search_condition_expression), GTK_STOCK_EDIT, _("_Edit"));
+       quicksearch_set_button(GTK_BUTTON(quicksearch->search_condition_expression), GTK_STOCK_EDIT, _("E_dit"));
        quicksearch_set_button(GTK_BUTTON(quicksearch->clear_search), GTK_STOCK_CLEAR, _("C_lear"));
        
        update_extended_buttons(quicksearch);
@@ -820,7 +830,7 @@ void quicksearch_relayout(QuickSearch *quicksearch)
        case WIDE_LAYOUT:
        case WIDE_MSGLIST_LAYOUT:
                quicksearch_set_button(GTK_BUTTON(quicksearch->search_description), GTK_STOCK_INFO, _("_Information"));
-               quicksearch_set_button(GTK_BUTTON(quicksearch->search_condition_expression), GTK_STOCK_EDIT, _("_Edit"));
+               quicksearch_set_button(GTK_BUTTON(quicksearch->search_condition_expression), GTK_STOCK_EDIT, _("E_dit"));
                quicksearch_set_button(GTK_BUTTON(quicksearch->clear_search), GTK_STOCK_CLEAR, _("C_lear"));
                break;
        case SMALL_LAYOUT:
@@ -843,8 +853,7 @@ void quicksearch_show(QuickSearch *quicksearch)
        GtkWidget *ctree = NULL;
        gtk_widget_show(quicksearch->hbox_search);
        update_extended_buttons(quicksearch);
-       gtk_widget_grab_focus(
-               GTK_WIDGET(gtk_bin_get_child(GTK_BIN((quicksearch->search_string_entry)))));
+       gtk_widget_grab_focus(quicksearch->search_string_entry);
 
        if (!mainwin || !mainwin->summaryview) {
                return;
@@ -1066,25 +1075,23 @@ void quicksearch_set_search_strings(QuickSearch *quicksearch)
                                        g_list_append(
                                                quicksearch->normal_search_strings,
                                                g_strdup(strings->data));
-                               g_free(newstr);
-                               continue;
-                       }
-                       
-                       matcher_list = matcher_parser_get_cond(newstr, FALSE);
-                       g_free(newstr);
+                       } else {
+                               matcher_list = matcher_parser_get_cond(newstr, FALSE);
                        
-                       if (matcher_list) {
-                               quicksearch->extended_search_strings =
-                                       g_list_prepend(
-                                               quicksearch->extended_search_strings,
-                                               g_strdup(strings->data));
-                               matcherlist_free(matcher_list);
-                       } else
-                               quicksearch->normal_search_strings =
-                                       g_list_prepend(
-                                               quicksearch->normal_search_strings,
-                                               g_strdup(strings->data));
+                               if (matcher_list) {
+                                       quicksearch->extended_search_strings =
+                                               g_list_prepend(
+                                                       quicksearch->extended_search_strings,
+                                                       g_strdup(strings->data));
+                                       matcherlist_free(matcher_list);
+                               } else
+                                       quicksearch->normal_search_strings =
+                                               g_list_prepend(
+                                                       quicksearch->normal_search_strings,
+                                                       g_strdup(strings->data));
+                       }
                }
+               g_free(newstr);
        
        } while ((strings = g_list_next(strings)) != NULL);