[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