[evince] Show fullscreen toolbar only when moving the mouse to the top of the screen



commit 51b8ebc2226bc11e4dabab04423c096a8c89b8ae
Author: Giselle Machado <giselle mnr gmail com>
Date:   Sun Mar 30 22:29:45 2014 +0200

    Show fullscreen toolbar only when moving the mouse to the top of the screen
    
    When in fullscreen, the toolbar is hidden on the
    top of the screen. Moving the mouse there makes
    the toolbar appears and removing it makes it
    disappear again.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=696643

 shell/ev-window.c |  153 +++++++++++++++++++++-------------------------------
 1 files changed, 62 insertions(+), 91 deletions(-)
---
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 420e7c8..118417d 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -157,8 +157,8 @@ struct _EvWindowPrivate {
 
        /* Fullscreen */
        GtkWidget *fs_overlay;
-       gint64     fs_motion_start_time;
-       guint      fs_motion_n_events;
+       GtkWidget *fs_eventbox;
+       GtkWidget *fs_revealer;
        gboolean   fs_pointer_on_toolbar;
        guint      fs_timeout_id;
 
@@ -283,9 +283,8 @@ struct _EvWindowPrivate {
 
 #define TOOLBAR_RESOURCE_PATH "/org/gnome/evince/shell/ui/toolbar.xml"
 
-#define FULLSCREEN_POPUP_TIMEOUT 5
-#define FULLSCREEN_MOTION_TIME 200 /* in milliseconds */
-#define FULLSCREEN_MOTION_NUM_EVENTS 15
+#define FULLSCREEN_POPUP_TIMEOUT 2
+#define FULLSCREEN_TRANSITION_DURATION 1000 /* in milliseconds */
 
 #define FIND_PAGE_RATE_REFRESH 100
 
@@ -4089,113 +4088,73 @@ ev_window_update_fullscreen_action (EvWindow *window)
 }
 
 static void
-ev_window_remove_fullscreen_timeout (EvWindow *window)
-{
-       if (window->priv->fs_timeout_id)
-               g_source_remove (window->priv->fs_timeout_id);
-       window->priv->fs_timeout_id = 0;
-}
-
-static void
 ev_window_fullscreen_hide_toolbar (EvWindow *window)
 {
        if (!ev_toolbar_has_visible_popups (EV_TOOLBAR (window->priv->toolbar)))
-               gtk_widget_hide (window->priv->toolbar);
+               gtk_revealer_set_reveal_child (GTK_REVEALER (window->priv->fs_revealer), FALSE);
 }
 
 static gboolean
 fullscreen_toolbar_timeout_cb (EvWindow *window)
 {
-       window->priv->fs_timeout_id = 0;
        ev_window_fullscreen_hide_toolbar (window);
 
-       return gtk_widget_get_visible (window->priv->toolbar);
+       if (!gtk_revealer_get_reveal_child (GTK_REVEALER (window->priv->fs_revealer))) {
+               window->priv->fs_timeout_id = 0;
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 static void
-ev_window_fullscreen_show_toolbar (EvWindow *window)
+ev_window_remove_fullscreen_timeout (EvWindow *window)
 {
-       ev_window_remove_fullscreen_timeout (window);
-       gtk_widget_show (window->priv->toolbar);
+       if (window->priv->fs_timeout_id)
+               g_source_remove (window->priv->fs_timeout_id);
+       window->priv->fs_timeout_id = 0;
+}
 
+static void
+ev_window_add_fullscreen_timeout (EvWindow *window)
+{
        window->priv->fs_timeout_id =
                g_timeout_add_seconds (FULLSCREEN_POPUP_TIMEOUT,
                                       (GSourceFunc)fullscreen_toolbar_timeout_cb, window);
 }
 
-static gboolean
-ev_window_fullscreen_toolbar_enter_notify (GtkWidget        *widget,
-                                          GdkEventCrossing *event,
-                                          EvWindow         *window)
+static void
+ev_window_fullscreen_show_toolbar (EvWindow *window)
 {
        ev_window_remove_fullscreen_timeout (window);
-       window->priv->fs_pointer_on_toolbar = TRUE;
+       if (gtk_revealer_get_reveal_child (GTK_REVEALER (window->priv->fs_revealer)))
+               return;
 
-       return FALSE;
+       gtk_revealer_set_reveal_child (GTK_REVEALER (window->priv->fs_revealer), TRUE);
+       if (!window->priv->fs_pointer_on_toolbar)
+               ev_window_add_fullscreen_timeout (window);
 }
 
 static gboolean
-ev_window_fullscreen_toolbar_leave_notify (GtkWidget *widget,
+ev_window_fullscreen_toolbar_enter_notify (GtkWidget *widget,
                                           GdkEvent  *event,
                                           EvWindow  *window)
 {
-       window->priv->fs_pointer_on_toolbar = FALSE;
+       window->priv->fs_pointer_on_toolbar = TRUE;
+       ev_window_fullscreen_show_toolbar (window);
 
        return FALSE;
 }
 
-static void
-ev_window_fullscreen_motion_notify (EvWindow *window)
-{
-       gint64 motion_delay;
-       gint64 current_time;
-
-       current_time = g_get_monotonic_time ();
-       /* Only after FULLSCREEN_MOTION_NUM_EVENTS motion events,
-        * in FULLSCREEN_MOTION_TIME milliseconds will we show
-        * the toolbar
-        */
-       motion_delay = (current_time - window->priv->fs_motion_start_time) / 1000;
-       if (window->priv->fs_motion_start_time == 0 ||
-           motion_delay < 0 ||
-           motion_delay > FULLSCREEN_MOTION_TIME) {
-               window->priv->fs_motion_start_time = current_time;
-               window->priv->fs_motion_n_events = 0;
-               return;
-       }
-
-       window->priv->fs_motion_n_events++;
-       if (!window->priv->fs_pointer_on_toolbar &&
-           window->priv->fs_motion_n_events > FULLSCREEN_MOTION_NUM_EVENTS)
-               ev_window_fullscreen_show_toolbar (window);
-}
-
-static GdkFilterReturn
-fullscreen_event_filter_func (GdkXEvent *gdk_xevent,
-                             GdkEvent  *event,
-                             EvWindow  *window)
+static gboolean
+ev_window_fullscreen_toolbar_leave_notify (GtkWidget *widget,
+                                          GdkEvent  *event,
+                                          EvWindow  *window)
 {
-#ifdef GDK_WINDOWING_X11
-       XEvent *xevent = (XEvent *)gdk_xevent;
-
-       if (xevent->xany.type == ButtonPress ||
-           xevent->xany.type == ButtonRelease ||
-           xevent->xany.type == MotionNotify) {
-               ev_window_fullscreen_motion_notify (window);
-       } else if (xevent->xany.type == GenericEvent) {
-               /* we just assume this is an XI2 event */
-               XIEvent *xi_event = (XIEvent *)xevent->xcookie.data;
-
-               if (xi_event->evtype == XI_Motion ||
-                   xi_event->evtype == XI_ButtonRelease ||
-                   xi_event->evtype == XI_ButtonPress)
-                       ev_window_fullscreen_motion_notify (window);
-       }
-#else
-       /* TODO */
-#endif
+       window->priv->fs_pointer_on_toolbar = FALSE;
+       ev_window_add_fullscreen_timeout (window);
 
-       return GDK_FILTER_CONTINUE;
+       return FALSE;
 }
 
 static void
@@ -4212,32 +4171,44 @@ ev_window_run_fullscreen (EvWindow *window)
        }
 
        window->priv->fs_overlay = gtk_overlay_new ();
-       gtk_widget_add_events (window->priv->fs_overlay,
-                              GDK_ENTER_NOTIFY_MASK |
-                              GDK_LEAVE_NOTIFY_MASK);
-       g_signal_connect (window->priv->fs_overlay, "enter-notify-event",
+       window->priv->fs_eventbox = gtk_event_box_new ();
+       window->priv->fs_revealer = gtk_revealer_new ();
+       g_signal_connect (window->priv->fs_eventbox, "enter-notify-event",
                          G_CALLBACK (ev_window_fullscreen_toolbar_enter_notify),
                          window);
-       g_signal_connect (window->priv->fs_overlay, "leave-notify-event",
+       g_signal_connect (window->priv->fs_eventbox, "leave-notify-event",
                          G_CALLBACK (ev_window_fullscreen_toolbar_leave_notify),
                          window);
 
+       gtk_widget_set_size_request (window->priv->fs_eventbox, -1, 1);
+       gtk_widget_set_valign (window->priv->fs_eventbox, GTK_ALIGN_START);
+       gtk_revealer_set_transition_type (GTK_REVEALER (window->priv->fs_revealer), 
GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP);
+       gtk_revealer_set_transition_duration (GTK_REVEALER (window->priv->fs_revealer), 
FULLSCREEN_TRANSITION_DURATION);
+
        g_object_ref (window->priv->main_box);
        gtk_container_remove (GTK_CONTAINER (window), window->priv->main_box);
        gtk_container_add (GTK_CONTAINER (window->priv->fs_overlay),
                           window->priv->main_box);
        g_object_unref (window->priv->main_box);
 
-       gtk_container_add (GTK_CONTAINER (window), window->priv->fs_overlay);
-       gtk_widget_show (window->priv->fs_overlay);
 
        g_object_ref (window->priv->toolbar);
        gtk_container_remove (GTK_CONTAINER (window->priv->main_box),
                              window->priv->toolbar);
-       gtk_overlay_add_overlay (GTK_OVERLAY (window->priv->fs_overlay),
-                                window->priv->toolbar);
+       gtk_container_add (GTK_CONTAINER (window->priv->fs_revealer),
+                          window->priv->toolbar);
        g_object_unref (window->priv->toolbar);
 
+       gtk_container_add (GTK_CONTAINER (window->priv->fs_eventbox),
+                          window->priv->fs_revealer);
+       gtk_widget_show (window->priv->fs_revealer);
+       gtk_overlay_add_overlay (GTK_OVERLAY (window->priv->fs_overlay),
+                                window->priv->fs_eventbox);
+       gtk_widget_show (window->priv->fs_eventbox);
+
+       gtk_container_add (GTK_CONTAINER (window), window->priv->fs_overlay);
+       gtk_widget_show (window->priv->fs_overlay);
+
        g_object_set (G_OBJECT (window->priv->scrolled_window),
                      "shadow-type", GTK_SHADOW_NONE,
                      NULL);
@@ -4245,8 +4216,6 @@ ev_window_run_fullscreen (EvWindow *window)
        ev_document_model_set_fullscreen (window->priv->model, TRUE);
        ev_window_update_fullscreen_action (window);
 
-       gdk_window_add_filter (NULL, (GdkFilterFunc)fullscreen_event_filter_func, window);
-
        ev_window_fullscreen_show_toolbar (window);
 
        if (fullscreen_window)
@@ -4265,8 +4234,12 @@ ev_window_stop_fullscreen (EvWindow *window,
                return;
 
        g_object_ref (window->priv->toolbar);
-       gtk_container_remove (GTK_CONTAINER (window->priv->fs_overlay),
+       gtk_container_remove (GTK_CONTAINER (window->priv->fs_revealer),
                              window->priv->toolbar);
+       gtk_container_remove (GTK_CONTAINER (window->priv->fs_eventbox),
+                             window->priv->fs_revealer);
+       gtk_container_remove (GTK_CONTAINER (window->priv->fs_overlay),
+                             window->priv->fs_eventbox);
        gtk_box_pack_start (GTK_BOX (window->priv->main_box),
                            window->priv->toolbar,
                            FALSE, TRUE, 0);
@@ -4292,8 +4265,6 @@ ev_window_stop_fullscreen (EvWindow *window,
        ev_document_model_set_fullscreen (window->priv->model, FALSE);
        ev_window_update_fullscreen_action (window);
 
-       gdk_window_remove_filter (NULL, (GdkFilterFunc)fullscreen_event_filter_func, window);
-
        if (unfullscreen_window)
                gtk_window_unfullscreen (GTK_WINDOW (window));
 


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