From 38d0abc026480263465acd6475ef5471b3f57caa Mon Sep 17 00:00:00 2001 From: Jehan Date: Tue, 7 Mar 2023 18:23:38 +0100 Subject: [PATCH] app: prevent multiple registrations of a same action. Pre-GIMP-3.0 code logics would re-allocate several GimpMenuFactory or GimpUIManager for no good reason. While it was still working with old GtkAction code, with our new GAction-based code, we were ending up overriding an action with a new version of the same action, while keeping reference to old actions. This made for discrepancies of the enabled or visible state of actions. The new code keeps singleton of some objects and references to already registered GimpUIManager or GimpActionGroups objects and make sure no actions with the same name are created twice. --- app/actions/debug-commands.c | 13 ++- app/actions/view-commands.c | 6 +- app/dialogs/dialogs-constructors.c | 86 ++++++++++---------- app/dialogs/dialogs.c | 8 +- app/dialogs/dialogs.h | 3 +- app/display/gimpdisplayshell-actions.c | 8 +- app/display/gimpdisplayshell-callbacks.c | 6 +- app/display/gimpdisplayshell-close.c | 6 +- app/display/gimpdisplayshell-tool-events.c | 16 ++-- app/display/gimpdisplayshell.c | 4 +- app/display/gimpimagewindow.c | 47 ++++------- app/display/gimpimagewindow.h | 1 - app/display/gimpsinglewindowstrategy.c | 4 +- app/display/gimptoolpath.c | 37 ++++----- app/gui/gui-vtable.c | 2 +- app/gui/gui.c | 16 ++-- app/menus/menus.c | 44 +++++++--- app/menus/menus.h | 21 +++-- app/tests/gimp-app-test-utils.c | 23 +----- app/tests/test-ui.c | 5 +- app/tools/gimptexttool-editor.c | 4 +- app/tools/gimptexttool.c | 24 ++---- app/tools/gimptexttool.h | 1 - app/widgets/gimpactionfactory.c | 28 ++++--- app/widgets/gimpactionfactory.h | 24 +++--- app/widgets/gimpactiongroup.c | 95 +++++++++++++++++----- app/widgets/gimpcontrollers.c | 3 +- app/widgets/gimpdialogfactory.c | 21 ++--- app/widgets/gimpdialogfactory.h | 4 +- app/widgets/gimpdock.c | 4 +- app/widgets/gimpdockable.c | 4 +- app/widgets/gimpdockbook.c | 18 ++-- app/widgets/gimpdockbook.h | 2 - app/widgets/gimpdockcolumns.c | 12 ++- app/widgets/gimpdockwindow.c | 8 +- app/widgets/gimpeditor.c | 16 ++-- app/widgets/gimpmenufactory.c | 52 ++++++------ app/widgets/gimpmenufactory.h | 12 ++- app/widgets/gimpsessioninfo-book.c | 6 +- app/widgets/gimptexteditor.c | 3 +- 40 files changed, 358 insertions(+), 339 deletions(-) diff --git a/app/actions/debug-commands.c b/app/actions/debug-commands.c index c1ce1f9c25..8b6abf2c50 100644 --- a/app/actions/debug-commands.c +++ b/app/actions/debug-commands.c @@ -114,15 +114,14 @@ debug_dump_keyboard_shortcuts_cmd_callback (GimpAction *action, GVariant *value, gpointer data) { - GimpDisplay *display; - GimpImageWindow *window; - GimpUIManager *manager; - GList *group_it; - GList *strings = NULL; + GimpDisplay *display; + GimpUIManager *manager; + GList *group_it; + GList *strings = NULL; + return_if_no_display (display, data); - window = gimp_display_shell_get_window (gimp_display_get_shell (display)); - manager = gimp_image_window_get_ui_manager (window); + manager = menus_get_image_manager_singleton (display->gimp); /* Gather formatted strings of keyboard shortcuts */ for (group_it = gimp_ui_manager_get_action_groups (manager); diff --git a/app/actions/view-commands.c b/app/actions/view-commands.c index 563ab11cef..07ef42a3f3 100644 --- a/app/actions/view-commands.c +++ b/app/actions/view-commands.c @@ -59,6 +59,8 @@ #include "dialogs/color-profile-dialog.h" #include "dialogs/dialogs.h" +#include "menus/menus.h" + #include "actions.h" #include "view-commands.h" @@ -324,7 +326,7 @@ view_show_all_cmd_callback (GimpAction *action, gimp_display_shell_set_show_all (shell, active); if (window) - SET_ACTIVE (gimp_image_window_get_ui_manager (window), + SET_ACTIVE (menus_get_image_manager_singleton (display->gimp), "view-show-all", shell->show_all); if (IS_ACTIVE_DISPLAY (display)) @@ -354,7 +356,7 @@ view_dot_for_dot_cmd_callback (GimpAction *action, gimp_display_shell_scale_set_dot_for_dot (shell, active); if (window) - SET_ACTIVE (gimp_image_window_get_ui_manager (window), + SET_ACTIVE (menus_get_image_manager_singleton (display->gimp), "view-dot-for-dot", shell->dot_for_dot); if (IS_ACTIVE_DISPLAY (display)) diff --git a/app/dialogs/dialogs-constructors.c b/app/dialogs/dialogs-constructors.c index b710d35919..af9f72719f 100644 --- a/app/dialogs/dialogs-constructors.c +++ b/app/dialogs/dialogs-constructors.c @@ -29,6 +29,8 @@ #include "config/gimpguiconfig.h" +#include "menus/menus.h" + #include "widgets/gimpbrusheditor.h" #include "widgets/gimpbrushfactoryview.h" #include "widgets/gimpbufferview.h" @@ -346,7 +348,7 @@ dialogs_tool_options_new (GimpDialogFactory *factory, gint view_size) { return gimp_tool_options_editor_new (context->gimp, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -365,7 +367,7 @@ dialogs_error_console_new (GimpDialogFactory *factory, gint view_size) { return gimp_error_console_new (context->gimp, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -375,7 +377,7 @@ dialogs_cursor_view_new (GimpDialogFactory *factory, gint view_size) { return gimp_cursor_view_new (context->gimp, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -385,7 +387,7 @@ dialogs_dashboard_new (GimpDialogFactory *factory, gint view_size) { return gimp_dashboard_new (context->gimp, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } @@ -401,7 +403,7 @@ dialogs_image_list_view_new (GimpDialogFactory *factory, context->gimp->images, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -415,7 +417,7 @@ dialogs_brush_list_view_new (GimpDialogFactory *factory, context, TRUE, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -428,7 +430,7 @@ dialogs_dynamics_list_view_new (GimpDialogFactory *factory, context->gimp->dynamics_factory, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -441,7 +443,7 @@ dialogs_mypaint_brush_list_view_new (GimpDialogFactory *factory, context->gimp->mybrush_factory, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory), + menus_get_global_menu_factory (context->gimp), "", "/mypaint-brushes-popup", "mypaint-brushes"); @@ -457,7 +459,7 @@ dialogs_pattern_list_view_new (GimpDialogFactory *factory, context->gimp->pattern_factory, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -470,7 +472,7 @@ dialogs_gradient_list_view_new (GimpDialogFactory *factory, context->gimp->gradient_factory, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory), + menus_get_global_menu_factory (context->gimp), "", "/gradients-popup", "gradients"); @@ -486,7 +488,7 @@ dialogs_palette_list_view_new (GimpDialogFactory *factory, context->gimp->palette_factory, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory), + menus_get_global_menu_factory (context->gimp), "", "/palettes-popup", "palettes"); @@ -502,7 +504,7 @@ dialogs_font_list_view_new (GimpDialogFactory *factory, context->gimp->font_factory, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -515,7 +517,7 @@ dialogs_buffer_list_view_new (GimpDialogFactory *factory, context->gimp->named_buffers, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -528,7 +530,7 @@ dialogs_tool_preset_list_view_new (GimpDialogFactory *factory, context->gimp->tool_preset_factory, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -541,7 +543,7 @@ dialogs_document_list_view_new (GimpDialogFactory *factory, context->gimp->documents, context, view_size, 0, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -554,7 +556,7 @@ dialogs_template_list_view_new (GimpDialogFactory *factory, context->gimp->templates, context, view_size, 0, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } @@ -570,7 +572,7 @@ dialogs_image_grid_view_new (GimpDialogFactory *factory, context->gimp->images, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -584,7 +586,7 @@ dialogs_brush_grid_view_new (GimpDialogFactory *factory, context, TRUE, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -597,7 +599,7 @@ dialogs_dynamics_grid_view_new (GimpDialogFactory *factory, context->gimp->dynamics_factory, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -610,7 +612,7 @@ dialogs_mypaint_brush_grid_view_new (GimpDialogFactory *factory, context->gimp->mybrush_factory, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory), + menus_get_global_menu_factory (context->gimp), "", "/mypaint-brushes-popup", "mypaint-brushes"); @@ -626,7 +628,7 @@ dialogs_pattern_grid_view_new (GimpDialogFactory *factory, context->gimp->pattern_factory, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -639,7 +641,7 @@ dialogs_gradient_grid_view_new (GimpDialogFactory *factory, context->gimp->gradient_factory, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory), + menus_get_global_menu_factory (context->gimp), "", "/gradients-popup", "gradients"); @@ -655,7 +657,7 @@ dialogs_palette_grid_view_new (GimpDialogFactory *factory, context->gimp->palette_factory, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory), + menus_get_global_menu_factory (context->gimp), "", "/palettes-popup", "palettes"); @@ -671,7 +673,7 @@ dialogs_font_grid_view_new (GimpDialogFactory *factory, context->gimp->font_factory, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -684,7 +686,7 @@ dialogs_buffer_grid_view_new (GimpDialogFactory *factory, context->gimp->named_buffers, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -697,7 +699,7 @@ dialogs_tool_preset_grid_view_new (GimpDialogFactory *factory, context->gimp->tool_preset_factory, context, view_size, 1, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -710,7 +712,7 @@ dialogs_document_grid_view_new (GimpDialogFactory *factory, context->gimp->documents, context, view_size, 0, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -723,7 +725,7 @@ dialogs_template_grid_view_new (GimpDialogFactory *factory, context->gimp->templates, context, view_size, 0, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } @@ -741,7 +743,7 @@ dialogs_layer_list_view_new (GimpDialogFactory *factory, return gimp_item_tree_view_new (GIMP_TYPE_LAYER_TREE_VIEW, view_size, 2, TRUE, gimp_context_get_image (context), - gimp_dialog_factory_get_menu_factory (factory), + menus_get_global_menu_factory (context->gimp), "", "/layers-popup"); } @@ -758,7 +760,7 @@ dialogs_channel_list_view_new (GimpDialogFactory *factory, return gimp_item_tree_view_new (GIMP_TYPE_CHANNEL_TREE_VIEW, view_size, 1, TRUE, gimp_context_get_image (context), - gimp_dialog_factory_get_menu_factory (factory), + menus_get_global_menu_factory (context->gimp), "", "/channels-popup"); } @@ -775,7 +777,7 @@ dialogs_vectors_list_view_new (GimpDialogFactory *factory, return gimp_item_tree_view_new (GIMP_TYPE_VECTORS_TREE_VIEW, view_size, 1, TRUE, gimp_context_get_image (context), - gimp_dialog_factory_get_menu_factory (factory), + menus_get_global_menu_factory (context->gimp), "", "/vectors-popup"); } @@ -786,7 +788,7 @@ dialogs_colormap_editor_new (GimpDialogFactory *factory, GimpUIManager *ui_manager, gint view_size) { - return gimp_colormap_editor_new (gimp_dialog_factory_get_menu_factory (factory)); + return gimp_colormap_editor_new (menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -804,7 +806,7 @@ dialogs_selection_editor_new (GimpDialogFactory *factory, GimpUIManager *ui_manager, gint view_size) { - return gimp_selection_editor_new (gimp_dialog_factory_get_menu_factory (factory)); + return gimp_selection_editor_new (menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -813,7 +815,7 @@ dialogs_symmetry_editor_new (GimpDialogFactory *factory, GimpUIManager *ui_manager, gint view_size) { - return gimp_symmetry_editor_new (gimp_dialog_factory_get_menu_factory (factory)); + return gimp_symmetry_editor_new (menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -823,7 +825,7 @@ dialogs_undo_editor_new (GimpDialogFactory *factory, gint view_size) { return gimp_undo_editor_new (context->gimp->config, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -832,7 +834,7 @@ dialogs_sample_point_editor_new (GimpDialogFactory *factory, GimpUIManager *ui_manager, gint view_size) { - return gimp_sample_point_editor_new (gimp_dialog_factory_get_menu_factory (factory)); + return gimp_sample_point_editor_new (menus_get_global_menu_factory (context->gimp)); } @@ -844,7 +846,7 @@ dialogs_navigation_editor_new (GimpDialogFactory *factory, GimpUIManager *ui_manager, gint view_size) { - return gimp_navigation_editor_new (gimp_dialog_factory_get_menu_factory (factory)); + return gimp_navigation_editor_new (menus_get_global_menu_factory (context->gimp)); } @@ -871,7 +873,7 @@ dialogs_brush_editor_get (GimpDialogFactory *factory, gint view_size) { return gimp_brush_editor_new (context, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -881,7 +883,7 @@ dialogs_dynamics_editor_get (GimpDialogFactory *factory, gint view_size) { return gimp_dynamics_editor_new (context, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -891,7 +893,7 @@ dialogs_gradient_editor_get (GimpDialogFactory *factory, gint view_size) { return gimp_gradient_editor_new (context, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -901,7 +903,7 @@ dialogs_palette_editor_get (GimpDialogFactory *factory, gint view_size) { return gimp_palette_editor_new (context, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } GtkWidget * @@ -911,5 +913,5 @@ dialogs_tool_preset_editor_get (GimpDialogFactory *factory, gint view_size) { return gimp_tool_preset_editor_new (context, - gimp_dialog_factory_get_menu_factory (factory)); + menus_get_global_menu_factory (context->gimp)); } diff --git a/app/dialogs/dialogs.c b/app/dialogs/dialogs.c index 608a15ed39..d637bd4b6b 100644 --- a/app/dialogs/dialogs.c +++ b/app/dialogs/dialogs.c @@ -523,18 +523,14 @@ dialogs_restore_window (GimpDialogFactory *factory, /* public functions */ void -dialogs_init (Gimp *gimp, - GimpMenuFactory *menu_factory) +dialogs_init (Gimp *gimp) { GimpDialogFactory *factory = NULL; gint i = 0; g_return_if_fail (GIMP_IS_GIMP (gimp)); - g_return_if_fail (GIMP_IS_MENU_FACTORY (menu_factory)); - factory = gimp_dialog_factory_new ("toplevel", - gimp_get_user_context (gimp), - menu_factory); + factory = gimp_dialog_factory_new ("toplevel", gimp_get_user_context (gimp)); gimp_dialog_factory_set_singleton (factory); for (i = 0; i < G_N_ELEMENTS (entries); i++) diff --git a/app/dialogs/dialogs.h b/app/dialogs/dialogs.h index 387dfa2fa4..6ffe780407 100644 --- a/app/dialogs/dialogs.h +++ b/app/dialogs/dialogs.h @@ -23,8 +23,7 @@ extern GimpDialogFactory *global_dialog_factory; extern GimpContainer *global_recent_docks; -void dialogs_init (Gimp *gimp, - GimpMenuFactory *menu_factory); +void dialogs_init (Gimp *gimp); void dialogs_exit (Gimp *gimp); void dialogs_load_recent_docks (Gimp *gimp); diff --git a/app/display/gimpdisplayshell-actions.c b/app/display/gimpdisplayshell-actions.c index e6c87eed90..76574ce1c9 100644 --- a/app/display/gimpdisplayshell-actions.c +++ b/app/display/gimpdisplayshell-actions.c @@ -25,6 +25,8 @@ #include "core/gimp.h" #include "core/gimpcontext.h" +#include "menus/menus.h" + #include "widgets/gimpactiongroup.h" #include "widgets/gimpuimanager.h" @@ -49,7 +51,7 @@ gimp_display_shell_set_action_sensitive (GimpDisplayShell *shell, if (window && gimp_image_window_get_active_shell (window) == shell) { - GimpUIManager *manager = gimp_image_window_get_ui_manager (window); + GimpUIManager *manager = menus_get_image_manager_singleton (shell->display->gimp); GimpActionGroup *action_group; action_group = gimp_ui_manager_get_action_group (manager, "view"); @@ -87,7 +89,7 @@ gimp_display_shell_set_action_active (GimpDisplayShell *shell, if (window && gimp_image_window_get_active_shell (window) == shell) { - GimpUIManager *manager = gimp_image_window_get_ui_manager (window); + GimpUIManager *manager = menus_get_image_manager_singleton (shell->display->gimp); GimpActionGroup *action_group; action_group = gimp_ui_manager_get_action_group (manager, "view"); @@ -125,7 +127,7 @@ gimp_display_shell_set_action_color (GimpDisplayShell *shell, if (window && gimp_image_window_get_active_shell (window) == shell) { - GimpUIManager *manager = gimp_image_window_get_ui_manager (window); + GimpUIManager *manager = menus_get_image_manager_singleton (shell->display->gimp); GimpActionGroup *action_group; action_group = gimp_ui_manager_get_action_group (manager, "view"); diff --git a/app/display/gimpdisplayshell-callbacks.c b/app/display/gimpdisplayshell-callbacks.c index 8c17e7f9e6..2768f63e88 100644 --- a/app/display/gimpdisplayshell-callbacks.c +++ b/app/display/gimpdisplayshell-callbacks.c @@ -29,6 +29,8 @@ #include "core/gimpimage.h" #include "core/gimpimage-quick-mask.h" +#include "menus/menus.h" + #include "widgets/gimpcairo-wilber.h" #include "widgets/gimpuimanager.h" @@ -349,7 +351,7 @@ gimp_display_shell_quick_mask_button_press (GtkWidget *widget, if (window) { - GimpUIManager *manager = gimp_image_window_get_ui_manager (window); + GimpUIManager *manager = menus_get_image_manager_singleton (shell->display->gimp); gimp_ui_manager_ui_popup_at_widget (manager, "/quick-mask-popup", @@ -380,7 +382,7 @@ gimp_display_shell_quick_mask_toggled (GtkWidget *widget, if (window) { - GimpUIManager *manager = gimp_image_window_get_ui_manager (window); + GimpUIManager *manager = menus_get_image_manager_singleton (shell->display->gimp); gimp_ui_manager_toggle_action (manager, "quick-mask", "quick-mask-toggle", diff --git a/app/display/gimpdisplayshell-close.c b/app/display/gimpdisplayshell-close.c index c09da4196e..bfe53b147e 100644 --- a/app/display/gimpdisplayshell-close.c +++ b/app/display/gimpdisplayshell-close.c @@ -34,6 +34,8 @@ #include "core/gimpcontext.h" #include "core/gimpimage.h" +#include "menus/menus.h" + #include "widgets/gimphelp-ids.h" #include "widgets/gimpmessagebox.h" #include "widgets/gimpmessagedialog.h" @@ -123,7 +125,7 @@ gimp_display_shell_close (GimpDisplayShell *shell, if (window) { - GimpUIManager *manager = gimp_image_window_get_ui_manager (window); + GimpUIManager *manager = menus_get_image_manager_singleton (shell->display->gimp); /* Activate the action instead of simply calling gimp_exit(), so * the quit action's sensitivity is taken into account. @@ -381,7 +383,7 @@ gimp_display_shell_close_response (GtkWidget *widget, if (window) { - GimpUIManager *manager = gimp_image_window_get_ui_manager (window); + GimpUIManager *manager = menus_get_image_manager_singleton (shell->display->gimp); gimp_image_window_set_active_shell (window, shell); diff --git a/app/display/gimpdisplayshell-tool-events.c b/app/display/gimpdisplayshell-tool-events.c index 9232b47b24..b0f4a47d20 100644 --- a/app/display/gimpdisplayshell-tool-events.c +++ b/app/display/gimpdisplayshell-tool-events.c @@ -38,6 +38,8 @@ #include "core/gimpimage-pick-item.h" #include "core/gimpitem.h" +#include "menus/menus.h" + #include "widgets/gimpaction.h" #include "widgets/gimpcontrollers.h" #include "widgets/gimpcontrollerkeyboard.h" @@ -273,8 +275,7 @@ gimp_display_shell_canvas_no_image_events (GtkWidget *canvas, GdkEventButton *bevent = (GdkEventButton *) event; if (bevent->button == 1) { - GimpImageWindow *window = gimp_display_shell_get_window (shell); - GimpUIManager *manager = gimp_image_window_get_ui_manager (window); + GimpUIManager *manager = menus_get_image_manager_singleton (shell->display->gimp); gimp_ui_manager_activate_action (manager, "file", "file-open"); } @@ -2103,9 +2104,8 @@ static gboolean gimp_display_shell_tab_pressed (GimpDisplayShell *shell, const GdkEventKey *kevent) { - GimpImageWindow *window = gimp_display_shell_get_window (shell); - GimpUIManager *manager = gimp_image_window_get_ui_manager (window); - GimpImage *image = gimp_display_get_image (shell->display); + GimpUIManager *manager = menus_get_image_manager_singleton (shell->display->gimp); + GimpImage *image = gimp_display_get_image (shell->display); if (kevent->state & GDK_CONTROL_MASK) { @@ -2292,11 +2292,9 @@ gimp_display_shell_initialize_tool (GimpDisplayShell *shell, * just calling gimp_context_tool_changed(). See * GimpGeglProcedure and bug #776370. */ - GimpImageWindow *window; - GimpUIManager *manager; + GimpUIManager *manager; - window = gimp_display_shell_get_window (shell); - manager = gimp_image_window_get_ui_manager (window); + manager = menus_get_image_manager_singleton (shell->display->gimp); gimp_filter_history_add (gimp, procedure); gimp_ui_manager_activate_action (manager, "filters", diff --git a/app/display/gimpdisplayshell.c b/app/display/gimpdisplayshell.c index 3bb7f3dbd2..4386c2ddef 100644 --- a/app/display/gimpdisplayshell.c +++ b/app/display/gimpdisplayshell.c @@ -51,6 +51,8 @@ #include "core/gimpprojection.h" #include "core/gimptemplate.h" +#include "menus/menus.h" + #include "widgets/gimpdevices.h" #include "widgets/gimphelp-ids.h" #include "widgets/gimpuimanager.h" @@ -1981,7 +1983,7 @@ gimp_display_shell_flush (GimpDisplayShell *shell) if (window && gimp_image_window_get_active_shell (window) == shell) { - GimpUIManager *manager = gimp_image_window_get_ui_manager (window); + GimpUIManager *manager = menus_get_image_manager_singleton (shell->display->gimp); gimp_ui_manager_update (manager, shell->display); } diff --git a/app/display/gimpimagewindow.c b/app/display/gimpimagewindow.c index 4b21603b73..0d6fb06300 100644 --- a/app/display/gimpimagewindow.c +++ b/app/display/gimpimagewindow.c @@ -62,6 +62,8 @@ #include "widgets/gimpviewrenderer.h" #include "widgets/gimpwidgets-utils.h" +#include "menus/menus.h" + #include "gimpdisplay.h" #include "gimpdisplay-foreach.h" #include "gimpdisplayshell.h" @@ -110,7 +112,6 @@ typedef struct _GimpImageWindowPrivate GimpImageWindowPrivate; struct _GimpImageWindowPrivate { Gimp *gimp; - GimpUIManager *menubar_manager; GimpDialogFactory *dialog_factory; GList *shells; @@ -346,7 +347,7 @@ gimp_image_window_constructed (GObject *object) { GimpImageWindow *window = GIMP_IMAGE_WINDOW (object); GimpImageWindowPrivate *private = GIMP_IMAGE_WINDOW_GET_PRIVATE (window); - GimpMenuFactory *menu_factory; + GimpUIManager *menubar_manager; GimpGuiConfig *config; GimpMenuModel *model; gboolean use_gtk_menubar = TRUE; @@ -356,12 +357,6 @@ gimp_image_window_constructed (GObject *object) gimp_assert (GIMP_IS_GIMP (private->gimp)); gimp_assert (GIMP_IS_DIALOG_FACTORY (private->dialog_factory)); - menu_factory = gimp_dialog_factory_get_menu_factory (private->dialog_factory); - - private->menubar_manager = gimp_menu_factory_manager_new (menu_factory, - "", - window); - g_signal_connect_object (private->dialog_factory, "dock-window-added", G_CALLBACK (gimp_image_window_update_ui_manager), window, G_CONNECT_SWAPPED); @@ -369,10 +364,11 @@ gimp_image_window_constructed (GObject *object) G_CALLBACK (gimp_image_window_update_ui_manager), window, G_CONNECT_SWAPPED); - g_signal_connect (private->menubar_manager, "show-tooltip", + menubar_manager = menus_get_image_manager_singleton (private->gimp); + g_signal_connect (menubar_manager, "show-tooltip", G_CALLBACK (gimp_image_window_show_tooltip), window); - g_signal_connect (private->menubar_manager, "hide-tooltip", + g_signal_connect (menubar_manager, "hide-tooltip", G_CALLBACK (gimp_image_window_hide_tooltip), window); @@ -384,7 +380,7 @@ gimp_image_window_constructed (GObject *object) gtk_widget_show (private->main_vbox); /* Create the menubar */ - model = gimp_ui_manager_get_model (private->menubar_manager, "/image-menubar"); + model = gimp_ui_manager_get_model (menubar_manager, "/image-menubar"); #ifndef GDK_WINDOWING_QUARTZ /* macOS has its native menubar system, which is implemented by @@ -404,7 +400,7 @@ gimp_image_window_constructed (GObject *object) } else { - private->menubar = gimp_menu_bar_new (model, private->menubar_manager); + private->menubar = gimp_menu_bar_new (model, menubar_manager); g_object_unref (model); gtk_box_pack_start (GTK_BOX (private->main_vbox), @@ -446,7 +442,7 @@ gimp_image_window_constructed (GObject *object) private->left_docks = gimp_dock_columns_new (gimp_get_user_context (private->gimp), private->dialog_factory, - private->menubar_manager); + menubar_manager); gtk_paned_pack1 (GTK_PANED (private->left_hpane), private->left_docks, FALSE, FALSE); gtk_widget_set_visible (private->left_docks, config->single_window_mode); @@ -482,7 +478,7 @@ gimp_image_window_constructed (GObject *object) private->right_docks = gimp_dock_columns_new (gimp_get_user_context (private->gimp), private->dialog_factory, - private->menubar_manager); + menubar_manager); gtk_paned_pack2 (GTK_PANED (private->right_hpane), private->right_docks, FALSE, FALSE); gtk_widget_set_visible (private->right_docks, config->single_window_mode); @@ -519,8 +515,6 @@ gimp_image_window_dispose (GObject *object) private->dialog_factory = NULL; } - g_clear_object (&private->menubar_manager); - if (private->update_ui_manager_idle_id) { g_source_remove (private->update_ui_manager_idle_id); @@ -608,7 +602,7 @@ gimp_image_window_delete_event (GtkWidget *widget, GimpGuiConfig *config = GIMP_GUI_CONFIG (private->gimp->config); if (config->single_window_mode) - gimp_ui_manager_activate_action (gimp_image_window_get_ui_manager (window), + gimp_ui_manager_activate_action (menus_get_image_manager_singleton (private->gimp), "file", "file-quit"); else if (shell) gimp_display_shell_close (shell, FALSE); @@ -865,7 +859,7 @@ gimp_image_window_dock_container_get_ui_manager (GimpDockContainer *dock_contain { GimpImageWindow *window = GIMP_IMAGE_WINDOW (dock_container); - return gimp_image_window_get_ui_manager (window); + return menus_get_image_manager_singleton (GIMP_IMAGE_WINDOW_GET_PRIVATE (window)->gimp); } void @@ -1184,18 +1178,6 @@ gimp_image_window_destroy (GimpImageWindow *window) gtk_widget_destroy (GTK_WIDGET (window)); } -GimpUIManager * -gimp_image_window_get_ui_manager (GimpImageWindow *window) -{ - GimpImageWindowPrivate *private; - - g_return_val_if_fail (GIMP_IS_IMAGE_WINDOW (window), FALSE); - - private = GIMP_IMAGE_WINDOW_GET_PRIVATE (window); - - return private->menubar_manager; -} - GimpDockColumns * gimp_image_window_get_left_docks (GimpImageWindow *window) { @@ -1895,7 +1877,7 @@ gimp_image_window_update_ui_manager_idle (GimpImageWindow *window) gimp_assert (private->active_shell != NULL); - gimp_ui_manager_update (private->menubar_manager, + gimp_ui_manager_update (menus_get_image_manager_singleton (private->active_shell->display->gimp), private->active_shell->display); private->update_ui_manager_idle_id = 0; @@ -2099,8 +2081,7 @@ gimp_image_window_disconnect_from_active_shell (GimpImageWindow *window) gimp_image_window_shell_title_notify, window); - if (private->menubar_manager) - gimp_image_window_hide_tooltip (private->menubar_manager, window); + gimp_image_window_hide_tooltip (menus_get_image_manager_singleton (private->gimp), window); if (private->update_ui_manager_idle_id) { diff --git a/app/display/gimpimagewindow.h b/app/display/gimpimagewindow.h index 10e180d150..73b792a555 100644 --- a/app/display/gimpimagewindow.h +++ b/app/display/gimpimagewindow.h @@ -51,7 +51,6 @@ GimpImageWindow * gimp_image_window_new (Gimp *gi GdkMonitor *monitor); void gimp_image_window_destroy (GimpImageWindow *window); -GimpUIManager * gimp_image_window_get_ui_manager (GimpImageWindow *window); GimpDockColumns * gimp_image_window_get_left_docks (GimpImageWindow *window); GimpDockColumns * gimp_image_window_get_right_docks (GimpImageWindow *window); diff --git a/app/display/gimpsinglewindowstrategy.c b/app/display/gimpsinglewindowstrategy.c index 979c7785de..1bdd1fd1ac 100644 --- a/app/display/gimpsinglewindowstrategy.c +++ b/app/display/gimpsinglewindowstrategy.c @@ -29,6 +29,8 @@ #include "core/gimp.h" +#include "menus/menus.h" + #include "widgets/gimpdialogfactory.h" #include "widgets/gimpdock.h" #include "widgets/gimpdockbook.h" @@ -92,7 +94,7 @@ gimp_single_window_strategy_show_dockable_dialog (GimpWindowStrategy *strategy, if (! gimp_image_window_has_toolbox (window)) { GimpDockColumns *columns; - GimpUIManager *ui_manager = gimp_image_window_get_ui_manager (window); + GimpUIManager *ui_manager = menus_get_image_manager_singleton (gimp); widget = gimp_dialog_factory_dialog_new (factory, monitor, ui_manager, diff --git a/app/display/gimptoolpath.c b/app/display/gimptoolpath.c index cf2444aaf2..e328e6251f 100644 --- a/app/display/gimptoolpath.c +++ b/app/display/gimptoolpath.c @@ -32,6 +32,10 @@ #include "display-types.h" +#include "core/gimpcontext.h" + +#include "menus/menus.h" + #include "vectors/gimpanchor.h" #include "vectors/gimpbezierstroke.h" #include "vectors/gimpvectors.h" @@ -127,8 +131,6 @@ struct _GimpToolPathPrivate GimpCanvasItem *path; GList *items; - - GimpUIManager *ui_manager; }; @@ -314,13 +316,10 @@ gimp_tool_path_constructed (GObject *object) static void gimp_tool_path_dispose (GObject *object) { - GimpToolPath *path = GIMP_TOOL_PATH (object); - GimpToolPathPrivate *private = path->private; + GimpToolPath *path = GIMP_TOOL_PATH (object); gimp_tool_path_set_vectors (path, NULL); - g_clear_object (&private->ui_manager); - G_OBJECT_CLASS (parent_class)->dispose (object); } @@ -1298,21 +1297,17 @@ gimp_tool_path_get_popup (GimpToolWidget *widget, { GimpToolPath *path = GIMP_TOOL_PATH (widget); GimpToolPathPrivate *private = path->private; + GimpDisplayShell *shell = gimp_tool_widget_get_shell (widget); + GimpImageWindow *image_window; + GimpDialogFactory *dialog_factory; + GimpMenuFactory *menu_factory; + GimpUIManager *ui_manager; - if (!private->ui_manager) - { - GimpDisplayShell *shell = gimp_tool_widget_get_shell (widget); - GimpImageWindow *image_window; - GimpDialogFactory *dialog_factory; + image_window = gimp_display_shell_get_window (shell); + dialog_factory = gimp_dock_container_get_dialog_factory (GIMP_DOCK_CONTAINER (image_window)); - image_window = gimp_display_shell_get_window (shell); - dialog_factory = gimp_dock_container_get_dialog_factory (GIMP_DOCK_CONTAINER (image_window)); - - private->ui_manager = - gimp_menu_factory_manager_new (gimp_dialog_factory_get_menu_factory (dialog_factory), - "", - widget); - } + menu_factory = menus_get_global_menu_factory (gimp_dialog_factory_get_context (dialog_factory)->gimp); + ui_manager = gimp_menu_factory_get_manager (menu_factory, "", widget); /* we're using a side effects of gimp_tool_path_get_function * that update the private->cur_* variables. */ @@ -1320,10 +1315,10 @@ gimp_tool_path_get_popup (GimpToolWidget *widget, if (private->cur_stroke) { - gimp_ui_manager_update (private->ui_manager, widget); + gimp_ui_manager_update (ui_manager, widget); *ui_path = "/vector-toolpath-popup"; - return private->ui_manager; + return ui_manager; } return NULL; diff --git a/app/gui/gui-vtable.c b/app/gui/gui-vtable.c index 706c56858c..b9a2eafbe7 100644 --- a/app/gui/gui-vtable.c +++ b/app/gui/gui-vtable.c @@ -683,7 +683,7 @@ gui_pdb_dialog_new (Gimp *gimp, "select-type", gimp_container_get_children_type (container), "initial-object", object, "callback-name", callback_name, - "menu-factory", global_menu_factory, + "menu-factory", menus_get_global_menu_factory (gimp), NULL); names = gimp_properties_append_valist (dialog_type, diff --git a/app/gui/gui.c b/app/gui/gui.c index 4deb3b3504..a771998ca8 100644 --- a/app/gui/gui.c +++ b/app/gui/gui.c @@ -152,7 +152,6 @@ static void gui_check_unique_accelerators (Gimp *gimp); /* private variables */ static Gimp *the_gui_gimp = NULL; -static GimpUIManager *image_ui_manager = NULL; static GimpUIConfigurer *ui_configurer = NULL; static GdkMonitor *initial_monitor = NULL; @@ -506,10 +505,10 @@ gui_restore_callback (Gimp *gimp, } actions_init (gimp); - menus_init (gimp, global_action_factory); + menus_init (gimp); gimp_render_init (gimp); - dialogs_init (gimp, global_menu_factory); + dialogs_init (gimp); gimp_clipboard_init (gimp); if (gimp_get_clipboard_image (gimp)) @@ -537,6 +536,7 @@ gui_restore_after_callback (Gimp *gimp, GimpInitStatusFunc status_callback) { GimpGuiConfig *gui_config = GIMP_GUI_CONFIG (gimp->config); + GimpUIManager *image_ui_manager; GimpDisplay *display; if (gimp->be_verbose) @@ -568,9 +568,7 @@ gui_restore_after_callback (Gimp *gimp, "gimp", gimp, NULL); - image_ui_manager = gimp_menu_factory_manager_new (global_menu_factory, - "", - gimp); + image_ui_manager = menus_get_image_manager_singleton (gimp); gimp_ui_manager_update (image_ui_manager, gimp); /* Check that every accelerator is unique. */ @@ -710,9 +708,6 @@ gui_exit_after_callback (Gimp *gimp, gimp_action_history_exit (gimp); - g_object_unref (image_ui_manager); - image_ui_manager = NULL; - g_object_unref (ui_configurer); ui_configurer = NULL; @@ -844,7 +839,8 @@ gui_display_changed (GimpContext *context, } } - gimp_ui_manager_update (image_ui_manager, display); + gimp_ui_manager_update (menus_get_image_manager_singleton (gimp), + display); } typedef struct diff --git a/app/menus/menus.c b/app/menus/menus.c index 6043449358..d3714b0666 100644 --- a/app/menus/menus.c +++ b/app/menus/menus.c @@ -24,6 +24,8 @@ #include "menus-types.h" +#include "actions/actions.h" + #include "config/gimpconfig-file.h" #include "config/gimpguiconfig.h" @@ -51,11 +53,6 @@ static void menus_remove_accels (gpointer data, gboolean changed); -/* global variables */ - -GimpMenuFactory * global_menu_factory = NULL; - - /* private variables */ static gboolean menurc_deleted = FALSE; @@ -64,17 +61,16 @@ static gboolean menurc_deleted = FALSE; /* public functions */ void -menus_init (Gimp *gimp, - GimpActionFactory *action_factory) +menus_init (Gimp *gimp) { + GimpMenuFactory *global_menu_factory = NULL; + g_return_if_fail (GIMP_IS_GIMP (gimp)); - g_return_if_fail (GIMP_IS_ACTION_FACTORY (action_factory)); - g_return_if_fail (global_menu_factory == NULL); /* We need to make sure the property is installed before using it */ g_type_class_ref (GTK_TYPE_MENU); - global_menu_factory = gimp_menu_factory_new (gimp, action_factory); + global_menu_factory = menus_get_global_menu_factory (gimp); gimp_menu_factory_manager_register (global_menu_factory, "", "file", @@ -401,10 +397,9 @@ void menus_exit (Gimp *gimp) { g_return_if_fail (GIMP_IS_GIMP (gimp)); - g_return_if_fail (global_menu_factory != NULL); + g_return_if_fail (menus_get_global_menu_factory (gimp) != NULL); - g_object_unref (global_menu_factory); - global_menu_factory = NULL; + g_object_unref (menus_get_global_menu_factory (gimp)); } void @@ -501,6 +496,29 @@ menus_remove (Gimp *gimp) gtk_accel_map_foreach (gimp, menus_remove_accels); } +GimpMenuFactory * +menus_get_global_menu_factory (Gimp *gimp) +{ + static GimpMenuFactory *global_menu_factory = NULL; + + if (global_menu_factory == NULL) + global_menu_factory = gimp_menu_factory_new (gimp, global_action_factory); + + return global_menu_factory; +} + +GimpUIManager * +menus_get_image_manager_singleton (Gimp *gimp) +{ + static GimpUIManager *image_ui_manager = NULL; + + if (image_ui_manager == NULL) + image_ui_manager = gimp_menu_factory_get_manager (menus_get_global_menu_factory (gimp), + "", gimp); + + return image_ui_manager; +} + /* private functions */ diff --git a/app/menus/menus.h b/app/menus/menus.h index ba59045f73..70dfe730eb 100644 --- a/app/menus/menus.h +++ b/app/menus/menus.h @@ -19,20 +19,19 @@ #define __MENUS_H__ -extern GimpMenuFactory *global_menu_factory; +void menus_init (Gimp *gimp); +void menus_exit (Gimp *gimp); +void menus_restore (Gimp *gimp); +void menus_save (Gimp *gimp, + gboolean always_save); -void menus_init (Gimp *gimp, - GimpActionFactory *action_factory); -void menus_exit (Gimp *gimp); +gboolean menus_clear (Gimp *gimp, + GError **error); +void menus_remove (Gimp *gimp); -void menus_restore (Gimp *gimp); -void menus_save (Gimp *gimp, - gboolean always_save); - -gboolean menus_clear (Gimp *gimp, - GError **error); -void menus_remove (Gimp *gimp); +GimpMenuFactory * menus_get_global_menu_factory (Gimp *gimp); +GimpUIManager * menus_get_image_manager_singleton (Gimp *gimp); #endif /* __MENUS_H__ */ diff --git a/app/tests/gimp-app-test-utils.c b/app/tests/gimp-app-test-utils.c index 1314e89bc3..dbf0436148 100644 --- a/app/tests/gimp-app-test-utils.c +++ b/app/tests/gimp-app-test-utils.c @@ -26,6 +26,8 @@ #include "display/gimpdisplayshell.h" #include "display/gimpimagewindow.h" +#include "menus/menus.h" + #include "widgets/gimpuimanager.h" #include "widgets/gimpdialogfactory.h" @@ -316,26 +318,7 @@ else GimpUIManager * gimp_test_utils_get_ui_manager (Gimp *gimp) { - GimpDisplay *display = NULL; - GimpDisplayShell *shell = NULL; - GtkWidget *toplevel = NULL; - GimpImageWindow *image_window = NULL; - GimpUIManager *ui_manager = NULL; - - display = GIMP_DISPLAY (gimp_get_empty_display (gimp)); - - /* If there were not empty display, assume that there is at least - * one image display and use that - */ - if (! display) - display = GIMP_DISPLAY (gimp_get_display_iter (gimp)->data); - - shell = gimp_display_get_shell (display); - toplevel = gtk_widget_get_toplevel (GTK_WIDGET (shell)); - image_window = GIMP_IMAGE_WINDOW (toplevel); - ui_manager = gimp_image_window_get_ui_manager (image_window); - - return ui_manager; + return menus_get_image_manager_singleton (gimp); } /** diff --git a/app/tests/test-ui.c b/app/tests/test-ui.c index 8c44d2ad53..6d2c03f90b 100644 --- a/app/tests/test-ui.c +++ b/app/tests/test-ui.c @@ -34,6 +34,8 @@ #include "display/gimpdisplayshell-transform.h" #include "display/gimpimagewindow.h" +#include "menus/menus.h" + #include "widgets/gimpdialogfactory.h" #include "widgets/gimpdock.h" #include "widgets/gimpdockable.h" @@ -111,8 +113,7 @@ tool_options_editor_updates (gconstpointer data) GimpDisplay *display = GIMP_DISPLAY (gimp_get_empty_display (gimp)); GimpDisplayShell *shell = gimp_display_get_shell (display); GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (shell)); - GimpImageWindow *image_window = GIMP_IMAGE_WINDOW (toplevel); - GimpUIManager *ui_manager = gimp_image_window_get_ui_manager (image_window); + GimpUIManager *ui_manager = menus_get_image_manager_singleton (gimp); GtkWidget *dockable = gimp_dialog_factory_dialog_new (gimp_dialog_factory_get_singleton (), gimp_widget_get_monitor (toplevel), NULL /*ui_manager*/, diff --git a/app/tools/gimptexttool-editor.c b/app/tools/gimptexttool-editor.c index 7a9b4f51d8..b499484640 100644 --- a/app/tools/gimptexttool-editor.c +++ b/app/tools/gimptexttool-editor.c @@ -35,6 +35,8 @@ #include "core/gimpimage.h" #include "core/gimptoolinfo.h" +#include "menus/menus.h" + #include "text/gimptext.h" #include "text/gimptextlayout.h" @@ -1354,7 +1356,7 @@ gimp_text_tool_editor_dialog (GimpTextTool *text_tool) text_tool->editor_dialog = gimp_text_options_editor_new (parent, tool->tool_info->gimp, options, - gimp_dialog_factory_get_menu_factory (dialog_factory), + menus_get_global_menu_factory (tool->tool_info->gimp), _("GIMP Text Editor"), text_tool->proxy, text_tool->buffer, xres, yres); diff --git a/app/tools/gimptexttool.c b/app/tools/gimptexttool.c index cc8a77f5e2..169848b15b 100644 --- a/app/tools/gimptexttool.c +++ b/app/tools/gimptexttool.c @@ -45,6 +45,8 @@ #include "core/gimptoolinfo.h" #include "core/gimpundostack.h" +#include "menus/menus.h" + #include "text/gimptext.h" #include "text/gimptext-vectors.h" #include "text/gimptextlayer.h" @@ -312,7 +314,6 @@ gimp_text_tool_finalize (GObject *object) g_clear_object (&text_tool->proxy); g_clear_object (&text_tool->buffer); - g_clear_object (&text_tool->ui_manager); gimp_text_tool_editor_finalize (text_tool); @@ -836,26 +837,17 @@ gimp_text_tool_get_popup (GimpTool *tool, coords->x, coords->y)) { - if (! text_tool->ui_manager) - { - GimpDisplayShell *shell = gimp_display_get_shell (tool->display); - GimpImageWindow *image_window; - GimpDialogFactory *dialog_factory; + GimpMenuFactory *menu_factory; + GimpUIManager *ui_manager; - image_window = gimp_display_shell_get_window (shell); - dialog_factory = gimp_dock_container_get_dialog_factory (GIMP_DOCK_CONTAINER (image_window)); + menu_factory = menus_get_global_menu_factory (tool->tool_info->gimp); + ui_manager = gimp_menu_factory_get_manager (menu_factory, "", text_tool); - text_tool->ui_manager = - gimp_menu_factory_manager_new (gimp_dialog_factory_get_menu_factory (dialog_factory), - "", - text_tool); - } - - gimp_ui_manager_update (text_tool->ui_manager, text_tool); + gimp_ui_manager_update (ui_manager, text_tool); *ui_path = "/text-tool-popup"; - return text_tool->ui_manager; + return ui_manager; } return NULL; diff --git a/app/tools/gimptexttool.h b/app/tools/gimptexttool.h index cda2820eab..a46f7fb9d1 100644 --- a/app/tools/gimptexttool.h +++ b/app/tools/gimptexttool.h @@ -56,7 +56,6 @@ struct _GimpTextTool GimpImage *image; GtkWidget *confirm_dialog; - GimpUIManager *ui_manager; gboolean handle_rectangle_change_complete; gboolean text_box_fixed; diff --git a/app/widgets/gimpactionfactory.c b/app/widgets/gimpactionfactory.c index 2512028284..441b012146 100644 --- a/app/widgets/gimpactionfactory.c +++ b/app/widgets/gimpactionfactory.c @@ -71,6 +71,7 @@ gimp_action_factory_finalize (GObject *object) g_free (entry->identifier); g_free (entry->label); g_free (entry->icon_name); + g_clear_object (&entry->group); g_slice_free (GimpActionFactoryEntry, entry); } @@ -124,7 +125,7 @@ gimp_action_factory_group_register (GimpActionFactory *factory, } GimpActionGroup * -gimp_action_factory_group_new (GimpActionFactory *factory, +gimp_action_factory_get_group (GimpActionFactory *factory, const gchar *identifier, gpointer user_data) { @@ -139,19 +140,24 @@ gimp_action_factory_group_new (GimpActionFactory *factory, if (! strcmp (entry->identifier, identifier)) { - GimpActionGroup *group; + if (entry->group == NULL) + { + GimpActionGroup *group; - group = gimp_action_group_new (factory->gimp, - entry->identifier, - entry->label, - entry->icon_name, - user_data, - entry->update_func); + group = gimp_action_group_new (factory->gimp, + entry->identifier, + entry->label, + entry->icon_name, + user_data, + entry->update_func); - if (entry->setup_func) - entry->setup_func (group); + if (entry->setup_func) + entry->setup_func (group); - return group; + entry->group = group; + } + + return entry->group; } } diff --git a/app/widgets/gimpactionfactory.h b/app/widgets/gimpactionfactory.h index fddcfa1250..c5bb6bba7e 100644 --- a/app/widgets/gimpactionfactory.h +++ b/app/widgets/gimpactionfactory.h @@ -34,6 +34,8 @@ struct _GimpActionFactoryEntry gchar *icon_name; GimpActionGroupSetupFunc setup_func; GimpActionGroupUpdateFunc update_func; + + GimpActionGroup *group; }; @@ -61,20 +63,20 @@ struct _GimpActionFactoryClass }; -GType gimp_action_factory_get_type (void) G_GNUC_CONST; +GType gimp_action_factory_get_type (void) G_GNUC_CONST; -GimpActionFactory * gimp_action_factory_new (Gimp *gimp); +GimpActionFactory * gimp_action_factory_new (Gimp *gimp); -void gimp_action_factory_group_register (GimpActionFactory *factory, - const gchar *identifier, - const gchar *label, - const gchar *icon_name, - GimpActionGroupSetupFunc setup_func, - GimpActionGroupUpdateFunc update_func); +void gimp_action_factory_group_register (GimpActionFactory *factory, + const gchar *identifier, + const gchar *label, + const gchar *icon_name, + GimpActionGroupSetupFunc setup_func, + GimpActionGroupUpdateFunc update_func); -GimpActionGroup * gimp_action_factory_group_new (GimpActionFactory *factory, - const gchar *identifier, - gpointer user_data); +GimpActionGroup * gimp_action_factory_get_group (GimpActionFactory *factory, + const gchar *identifier, + gpointer user_data); #endif /* __GIMP_ACTION_FACTORY_H__ */ diff --git a/app/widgets/gimpactiongroup.c b/app/widgets/gimpactiongroup.c index 6facb7e63e..98964244a7 100644 --- a/app/widgets/gimpactiongroup.c +++ b/app/widgets/gimpactiongroup.c @@ -422,6 +422,10 @@ gimp_action_group_add_actions (GimpActionGroup *group, tooltip = gettext (entries[i].tooltip); } + /* The action should not already exist in the application. */ + g_return_if_fail (g_action_map_lookup_action (G_ACTION_MAP (group->gimp->app), + entries[i].name) == NULL); + action = gimp_action_impl_new (entries[i].name, label, tooltip, entries[i].icon_name, entries[i].help_id, context); @@ -473,6 +477,10 @@ gimp_action_group_add_toggle_actions (GimpActionGroup *group, tooltip = gettext (entries[i].tooltip); } + /* The action should not already exist in the application. */ + g_return_if_fail (g_action_map_lookup_action (G_ACTION_MAP (group->gimp->app), + entries[i].name) == NULL); + action = gimp_toggle_action_new (entries[i].name, label, tooltip, entries[i].icon_name, entries[i].help_id, context); @@ -531,6 +539,10 @@ gimp_action_group_add_radio_actions (GimpActionGroup *group, tooltip = gettext (entries[i].tooltip); } + /* The action should not already exist in the application. */ + g_return_val_if_fail (g_action_map_lookup_action (G_ACTION_MAP (group->gimp->app), + entries[i].name) == NULL, NULL); + action = gimp_radio_action_new (entries[i].name, label, tooltip, entries[i].icon_name, entries[i].help_id, @@ -594,6 +606,10 @@ gimp_action_group_add_enum_actions (GimpActionGroup *group, tooltip = gettext (entries[i].tooltip); } + /* The action should not already exist in the application. */ + g_return_if_fail (g_action_map_lookup_action (G_ACTION_MAP (group->gimp->app), + entries[i].name) == NULL); + action = gimp_enum_action_new (entries[i].name, label, tooltip, entries[i].icon_name, entries[i].help_id, @@ -649,20 +665,31 @@ gimp_action_group_add_string_actions (GimpActionGroup *group, tooltip = gettext (entries[i].tooltip); } - action = gimp_string_action_new (entries[i].name, label, tooltip, - entries[i].icon_name, - entries[i].help_id, - entries[i].value, context); + /* XXX: as a special exception, because the dialogs_dockable_actions are + * added both in the dockable and dialogs action groups. + */ + action = GIMP_STRING_ACTION (g_action_map_lookup_action (G_ACTION_MAP (group->gimp->app), + entries[i].name)); + if (G_LIKELY (action == NULL)) + { + action = gimp_string_action_new (entries[i].name, label, tooltip, + entries[i].icon_name, + entries[i].help_id, + entries[i].value, context); + gimp_action_group_add_action_with_accel (group, GIMP_ACTION (action), + entries[i].accelerator); + } + else + { + g_object_ref (action); + } if (callback) g_signal_connect (action, "gimp-activate", G_CALLBACK (callback), group->user_data); - gimp_action_group_add_action_with_accel (group, GIMP_ACTION (action), - entries[i].accelerator); g_signal_emit (group, signals[ACTION_ADDED], 0, action); - g_object_unref (action); } } @@ -702,6 +729,10 @@ gimp_action_group_add_double_actions (GimpActionGroup *group, tooltip = gettext (entries[i].tooltip); } + /* The action should not already exist in the application. */ + g_return_if_fail (g_action_map_lookup_action (G_ACTION_MAP (group->gimp->app), + entries[i].name) == NULL); + action = gimp_double_action_new (entries[i].name, label, tooltip, entries[i].icon_name, entries[i].help_id, @@ -750,24 +781,44 @@ gimp_action_group_add_procedure_actions (GimpActionGroup *group, continue; } - action = gimp_procedure_action_new (entries[i].name, - entries[i].label, - entries[i].tooltip, - entries[i].icon_name, - entries[i].help_id, - entries[i].procedure, - context); + action = GIMP_PROCEDURE_ACTION (g_action_map_lookup_action (G_ACTION_MAP (group->gimp->app), + entries[i].name)); + if (G_LIKELY (action == NULL)) + { + action = gimp_procedure_action_new (entries[i].name, + entries[i].label, + entries[i].tooltip, + entries[i].icon_name, + entries[i].help_id, + entries[i].procedure, + context); - if (callback) - g_signal_connect (action, "gimp-activate", - G_CALLBACK (callback), - group->user_data); + if (callback) + g_signal_connect (action, "gimp-activate", + G_CALLBACK (callback), + group->user_data); - gimp_action_group_add_action_with_accel (group, GIMP_ACTION (action), - entries[i].accelerator); - g_signal_emit (group, signals[ACTION_ADDED], 0, action); + gimp_action_group_add_action_with_accel (group, GIMP_ACTION (action), + entries[i].accelerator); + g_signal_emit (group, signals[ACTION_ADDED], 0, action); - g_object_unref (action); + g_object_unref (action); + } + else + { + /* Unlike other existence checks, this is not a program error (hence + * no WARNINGs nor CRITICALs). It is more likely a third-party plug-in + * procedure name clashing with a core action (the previous test + * gimp_action_group_check_unique_action() will check for clashes + * between 2 plug-in procedure's names; this test will check in all + * other groups too). + * So we just warn for problem discovery. + */ + gimp_message (group->gimp, NULL, GIMP_MESSAGE_WARNING, + "%s: plug-in procedure '%s' could not be registered. " + "A procedure with the same name already exists.", + G_STRFUNC, entries[i].name); + } } } diff --git a/app/widgets/gimpcontrollers.c b/app/widgets/gimpcontrollers.c index d1c0448120..06045c9b06 100644 --- a/app/widgets/gimpcontrollers.c +++ b/app/widgets/gimpcontrollers.c @@ -140,7 +140,7 @@ gimp_controllers_restore (Gimp *gimp, g_return_if_fail (manager != NULL); g_return_if_fail (manager->ui_manager == NULL); - manager->ui_manager = g_object_ref (ui_manager); + manager->ui_manager = ui_manager; file = gimp_directory_file ("controllerrc", NULL); @@ -297,7 +297,6 @@ gimp_controller_manager_free (GimpControllerManager *manager) manager->event_mapped_id); g_clear_object (&manager->controllers); - g_clear_object (&manager->ui_manager); g_slice_free (GimpControllerManager, manager); } diff --git a/app/widgets/gimpdialogfactory.c b/app/widgets/gimpdialogfactory.c index 0b0d6f880f..7445244f16 100644 --- a/app/widgets/gimpdialogfactory.c +++ b/app/widgets/gimpdialogfactory.c @@ -36,6 +36,8 @@ #include "core/gimp.h" #include "core/gimpcontext.h" +#include "menus/menus.h" + #include "gimpcursor.h" #include "gimpdialogfactory.h" #include "gimpdock.h" @@ -61,7 +63,6 @@ enum struct _GimpDialogFactoryPrivate { GimpContext *context; - GimpMenuFactory *menu_factory; GList *open_dialogs; GList *session_infos; @@ -223,17 +224,14 @@ gimp_dialog_factory_finalize (GObject *object) } GimpDialogFactory * -gimp_dialog_factory_new (const gchar *name, - GimpContext *context, - GimpMenuFactory *menu_factory) +gimp_dialog_factory_new (const gchar *name, + GimpContext *context) { GimpDialogFactory *factory; GimpGuiConfig *config; g_return_val_if_fail (name != NULL, NULL); g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL); - g_return_val_if_fail (! menu_factory || GIMP_IS_MENU_FACTORY (menu_factory), - NULL); factory = g_object_new (GIMP_TYPE_DIALOG_FACTORY, NULL); @@ -242,7 +240,6 @@ gimp_dialog_factory_new (const gchar *name, config = GIMP_GUI_CONFIG (context->gimp->config); factory->p->context = context; - factory->p->menu_factory = menu_factory; factory->p->dialog_state = (config->hide_docks ? GIMP_DIALOGS_HIDDEN_EXPLICITLY : GIMP_DIALOGS_SHOWN); @@ -494,7 +491,7 @@ gimp_dialog_factory_dialog_new_internal (GimpDialogFactory *factory, * created in its dock's context. */ dock = gimp_dock_with_window_new (factory, monitor, FALSE); - dockbook = gimp_dockbook_new (factory->p->menu_factory); + dockbook = gimp_dockbook_new (menus_get_global_menu_factory (factory->p->context->gimp)); gimp_dock_add_book (GIMP_DOCK (dock), GIMP_DOCKBOOK (dockbook), @@ -726,14 +723,6 @@ gimp_dialog_factory_get_context (GimpDialogFactory *factory) return factory->p->context; } -GimpMenuFactory * -gimp_dialog_factory_get_menu_factory (GimpDialogFactory *factory) -{ - g_return_val_if_fail (GIMP_IS_DIALOG_FACTORY (factory), NULL); - - return factory->p->menu_factory; -} - GList * gimp_dialog_factory_get_open_dialogs (GimpDialogFactory *factory) { diff --git a/app/widgets/gimpdialogfactory.h b/app/widgets/gimpdialogfactory.h index 5cc02331c9..d2015aace2 100644 --- a/app/widgets/gimpdialogfactory.h +++ b/app/widgets/gimpdialogfactory.h @@ -112,8 +112,7 @@ struct _GimpDialogFactoryClass GType gimp_dialog_factory_get_type (void) G_GNUC_CONST; GimpDialogFactory * gimp_dialog_factory_new (const gchar *name, - GimpContext *context, - GimpMenuFactory *menu_factory); + GimpContext *context); void gimp_dialog_factory_register_entry (GimpDialogFactory *factory, const gchar *identifier, @@ -149,7 +148,6 @@ GtkWidget * gimp_dialog_factory_dialog_new (GimpDialogFactory gboolean present); GimpContext * gimp_dialog_factory_get_context (GimpDialogFactory *factory); -GimpMenuFactory * gimp_dialog_factory_get_menu_factory (GimpDialogFactory *factory); GList * gimp_dialog_factory_get_open_dialogs (GimpDialogFactory *factory); GList * gimp_dialog_factory_get_session_infos (GimpDialogFactory *factory); diff --git a/app/widgets/gimpdock.c b/app/widgets/gimpdock.c index cffec7692b..b20ecb95b1 100644 --- a/app/widgets/gimpdock.c +++ b/app/widgets/gimpdock.c @@ -30,6 +30,8 @@ #include "core/gimp.h" #include "core/gimpcontext.h" +#include "menus/menus.h" + #include "gimpdialogfactory.h" #include "gimpdock.h" #include "gimpdockable.h" @@ -298,7 +300,7 @@ gimp_dock_dropped_cb (GtkWidget *notebook, /* Create a new dockbook */ factory = gimp_dock_get_dialog_factory (dock); - new_dockbook = gimp_dockbook_new (gimp_dialog_factory_get_menu_factory (factory)); + new_dockbook = gimp_dockbook_new (menus_get_global_menu_factory (gimp_dialog_factory_get_context (factory)->gimp)); gimp_dock_add_book (dock, GIMP_DOCKBOOK (new_dockbook), insert_index); /* Add the dockable to new new dockbook */ diff --git a/app/widgets/gimpdockable.c b/app/widgets/gimpdockable.c index 0ab1f14fd0..0895542d72 100644 --- a/app/widgets/gimpdockable.c +++ b/app/widgets/gimpdockable.c @@ -32,6 +32,8 @@ #include "core/gimpcontext.h" +#include "menus/menus.h" + #include "gimpdialogfactory.h" #include "gimpdnd.h" #include "gimpdock.h" @@ -543,7 +545,7 @@ gimp_dockable_detach (GimpDockable *dockable) src_dock_window = gimp_dock_window_from_dock (src_dock); dialog_factory = gimp_dock_get_dialog_factory (src_dock); - menu_factory = gimp_dialog_factory_get_menu_factory (dialog_factory); + menu_factory = menus_get_global_menu_factory (gimp_dialog_factory_get_context (dialog_factory)->gimp); dock = gimp_dock_with_window_new (dialog_factory, gimp_widget_get_monitor (GTK_WIDGET (dockable)), diff --git a/app/widgets/gimpdockbook.c b/app/widgets/gimpdockbook.c index 8df831feae..2f4195ef2f 100644 --- a/app/widgets/gimpdockbook.c +++ b/app/widgets/gimpdockbook.c @@ -36,6 +36,8 @@ #include "core/gimp.h" #include "core/gimpcontext.h" +#include "menus/menus.h" + #include "gimpactiongroup.h" #include "gimpdialogfactory.h" #include "gimpdnd.h" @@ -261,8 +263,6 @@ gimp_dockbook_finalize (GObject *object) { GimpDockbook *dockbook = GIMP_DOCKBOOK (object); - g_clear_object (&dockbook->p->ui_manager); - G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -425,7 +425,7 @@ gimp_dockbook_create_window (GtkNotebook *notebook, src_dock_window = gimp_dock_window_from_dock (src_dock); dialog_factory = gimp_dock_get_dialog_factory (src_dock); - menu_factory = gimp_dialog_factory_get_menu_factory (dialog_factory); + menu_factory = menus_get_global_menu_factory (gimp_dialog_factory_get_context (dialog_factory)->gimp); new_dock = gimp_dock_with_window_new (dialog_factory, gimp_widget_get_monitor (page), @@ -554,7 +554,7 @@ gimp_dockbook_show_menu (GimpDockbook *dockbook) GimpDockable *dockable; gint page_num; - dockbook_ui_manager = gimp_dockbook_get_ui_manager (dockbook); + dockbook_ui_manager = dockbook->p->ui_manager; if (! dockbook_ui_manager) return FALSE; @@ -612,7 +612,7 @@ gimp_dockbook_new (GimpMenuFactory *menu_factory) dockbook = g_object_new (GIMP_TYPE_DOCKBOOK, NULL); - dockbook->p->ui_manager = gimp_menu_factory_manager_new (menu_factory, + dockbook->p->ui_manager = gimp_menu_factory_get_manager (menu_factory, "", dockbook); @@ -667,14 +667,6 @@ gimp_dockbook_set_dock (GimpDockbook *dockbook, } } -GimpUIManager * -gimp_dockbook_get_ui_manager (GimpDockbook *dockbook) -{ - g_return_val_if_fail (GIMP_IS_DOCKBOOK (dockbook), NULL); - - return dockbook->p->ui_manager; -} - /** * gimp_dockbook_add_from_dialog_factory: * @dockbook: The #DockBook diff --git a/app/widgets/gimpdockbook.h b/app/widgets/gimpdockbook.h index 60b8235f0e..d66569d2f5 100644 --- a/app/widgets/gimpdockbook.h +++ b/app/widgets/gimpdockbook.h @@ -71,8 +71,6 @@ void gimp_dockbook_set_dock (GimpDockbook GimpDock *dock); GimpDock * gimp_dockbook_get_dock (GimpDockbook *dockbook); -GimpUIManager * gimp_dockbook_get_ui_manager (GimpDockbook *dockbook); - GtkWidget * gimp_dockbook_add_from_dialog_factory (GimpDockbook *dockbook, const gchar *identifiers); diff --git a/app/widgets/gimpdockcolumns.c b/app/widgets/gimpdockcolumns.c index 128cb2603a..b5f4fdafb5 100644 --- a/app/widgets/gimpdockcolumns.c +++ b/app/widgets/gimpdockcolumns.c @@ -30,6 +30,8 @@ #include "core/gimp.h" #include "core/gimpcontext.h" +#include "menus/menus.h" + #include "gimpdialogfactory.h" #include "gimpdock.h" #include "gimpdockable.h" @@ -405,14 +407,16 @@ gimp_dock_columns_prepare_dockbook (GimpDockColumns *dock_columns, gint dock_index, GtkWidget **dockbook_p) { - GimpMenuFactory *menu_factory; - GtkWidget *dock; - GtkWidget *dockbook; + GimpDialogFactory *dialog_factory; + GimpMenuFactory *menu_factory; + GtkWidget *dock; + GtkWidget *dockbook; dock = gimp_menu_dock_new (); gimp_dock_columns_add_dock (dock_columns, GIMP_DOCK (dock), dock_index); - menu_factory = gimp_dialog_factory_get_menu_factory (dock_columns->p->dialog_factory); + dialog_factory = dock_columns->p->dialog_factory; + menu_factory = menus_get_global_menu_factory (gimp_dialog_factory_get_context (dialog_factory)->gimp); dockbook = gimp_dockbook_new (menu_factory); gimp_dock_add_book (GIMP_DOCK (dock), GIMP_DOCKBOOK (dockbook), -1); diff --git a/app/widgets/gimpdockwindow.c b/app/widgets/gimpdockwindow.c index 4ae1b7489c..86e8a5a95e 100644 --- a/app/widgets/gimpdockwindow.c +++ b/app/widgets/gimpdockwindow.c @@ -41,6 +41,8 @@ #include "core/gimplist.h" #include "core/gimpimage.h" +#include "menus/menus.h" + #include "gimpcontainercombobox.h" #include "gimpcontainerview.h" #include "gimpdialogfactory.h" @@ -313,14 +315,13 @@ gimp_dock_window_constructed (GObject *object) /* Setup hints */ gimp_window_set_hint (GTK_WINDOW (dock_window), config->dock_window_hint); - menu_factory = - gimp_dialog_factory_get_menu_factory (dock_window->p->dialog_factory); + menu_factory = menus_get_global_menu_factory (gimp); /* Make image window related keyboard shortcuts work also when a * dock window is the focused window */ dock_window->p->ui_manager = - gimp_menu_factory_manager_new (menu_factory, + gimp_menu_factory_get_manager (menu_factory, dock_window->p->ui_manager_name, dock_window); @@ -483,7 +484,6 @@ gimp_dock_window_dispose (GObject *object) dock_window->p->image_flush_handler_id = 0; } - g_clear_object (&dock_window->p->ui_manager); g_clear_object (&dock_window->p->dialog_factory); g_clear_object (&dock_window->p->context); diff --git a/app/widgets/gimpeditor.c b/app/widgets/gimpeditor.c index 810e97093f..c04a5f378a 100644 --- a/app/widgets/gimpeditor.c +++ b/app/widgets/gimpeditor.c @@ -241,7 +241,7 @@ gimp_editor_constructed (GObject *object) if (editor->priv->menu_factory && editor->priv->menu_identifier) { editor->priv->ui_manager = - gimp_menu_factory_manager_new (editor->priv->menu_factory, + gimp_menu_factory_get_manager (editor->priv->menu_factory, editor->priv->menu_identifier, editor->priv->popup_data); @@ -269,9 +269,6 @@ gimp_editor_dispose (GObject *object) g_clear_pointer (&editor->priv->menu_identifier, g_free); - if (editor->priv->ui_manager) - g_clear_object (&editor->priv->ui_manager); - g_clear_pointer (&editor->priv->ui_path, g_free); G_OBJECT_CLASS (parent_class)->dispose (object); @@ -442,14 +439,11 @@ gimp_editor_create_menu (GimpEditor *editor, editor->priv->menu_factory = g_object_ref (menu_factory); if (editor->priv->ui_manager) - { - g_signal_handlers_disconnect_by_func (editor->priv->ui_manager->gimp->config, - G_CALLBACK (gimp_editor_style_updated), - editor); - g_object_unref (editor->priv->ui_manager); - } + g_signal_handlers_disconnect_by_func (editor->priv->ui_manager->gimp->config, + G_CALLBACK (gimp_editor_style_updated), + editor); - editor->priv->ui_manager = gimp_menu_factory_manager_new (menu_factory, + editor->priv->ui_manager = gimp_menu_factory_get_manager (menu_factory, menu_identifier, popup_data); g_signal_connect_object (editor->priv->ui_manager->gimp->config, diff --git a/app/widgets/gimpmenufactory.c b/app/widgets/gimpmenufactory.c index 5fefa73c60..fe94c6e2c6 100644 --- a/app/widgets/gimpmenufactory.c +++ b/app/widgets/gimpmenufactory.c @@ -95,6 +95,7 @@ gimp_menu_factory_finalize (GObject *object) g_slice_free (GimpUIManagerUIEntry, ui_entry); } + g_clear_object (&entry->manager); g_list_free (entry->managed_uis); g_slice_free (GimpMenuFactoryEntry, entry); @@ -192,7 +193,7 @@ gimp_menu_factory_get_registered_menus (GimpMenuFactory *factory) } GimpUIManager * -gimp_menu_factory_manager_new (GimpMenuFactory *factory, +gimp_menu_factory_get_manager (GimpMenuFactory *factory, const gchar *identifier, gpointer callback_data) { @@ -207,34 +208,37 @@ gimp_menu_factory_manager_new (GimpMenuFactory *factory, if (! strcmp (entry->identifier, identifier)) { - GimpUIManager *manager; - GList *list; - - manager = gimp_ui_manager_new (factory->p->gimp, entry->identifier); - - for (list = entry->action_groups; list; list = g_list_next (list)) + if (entry->manager == NULL) { - GimpActionGroup *group; + GimpUIManager *manager; + GList *list; - group = gimp_action_factory_group_new (factory->p->action_factory, - (const gchar *) list->data, - callback_data); + manager = gimp_ui_manager_new (factory->p->gimp, entry->identifier); + entry->manager = manager; - gimp_ui_manager_add_action_group (manager, group); - g_object_unref (group); + for (list = entry->action_groups; list; list = g_list_next (list)) + { + GimpActionGroup *group; + + group = gimp_action_factory_get_group (factory->p->action_factory, + (const gchar *) list->data, + callback_data); + + gimp_ui_manager_add_action_group (manager, group); + } + + for (list = entry->managed_uis; list; list = g_list_next (list)) + { + GimpUIManagerUIEntry *ui_entry = list->data; + + gimp_ui_manager_ui_register (manager, + ui_entry->ui_path, + ui_entry->basename, + ui_entry->setup_func); + } } - for (list = entry->managed_uis; list; list = g_list_next (list)) - { - GimpUIManagerUIEntry *ui_entry = list->data; - - gimp_ui_manager_ui_register (manager, - ui_entry->ui_path, - ui_entry->basename, - ui_entry->setup_func); - } - - return manager; + return entry->manager; } } diff --git a/app/widgets/gimpmenufactory.h b/app/widgets/gimpmenufactory.h index 6c130e84ab..102d22a1e9 100644 --- a/app/widgets/gimpmenufactory.h +++ b/app/widgets/gimpmenufactory.h @@ -29,9 +29,11 @@ typedef struct _GimpMenuFactoryEntry GimpMenuFactoryEntry; struct _GimpMenuFactoryEntry { - gchar *identifier; - GList *action_groups; - GList *managed_uis; + gchar *identifier; + GList *action_groups; + GList *managed_uis; + + GimpUIManager *manager; }; @@ -67,9 +69,11 @@ void gimp_menu_factory_manager_register (GimpMenuFactory *fac const gchar *first_group, ...) G_GNUC_NULL_TERMINATED; GList * gimp_menu_factory_get_registered_menus (GimpMenuFactory *factory); -GimpUIManager * gimp_menu_factory_manager_new (GimpMenuFactory *factory, +GimpUIManager * gimp_menu_factory_get_manager (GimpMenuFactory *factory, const gchar *identifier, gpointer callback_data); +GimpUIManager * gimp_menu_factory_get_image_manager (GimpMenuFactory *factory); + #endif /* __GIMP_MENU_FACTORY_H__ */ diff --git a/app/widgets/gimpsessioninfo-book.c b/app/widgets/gimpsessioninfo-book.c index 333ecb14bf..0049ec8360 100644 --- a/app/widgets/gimpsessioninfo-book.c +++ b/app/widgets/gimpsessioninfo-book.c @@ -26,6 +26,10 @@ #include "widgets-types.h" +#include "core/gimpcontext.h" + +#include "menus/menus.h" + #include "gimpdialogfactory.h" #include "gimpdock.h" #include "gimpdockbook.h" @@ -250,7 +254,7 @@ gimp_session_info_book_restore (GimpSessionInfoBook *info, g_return_val_if_fail (GIMP_IS_DOCK (dock), NULL); dialog_factory = gimp_dock_get_dialog_factory (dock); - menu_factory = gimp_dialog_factory_get_menu_factory (dialog_factory); + menu_factory = menus_get_global_menu_factory (gimp_dialog_factory_get_context (dialog_factory)->gimp); dockbook = gimp_dockbook_new (menu_factory); diff --git a/app/widgets/gimptexteditor.c b/app/widgets/gimptexteditor.c index c27959eced..0644b5c8c1 100644 --- a/app/widgets/gimptexteditor.c +++ b/app/widgets/gimptexteditor.c @@ -118,7 +118,6 @@ gimp_text_editor_finalize (GObject *object) GimpTextEditor *editor = GIMP_TEXT_EDITOR (object); g_clear_pointer (&editor->font_name, g_free); - g_clear_object (&editor->ui_manager); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -175,7 +174,7 @@ gimp_text_editor_new (const gchar *title, G_CALLBACK (gimp_text_editor_text_changed), editor, 0); - editor->ui_manager = gimp_menu_factory_manager_new (menu_factory, + editor->ui_manager = gimp_menu_factory_get_manager (menu_factory, "", editor);