[Xfce4-commits] <xfce4-terminal:master> Support fullscreen in the drop-down window.

Nick Schermer noreply at xfce.org
Mon Dec 31 16:28:01 CET 2012


Updating branch refs/heads/master
         to dbd5b6d88e5c004d403ab60bcf7a1abedbc86009 (commit)
       from 83a363f81b1f8e35627948f988934d65ba66a761 (commit)

commit dbd5b6d88e5c004d403ab60bcf7a1abedbc86009
Author: Nick Schermer <nick at xfce.org>
Date:   Mon Dec 31 16:26:02 2012 +0100

    Support fullscreen in the drop-down window.

 terminal/terminal-app.c             |    4 +-
 terminal/terminal-window-dropdown.c |   98 ++++++++++++++++++++++++++---------
 terminal/terminal-window-dropdown.h |    1 +
 terminal/terminal-window.c          |   34 +++++-------
 terminal/terminal-window.h          |    1 +
 5 files changed, 92 insertions(+), 46 deletions(-)

diff --git a/terminal/terminal-app.c b/terminal/terminal-app.c
index 19a3eee..38ee904 100644
--- a/terminal/terminal-app.c
+++ b/terminal/terminal-app.c
@@ -342,12 +342,13 @@ terminal_app_create_window (TerminalApp       *app,
 static GtkWidget*
 terminal_app_create_drop_down (TerminalApp        *app,
                                const gchar        *role,
+                               gboolean            fullscreen,
                                TerminalVisibility  menubar,
                                TerminalVisibility  toolbar)
 {
   GtkWidget *window;
 
-  window = terminal_window_dropdown_new (role, menubar, toolbar);
+  window = terminal_window_dropdown_new (role, fullscreen, menubar, toolbar);
 
   terminal_app_take_window (app, GTK_WINDOW (window));
 
@@ -601,6 +602,7 @@ terminal_app_open_window (TerminalApp        *app,
       /* create new drop-down window */
       window = terminal_app_create_drop_down (app,
                                               attr->role,
+                                              attr->fullscreen,
                                               attr->menubar,
                                               attr->toolbar);
     }
diff --git a/terminal/terminal-window-dropdown.c b/terminal/terminal-window-dropdown.c
index 4ec9663..da7ede1 100644
--- a/terminal/terminal-window-dropdown.c
+++ b/terminal/terminal-window-dropdown.c
@@ -567,12 +567,13 @@ static gboolean
 terminal_window_dropdown_animate_down (gpointer data)
 {
   TerminalWindowDropdown *dropdown = TERMINAL_WINDOW_DROPDOWN (data);
+  TerminalWindow         *window = TERMINAL_WINDOW (data);
   GtkRequisition          req1, req2;
   gint                    step_size;
   gint                    viewport_h;
 
   /* decrease each interval */
-  gtk_widget_size_request (TERMINAL_WINDOW (dropdown)->vbox, &req1);
+  gtk_widget_size_request (window->vbox, &req1);
   step_size = req1.height * ANIMATION_FPS / dropdown->animation_time;
   if (step_size < 1)
     step_size = 1;
@@ -587,7 +588,16 @@ terminal_window_dropdown_animate_down (gpointer data)
   gtk_widget_set_size_request (dropdown->viewport, req2.width, viewport_h);
   gtk_window_resize (GTK_WINDOW (dropdown), req2.width, viewport_h);
 
-  return viewport_h < req1.height;
+  /* continue the animation */
+  if (viewport_h < req1.height)
+    return TRUE;
+
+  /* restore the fullscreen state */
+  if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (window->action_fullscreen)))
+    gtk_window_fullscreen (GTK_WINDOW (window));
+
+  /* animation complete */
+  return FALSE;
 }
 
 
@@ -596,12 +606,26 @@ static gboolean
 terminal_window_dropdown_animate_up (gpointer data)
 {
   TerminalWindowDropdown *dropdown = TERMINAL_WINDOW_DROPDOWN (data);
+  TerminalWindow         *window = TERMINAL_WINDOW (data);
   GtkRequisition          req1, req2;
   gint                    step_size;
   gint                    viewport_h;
+  GdkRectangle            rect;
+
+  /* get window size */
+  if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (window->action_fullscreen)))
+    {
+      /* use the monitor size for the animation */
+      gdk_screen_get_monitor_geometry (dropdown->screen, dropdown->monitor_num, &rect);
+      req1.width = rect.width;
+      req1.height = rect.height;
+    }
+  else
+    {
+      gtk_widget_size_request (TERMINAL_WINDOW (dropdown)->vbox, &req1);
+    }
 
   /* decrease each interval */
-  gtk_widget_size_request (TERMINAL_WINDOW (dropdown)->vbox, &req1);
   step_size = req1.height * ANIMATION_FPS / dropdown->animation_time;
   if (step_size < 1)
     step_size = 1;
@@ -619,7 +643,8 @@ terminal_window_dropdown_animate_up (gpointer data)
   else
     {
       /* resize viewport */
-      gtk_widget_set_size_request (dropdown->viewport, req2.width, viewport_h);
+      gtk_widget_set_size_request (dropdown->viewport, req1.width, viewport_h);
+      gtk_window_resize (GTK_WINDOW (dropdown), req1.width, viewport_h);
       return TRUE;
     }
 }
@@ -697,36 +722,50 @@ terminal_window_dropdown_show (TerminalWindowDropdown *dropdown,
   /* move window to correct screen */
   gtk_window_set_screen (GTK_WINDOW (dropdown), dropdown->screen);
 
-  /* calculate size */
-  w = monitor_geo.width * dropdown->rel_width;
-  h = monitor_geo.height * dropdown->rel_height;
-
   /* get terminal size */
   terminal_screen_get_geometry (window->active, &char_width, &char_height, &xpad, &ypad);
 
   /* correct padding with notebook size */
-  gtk_widget_size_request (window->notebook, &req1);
-  gtk_widget_size_request (GTK_WIDGET (window->active), &req2);
-  xpad += MAX (req1.width - req2.width, 0);
-  ypad += MAX (req1.height - req2.height, 0);
-
-  if (window->menubar != NULL
-      && gtk_widget_get_visible (window->menubar))
+  if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (window->action_fullscreen)))
     {
-      gtk_widget_size_request (window->menubar, &req2);
-      ypad += req2.height;
-    }
+      /* don't fullscreen during animation*/
+      gtk_window_unfullscreen (GTK_WINDOW (window));
 
-  if (window->toolbar != NULL
-      && gtk_widget_get_visible (window->toolbar))
+      /* use monitor geometry */
+      w = monitor_geo.width;
+      h = monitor_geo.height;
+    }
+  else
     {
-      gtk_widget_size_request (window->toolbar, &req2);
-      ypad += req2.height;
+      /* calculate size */
+      w = monitor_geo.width * dropdown->rel_width;
+      h = monitor_geo.height * dropdown->rel_height;
+
+      gtk_widget_size_request (window->notebook, &req1);
+      gtk_widget_size_request (GTK_WIDGET (window->active), &req2);
+      xpad += MAX (req1.width - req2.width, 0);
+      ypad += MAX (req1.height - req2.height, 0);
+
+      if (window->menubar != NULL
+          && gtk_widget_get_visible (window->menubar))
+        {
+          gtk_widget_size_request (window->menubar, &req2);
+          ypad += req2.height;
+        }
+
+      if (window->toolbar != NULL
+          && gtk_widget_get_visible (window->toolbar))
+        {
+          gtk_widget_size_request (window->toolbar, &req2);
+          ypad += req2.height;
+        }
+
+      /* minimize to fit terminal charaters */
+      w -= (w - xpad) % char_width;
+      h -= (h - ypad) % char_height;
     }
 
-  /* minimize to fit terminal charaters */
-  w -= (w - xpad) % char_width;
-  h -= (h - ypad) % char_height;
+  /* viewport size if not animated */
   viewport_h = h;
 
   /* viewport start height for animation */
