From: John Darrington Date: Sat, 30 Jan 2016 10:45:28 +0000 (+0100) Subject: Reimplement the Windows menu. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp;a=commitdiff_plain;h=f8fdc760d4ee04801a2da8af0700b2a87f724ae4 Reimplement the Windows menu. Fixes bug #45253 --- diff --git a/src/ui/gui/automake.mk b/src/ui/gui/automake.mk index 43068f2876..a88e8e733d 100644 --- a/src/ui/gui/automake.mk +++ b/src/ui/gui/automake.mk @@ -322,7 +322,9 @@ src_ui_gui_psppire_SOURCES = \ src/ui/gui/widget-io.c \ src/ui/gui/widget-io.h \ src/ui/gui/widgets.c \ - src/ui/gui/widgets.h + src/ui/gui/widgets.h \ + src/ui/gui/windows-menu.c \ + src/ui/gui/windows-menu.h OBSOLETE = \ diff --git a/src/ui/gui/data-editor.ui b/src/ui/gui/data-editor.ui index 23f3ad8864..8829e4eca6 100644 --- a/src/ui/gui/data-editor.ui +++ b/src/ui/gui/data-editor.ui @@ -542,26 +542,6 @@ utilities-data-file-comments - - - windows - _Windows - - - - - windows_minimise_all - _Minimize All Windows - windows-minimize-all - - - - - windows_split - _Split - windows-split - - @@ -665,10 +645,6 @@ - - - - diff --git a/src/ui/gui/output-window.ui b/src/ui/gui/output-window.ui index a8aa42db42..1a1a02f940 100644 --- a/src/ui/gui/output-window.ui +++ b/src/ui/gui/output-window.ui @@ -44,19 +44,6 @@ _Copy - - - windows_menuitem - _Windows - - - - - windows-minimize-all - windows_minimise-all - _Minimize All Windows - - @@ -69,9 +56,6 @@ - - - diff --git a/src/ui/gui/psppire-data-window.c b/src/ui/gui/psppire-data-window.c index d7b8ae6f83..7917274da5 100644 --- a/src/ui/gui/psppire-data-window.c +++ b/src/ui/gui/psppire-data-window.c @@ -36,6 +36,7 @@ #include "ui/gui/psppire-encoding-selector.h" #include "ui/gui/psppire-syntax-window.h" #include "ui/gui/psppire-window.h" +#include "ui/gui/windows-menu.h" #include "ui/gui/psppire.h" #include "ui/syntax-gen.h" @@ -722,13 +723,6 @@ toggle_value_labels (PsppireDataWindow *de, GtkToggleAction *ta) g_object_set (de->data_editor, "value-labels", gtk_toggle_action_get_active (ta), NULL); } -static void -toggle_split_window (PsppireDataWindow *de, GtkToggleAction *ta) -{ - psppire_data_editor_split_window (de->data_editor, - gtk_toggle_action_get_active (ta)); -} - static void file_quit (PsppireDataWindow *de) @@ -906,15 +900,10 @@ enable_save (PsppireDataWindow *dw) static void psppire_data_window_init (PsppireDataWindow *de) { - GtkWidget *w ; de->builder = builder_new ("data-editor.ui"); de->ui_manager = GTK_UI_MANAGER (get_object_assert (de->builder, "uimanager1", GTK_TYPE_UI_MANAGER)); - w = gtk_ui_manager_get_widget (de->ui_manager, "/ui/menubar/windows/windows_minimise_all"); - - PSPPIRE_WINDOW (de)->menu = GTK_MENU_SHELL (gtk_widget_get_parent (w)); - de->uim = NULL; de->merge_id = 0; } @@ -1110,10 +1099,7 @@ psppire_data_window_finish_init (PsppireDataWindow *de, connect_action (de, "transform_run-pending", G_CALLBACK (execute)); - connect_action (de, "windows_minimise_all", G_CALLBACK (psppire_window_minimise_all)); - - g_signal_connect_swapped (get_action_assert (de->builder, "windows_split"), "toggled", G_CALLBACK (toggle_split_window), de); - + gtk_menu_shell_append (GTK_MENU_SHELL (menubar), create_windows_menu (GTK_WINDOW (de))); gtk_menu_shell_append (GTK_MENU_SHELL (menubar), create_help_menu (GTK_WINDOW (de))); g_signal_connect (de->data_editor, "notify::ui-manager", diff --git a/src/ui/gui/psppire-output-window.c b/src/ui/gui/psppire-output-window.c index 795804a822..469966af23 100644 --- a/src/ui/gui/psppire-output-window.c +++ b/src/ui/gui/psppire-output-window.c @@ -38,6 +38,7 @@ #include "ui/gui/help-menu.h" #include "ui/gui/builder-wrapper.h" #include "ui/gui/psppire-output-view.h" +#include "ui/gui/windows-menu.h" #include "gl/xalloc.h" @@ -494,24 +495,14 @@ psppire_output_window_init (PsppireOutputWindow *window) G_CALLBACK (cancel_urgency), NULL); - g_signal_connect (get_action_assert (xml,"windows_minimise-all"), - "activate", - G_CALLBACK (psppire_window_minimise_all), - NULL); - - { - GtkWidget *w; - GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (xml, "uimanager1", GTK_TYPE_UI_MANAGER)); + GtkWidget *menubar = get_widget_assert (xml, "menubar"); - GtkWidget *menubar = get_widget_assert (xml, "menubar"); + gtk_menu_shell_append (GTK_MENU_SHELL (menubar), + create_windows_menu (GTK_WINDOW (window))); + + gtk_menu_shell_append (GTK_MENU_SHELL (menubar), + create_help_menu (GTK_WINDOW (window))); - gtk_menu_shell_append (GTK_MENU_SHELL (menubar), create_help_menu (GTK_WINDOW (window))); - - w = gtk_ui_manager_get_widget (uim,"/ui/menubar/windows_menuitem/windows_minimise-all"); - - PSPPIRE_WINDOW (window)->menu = - GTK_MENU_SHELL (gtk_widget_get_parent (w)); - } g_signal_connect_swapped (get_action_assert (xml, "file_export"), "activate", G_CALLBACK (psppire_output_window_export), window); diff --git a/src/ui/gui/psppire-syntax-window.c b/src/ui/gui/psppire-syntax-window.c index 66838dd307..f8758a0cd7 100644 --- a/src/ui/gui/psppire-syntax-window.c +++ b/src/ui/gui/psppire-syntax-window.c @@ -36,8 +36,8 @@ #include "ui/gui/psppire-encoding-selector.h" #include "ui/gui/psppire-lex-reader.h" #include "ui/gui/psppire-syntax-window.h" -#include "ui/gui/psppire-window-register.h" #include "ui/gui/psppire.h" +#include "ui/gui/windows-menu.h" #include "gl/localcharset.h" #include "gl/xalloc.h" @@ -859,19 +859,11 @@ psppire_syntax_window_init (PsppireSyntaxWindow *window) G_CALLBACK (on_run_to_end), window); - g_signal_connect (get_action_assert (xml,"windows_minimise_all"), - "activate", - G_CALLBACK (psppire_window_minimise_all), NULL); - - - { - GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (xml, "uimanager1", GTK_TYPE_UI_MANAGER)); - GtkWidget *w = gtk_ui_manager_get_widget (uim,"/ui/menubar/windows/windows_minimise_all"); - - gtk_menu_shell_append (GTK_MENU_SHELL (menubar), create_help_menu (GTK_WINDOW (window))); + gtk_menu_shell_append (GTK_MENU_SHELL (menubar), + create_windows_menu (GTK_WINDOW (window))); - PSPPIRE_WINDOW (window)->menu = GTK_MENU_SHELL (gtk_widget_get_parent (w)); - } + gtk_menu_shell_append (GTK_MENU_SHELL (menubar), + create_help_menu (GTK_WINDOW (window))); g_object_unref (xml); } diff --git a/src/ui/gui/psppire-window-register.c b/src/ui/gui/psppire-window-register.c index dbab4b18c7..75fb6efcd3 100644 --- a/src/ui/gui/psppire-window-register.c +++ b/src/ui/gui/psppire-window-register.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2008 Free Software Foundation + Copyright (C) 2008 Free Software Foundation 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 @@ -146,13 +146,11 @@ psppire_window_register_insert (PsppireWindowRegister *wr, PsppireWindow *window g_signal_emit (wr, signals[INSERTED], 0, name); } - void psppire_window_register_remove (PsppireWindowRegister *wr, const gchar *name) { - g_signal_emit (wr, signals[REMOVED], 0, name); - g_hash_table_remove (wr->name_table, (gpointer) name); + g_signal_emit (wr, signals[REMOVED], 0, name); } PsppireWindow * diff --git a/src/ui/gui/psppire-window-register.h b/src/ui/gui/psppire-window-register.h index 14b2a9461e..cf4f4d8ec9 100644 --- a/src/ui/gui/psppire-window-register.h +++ b/src/ui/gui/psppire-window-register.h @@ -87,6 +87,8 @@ void psppire_window_register_foreach (PsppireWindowRegister *wr, GHFunc func, gint psppire_window_register_n_items (PsppireWindowRegister *wr); +GtkWidget *create_windows_menu (GtkWindow *toplevel); + G_END_DECLS diff --git a/src/ui/gui/psppire-window.c b/src/ui/gui/psppire-window.c index c0268e67b9..6fb0b87c47 100644 --- a/src/ui/gui/psppire-window.c +++ b/src/ui/gui/psppire-window.c @@ -313,62 +313,15 @@ psppire_window_base_init (PsppireWindowClass *class) -static void -menu_toggled (GtkCheckMenuItem *mi, gpointer data) -{ -#if GTK3_TRANSITION - /* Prohibit changes to the state */ - mi->active = !mi->active; -#endif -} - - -/* Look up the window associated with this menuitem and present it to the user */ -static void -menu_activate (GtkMenuItem *mi, gpointer data) -{ - const gchar *key = data; - - PsppireWindowRegister *reg = psppire_window_register_new (); - - PsppireWindow *window = psppire_window_register_lookup (reg, key); - - gtk_window_present (GTK_WINDOW (window)); -} - static void insert_menuitem_into_menu (PsppireWindow *window, gpointer key) { gchar *filename; GtkWidget *item; - - /* Add a separator before adding the first real item. If we add a separator - at any other time, sometimes GtkUIManager removes it. */ - if (!window->added_separator) - { - GtkWidget *separator = gtk_separator_menu_item_new (); - gtk_widget_show (separator); - gtk_menu_shell_append (window->menu, separator); - window->added_separator = TRUE; - } - filename = g_filename_display_name (key); item = gtk_check_menu_item_new_with_label (filename); g_free (filename); - - g_signal_connect (item, "toggled", G_CALLBACK (menu_toggled), NULL); - g_signal_connect (item, "activate", G_CALLBACK (menu_activate), key); - - gtk_widget_show (item); - - gtk_menu_shell_append (window->menu, item); - -#if GTK3_TRANSITION - /* Set the state without emitting a signal */ - GTK_CHECK_MENU_ITEM (item)->active = - (psppire_window_register_lookup (psppire_window_register_new (), key) == window); -#endif - + g_hash_table_insert (window->menuitem_table, key, item); } @@ -397,14 +350,7 @@ static void remove_menuitem (PsppireWindowRegister *reg, const gchar *key, gpointer data) { PsppireWindow *window = PSPPIRE_WINDOW (data); - GtkWidget *item ; - - item = g_hash_table_lookup (window->menuitem_table, key); - g_hash_table_remove (window->menuitem_table, key); - - if (GTK_IS_CONTAINER (window->menu)) - gtk_container_remove (GTK_CONTAINER (window->menu), item); } static void @@ -452,7 +398,6 @@ on_delete (PsppireWindow *w, GdkEvent *event, gpointer user_data) static void psppire_window_init (PsppireWindow *window) { - window->menu = NULL; window->filename = NULL; window->basename = NULL; window->id = NULL; @@ -619,7 +564,7 @@ psppire_window_model_get_type (void) window_model_type = g_type_register_static (G_TYPE_INTERFACE, "PsppireWindowModel", &window_model_info, 0); - + g_type_interface_add_prerequisite (window_model_type, G_TYPE_OBJECT); } diff --git a/src/ui/gui/psppire-window.h b/src/ui/gui/psppire-window.h index 0e57b4d78d..bc1b0f0b28 100644 --- a/src/ui/gui/psppire-window.h +++ b/src/ui/gui/psppire-window.h @@ -68,7 +68,6 @@ struct _PsppireWindow gchar *list_name; /* Name for "Windows" menu list. */ GHashTable *menuitem_table; - GtkMenuShell *menu; guint insert_handler; guint remove_handler; diff --git a/src/ui/gui/syntax-editor.ui b/src/ui/gui/syntax-editor.ui index 7b48bc6f75..797a7f04e0 100644 --- a/src/ui/gui/syntax-editor.ui +++ b/src/ui/gui/syntax-editor.ui @@ -148,19 +148,6 @@ To End - - - windows - _Windows - - - - - windows-minimize-all - windows_minimise_all - _Minimize All Windows - - @@ -193,9 +180,6 @@ - - - diff --git a/src/ui/gui/windows-menu.c b/src/ui/gui/windows-menu.c new file mode 100644 index 0000000000..5390b0e9ae --- /dev/null +++ b/src/ui/gui/windows-menu.c @@ -0,0 +1,151 @@ +/* PSPPIRE - a graphical user interface for PSPP. + Copyright (C) 2016 Free Software Foundation + + 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 3 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, see . */ + +#include + +#include "windows-menu.h" +#include "psppire-window-register.h" +#include "psppire-data-window.h" + +#include +#define _(msgid) gettext (msgid) +#define N_(msgid) msgid + +static void +minimise (gpointer key, gpointer value, gpointer user_data) +{ + PsppireWindow *pw = PSPPIRE_WINDOW (value); + gtk_window_iconify (GTK_WINDOW (pw)); +} + +static void +min_all (GtkWidget *widget, gpointer ud) +{ + PsppireWindowRegister *reg = psppire_window_register_new (); + + psppire_window_register_foreach (reg, minimise, NULL); +} + +static void +reset_check_state (GtkWidget *widget, gpointer ud) +{ + /* Prevent the state from actually changing */ + g_signal_handlers_block_by_func (widget, reset_check_state, ud); + gboolean state = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (widget), !state); + g_signal_handlers_unblock_by_func (widget, reset_check_state, ud); +} + +static gboolean +raise_window (GtkWidget *widget, GdkEvent *ev, gpointer ud) +{ + GtkWindow *win = GTK_WINDOW (ud); + gtk_window_present_with_time (win, ((GdkEventButton *)ev)->time); + + return FALSE; +} + + +static void +add_menuitem (gpointer key, gpointer value, gpointer user_data) +{ + GtkMenu *menu = GTK_MENU (user_data); + PsppireWindow *pw = PSPPIRE_WINDOW (value); + + GtkWidget *mi = gtk_check_menu_item_new_with_label (key); + + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi), + pw == g_object_get_data (G_OBJECT (menu), "toplevel")); + + g_signal_connect (mi, "toggled", G_CALLBACK (reset_check_state), pw); + + g_signal_connect (mi, "button-press-event", G_CALLBACK (raise_window), pw); + + + gtk_container_add (GTK_CONTAINER(menu), mi); +} + +static void +toggle_split_window (PsppireDataWindow *de, GtkCheckMenuItem *ta) +{ + psppire_data_editor_split_window (de->data_editor, + gtk_check_menu_item_get_active (ta)); +} + + + +static void +repopulate_windows_menu (GObject *inst, gchar *name, gpointer data) +{ + PsppireWindowRegister *reg = psppire_window_register_new (); + GtkMenuItem *mi = GTK_MENU_ITEM (data); + + GtkWidget *menu = gtk_menu_new (); + + GtkWindow *toplevel = g_object_get_data (G_OBJECT (mi), "toplevel"); + + GtkWidget *minimize = gtk_menu_item_new_with_mnemonic (_("_Minimize all Windows")); + GtkWidget *split = gtk_check_menu_item_new_with_mnemonic (_("_Split")); + + + GtkWidget *sep = gtk_separator_menu_item_new (); + + gtk_menu_attach (GTK_MENU (menu), minimize, 0, 1, 0, 1); + + if (PSPPIRE_DATA_WINDOW_TYPE == G_OBJECT_TYPE (toplevel) ) + { + gtk_menu_attach (GTK_MENU (menu), split, 0, 1, 1, 2); + g_signal_connect_swapped (split, "toggled", + G_CALLBACK (toggle_split_window), toplevel); + } + + gtk_container_add (GTK_CONTAINER (menu), sep); + + gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), menu); + + g_object_set_data (G_OBJECT (menu), "toplevel", toplevel); + + g_hash_table_foreach (reg->name_table, add_menuitem, menu); + + g_signal_connect (minimize, "activate", G_CALLBACK (min_all), NULL); + + gtk_widget_show_all (GTK_WIDGET (mi)); +} + +static void +on_destroy (GtkWindow *w, gpointer data) +{ + PsppireWindowRegister *reg = psppire_window_register_new (); + + g_signal_handlers_disconnect_by_func (reg, repopulate_windows_menu, w); +} + +GtkWidget * +create_windows_menu (GtkWindow *toplevel) +{ + PsppireWindowRegister *reg = psppire_window_register_new (); + + GtkWidget *menuitem = gtk_menu_item_new_with_mnemonic (_("_Windows")); + + g_object_set_data (G_OBJECT (menuitem), "toplevel", toplevel); + + g_signal_connect (reg, "removed", G_CALLBACK (repopulate_windows_menu), menuitem); + g_signal_connect (reg, "inserted", G_CALLBACK (repopulate_windows_menu), menuitem); + + g_signal_connect (menuitem, "destroy", G_CALLBACK (on_destroy), NULL); + + return menuitem; +} diff --git a/src/ui/gui/windows-menu.h b/src/ui/gui/windows-menu.h new file mode 100644 index 0000000000..538c0fd072 --- /dev/null +++ b/src/ui/gui/windows-menu.h @@ -0,0 +1,25 @@ +/* PSPPIRE - a graphical user interface for PSPP. + Copyright (C) 2016 Free Software Foundation + + 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 3 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, see . */ + + +#ifndef WINDOWS_MENU_H +#define WINDOWS_MENU_H + +#include + +GtkWidget * create_windows_menu (GtkWindow *toplevel); + +#endif