[Xfce4-commits] <ristretto:master> Improve behaviour when in fullscreen mode

Stephan Arts stephan at xfce.org
Wed Aug 12 12:20:11 CEST 2009


Updating branch refs/heads/master
         to c75595516827f2c6fc5552e81335088a3af7da48 (commit)
       from 81c13825b177d82b6f72cb06b8e28cbae9fa8163 (commit)

commit c75595516827f2c6fc5552e81335088a3af7da48
Author: Stephan Arts <stephan at xfce.org>
Date:   Thu Apr 30 09:26:43 2009 +0200

    Improve behaviour when in fullscreen mode

 ChangeLog              |   13 ++++---
 src/main_window.c      |   95 ++++++++++++++++++++++++++++++++++++++++++++++--
 src/main_window_ui.xml |   11 ++++++
 src/picture_viewer.c   |    3 +-
 4 files changed, 112 insertions(+), 10 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 8f2b249..1f87082 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,23 +1,26 @@
 2009-04-30  Stephan Arts <stephan at xfce.org>
 
 	* src/main_window.c
-	  src/pictureviewer.c
-	  src/pictureviewer.h: Let the pictureviewer figure out the fullscreen-
+	  src/picture_viewer.c
+	  src/picture_viewer.h: Let the pictureviewer figure out the fullscreen-
 	  state of it's parent-window by itself
+	* src/main_window.c
+	  src/main_window_ui.xml: Add 'fullscreen-toolbar' with controls when in
+	  fullscreen-mode.
 
 2009-04-28  Stephan Arts <stephan at xfce.org>
 
 	* src/image.c
-	  src/pictureviewer.c: Emit 'prepared' signal when the size-prepared signal
+	  src/picture_viewer.c: Emit 'prepared' signal when the size-prepared signal
 	  is emitted, instead of waiting for the area-prepared signal. When the
 	  image is rendered at a different scale then 'maximum', the 
 	  'area-prepared', 'area-updated' and 'closed' signals are all emitted at 
 	  once. Then the thumbnail is not displayed when the image is not ready yet.
-	* src/pictureviewer.c: Do not repaint the image when the image is
+	* src/picture_viewer.c: Do not repaint the image when the image is
 	  'prepared' but there is no thumbnail available. This will prevent the
 	  image from flickering.
 	* src/image_cache.c: Implement 'enable'/'disable' of image-cache
 	* src/main_window_ui.xml
 	  src/main_window.c: Remove properties dialog menu item
-	* src/pictureviewer.c: Add a 'fullscreen' state, setting a different
+	* src/picture_viewer.c: Add a 'fullscreen' state, setting a different
 	  background-color if it is in fullscreen.
diff --git a/src/main_window.c b/src/main_window.c
index bc688da..a719125 100644
--- a/src/main_window.c
+++ b/src/main_window.c
@@ -57,6 +57,7 @@ struct _RsttoMainWindowPriv
         gboolean        toolbar_visible;
     } props;
 
+    guint show_fs_toolbar_timeout_id;
     gint window_save_geometry_timer_id;
 
     RsttoNavigatorIter *iter;
@@ -68,6 +69,7 @@ struct _RsttoMainWindowPriv
 
     GtkWidget *menubar;
     GtkWidget *toolbar;
+    GtkWidget *fs_toolbar;
     GtkWidget *picture_viewer;
     GtkWidget *p_viewer_s_window;
     GtkWidget *statusbar;
@@ -75,6 +77,8 @@ struct _RsttoMainWindowPriv
     guint      recent_merge_id;
     guint      play_merge_id;
     guint      pause_merge_id;
+    guint      fs_play_merge_id;
+    guint      fs_pause_merge_id;
 
     GtkAction *play_action;
     GtkAction *pause_action;
@@ -114,6 +118,8 @@ static gboolean
 cb_rstto_main_window_configure_event (GtkWidget *widget, GdkEventConfigure *event);
 static void
 cb_rstto_main_window_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data);
