Updating branch refs/heads/nick/dropdown to 2076c677fffce40c51c7f226fcde690a2ccad2c1 (commit) from 7ac4ebaf1f564388e0cc4a46c5d59ed47019cb7e (commit)
commit 2076c677fffce40c51c7f226fcde690a2ccad2c1 Author: Nick Schermer <n...@xfce.org> Date: Fri Dec 28 23:11:29 2012 +0100 Initial import of the --drop-down functionality. terminal/Makefile.am | 10 +- terminal/terminal-app.c | 128 +++++++++---- terminal/terminal-dialogs.c | 56 ++++++ terminal/terminal-dialogs.h | 5 + terminal/terminal-options.c | 4 + terminal/terminal-options.h | 1 + terminal/terminal-screen.c | 148 +++++++++------- terminal/terminal-screen.h | 6 + terminal/terminal-search-dialog.c | 12 ++- terminal/terminal-window-dropdown.c | 338 +++++++++++++++++++++++++++++++++++ terminal/terminal-window-dropdown.h | 46 +++++ terminal/terminal-window.c | 134 ++++++--------- terminal/terminal-window.h | 51 ++++++ 13 files changed, 749 insertions(+), 190 deletions(-) diff --git a/terminal/Makefile.am b/terminal/Makefile.am index cb1b96f..8cb9e2f 100644 --- a/terminal/Makefile.am +++ b/terminal/Makefile.am @@ -28,7 +28,8 @@ xfce4_terminal_headers = \ terminal-private.h \ terminal-screen.h \ terminal-widget.h \ - terminal-window.h \ + terminal-window.h \ \ + terminal-window-dropdown.h \ terminal-window-ui.h xfce4_terminal_SOURCES = \ @@ -46,24 +47,25 @@ xfce4_terminal_SOURCES = \ terminal-search-dialog.c \ terminal-screen.c \ terminal-widget.c \ - terminal-window.c + terminal-window.c \ + terminal-window-dropdown.c xfce4_terminal_CFLAGS = \ $(GTK_CFLAGS) \ $(GIO_CFLAGS) \ - $(LIBX11_CFLAGS)\ + $(LIBX11_CFLAGS) \ $(VTE_CFLAGS) \ $(LIBXFCE4UI_CFLAGS) \ $(PLATFORM_CFLAGS) xfce4_terminal_LDFLAGS = \ -no-undefined \ + $(LIBX11_LDFLAGS) \ $(PLATFORM_LDFLAGS) xfce4_terminal_LDADD = \ $(GTK_LIBS) \ $(GIO_LIBS) \ - $(LIBX11_LDFLAGS) \ $(LIBX11_LIBS) \ $(VTE_LIBS) \ $(LIBXFCE4UI_LIBS) \ diff --git a/terminal/terminal-app.c b/terminal/terminal-app.c index 7b4334f..6ecf0ec 100644 --- a/terminal/terminal-app.c +++ b/terminal/terminal-app.c @@ -43,6 +43,7 @@ #include <terminal/terminal-preferences.h> #include <terminal/terminal-private.h> #include <terminal/terminal-window.h> +#include <terminal/terminal-window-dropdown.h> #define ACCEL_MAP_PATH "xfce4/terminal/accels.scm" @@ -53,12 +54,6 @@ static void terminal_app_update_accels (TerminalApp static void terminal_app_update_mnemonics (TerminalApp *app); static gboolean terminal_app_accel_map_load (gpointer user_data); static gboolean terminal_app_accel_map_save (gpointer user_data); -static GtkWidget *terminal_app_create_window (TerminalApp *app, - const gchar *role, - gboolean fullscreen, - TerminalVisibility menubar, - TerminalVisibility borders, - TerminalVisibility toolbar); static void terminal_app_new_window (TerminalWindow *window, const gchar *working_directory, TerminalApp *app); @@ -293,6 +288,29 @@ terminal_app_accel_map_load (gpointer user_data) +static void +terminal_app_take_window (TerminalApp *app, + GtkWindow *window) +{ + GtkWindowGroup *group; + + terminal_return_if_fail (GTK_IS_WINDOW (window)); + + group = gtk_window_group_new (); + gtk_window_group_add_window (group, window); + g_object_weak_ref (G_OBJECT (window), (GWeakNotify) g_object_unref, group); + + g_signal_connect (G_OBJECT (window), "destroy", + G_CALLBACK (terminal_app_window_destroyed), app); + g_signal_connect (G_OBJECT (window), "new-window", + G_CALLBACK (terminal_app_new_window), app); + g_signal_connect (G_OBJECT (window), "new-window-with-screen", + G_CALLBACK (terminal_app_new_window_with_terminal), app); + app->windows = g_slist_prepend (app->windows, window); +} + + + static GtkWidget* terminal_app_create_window (TerminalApp *app, const gchar *role, @@ -303,7 +321,6 @@ terminal_app_create_window (TerminalApp *app, { GtkWidget *window; gchar *new_role = NULL; - GtkWindowGroup *group; if (role == NULL) { @@ -313,20 +330,23 @@ terminal_app_create_window (TerminalApp *app, } window = terminal_window_new (role, fullscreen, menubar, borders, toolbar); + g_free (new_role); - group = gtk_window_group_new (); - gtk_window_group_add_window (group, GTK_WINDOW (window)); - g_object_weak_ref (G_OBJECT (window), (GWeakNotify) g_object_unref, group); + terminal_app_take_window (app, GTK_WINDOW (window)); - g_signal_connect (G_OBJECT (window), "destroy", - G_CALLBACK (terminal_app_window_destroyed), app); - g_signal_connect (G_OBJECT (window), "new-window", - G_CALLBACK (terminal_app_new_window), app); - g_signal_connect (G_OBJECT (window), "new-window-with-screen", - G_CALLBACK (terminal_app_new_window_with_terminal), app); - app->windows = g_slist_prepend (app->windows, window); + return window; +} - g_free (new_role); + + +static GtkWidget* +terminal_app_create_drop_down (TerminalApp *app) +{ + GtkWidget *window; + + window = terminal_window_dropdown_new (); + + terminal_app_take_window (app, GTK_WINDOW (window)); return window; } @@ -441,9 +461,13 @@ terminal_app_save_yourself (XfceSMClient *client, gint argc; gint n; - for (lp = app->windows; lp != NULL; lp = lp->next) + for (lp = app->windows, n = 0; lp != NULL; lp = lp->next) { - if (lp != app->windows) + /* don't session save dropdown windows */ + if (TERMINAL_IS_WINDOW_DROPDOWN (lp->data)) + continue; + + if (n++ != 0) result = g_slist_append (result, g_strdup ("--window")); result = g_slist_concat (result, terminal_window_get_restart_command (lp->data)); } @@ -557,8 +581,25 @@ terminal_app_open_window (TerminalApp *app, terminal_return_if_fail (TERMINAL_IS_APP (app)); terminal_return_if_fail (attr != NULL); - if (attr->reuse_last_window - && app->windows != NULL) + if (attr->drop_down) + { + /* look for an exising drop-down window */ + for (lp = app->windows; lp != NULL; lp = lp->next) + if (TERMINAL_IS_WINDOW_DROPDOWN (lp->data)) + break; + + if (lp != NULL) + { + /* toggle state of visible window */ + terminal_window_dropdown_toggle (lp->data, attr->startup_id); + return; + } + + /* create new drop-down window */ + window = terminal_app_create_drop_down (app); + } + else if (attr->reuse_last_window + && app->windows != NULL) { /* open the tabs in an existing window */ window = app->windows->data; @@ -574,11 +615,13 @@ terminal_app_open_window (TerminalApp *app, attr->borders, attr->toolbar); - if (attr->startup_id != NULL) - gtk_window_set_startup_id (GTK_WINDOW (window), attr->startup_id); + /* apply normal window properties */ if (attr->maximize) gtk_window_maximize (GTK_WINDOW (window)); + if (attr->startup_id != NULL) + gtk_window_set_startup_id (GTK_WINDOW (window), attr->startup_id); + if (attr->icon != NULL) { if (g_path_is_absolute (attr->icon)) @@ -595,6 +638,7 @@ terminal_app_open_window (TerminalApp *app, } } + /* add the tabs */ for (lp = attr->tabs; lp != NULL; lp = lp->next) { terminal = g_object_new (TERMINAL_TYPE_SCREEN, NULL); @@ -617,23 +661,29 @@ terminal_app_open_window (TerminalApp *app, if (reuse_window) return; - /* set the window geometry, this can only be set after one of the tabs - * has been added, because vte is the geometry widget, so atleast one - * call should have been made to terminal_screen_set_window_geometry_hints */ - if (G_LIKELY (attr->geometry == NULL)) - g_object_get (G_OBJECT (app->preferences), "misc-default-geometry", &geometry, NULL); - else - geometry = g_strdup (attr->geometry); + if (!attr->drop_down) + { + /* set the window geometry, this can only be set after one of the tabs + * has been added, because vte is the geometry widget, so atleast one + * call should have been made to terminal_screen_set_window_geometry_hints */ + if (G_LIKELY (attr->geometry == NULL)) + g_object_get (G_OBJECT (app->preferences), "misc-default-geometry", &geometry, NULL); + else + geometry = g_strdup (attr->geometry); - /* try to apply the geometry to the window */ - if (!gtk_window_parse_geometry (GTK_WINDOW (window), geometry)) - g_printerr (_("Invalid geometry string \"%s\"\n"), geometry); + /* try to apply the geometry to the window */ + if (!gtk_window_parse_geometry (GTK_WINDOW (window), geometry)) + g_printerr (_("Invalid geometry string \"%s\"\n"), geometry); - /* cleanup */ - g_free (geometry); + /* cleanup */ + g_free (geometry); + } /* show the window */ - gtk_widget_show (window); + if (attr->drop_down) + terminal_window_dropdown_toggle (TERMINAL_WINDOW_DROPDOWN (window), attr->startup_id); + else + gtk_widget_show (window); } diff --git a/terminal/terminal-dialogs.c b/terminal/terminal-dialogs.c index bb109e5..04ecc8b 100644 --- a/terminal/terminal-dialogs.c +++ b/terminal/terminal-dialogs.c @@ -29,6 +29,12 @@ #include <libxfce4util/libxfce4util.h> +#include <gdk/gdk.h> +#ifdef GDK_WINDOWING_X11 +#include <gdk/gdkx.h> +#include <X11/Xlib.h> +#endif + #include <terminal/terminal-dialogs.h> #include <terminal/terminal-private.h> @@ -84,3 +90,53 @@ terminal_dialogs_show_about (GtkWindow *parent) "website-label", _("Visit Terminal website"), NULL); } + + + +void +terminal_set_style_thinkess (GtkWidget *widget, + gint thinkness) +{ + GtkRcStyle *style; + + style = gtk_rc_style_new (); + style->xthickness = style->ythickness = thinkness; + gtk_widget_modify_style (widget, style); + g_object_unref (G_OBJECT (style)); +} + + + +void +terminal_activate_window (GtkWindow *window) +{ +#ifdef GDK_WINDOWING_X11 + XClientMessageEvent event; + + terminal_return_if_fail (GTK_IS_WINDOW (window)); + terminal_return_if_fail (gtk_widget_get_realized (GTK_WIDGET (window))); + + /* we need a slightly custom version of the call through Gtk+ to + * properly focus the panel when a plugin calls + * xfce_panel_plugin_focus_widget() */ + event.type = ClientMessage; + event.window = GDK_WINDOW_XID (gtk_widget_get_window (GTK_WIDGET (window))); + event.message_type = gdk_x11_get_xatom_by_name ("_NET_ACTIVE_WINDOW"); + event.format = 32; + event.data.l[0] = 0; + + gdk_error_trap_push (); + + XSendEvent (gdk_x11_get_default_xdisplay (), + gdk_x11_get_default_root_xwindow (), False, + StructureNotifyMask, (XEvent *) &event); + + gdk_flush (); + + if (gdk_error_trap_pop () != 0) + g_critical ("Failed to focus window"); +#else + /* our best guess on non-x11 clients */ + gtk_window_present (window); +#endif +} diff --git a/terminal/terminal-dialogs.h b/terminal/terminal-dialogs.h index e58f7df..1efbb30 100644 --- a/terminal/terminal-dialogs.h +++ b/terminal/terminal-dialogs.h @@ -25,6 +25,11 @@ G_BEGIN_DECLS void terminal_dialogs_show_about (GtkWindow *parent); +void terminal_set_style_thinkess (GtkWidget *widget, + gint thinkness); + +void terminal_activate_window (GtkWindow *window); + G_END_DECLS #endif /* !__TERMINAL_DIALOGS_H__ */ diff --git a/terminal/terminal-options.c b/terminal/terminal-options.c index 64e2f2e..c4ad677 100644 --- a/terminal/terminal-options.c +++ b/terminal/terminal-options.c @@ -394,6 +394,10 @@ terminal_window_attr_parse (gint argc, win_attr->icon = g_strdup (s); } } + else if (terminal_option_cmp ("drop-down", 0, argc, argv, &n, NULL)) + { + win_attr->drop_down = TRUE; + } else if (terminal_option_show_hide_cmp ("menubar", argc, argv, &n, &visible)) { win_attr->menubar = visible; diff --git a/terminal/terminal-options.h b/terminal/terminal-options.h index 591d36b..15c6a01 100644 --- a/terminal/terminal-options.h +++ b/terminal/terminal-options.h @@ -47,6 +47,7 @@ struct _TerminalTabAttr struct _TerminalWindowAttr { GSList *tabs; + guint drop_down : 1; gchar *display; gchar *geometry; gchar *role; diff --git a/terminal/terminal-screen.c b/terminal/terminal-screen.c index 98df97c..429cb5c 100644 --- a/terminal/terminal-screen.c +++ b/terminal/terminal-screen.c @@ -1237,34 +1237,27 @@ terminal_screen_vte_resize_window (VteTerminal *terminal, TerminalScreen *screen) { GtkWidget *toplevel; - gint xpad = 0; - gint ypad = 0; + gint xpad; + gint ypad; glong grid_width; glong grid_height; - GtkBorder *border = NULL; + glong char_width; + glong char_height; terminal_return_if_fail (VTE_IS_TERMINAL (terminal)); terminal_return_if_fail (TERMINAL_IS_SCREEN (screen)); /* don't do anything if the window is already fullscreen/maximized */ toplevel = gtk_widget_get_toplevel (GTK_WIDGET (screen)); - if (!GTK_WIDGET_REALIZED (toplevel) + if (!gtk_widget_get_realized (toplevel) || (gdk_window_get_state (toplevel->window) & (GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_FULLSCREEN)) != 0) return; - /* we have to calculate the grid size, because the signal - * returns a size in pixels */ - gtk_widget_style_get (GTK_WIDGET (terminal), "inner-border", &border, NULL); - if (border != NULL) - { - xpad = border->left + border->right; - ypad = border->top + border->bottom; - gtk_border_free (border); - } + terminal_screen_get_geometry (screen, &char_width, &char_height, &xpad, &ypad); - grid_width = (width - xpad) / terminal->char_width; - grid_height = (height - ypad) / terminal->char_height; + grid_width = (width - xpad) / char_width; + grid_height = (height - ypad) / char_height; /* leave if there is nothing to resize */ if (terminal->column_count == grid_width @@ -1274,8 +1267,10 @@ terminal_screen_vte_resize_window (VteTerminal *terminal, /* set the terminal size and resize the window if it is active */ vte_terminal_set_size (terminal, grid_width, grid_height); if (screen == terminal_window_get_active (TERMINAL_WINDOW (toplevel))) - terminal_screen_force_resize_window (screen, GTK_WINDOW (toplevel), - grid_width, grid_height); + { + terminal_screen_force_resize_window (screen, GTK_WINDOW (toplevel), + grid_width, grid_height); + } } @@ -1649,6 +1644,46 @@ terminal_screen_set_size (TerminalScreen *screen, +void +terminal_screen_get_geometry (TerminalScreen *screen, + glong *char_width, + glong *char_height, + gint *xpad, + gint *ypad) +{ + GtkBorder *border = NULL; + + terminal_return_if_fail (TERMINAL_IS_SCREEN (screen)); + terminal_return_if_fail (VTE_IS_TERMINAL (screen->terminal)); + + if (char_width != NULL) + *char_width = vte_terminal_get_char_width (VTE_TERMINAL (screen->terminal)); + if (char_height != NULL) + *char_height = vte_terminal_get_char_height (VTE_TERMINAL (screen->terminal)); + + if (xpad != NULL || ypad != NULL) + { + gtk_widget_style_get (GTK_WIDGET (screen->terminal), "inner-border", &border, NULL); + if (G_LIKELY (border != NULL)) + { + if (xpad != NULL) + *xpad = border->left + border->right; + if (ypad != NULL) + *ypad = border->top + border->bottom; + gtk_border_free (border); + } + else + { + if (xpad != NULL) + *xpad = 0; + if (ypad != NULL) + *ypad = 0; + } + } +} + + + /** * terminal_screen_set_window_geometry_hints: * @@ -1660,27 +1695,24 @@ terminal_screen_set_window_geometry_hints (TerminalScreen *screen, GtkWindow *window) { GdkGeometry hints; - gint xpad = 0; - gint ypad = 0; - GtkBorder *border = NULL; + gint xpad; + gint ypad; + glong char_width; + glong char_height; terminal_return_if_fail (TERMINAL_IS_SCREEN (screen)); terminal_return_if_fail (VTE_IS_TERMINAL (screen->terminal)); terminal_return_if_fail (GTK_WIDGET_REALIZED (screen)); terminal_return_if_fail (GTK_WIDGET_REALIZED (window)); - gtk_widget_style_get (GTK_WIDGET (screen->terminal), "inner-border", &border, NULL); - if (border != NULL) - { - xpad = border->left + border->right; - ypad = border->top + border->bottom; - gtk_border_free (border); - } + terminal_screen_get_geometry (screen, + &char_width, &char_height, + &xpad, &ypad); hints.base_width = xpad; hints.base_height = ypad; - hints.width_inc = VTE_TERMINAL (screen->terminal)->char_width ; - hints.height_inc = VTE_TERMINAL (screen->terminal)->char_height; + hints.width_inc = char_width; + hints.height_inc = char_height; hints.min_width = hints.base_width + hints.width_inc * 4; hints.min_height = hints.base_height + hints.height_inc * 2; @@ -1703,18 +1735,17 @@ terminal_screen_set_window_geometry_hints (TerminalScreen *screen, void terminal_screen_force_resize_window (TerminalScreen *screen, GtkWindow *window, - glong force_columns, - glong force_rows) + glong columns, + glong rows) { GtkRequisition terminal_requisition; GtkRequisition window_requisition; gint width; gint height; - glong columns; - glong rows; - gint xpad = 0; - gint ypad = 0; - GtkBorder *border = NULL; + gint xpad, ypad; + glong char_width; + glong char_height; + terminal_return_if_fail (TERMINAL_IS_SCREEN (screen)); terminal_return_if_fail (VTE_IS_TERMINAL (screen->terminal)); @@ -1725,29 +1756,24 @@ terminal_screen_force_resize_window (TerminalScreen *screen, gtk_widget_size_request (GTK_WIDGET (window), &window_requisition); gtk_widget_size_request (screen->terminal, &terminal_requisition); - width = MAX (window_requisition.width - terminal_requisition.width, 0); - height = MAX (window_requisition.height - terminal_requisition.height, 0); - - if (force_columns < 0) - columns = VTE_TERMINAL (screen->terminal)->column_count; - else - columns = force_columns; + if (columns < 1) + columns = vte_terminal_get_column_count (VTE_TERMINAL (screen->terminal)); + if (rows < 1) + rows = vte_terminal_get_row_count (VTE_TERMINAL (screen->terminal)); - if (force_rows < 0) - rows = VTE_TERMINAL (screen->terminal)->row_count; - else - rows = force_rows; + terminal_screen_get_geometry (screen, + &char_width, &char_height, + &xpad, &ypad); - gtk_widget_style_get (GTK_WIDGET (screen->terminal), "inner-border", &border, NULL); - if (border != NULL) - { - xpad = border->left + border->right; - ypad = border->top + border->bottom; - gtk_border_free (border); - } + width = window_requisition.width - terminal_requisition.width; + if (width < 0) + width = 0; + width += xpad + char_width * columns; - width += xpad + VTE_TERMINAL (screen->terminal)->char_width * columns; - height += ypad + VTE_TERMINAL (screen->terminal)->char_height * rows; + height = window_requisition.height - terminal_requisition.height; + if (height < 0) + height = 0; + height += ypad + char_height * rows; if (GTK_WIDGET_MAPPED (window)) gtk_window_resize (window, width, height); @@ -2107,9 +2133,8 @@ terminal_screen_reset_activity (TerminalScreen *screen) GtkWidget * terminal_screen_get_tab_label (TerminalScreen *screen) { - GtkWidget *hbox; - GtkWidget *button, *image, *align; - GtkRcStyle *style; + GtkWidget *hbox; + GtkWidget *button, *image, *align; terminal_return_val_if_fail (TERMINAL_IS_SCREEN (screen), NULL); @@ -2147,10 +2172,7 @@ terminal_screen_get_tab_label (TerminalScreen *screen) gtk_widget_show (button); /* make button a bit smaller */ - style = gtk_rc_style_new (); - style->xthickness = style->ythickness = 0; - gtk_widget_modify_style (button, style); - g_object_unref (G_OBJECT (style)); + terminal_set_style_thinkess (button, 0); /* button image */ image = gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); diff --git a/terminal/terminal-screen.h b/terminal/terminal-screen.h index 1a03a42..b4f2cb3 100644 --- a/terminal/terminal-screen.h +++ b/terminal/terminal-screen.h @@ -51,6 +51,12 @@ void terminal_screen_set_size (TerminalScreen *scree glong width_chars, glong height_chars); +void terminal_screen_get_geometry (TerminalScreen *screen, + glong *char_width, + glong *char_height, + gint *xpad, + gint *ypad); + void terminal_screen_set_window_geometry_hints (TerminalScreen *screen, GtkWindow *window); diff --git a/terminal/terminal-search-dialog.c b/terminal/terminal-search-dialog.c index ef3cdb7..a7b08c6 100644 --- a/terminal/terminal-search-dialog.c +++ b/terminal/terminal-search-dialog.c @@ -55,7 +55,7 @@ struct _TerminalSearchDialog GtkWidget *button_prev; GtkWidget *button_next; - + GtkWidget *entry; GtkWidget *match_case; @@ -96,19 +96,24 @@ terminal_search_dialog_init (TerminalSearchDialog *dialog) dialog->button_prev = xfce_gtk_button_new_mixed (GTK_STOCK_GO_BACK, _("_Previous")); gtk_dialog_add_action_widget (GTK_DIALOG (dialog), dialog->button_prev, TERMINAL_RESPONSE_SEARCH_PREV); gtk_widget_set_can_default (dialog->button_prev, TRUE); + gtk_widget_show (dialog->button_prev); dialog->button_next = xfce_gtk_button_new_mixed (GTK_STOCK_GO_FORWARD, _("_Next")); gtk_dialog_add_action_widget (GTK_DIALOG (dialog), dialog->button_next, TERMINAL_RESPONSE_SEARCH_NEXT); + gtk_widget_show (dialog->button_next); vbox = gtk_vbox_new (FALSE, 6); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), vbox, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); + gtk_widget_show (vbox); hbox = gtk_hbox_new (FALSE, 12); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); + gtk_widget_show (hbox); label = gtk_label_new_with_mnemonic (_("_Search for:")); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); dialog->entry = gtk_entry_new (); gtk_box_pack_start (GTK_BOX (hbox), dialog->entry, TRUE, TRUE, 0); @@ -119,26 +124,31 @@ terminal_search_dialog_init (TerminalSearchDialog *dialog) G_CALLBACK (terminal_search_dialog_entry_icon_release), NULL); g_signal_connect (G_OBJECT (dialog->entry), "changed", G_CALLBACK (terminal_search_dialog_entry_changed), dialog); + gtk_widget_show (dialog->entry); dialog->match_case = gtk_check_button_new_with_mnemonic (_("C_ase sensitive")); gtk_box_pack_start (GTK_BOX (vbox), dialog->match_case, FALSE, FALSE, 0); g_signal_connect_swapped (G_OBJECT (dialog->match_case), "toggled", G_CALLBACK (terminal_search_dialog_clear_gregex), dialog); + gtk_widget_show (dialog->match_case); dialog->match_regex = gtk_check_button_new_with_mnemonic (_("Match as _regular expression")); gtk_box_pack_start (GTK_BOX (vbox), dialog->match_regex, FALSE, FALSE, 0); g_signal_connect_swapped (G_OBJECT (dialog->match_regex), "toggled", G_CALLBACK (terminal_search_dialog_clear_gregex), dialog); + gtk_widget_show (dialog->match_regex); dialog->match_word = gtk_check_button_new_with_mnemonic (_("Match _entire word only")); gtk_box_pack_start (GTK_BOX (vbox), dialog->match_word, FALSE, FALSE, 0); g_signal_connect_swapped (G_OBJECT (dialog->match_word), "toggled", G_CALLBACK (terminal_search_dialog_clear_gregex), dialog); + gtk_widget_show (dialog->match_word); dialog->wrap_around = gtk_check_button_new_with_mnemonic (_("_Wrap around")); gtk_box_pack_start (GTK_BOX (vbox), dialog->wrap_around, FALSE, FALSE, 0); g_signal_connect_swapped (G_OBJECT (dialog->wrap_around), "toggled", G_CALLBACK (terminal_search_dialog_clear_gregex), dialog); + gtk_widget_show (dialog->wrap_around); terminal_search_dialog_entry_changed (dialog->entry, dialog); } diff --git a/terminal/terminal-window-dropdown.c b/terminal/terminal-window-dropdown.c new file mode 100644 index 0000000..e02a5fa --- /dev/null +++ b/terminal/terminal-window-dropdown.c @@ -0,0 +1,338 @@ +/*- + * Copyright (C) 2012 Nick Schermer <n...@xfce.org> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple + * Place, Suite 330, Boston, MA 02111-1307 USA. + * + * The geometry handling code was taken from gnome-terminal. The geometry hacks + * were initially written by Owen Taylor. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif + +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef HAVE_ERRNO_H +#include <errno.h> +#endif +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif + +#include <libxfce4ui/libxfce4ui.h> + +#include <terminal/terminal-private.h> +#include <terminal/terminal-window.h> +#include <terminal/terminal-dialogs.h> +#include <terminal/terminal-window-dropdown.h> + + + +static void terminal_window_dropdown_finalize (GObject *object); +static gboolean terminal_window_dropdown_focus_out_event (GtkWidget *widget, + GdkEventFocus *event); +static void terminal_window_dropdown_position (TerminalWindowDropdown *dropdown); +static void terminal_window_dropdown_preferences (TerminalWindowDropdown *dropdown); + + +typedef enum +{ + DROPDOWN_STATE_HIDDEN, + DROPDOWN_STATE_VISIBLE, +} +DropdownState; + +struct _TerminalWindowDropdownClass +{ + TerminalWindowClass __parent__; +}; + +struct _TerminalWindowDropdown +{ + TerminalWindow __parent__; + + /* ui widgets */ + GtkWidget *keep_open; + + /* size */ + gdouble rel_width; + gdouble rel_height; +}; + + + +G_DEFINE_TYPE (TerminalWindowDropdown, terminal_window_dropdown, TERMINAL_TYPE_WINDOW) + + + +static void +terminal_window_dropdown_class_init (TerminalWindowDropdownClass *klass) +{ + GObjectClass *gobject_class; + GtkWidgetClass *gtkwidget_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = terminal_window_dropdown_finalize; + + gtkwidget_class = GTK_WIDGET_CLASS (klass); + gtkwidget_class->focus_out_event = terminal_window_dropdown_focus_out_event; +} + + + +static void +terminal_window_dropdown_init (TerminalWindowDropdown *dropdown) +{ + TerminalWindow *window = TERMINAL_WINDOW (dropdown); + GtkAction *action; + GtkWidget *hbox; + GtkWidget *button; + GtkWidget *img; + + /* shared setting to disable some functionality in TerminalWindow */ + window->drop_down = TRUE; + + dropdown->rel_width = 0.8; + dropdown->rel_height = 0.6; + + /* default window settings */ + gtk_window_set_resizable (GTK_WINDOW (dropdown), FALSE); + gtk_window_set_decorated (GTK_WINDOW (dropdown), FALSE); + gtk_window_set_keep_above (GTK_WINDOW (dropdown), TRUE); + gtk_window_set_gravity (GTK_WINDOW (dropdown), GDK_GRAVITY_STATIC); + gtk_window_set_type_hint (GTK_WINDOW (dropdown), GDK_WINDOW_TYPE_HINT_DIALOG); /* avoid smart placement */ + gtk_window_set_opacity (GTK_WINDOW (dropdown), 0.85); + gtk_window_stick (GTK_WINDOW (dropdown)); + + /* this avoids to return focus to the window after dialog changes, + * but we have terminal_activate_window() for that */ + gtk_window_set_skip_pager_hint (GTK_WINDOW (dropdown), TRUE); + gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dropdown), TRUE); + + /* adjust notebook for drop-down usage */ + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (window->notebook), TRUE); + gtk_notebook_set_tab_pos (GTK_NOTEBOOK (window->notebook), GTK_POS_BOTTOM); + terminal_set_style_thinkess (window->notebook, 1); + + /* actions we don't want */ + action = gtk_action_group_get_action (window->action_group, "show-borders"); + gtk_action_set_visible (action, FALSE); + + /* notebook buttons */ + hbox = gtk_hbox_new (TRUE, 2); + gtk_notebook_set_action_widget (GTK_NOTEBOOK (window->notebook), hbox, GTK_PACK_END); + gtk_widget_show (hbox); + + button = dropdown->keep_open = gtk_toggle_button_new (); + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_set_tooltip_text (button, _("Keep window open when it loses focus")); + gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE); + gtk_button_set_focus_on_click (GTK_BUTTON (button), FALSE); + gtk_widget_show (button); + + img = gtk_image_new_from_stock (GTK_STOCK_GOTO_BOTTOM, GTK_ICON_SIZE_MENU); + gtk_container_add (GTK_CONTAINER (button), img); + gtk_widget_show (img); + + button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_set_tooltip_text (button, _("Drop-down Preferences...")); + gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE); + gtk_button_set_focus_on_click (GTK_BUTTON (button), FALSE); + g_signal_connect_swapped (G_OBJECT (button), "clicked", + G_CALLBACK (terminal_window_dropdown_preferences), dropdown); + gtk_widget_show (button); + + img = gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU); + gtk_container_add (GTK_CONTAINER (button), img); + gtk_widget_show (img); +} + + + +static void +terminal_window_dropdown_finalize (GObject *object) +{ + //TerminalWindowDropdown *dropdown = TERMINAL_WINDOW_DROPDOWN (object); + + (*G_OBJECT_CLASS (terminal_window_dropdown_parent_class)->finalize) (object); +} + + + +static gboolean +terminal_window_dropdown_focus_out_event (GtkWidget *widget, + GdkEventFocus *event) +{ + TerminalWindowDropdown *dropdown = TERMINAL_WINDOW_DROPDOWN (widget); + gboolean retval; + GdkGrabStatus status; + + /* let Gtk do its thingy */ + retval = (*GTK_WIDGET_CLASS (terminal_window_dropdown_parent_class)->focus_out_event) (widget, event); + + /* check if keep open is not enabled */ + if (gtk_widget_get_visible (widget) + && TERMINAL_WINDOW (dropdown)->n_child_windows == 0 + && gtk_grab_get_current () == NULL /* popup menu check */ + && !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dropdown->keep_open))) + { + /* check if the user is not pressing a key */ + status = gdk_keyboard_grab (event->window, FALSE, GDK_CURRENT_TIME); + if (status == GDK_GRAB_SUCCESS) + { + /* drop the grab */ + gdk_keyboard_ungrab (GDK_CURRENT_TIME); + + /* hide the window */ + gtk_widget_hide (GTK_WIDGET (dropdown)); + } + } + + return retval; +} + + + +static void +terminal_window_dropdown_position (TerminalWindowDropdown *dropdown) +{ + TerminalWindow *window = TERMINAL_WINDOW (dropdown); + gint w, h; + GdkRectangle monitor_geo; + gint x_dest, y_dest; + GdkScreen *screen; + gint monitor_num; + gint xpad, ypad; + glong char_width, char_height; + GtkRequisition req1, req2; + + /* nothing to do if the window is hidden */ + if (!gtk_widget_get_visible (GTK_WIDGET (dropdown))) + return; + + /* get the active monitor size */ + screen = xfce_gdk_screen_get_active (&monitor_num); + gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor_geo); + + /* move window to correct screen */ + gtk_window_set_screen (GTK_WINDOW (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 (GTK_WIDGET (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); + + /* minimize to fit terminal charaters */ + w -= (w - xpad) % char_width; + h -= (h - ypad) % char_height; + + /* resize the notebook */ + gtk_widget_set_size_request (window->notebook, w, h); + + /* calc position */ + x_dest = monitor_geo.x + (monitor_geo.width - w) / 2; + y_dest = monitor_geo.y; + + /* move */ + gtk_window_move (GTK_WINDOW (dropdown), x_dest, y_dest); +} + + + +static void +terminal_window_dropdown_preferences (TerminalWindowDropdown *dropdown) +{ + +} + + + +static guint32 +terminal_window_dropdown_get_timestamp (GtkWidget *widget, + const gchar *startup_id) +{ + const gchar *timestr; + guint32 timestamp; + gchar *end; + + /* extract the time from the id */ + if (startup_id != NULL) + { + timestr = g_strrstr (startup_id, "_TIME"); + if (G_LIKELY (timestr != NULL)) + { + timestr += 5; + errno = 0; + + /* translate into integer */ + timestamp = strtoul (timestr, &end, 0); + if (end != timestr && errno == 0) + return timestamp; + } + } + + return GDK_CURRENT_TIME; +} + + + +GtkWidget * +terminal_window_dropdown_new (void) +{ + return g_object_new (TERMINAL_TYPE_WINDOW_DROPDOWN, NULL); +} + + + +void +terminal_window_dropdown_toggle (TerminalWindowDropdown *dropdown, + const gchar *startup_id) +{ + guint32 timestamp; + + if (gtk_widget_get_visible (GTK_WIDGET (dropdown))) + { + /* hide */ + gtk_widget_hide (GTK_WIDGET (dropdown)); + } + else + { + /* show with event time */ + timestamp = terminal_window_dropdown_get_timestamp (GTK_WIDGET (dropdown), startup_id); + gtk_window_present_with_time (GTK_WINDOW (dropdown), timestamp); + + /* check position */ + terminal_window_dropdown_position (dropdown); + } + + /* window is focussed or hidden */ + if (startup_id != NULL) + gdk_notify_startup_complete_with_id (startup_id); +} diff --git a/terminal/terminal-window-dropdown.h b/terminal/terminal-window-dropdown.h new file mode 100644 index 0000000..b8dffab --- /dev/null +++ b/terminal/terminal-window-dropdown.h @@ -0,0 +1,46 @@ +/*- + * Copyright (C) 2012 Nick Schermer <n...@xfce.org> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple + * Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __TERMINAL_WINDOW_DROPDOWN_DROPDOWN_H__ +#define __TERMINAL_WINDOW_DROPDOWN_DROPDOWN_H__ + +#include <terminal/terminal-screen.h> +#include <terminal/terminal-options.h> + +G_BEGIN_DECLS + +#define TERMINAL_TYPE_WINDOW_DROPDOWN (terminal_window_dropdown_get_type ()) +#define TERMINAL_WINDOW_DROPDOWN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TERMINAL_TYPE_WINDOW_DROPDOWN, TerminalWindowDropdown)) +#define TERMINAL_WINDOW_DROPDOWN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TERMINAL_TYPE_WINDOW_DROPDOWN, TerminalWindowDropdownClass)) +#define TERMINAL_IS_WINDOW_DROPDOWN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TERMINAL_TYPE_WINDOW_DROPDOWN)) +#define TERMINAL_IS_WINDOW_DROPDOWN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TERMINAL_TYPE_WINDOW_DROPDOWN)) +#define TERMINAL_WINDOW_DROPDOWN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TERMINAL_TYPE_WINDOW_DROPDOWN, TerminalWindowDropdownClass)) + +typedef struct _TerminalWindowDropdownClass TerminalWindowDropdownClass; +typedef struct _TerminalWindowDropdown TerminalWindowDropdown; + +GType terminal_window_dropdown_get_type (void) G_GNUC_CONST; + +GtkWidget *terminal_window_dropdown_new (void); + +void terminal_window_dropdown_toggle (TerminalWindowDropdown *dropdown, + const gchar *startup_id); + +G_END_DECLS + +#endif /* !__TERMINAL_WINDOW_DROPDOWN_H__ */ diff --git a/terminal/terminal-window.c b/terminal/terminal-window.c index 33610ba..b644002 100644 --- a/terminal/terminal-window.c +++ b/terminal/terminal-window.c @@ -191,52 +191,6 @@ static void terminal_window_action_about (GtkAction -struct _TerminalWindowClass -{ - GtkWindowClass __parent__; -}; - -struct _TerminalWindow -{ - GtkWindow __parent__; - - TerminalPreferences *preferences; - GtkWidget *preferences_dialog; - - GtkActionGroup *action_group; - GtkUIManager *ui_manager; - - guint tabs_menu_merge_id; - GSList *tabs_menu_actions; - - GtkWidget *menubar; - GtkWidget *toolbar; - GtkWidget *notebook; - - GtkWidget *search_dialog; - - /* pushed size of screen */ - glong grid_width; - glong grid_height; - - GtkAction *encoding_action; - - TerminalScreen *active; - - /* cached actions to avoid lookups */ - GtkAction *action_detah_tab; - GtkAction *action_close_tab; - GtkAction *action_prev_tab; - GtkAction *action_next_tab; - GtkAction *action_move_tab_left; - GtkAction *action_move_tab_right; - GtkAction *action_copy; - GtkAction *action_search_next; - GtkAction *action_search_prev; -}; - - - static guint window_signals[LAST_SIGNAL]; static gconstpointer window_notebook_group = PACKAGE_NAME; static GQuark tabs_menu_action_quark = 0; @@ -343,7 +297,6 @@ terminal_window_init (TerminalWindow *window) GtkAction *action; GtkWidget *vbox; gboolean always_show_tabs; - GtkRcStyle *style; GdkScreen *screen; GdkColormap *colormap; @@ -399,15 +352,9 @@ terminal_window_init (TerminalWindow *window) "tab-hborder", 0, "tab-vborder", 0, NULL); - g_object_bind_property (G_OBJECT (window->preferences), "misc-tab-position", - G_OBJECT (window->notebook), "tab-pos", - G_BINDING_SYNC_CREATE); /* hide the ugly terminal border when tabs are shown */ - style = gtk_rc_style_new (); - style->xthickness = style->ythickness = 0; - gtk_widget_modify_style (window->notebook, style); - g_object_unref (G_OBJECT (style)); + terminal_set_style_thinkess (window->notebook, 0); /* set the notebook group id */ gtk_notebook_set_group (GTK_NOTEBOOK (window->notebook), @@ -681,7 +628,8 @@ terminal_window_set_size_force_grid (TerminalWindow *window, terminal_return_if_fail (TERMINAL_IS_SCREEN (screen)); /* required to get the char height/width right */ - if (gtk_widget_get_realized (GTK_WIDGET (screen))) + if (gtk_widget_get_realized (GTK_WIDGET (screen)) + && !window->drop_down) { terminal_screen_force_resize_window (screen, GTK_WINDOW (window), force_grid_width, force_grid_height); @@ -902,6 +850,10 @@ terminal_window_notebook_show_tabs (TerminalWindow *window) gboolean show_tabs = TRUE; gint npages; + /* handled by other widget */ + if (window->drop_down) + return; + /* set the visibility of the tabs */ npages = gtk_notebook_get_n_pages (notebook); if (npages < 2) @@ -1614,9 +1566,9 @@ terminal_window_action_goto_tab (GtkRadioAction *action, static void -title_dialog_response (GtkWidget *dialog, - gint response, - GBinding *title_binding) +title_dialog_response (GtkWidget *dialog, + gint response, + TerminalWindow *window) { /* check if we should open the user manual */ if (response == GTK_RESPONSE_HELP) @@ -1626,8 +1578,12 @@ title_dialog_response (GtkWidget *dialog, } else { + /* need for hiding on focus */ + if (window->drop_down) + terminal_activate_window (GTK_WINDOW (window)); + /* close the dialog */ - g_object_unref (title_binding); + window->n_child_windows--; gtk_widget_destroy (dialog); } } @@ -1635,9 +1591,11 @@ title_dialog_response (GtkWidget *dialog, static void -title_dialog_quit (GtkWidget *dialog) +title_dialog_clear (GtkWidget *entry, + GtkEntryIconPosition icon_pos) { - gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE); + if (icon_pos == GTK_ENTRY_ICON_SECONDARY) + gtk_entry_set_text (GTK_ENTRY (entry), ""); } @@ -1646,54 +1604,51 @@ static void terminal_window_action_set_title (GtkAction *action, TerminalWindow *window) { - AtkRelationSet *relations; - AtkRelation *relation; - AtkObject *object; - GtkWidget *dialog; - GtkWidget *box; - GtkWidget *label; - GtkWidget *entry; - GBinding *title_binding; + AtkObject *object; + GtkWidget *dialog; + GtkWidget *box; + GtkWidget *label; + GtkWidget *entry; if (G_LIKELY (window->active != NULL)) { + window->n_child_windows++; + dialog = gtk_dialog_new_with_buttons (Q_("Window Title|Set Title"), GTK_WINDOW (window), - GTK_DIALOG_DESTROY_WITH_PARENT - | GTK_DIALOG_NO_SEPARATOR, + GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_HELP, GTK_RESPONSE_HELP, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE); box = gtk_hbox_new (FALSE, 12); gtk_container_set_border_width (GTK_CONTAINER (box), 6); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), box, TRUE, TRUE, 0); gtk_widget_show (box); - label = gtk_label_new (_("Title:")); + label = gtk_label_new_with_mnemonic (_("_Title:")); gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0); gtk_widget_show (label); entry = gtk_entry_new (); gtk_box_pack_start (GTK_BOX (box), entry, TRUE, TRUE, 0); - g_signal_connect_swapped (G_OBJECT (entry), "activate", - G_CALLBACK (title_dialog_quit), dialog); + gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry); + gtk_entry_set_icon_from_stock (GTK_ENTRY (entry), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_CLEAR); + g_signal_connect (G_OBJECT (entry), "icon-release", G_CALLBACK (title_dialog_clear), NULL); gtk_widget_show (entry); /* set Atk description and label relation for the entry */ object = gtk_widget_get_accessible (entry); atk_object_set_description (object, _("Enter the title for the current terminal tab")); - relations = atk_object_ref_relation_set (gtk_widget_get_accessible (label)); - relation = atk_relation_new (&object, 1, ATK_RELATION_LABEL_FOR); - atk_relation_set_add (relations, relation); - g_object_unref (G_OBJECT (relation)); - title_binding = g_object_bind_property (G_OBJECT (window->active), "custom-title", - G_OBJECT (entry), "text", - G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_object_bind_property (G_OBJECT (window->active), "custom-title", + G_OBJECT (entry), "text", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); g_signal_connect (G_OBJECT (dialog), "response", - G_CALLBACK (title_dialog_response), title_binding); + G_CALLBACK (title_dialog_response), window); gtk_widget_show (dialog); } @@ -1740,7 +1695,12 @@ terminal_window_action_search_response (GtkWidget *dialog, } else { + /* need for hiding on focus */ + if (window->drop_down) + terminal_activate_window (GTK_WINDOW (window)); + /* hide dialog */ + window->n_child_windows--; gtk_widget_hide (dialog); } @@ -1761,9 +1721,12 @@ terminal_window_action_search (GtkAction *action, window->search_dialog = terminal_search_dialog_new (GTK_WINDOW (window)); g_signal_connect (G_OBJECT (window->search_dialog), "response", G_CALLBACK (terminal_window_action_search_response), window); - gtk_widget_show_all (window->search_dialog); } + /* increase child counter */ + if (!gtk_widget_get_visible (window->search_dialog)) + window->n_child_windows++; + terminal_search_dialog_present (TERMINAL_SEARCH_DIALOG (window->search_dialog)); } @@ -1896,6 +1859,11 @@ terminal_window_new (const gchar *role, action = gtk_action_group_get_action (window->action_group, "show-borders"); gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), show_borders); + /* property that is not suitable for init */ + g_object_bind_property (G_OBJECT (window->preferences), "misc-tab-position", + G_OBJECT (window->notebook), "tab-pos", + G_BINDING_SYNC_CREATE); + return GTK_WIDGET (window); } diff --git a/terminal/terminal-window.h b/terminal/terminal-window.h index f877519..ed804f5 100644 --- a/terminal/terminal-window.h +++ b/terminal/terminal-window.h @@ -23,6 +23,7 @@ #include <terminal/terminal-screen.h> #include <terminal/terminal-options.h> +#include <terminal/terminal-preferences.h> G_BEGIN_DECLS @@ -36,6 +37,56 @@ G_BEGIN_DECLS typedef struct _TerminalWindowClass TerminalWindowClass; typedef struct _TerminalWindow TerminalWindow; +struct _TerminalWindowClass +{ + GtkWindowClass __parent__; +}; + +struct _TerminalWindow +{ + GtkWindow __parent__; + + /* if this is a TerminalWindowDropdown */ + guint drop_down : 1; + + /* for the drop-down to keep open with dialogs */ + guint n_child_windows; + + TerminalPreferences *preferences; + GtkWidget *preferences_dialog; + + GtkActionGroup *action_group; + GtkUIManager *ui_manager; + + guint tabs_menu_merge_id; + GSList *tabs_menu_actions; + + GtkWidget *menubar; + GtkWidget *toolbar; + GtkWidget *notebook; + + GtkWidget *search_dialog; + + /* pushed size of screen */ + glong grid_width; + glong grid_height; + + GtkAction *encoding_action; + + TerminalScreen *active; + + /* cached actions to avoid lookups */ + GtkAction *action_detah_tab; + GtkAction *action_close_tab; + GtkAction *action_prev_tab; + GtkAction *action_next_tab; + GtkAction *action_move_tab_left; + GtkAction *action_move_tab_right; + GtkAction *action_copy; + GtkAction *action_search_next; + GtkAction *action_search_prev; +}; + GType terminal_window_get_type (void) G_GNUC_CONST; GtkWidget *terminal_window_new (const gchar *role, _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits