[evince/dont_grab_focus_from_mouse: 2/3] sidebar pages: dont grab focus from mouse clicks




commit 6204d0e71b1a1908bdf330a76d96836dc27980db
Author: Nelson Benítez León <nbenitezl gmail com>
Date:   Sun Jan 16 16:05:44 2022 -0400

    sidebar pages: dont grab focus from mouse clicks
    
    When the mouse is used to click on sidebar
    elements (Outline entries, Annotation entries,
    Bookmark entries, Thumbnail pictures) the focus
    should not be passed from main view to sidebar,
    that should only happen when the user explicitly
    uses the TAB key to switch keyboard focus.
    
    Part of issue #704

 shell/ev-sidebar-thumbnails.c | 18 ++++++++++++++++++
 shell/ev-sidebar.c            | 31 +++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+)
---
diff --git a/shell/ev-sidebar-thumbnails.c b/shell/ev-sidebar-thumbnails.c
index 1993fd53a..b2c227709 100644
--- a/shell/ev-sidebar-thumbnails.c
+++ b/shell/ev-sidebar-thumbnails.c
@@ -104,6 +104,7 @@ static void         ev_sidebar_thumbnails_reload           (EvSidebarThumbnails
 static void         adjustment_changed_cb                  (EvSidebarThumbnails     *sidebar_thumbnails);
 static void         check_toggle_blank_first_dual_mode     (EvSidebarThumbnails     *sidebar_thumbnails);
 static void         check_toggle_blank_first_dual_mode_when_resizing (EvSidebarThumbnails 
*sidebar_thumbnails);
+static EvWindow *   ev_sidebar_thumbnails_get_ev_window    (EvSidebarThumbnails *sidebar);
 
 G_DEFINE_TYPE_EXTENDED (EvSidebarThumbnails, 
                         ev_sidebar_thumbnails, 
@@ -653,6 +654,20 @@ ev_sidebar_thumbnails_fill_model (EvSidebarThumbnails *sidebar_thumbnails)
        }
 }
 
+static gboolean
+button_release_cb (GtkIconView *icon_view,
+                  GdkEventButton *event,
+                  EvSidebarThumbnails *sidebar_thumbnails)
+{
+       EvWindow *ev_window;
+
+       ev_window = ev_sidebar_thumbnails_get_ev_window (sidebar_thumbnails);
+       if (ev_window)
+               ev_window_focus_view (ev_window);
+
+       return GDK_EVENT_STOP;
+}
+
 static void
 ev_sidebar_icon_selection_changed (GtkIconView         *icon_view,
                                   EvSidebarThumbnails *ev_sidebar_thumbnails)
@@ -731,6 +746,9 @@ ev_sidebar_init_icon_view (EvSidebarThumbnails *ev_sidebar_thumbnails)
        g_signal_connect_data (priv->model, "notify::dual-odd-left",
                               G_CALLBACK (check_toggle_blank_first_dual_mode), ev_sidebar_thumbnails,
                               NULL, G_CONNECT_SWAPPED | G_CONNECT_AFTER);
+       g_signal_connect (priv->icon_view, "button-release-event",
+                         G_CALLBACK (button_release_cb), ev_sidebar_thumbnails);
+
 
        check_toggle_blank_first_dual_mode (ev_sidebar_thumbnails);
        gtk_container_add (GTK_CONTAINER (priv->swindow), priv->icon_view);
diff --git a/shell/ev-sidebar.c b/shell/ev-sidebar.c
index ff8ca1d16..17eef23a1 100644
--- a/shell/ev-sidebar.c
+++ b/shell/ev-sidebar.c
@@ -35,6 +35,7 @@
 
 #include "ev-sidebar.h"
 #include "ev-sidebar-page.h"
+#include "ev-window.h"
 
 enum
 {
@@ -186,6 +187,34 @@ ev_sidebar_child_change_cb (GObject    *gobject,
                g_object_notify (G_OBJECT (ev_sidebar), "current-page");
 }
 
+static EvWindow *
+ev_sidebar_get_ev_window (EvSidebar *sidebar)
+{
+       GtkWidget *toplevel;
+
+       toplevel = gtk_widget_get_toplevel (GTK_WIDGET (sidebar));
+
+       if (toplevel && EV_IS_WINDOW (toplevel))
+               return EV_WINDOW (toplevel);
+
+       return NULL;
+}
+
+static gboolean
+button_release_cb (EvSidebar *ev_sidebar,
+                  GdkEventButton *event,
+                  gpointer data)
+{
+       EvWindow *ev_window;
+
+       ev_window = ev_sidebar_get_ev_window (ev_sidebar);
+       if (ev_window)
+               ev_window_focus_view (ev_window);
+
+       return GDK_EVENT_STOP;
+}
+
+
 static void
 ev_sidebar_init (EvSidebar *ev_sidebar)
 {
@@ -224,6 +253,8 @@ ev_sidebar_init (EvSidebar *ev_sidebar)
        g_signal_connect (stack, "notify::visible-child",
                          G_CALLBACK (ev_sidebar_child_change_cb),
                          ev_sidebar);
+       g_signal_connect (ev_sidebar, "button-release-event",
+                         G_CALLBACK (button_release_cb), NULL);
 }
 
 static gboolean


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