+static gboolean
+cb_rstto_main_window_show_fs_toolbar_timeout (RsttoMainWindow *window);
 
 static void
 cb_rstto_main_window_navigator_new_image (RsttoNavigator *navigator, RsttoImage *image, RsttoMainWindow *window);
@@ -177,6 +183,11 @@ cb_rstto_main_window_contents (GtkWidget *widget, RsttoMainWindow *window);
 static void
 cb_rstto_main_window_quit (GtkWidget *widget, RsttoMainWindow *window);
 
+static gboolean 
+cb_rstto_main_window_picture_viewer_motion_notify_event (RsttoPictureViewer *viewer,
+                                             GdkEventMotion *event,
+                                             gpointer user_data);
+
 static void
 rstto_main_window_set_sensitive (RsttoMainWindow *window, gboolean sensitive);
 
@@ -290,6 +301,8 @@ rstto_main_window_init (RsttoMainWindow *window)
     window->priv->recent_merge_id = gtk_ui_manager_new_merge_id (window->priv->ui_manager);
     window->priv->play_merge_id = gtk_ui_manager_new_merge_id (window->priv->ui_manager);
     window->priv->pause_merge_id = gtk_ui_manager_new_merge_id (window->priv->ui_manager);
+    window->priv->fs_play_merge_id = gtk_ui_manager_new_merge_id (window->priv->ui_manager);
+    window->priv->fs_pause_merge_id = gtk_ui_manager_new_merge_id (window->priv->ui_manager);
 
 
     window->priv->play_action = gtk_action_new ("play", "_Play", "Play slideshow", GTK_STOCK_MEDIA_PLAY);
@@ -329,6 +342,7 @@ rstto_main_window_init (RsttoMainWindow *window)
     gtk_ui_manager_add_ui_from_string (window->priv->ui_manager,main_window_ui, main_window_ui_length, NULL);
     window->priv->menubar = gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-menu");
     window->priv->toolbar = gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar");
+    window->priv->fs_toolbar = gtk_ui_manager_get_widget (window->priv->ui_manager, "/fullscreen-toolbar");
 
     /**
      * Get the separator toolitem and tell it to expand
@@ -337,6 +351,10 @@ rstto_main_window_init (RsttoMainWindow *window)
     gtk_tool_item_set_expand (GTK_TOOL_ITEM (separator), TRUE);
     gtk_separator_tool_item_set_draw (GTK_SEPARATOR_TOOL_ITEM (separator), FALSE);
 
+    separator = gtk_ui_manager_get_widget (window->priv->ui_manager, "/fullscreen-toolbar/separator-1");
+    gtk_tool_item_set_expand (GTK_TOOL_ITEM (separator), TRUE);
+    gtk_separator_tool_item_set_draw (GTK_SEPARATOR_TOOL_ITEM (separator), FALSE);
+
     /**
      * Make the back and forward toolitems important,
      * when they are, the labels are shown when the toolbar style is 'both-horizontal'
@@ -359,10 +377,12 @@ rstto_main_window_init (RsttoMainWindow *window)
     gtk_box_pack_start(GTK_BOX(main_vbox), window->priv->menubar, FALSE, FALSE, 0);
     gtk_box_pack_start(GTK_BOX(main_vbox), window->priv->toolbar, FALSE, FALSE, 0);
     gtk_box_pack_start(GTK_BOX(main_vbox), window->priv->p_viewer_s_window, TRUE, TRUE, 0);
+    gtk_box_pack_start(GTK_BOX(main_vbox), window->priv->fs_toolbar, FALSE, FALSE, 0);
     gtk_box_pack_start(GTK_BOX(main_vbox), window->priv->statusbar, FALSE, FALSE, 0);
 
     rstto_main_window_set_sensitive (window, FALSE);
     gtk_widget_set_no_show_all (window->priv->toolbar, TRUE);
+    gtk_widget_set_no_show_all (window->priv->fs_toolbar, TRUE);
 
     /**
      * Add missing pieces to the UI
@@ -375,6 +395,13 @@ rstto_main_window_init (RsttoMainWindow *window)
                            GTK_UI_MANAGER_MENUITEM,
                            FALSE);
     gtk_ui_manager_add_ui (window->priv->ui_manager,
+                           window->priv->fs_play_merge_id,
+                           "/fullscreen-toolbar/placeholder-slideshow",
+                           "play",
+                           "play",
+                           GTK_UI_MANAGER_TOOLITEM,
+                           FALSE);
+    gtk_ui_manager_add_ui (window->priv->ui_manager,
                            window->priv->recent_merge_id,
                            "/main-menu/file-menu/placeholder-open-recent",
                            "recent",
@@ -414,6 +441,9 @@ rstto_main_window_init (RsttoMainWindow *window)
         gtk_widget_hide (window->priv->toolbar);
     }
 
+    gtk_widget_hide (window->priv->fs_toolbar);
+
+    g_signal_connect(G_OBJECT(window->priv->picture_viewer), "motion-notify-event", G_CALLBACK(cb_rstto_main_window_picture_viewer_motion_notify_event), window);
     g_signal_connect(G_OBJECT(window), "configure-event", G_CALLBACK(cb_rstto_main_window_configure_event), NULL);
     g_signal_connect(G_OBJECT(window), "window-state-event", G_CALLBACK(cb_rstto_main_window_state_event), NULL);
 }
@@ -589,6 +619,10 @@ rstto_main_window_set_sensitive (RsttoMainWindow *window, gboolean sensitive)
     gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/zoom-out"), sensitive);
     gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/zoom-fit"), sensitive);
     gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/main-toolbar/zoom-100"), sensitive);
+
+    /* FS Toolbar */
+    gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/fullscreen-toolbar/forward"), sensitive);
+    gtk_widget_set_sensitive (gtk_ui_manager_get_widget (window->priv->ui_manager, "/fullscreen-toolbar/back"), sensitive);
 }
 
 /**
@@ -1047,8 +1081,6 @@ cb_rstto_main_window_open_recent(GtkRecentChooser *chooser, RsttoMainWindow *win
 static void
 cb_rstto_main_window_play (GtkWidget *widget, RsttoMainWindow *window)
 {
-    g_debug ("%s", __FUNCTION__);
-
     GValue timeout = {0, };
 
     gtk_ui_manager_add_ui (window->priv->ui_manager,
@@ -1061,6 +1093,16 @@ cb_rstto_main_window_play (GtkWidget *widget, RsttoMainWindow *window)
     gtk_ui_manager_remove_ui (window->priv->ui_manager,
                               window->priv->play_merge_id);
 
+    gtk_ui_manager_add_ui (window->priv->ui_manager,
+                           window->priv->fs_pause_merge_id,
+                           "/fullscreen-toolbar/placeholder-slideshow",
+                           "pause",
+                           "pause",
+                           GTK_UI_MANAGER_TOOLITEM,
+                           FALSE);
+    gtk_ui_manager_remove_ui (window->priv->ui_manager,
+                              window->priv->fs_play_merge_id);
+
     g_value_init (&timeout, G_TYPE_UINT);
     g_object_get_property (G_OBJECT(window->priv->settings_manager), "slideshow-timeout", &timeout);
 
@@ -1079,7 +1121,6 @@ cb_rstto_main_window_play (GtkWidget *widget, RsttoMainWindow *window)
 static void
 cb_rstto_main_window_pause (GtkWidget *widget, RsttoMainWindow *window)
 {
-    g_debug ("%s", __FUNCTION__);
     gtk_ui_manager_add_ui (window->priv->ui_manager,
                            window->priv->play_merge_id,
                            "/main-menu/go-menu/placeholder-slideshow",
@@ -1090,6 +1131,16 @@ cb_rstto_main_window_pause (GtkWidget *widget, RsttoMainWindow *window)
     gtk_ui_manager_remove_ui (window->priv->ui_manager,
                               window->priv->pause_merge_id);
 
+    gtk_ui_manager_add_ui (window->priv->ui_manager,
+                           window->priv->fs_play_merge_id,
+                           "/fullscreen-toolbar/placeholder-slideshow",
+                           "play",
+                           "play",
+                           GTK_UI_MANAGER_TOOLITEM,
+                           FALSE);
+    gtk_ui_manager_remove_ui (window->priv->ui_manager,
+                              window->priv->fs_pause_merge_id);
+
     window->priv->playing = FALSE;
 }
 
@@ -1429,7 +1480,14 @@ cb_rstto_main_window_state_event(GtkWidget *widget, GdkEventWindowState *event,
             gtk_widget_hide (window->priv->statusbar);
         }
         else
-       {
+        {
+            if (window->priv->show_fs_toolbar_timeout_id > 0)
+            {
+                g_source_remove (window->priv->show_fs_toolbar_timeout_id);
+                window->priv->show_fs_toolbar_timeout_id = 0;
+            }
+            gtk_widget_hide (window->priv->fs_toolbar);
+
             g_value_init (&show_toolbar_val, G_TYPE_BOOLEAN);
             g_object_get_property (G_OBJECT(window->priv->settings_manager), "show-toolbar", &show_toolbar_val);
 
@@ -1446,3 +1504,32 @@ cb_rstto_main_window_state_event(GtkWidget *widget, GdkEventWindowState *event,
     {
     }
 }
+
+static gboolean 
+cb_rstto_main_window_picture_viewer_motion_notify_event (RsttoPictureViewer *viewer,
+                                             GdkEventMotion *event,
+                                             gpointer user_data)
+{
+    RsttoMainWindow *window = RSTTO_MAIN_WINDOW (user_data);
+    if(gdk_window_get_state(GTK_WIDGET(window)->window) & GDK_WINDOW_STATE_FULLSCREEN)
+    {
+        if (event->state == 0)
+        {
+            /* TODO: implement timer to hide it again */
+            gtk_widget_show (window->priv->fs_toolbar);
+            if (window->priv->show_fs_toolbar_timeout_id > 0)
+            {
+                g_source_remove (window->priv->show_fs_toolbar_timeout_id);
+                window->priv->show_fs_toolbar_timeout_id = 0;
+            }
+            window->priv->show_fs_toolbar_timeout_id = g_timeout_add (3000, (GSourceFunc)cb_rstto_main_window_show_fs_toolbar_timeout, window);
+        }
+    }
+}
+
+static gboolean
+cb_rstto_main_window_show_fs_toolbar_timeout (RsttoMainWindow *window)
+{
+    gtk_widget_hide (window->priv->fs_toolbar);
+    return FALSE;
+}
diff --git a/src/main_window_ui.xml b/src/main_window_ui.xml
index a03bf31..af1d990 100644
--- a/src/main_window_ui.xml
+++ b/src/main_window_ui.xml
@@ -67,4 +67,15 @@
         <toolitem action="zoom-100"/>
         <toolitem action="zoom-fit"/>
     </toolbar>
