[evolution] Bug #711351 - Folder change in folder tree steals focus



commit d325d27f96d7b3db849924b0282799968fb06010
Author: Milan Crha <mcrha redhat com>
Date:   Fri Mar 7 14:48:30 2014 +0100

    Bug #711351 - Folder change in folder tree steals focus

 modules/mail/e-mail-shell-content.c |    3 ++
 shell/e-shell-searchbar.c           |   10 ++++++-
 shell/e-shell-searchbar.h           |    2 +
 shell/e-shell-window-actions.c      |   47 ++++++++++++++++++++++++++++++++++-
 4 files changed, 60 insertions(+), 2 deletions(-)
---
diff --git a/modules/mail/e-mail-shell-content.c b/modules/mail/e-mail-shell-content.c
index bd631f1..24c4ec6 100644
--- a/modules/mail/e-mail-shell-content.c
+++ b/modules/mail/e-mail-shell-content.c
@@ -222,6 +222,9 @@ mail_shell_content_focus_search_results (EShellContent *shell_content)
        reader = E_MAIL_READER (mail_shell_content->priv->mail_view);
        message_list = e_mail_reader_get_message_list (reader);
 
+       if (!message_list || MESSAGE_LIST (message_list)->just_set_folder)
+               return;
+
        gtk_widget_grab_focus (message_list);
 }
 
diff --git a/shell/e-shell-searchbar.c b/shell/e-shell-searchbar.c
index d00ed7c..2c070cf 100644
--- a/shell/e-shell-searchbar.c
+++ b/shell/e-shell-searchbar.c
@@ -477,7 +477,6 @@ shell_searchbar_option_changed_cb (GtkRadioAction *action,
                        e_shell_view_execute_search (shell_view);
                } else {
                        shell_searchbar_save_search_option (searchbar);
-                       gtk_widget_grab_focus (searchbar->priv->search_entry);
                }
 
        } else if (search_text != NULL)
@@ -1443,3 +1442,12 @@ e_shell_searchbar_save_state (EShellSearchbar *searchbar)
 
        searchbar->priv->state_dirty = FALSE;
 }
+
+void
+e_shell_searchbar_search_entry_grab_focus (EShellSearchbar *searchbar)
+{
+       g_return_if_fail (E_IS_SHELL_SEARCHBAR (searchbar));
+       g_return_if_fail (searchbar->priv->search_entry);
+
+       gtk_widget_grab_focus (searchbar->priv->search_entry);
+}
diff --git a/shell/e-shell-searchbar.h b/shell/e-shell-searchbar.h
index dc0b22b..e5ccfb1 100644
--- a/shell/e-shell-searchbar.h
+++ b/shell/e-shell-searchbar.h
@@ -110,6 +110,8 @@ void                e_shell_searchbar_set_state_group
                                                 const gchar *state_group);
 void           e_shell_searchbar_load_state    (EShellSearchbar *searchbar);
 void           e_shell_searchbar_save_state    (EShellSearchbar *searchbar);
+void           e_shell_searchbar_search_entry_grab_focus
+                                               (EShellSearchbar *searchbar);
 
 G_END_DECLS
 
diff --git a/shell/e-shell-window-actions.c b/shell/e-shell-window-actions.c
index fee8559..9146b54 100644
--- a/shell/e-shell-window-actions.c
+++ b/shell/e-shell-window-actions.c
@@ -538,6 +538,41 @@ action_search_edit_cb (GtkAction *action,
        e_shell_window_update_search_menu (shell_window);
 }
 
+static void
+search_options_selection_cancel_cb (GtkMenuShell *menu,
+                                   EShellWindow *shell_window);
+
+static void
+search_options_selection_done_cb (GtkMenuShell *menu,
+                                 EShellWindow *shell_window)
+{
+       EShellView *shell_view;
+       EShellSearchbar *search_bar;
+       const gchar *view_name;
+
+       /* disconnect first */
+       g_signal_handlers_disconnect_by_func (menu, search_options_selection_done_cb, shell_window);
+       g_signal_handlers_disconnect_by_func (menu, search_options_selection_cancel_cb, shell_window);
+
+       g_return_if_fail (E_IS_SHELL_WINDOW (shell_window));
+
+       view_name = e_shell_window_get_active_view (shell_window);
+       shell_view = e_shell_window_get_shell_view (shell_window, view_name);
+       g_return_if_fail (shell_view != NULL);
+
+       search_bar = E_SHELL_SEARCHBAR (e_shell_view_get_searchbar (shell_view));
+       e_shell_searchbar_search_entry_grab_focus (search_bar);
+}
+
+static void
+search_options_selection_cancel_cb (GtkMenuShell *menu,
+                                   EShellWindow *shell_window)
+{
+       /* only disconnect both functions, thus the selection-done is not called */
+       g_signal_handlers_disconnect_by_func (menu, search_options_selection_done_cb, shell_window);
+       g_signal_handlers_disconnect_by_func (menu, search_options_selection_cancel_cb, shell_window);
+}
+
 /**
  * E_SHELL_WINDOW_ACTION_SEARCH_OPTIONS:
  * @window: an #EShellWindow
@@ -553,13 +588,23 @@ action_search_options_cb (GtkAction *action,
        EShellViewClass *shell_view_class;
        const gchar *view_name;
        const gchar *widget_path;
+       GtkWidget *popup_menu;
 
        view_name = e_shell_window_get_active_view (shell_window);
        shell_view = e_shell_window_get_shell_view (shell_window, view_name);
        shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
 
        widget_path = shell_view_class->search_options;
-       e_shell_view_show_popup_menu (shell_view, widget_path, NULL);
+       popup_menu = e_shell_view_show_popup_menu (shell_view, widget_path, NULL);
+
+       if (popup_menu) {
+               g_return_if_fail (GTK_IS_MENU_SHELL (popup_menu));
+
+               g_signal_connect_object (popup_menu, "selection-done",
+                       G_CALLBACK (search_options_selection_done_cb), shell_window, 0);
+               g_signal_connect_object (popup_menu, "cancel",
+                       G_CALLBACK (search_options_selection_cancel_cb), shell_window, 0);
+       }
 }
 
 /**


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]