@@ -859,6 +898,7 @@ terminal_window_dropdown_get_timestamp (GtkWidget   *widget,
 
 GtkWidget *
 terminal_window_dropdown_new (const gchar        *role,
+                              gboolean            fullscreen,
                               TerminalVisibility  menubar,
                               TerminalVisibility  toolbar)
 {
@@ -878,6 +918,10 @@ terminal_window_dropdown_new (const gchar        *role,
                 "misc-toolbar-default", &show_toolbar,
                 NULL);
 
+  /* setup full screen */
+  if (fullscreen && gtk_action_is_sensitive (window->action_fullscreen))
+    gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (window->action_fullscreen), TRUE);
+
   /* setup menubar visibility */
   if (G_LIKELY (menubar != TERMINAL_VISIBILITY_DEFAULT))
     show_menubar = (menubar == TERMINAL_VISIBILITY_SHOW);
@@ -894,6 +938,10 @@ terminal_window_dropdown_new (const gchar        *role,
   g_signal_connect_swapped (action, "activate",
       G_CALLBACK (terminal_window_dropdown_update_geometry), window);
 
+
+  g_signal_connect_swapped (window->action_fullscreen, "activate",
+      G_CALLBACK (terminal_window_dropdown_update_geometry), window);
+
   return GTK_WIDGET (window);
 }
 
diff --git a/terminal/terminal-window-dropdown.h b/terminal/terminal-window-dropdown.h
index 82e1ab0..7f13d7d 100644
--- a/terminal/terminal-window-dropdown.h
+++ b/terminal/terminal-window-dropdown.h
@@ -37,6 +37,7 @@ typedef struct _TerminalWindowDropdown      TerminalWindowDropdown;
 GType           terminal_window_dropdown_get_type             (void) G_GNUC_CONST;
 
 GtkWidget      *terminal_window_dropdown_new                  (const gchar            *role,
+                                                               gboolean                fullscreen,
                                                                TerminalVisibility      menubar,
                                                                TerminalVisibility      toolbar);
 
diff --git a/terminal/terminal-window.c b/terminal/terminal-window.c
index aaf37cc..e854688 100644
--- a/terminal/terminal-window.c
+++ b/terminal/terminal-window.c
@@ -291,7 +291,6 @@ static void
 terminal_window_init (TerminalWindow *window)
 {
   GtkAccelGroup  *accel_group;
-  GtkAction      *action;
   GtkWidget      *vbox;
   gboolean        always_show_tabs;
   GdkScreen      *screen;
@@ -330,15 +329,6 @@ terminal_window_init (TerminalWindow *window)
   gtk_container_add (GTK_CONTAINER (window), vbox);
   gtk_widget_show (vbox);
 
-#if defined(GDK_WINDOWING_X11)
-  /* setup fullscreen mode */
-  if (!gdk_net_wm_supports (gdk_atom_intern ("_NET_WM_STATE_FULLSCREEN", FALSE)))
-    {
-      action = gtk_action_group_get_action (window->action_group, "fullscreen");
-      gtk_action_set_sensitive (action, FALSE);
-    }
-#endif
-
   /* allocate the notebook for the terminal screens */
   g_object_get (G_OBJECT (window->preferences), "misc-always-show-tabs", &always_show_tabs, NULL);
   window->notebook = g_object_new (GTK_TYPE_NOTEBOOK,
@@ -392,6 +382,13 @@ terminal_window_init (TerminalWindow *window)
   window->action_copy = gtk_action_group_get_action (window->action_group, "copy");
   window->action_search_next = gtk_action_group_get_action (window->action_group, "search-next");
   window->action_search_prev = gtk_action_group_get_action (window->action_group, "search-prev");
+  window->action_fullscreen = gtk_action_group_get_action (window->action_group, "fullscreen");
+
+#if defined(GDK_WINDOWING_X11)
+  /* setup fullscreen mode */
+  if (!gdk_net_wm_supports (gdk_atom_intern ("_NET_WM_STATE_FULLSCREEN", FALSE)))
+    gtk_action_set_sensitive (window->action_fullscreen, FALSE);
+#endif
 }
 
 
@@ -443,18 +440,17 @@ terminal_window_state_event (GtkWidget           *widget,
                              GdkEventWindowState *event)
 {
   TerminalWindow *window = TERMINAL_WINDOW (widget);
-  GtkAction      *action;
   gboolean        fullscreen;
 
   terminal_return_val_if_fail (TERMINAL_IS_WINDOW (window), FALSE);
 
   /* update the fullscreen action if the fullscreen state changed by the wm */
-  if ((event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) != 0)
+  if ((event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) != 0
+      && gtk_widget_get_visible (widget))
     {
       fullscreen = (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) != 0;
-      action = gtk_action_group_get_action (window->action_group, "fullscreen");
-      if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)) != fullscreen)
-        gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), fullscreen);
+      if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (window->action_fullscreen)) != fullscreen)
+        gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (window->action_fullscreen), fullscreen);
     }
 
   if (GTK_WIDGET_CLASS (terminal_window_parent_class)->window_state_event != NULL)
@@ -1813,9 +1809,8 @@ terminal_window_new (const gchar       *role,
                 NULL);
 
   /* setup full screen */
-  action = gtk_action_group_get_action (window->action_group, "fullscreen");
-  if (fullscreen && gtk_action_is_sensitive (action))
-    gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
+  if (fullscreen && gtk_action_is_sensitive (window->action_fullscreen))
+    gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (window->action_fullscreen), TRUE);
 
   /* setup menubar visibility */
   if (G_LIKELY (menubar != TERMINAL_VISIBILITY_DEFAULT))
@@ -1974,8 +1969,7 @@ terminal_window_get_restart_command (TerminalWindow *window)
   if (G_LIKELY (role != NULL))
     result = g_slist_prepend (result, g_strdup_printf ("--role=%s", role));
 
-  action = gtk_action_group_get_action (window->action_group, "fullscreen");
-  if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)))
+  if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (window->action_fullscreen)))
     result = g_slist_prepend (result, g_strdup ("--fullscreen"));
 
   action = gtk_action_group_get_action (window->action_group, "show-menubar");
diff --git a/terminal/terminal-window.h b/terminal/terminal-window.h
index 2cd0818..f155c40 100644
--- a/terminal/terminal-window.h
+++ b/terminal/terminal-window.h
@@ -86,6 +86,7 @@ struct _TerminalWindow
   GtkAction           *action_copy;
   GtkAction           *action_search_next;
   GtkAction           *action_search_prev;
+  GtkAction           *action_fullscreen;
 };
 
 GType           terminal_window_get_type             (void) G_GNUC_CONST;


More information about the Xfce4-commits mailing list