+
+    <!--
+
+    -->
+    <toolbar name="fullscreen-toolbar">
+        <toolitem action="back"/>
+        <placeholder name="placeholder-slideshow" />
+        <toolitem action="forward"/>
+        <separator name="separator-1"/>
+        <toolitem action="fullscreen"/>
+    </toolbar>
 </ui>
diff --git a/src/picture_viewer.c b/src/picture_viewer.c
index e64e4cf..85c5eb8 100644
--- a/src/picture_viewer.c
+++ b/src/picture_viewer.c
@@ -186,7 +186,8 @@ rstto_picture_viewer_init(RsttoPictureViewer *viewer)
     gtk_widget_set_events (GTK_WIDGET(viewer),
                            GDK_BUTTON_PRESS_MASK |
                            GDK_BUTTON_RELEASE_MASK |
-                           GDK_BUTTON1_MOTION_MASK);
+                           GDK_BUTTON1_MOTION_MASK |
+                           GDK_POINTER_MOTION_MASK);
 
     g_signal_connect(G_OBJECT(viewer), "button_press_event", G_CALLBACK(cb_rstto_picture_viewer_button_press_event), NULL);
     g_signal_connect(G_OBJECT(viewer), "button_release_event", G_CALLBACK(cb_rstto_picture_viewer_button_release_event), NULL);



More information about the Xfce4-commits mailing list