[evince/860-evince-print-shortcut-doesn-t-work-when-outline-is-focused: 559/559] ev-window.c: Don't send Ctrl and Alt accels to sidebar



commit 0dadc6cdb02b665a3eeb0ee9e02021e717564a3d
Author: Nelson Benítez León <nbenitezl gmail com>
Date:   Sat Aug 11 21:15:03 2018 +0500

    ev-window.c: Don't send Ctrl and Alt accels to sidebar
    
    Don't send Ctrl and Alt accels to sidebar, as they may be handled by
    GtkTreeView or other sidebar focused widgets, while we want them to reach
    the main EvApplication accels.
    
    We except GtkEntry's (eg. cell tex editing in tree views) as eg. Ctrl+L
    accel should be handled by GtkEntry instead of rotating document.
    
    Issues #860 and #795

 shell/ev-window.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++---
 shell/ev-window.h |  2 ++
 2 files changed, 50 insertions(+), 3 deletions(-)
---
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 8e9a86fd..760d0f9f 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -6207,15 +6207,36 @@ static gboolean
 ev_window_key_press_event (GtkWidget   *widget,
                           GdkEventKey *event)
 {
+       GtkWidget *sidebar;
+       GtkWidget *find_sidebar;
+       GtkWidget *focus_widget;
+       gboolean skip_sending_accel_to_sidebar = FALSE;
        static gpointer grand_parent_class = NULL;
        GtkWindow *window = GTK_WINDOW (widget);
 
        if (grand_parent_class == NULL)
                 grand_parent_class = g_type_class_peek_parent (ev_window_parent_class);
 
-        /* Handle focus widget key events */
-        if (gtk_window_propagate_key_event (window, event))
-               return TRUE;
+       /* Don't send Ctrl and Alt accels to sidebar, as they may be handled by
+        * GtkTreeView or other sidebar focused widgets, while we want them to reach
+        * the main EvApplication accels. Issues #860 and #795 */
+       if (event->state & GDK_CONTROL_MASK || event->state & GDK_MOD1_MASK) {
+               sidebar = ev_window_get_sidebar (EV_WINDOW (widget));
+               find_sidebar = ev_window_get_find_sidebar (EV_WINDOW (widget));
+               focus_widget = gtk_window_get_focus (window);
+
+               if (focus_widget && gtk_widget_has_focus (focus_widget) &&
+                   !GTK_IS_ENTRY (focus_widget) &&
+                   (gtk_widget_is_ancestor (focus_widget, sidebar)
+                    || gtk_widget_is_ancestor (focus_widget, find_sidebar)))
+                       skip_sending_accel_to_sidebar = TRUE;
+       }
+
+       if (!skip_sending_accel_to_sidebar) {
+               /* Handle focus widget key events */
+               if (gtk_window_propagate_key_event (window, event))
+                       return TRUE;
+       }
 
        /* Handle mnemonics and accelerators */
        if (gtk_window_activate_key (window, event))
@@ -7889,6 +7910,30 @@ ev_window_get_toolbar (EvWindow *ev_window)
        return priv->toolbar;
 }
 
+GtkWidget *
+ev_window_get_sidebar (EvWindow *ev_window)
+{
+       EvWindowPrivate *priv;
+
+       g_return_val_if_fail (EV_WINDOW (ev_window), NULL);
+
+       priv = GET_PRIVATE (ev_window);
+
+       return priv->sidebar;
+}
+
+GtkWidget *
+ev_window_get_find_sidebar (EvWindow *ev_window)
+{
+       EvWindowPrivate *priv;
+
+       g_return_val_if_fail (EV_WINDOW (ev_window), NULL);
+
+       priv = GET_PRIVATE (ev_window);
+
+       return priv->find_sidebar;
+}
+
 void
 ev_window_focus_view (EvWindow *ev_window)
 {
diff --git a/shell/ev-window.h b/shell/ev-window.h
index 3b8be3ae..cd20baaa 100644
--- a/shell/ev-window.h
+++ b/shell/ev-window.h
@@ -97,6 +97,8 @@ void            ev_window_handle_annot_popup             (EvWindow       *ev_win
                                                           EvAnnotation   *annot);
 EvMetadata     *ev_window_get_metadata                  (EvWindow       *ev_window);
 gint            ev_window_get_metadata_sidebar_size      (EvWindow       *ev_window);
+GtkWidget      *ev_window_get_sidebar                   (EvWindow       *ev_window);
+GtkWidget      *ev_window_get_find_sidebar              (EvWindow       *ev_window);
 
 G_END_DECLS
 


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