[gthumb] fixed navigation buttons not hidden after a timeout sometimes



commit c3b7070bc6277eb9a5fbdfe992d700a27af0bdba
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Sun May 4 10:56:43 2014 +0200

    fixed navigation buttons not hidden after a timeout sometimes
    
    call hide_mouse_pointer_after_delay after showing the viewer

 gthumb/gth-browser.c |   42 +++++++++++++++++++++++++++++-------------
 gthumb/gtk-utils.c   |   18 ++++++++++++++++++
 gthumb/gtk-utils.h   |    1 +
 3 files changed, 48 insertions(+), 13 deletions(-)
---
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index a896d1e..6a3e0b0 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -2212,6 +2212,9 @@ _gth_browser_update_header_section_visibility (GthBrowser              *browser,
 }
 
 
+/* -- hide_mouse_pointer_after_delay -- */
+
+
 typedef struct {
        GthBrowser *browser;
        GdkDevice  *device;
@@ -2247,6 +2250,9 @@ pointer_on_control (HideMouseData *hmdata,
 {
        GList *scan;
 
+       if (hmdata->device == NULL)
+               return FALSE;
+
        for (scan = controls; scan; scan = scan->next)
                if (pointer_on_widget ((GtkWidget *) scan->data, hmdata->device))
                        return TRUE;
@@ -2281,13 +2287,32 @@ hide_mouse_pointer_cb (gpointer data)
 }
 
 
+static void
+hide_mouse_pointer_after_delay (GthBrowser *browser,
+                               GdkDevice  *device)
+{
+       HideMouseData *hmdata;
+
+       if (browser->priv->hide_mouse_timeout != 0)
+               g_source_remove (browser->priv->hide_mouse_timeout);
+
+       hmdata = g_new0 (HideMouseData, 1);
+       hmdata->browser = browser;
+       hmdata->device = (device != NULL) ? device : _gtk_widget_get_client_pointer (GTK_WIDGET (browser));
+       browser->priv->hide_mouse_timeout = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT,
+                                                                       HIDE_MOUSE_DELAY,
+                                                                       hide_mouse_pointer_cb,
+                                                                       hmdata,
+                                                                       g_free);
+}
+
+
 static gboolean
 viewer_motion_notify_event_cb (GtkWidget      *widget,
                               GdkEventMotion *event,
                               gpointer        data)
 {
-       GthBrowser    *browser = data;
-       HideMouseData *hmdata;
+       GthBrowser *browser = data;
 
        if (! pointer_on_widget (browser->priv->viewer_container, event->device))
                return FALSE;
@@ -2309,17 +2334,7 @@ viewer_motion_notify_event_cb (GtkWidget      *widget,
                _gth_browser_show_pointer_on_viewer (browser, TRUE);
        }
 
-       if (browser->priv->hide_mouse_timeout != 0)
-               g_source_remove (browser->priv->hide_mouse_timeout);
-
-       hmdata = g_new0 (HideMouseData, 1);
-       hmdata->browser = browser;
-       hmdata->device = event->device;
-       browser->priv->hide_mouse_timeout = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT,
-                                                                       HIDE_MOUSE_DELAY,
-                                                                       hide_mouse_pointer_cb,
-                                                                       hmdata,
-                                                                       g_free);
+       hide_mouse_pointer_after_delay (browser, event->device);
 
        browser->priv->last_mouse_x = event->x;
        browser->priv->last_mouse_y = event->y;
@@ -2352,6 +2367,7 @@ _gth_browser_real_set_current_page (GthWindow *window,
                 if (page == GTH_BROWSER_PAGE_VIEWER) {
                         gth_viewer_page_show (browser->priv->viewer_page);
                         _gth_browser_show_pointer_on_viewer (browser, FALSE);
+                        hide_mouse_pointer_after_delay (browser, NULL);
 
                        browser->priv->last_mouse_x = 0.0;
                        browser->priv->last_mouse_y = 0.0;
diff --git a/gthumb/gtk-utils.c b/gthumb/gtk-utils.c
index ba5d9b0..d3363a5 100644
--- a/gthumb/gtk-utils.c
+++ b/gthumb/gtk-utils.c
@@ -1211,3 +1211,21 @@ _gtk_window_get_is_maximized (GtkWindow *window)
 
        return (gdk_window_get_state (gdk_win) & GDK_WINDOW_STATE_MAXIMIZED) != 0;
 }
+
+
+GdkDevice *
+_gtk_widget_get_client_pointer (GtkWidget *widget)
+{
+       GdkDisplay       *display;
+       GdkDeviceManager *device_manager;
+
+       display = gtk_widget_get_display (widget);
+       if (display == NULL)
+               return NULL;
+
+       device_manager = gdk_display_get_device_manager (display);
+       if (device_manager == NULL)
+               return NULL;
+
+       return gdk_device_manager_get_client_pointer (device_manager);
+}
diff --git a/gthumb/gtk-utils.h b/gthumb/gtk-utils.h
index f1ef58b..ad11d38 100644
--- a/gthumb/gtk-utils.h
+++ b/gthumb/gtk-utils.h
@@ -145,6 +145,7 @@ void                _gtk_window_add_accelerator_for_action     (GtkWindow           
*window,
 void           _gtk_window_add_accelerators_from_menu     (GtkWindow           *window,
                                                            GMenuModel          *menu);
 gboolean       _gtk_window_get_is_maximized               (GtkWindow           *window);
+GdkDevice *     _gtk_widget_get_client_pointer            (GtkWidget           *widget);
 
 G_END_DECLS
 


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