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.
This commit is contained in:
Jehan 2023-03-07 18:23:38 +01:00
parent fd05b75cf7
commit 38d0abc026
40 changed files with 358 additions and 339 deletions

View file

@ -114,15 +114,14 @@ debug_dump_keyboard_shortcuts_cmd_callback (GimpAction *action,
GVariant *value, GVariant *value,
gpointer data) gpointer data)
{ {
GimpDisplay *display; GimpDisplay *display;
GimpImageWindow *window; GimpUIManager *manager;
GimpUIManager *manager; GList *group_it;
GList *group_it; GList *strings = NULL;
GList *strings = NULL;
return_if_no_display (display, data); return_if_no_display (display, data);
window = gimp_display_shell_get_window (gimp_display_get_shell (display)); manager = menus_get_image_manager_singleton (display->gimp);
manager = gimp_image_window_get_ui_manager (window);
/* Gather formatted strings of keyboard shortcuts */ /* Gather formatted strings of keyboard shortcuts */
for (group_it = gimp_ui_manager_get_action_groups (manager); for (group_it = gimp_ui_manager_get_action_groups (manager);

View file

@ -59,6 +59,8 @@
#include "dialogs/color-profile-dialog.h" #include "dialogs/color-profile-dialog.h"
#include "dialogs/dialogs.h" #include "dialogs/dialogs.h"
#include "menus/menus.h"
#include "actions.h" #include "actions.h"
#include "view-commands.h" #include "view-commands.h"
@ -324,7 +326,7 @@ view_show_all_cmd_callback (GimpAction *action,
gimp_display_shell_set_show_all (shell, active); gimp_display_shell_set_show_all (shell, active);
if (window) 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); "view-show-all", shell->show_all);
if (IS_ACTIVE_DISPLAY (display)) 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); gimp_display_shell_scale_set_dot_for_dot (shell, active);
if (window) 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); "view-dot-for-dot", shell->dot_for_dot);
if (IS_ACTIVE_DISPLAY (display)) if (IS_ACTIVE_DISPLAY (display))

View file

@ -29,6 +29,8 @@
#include "config/gimpguiconfig.h" #include "config/gimpguiconfig.h"
#include "menus/menus.h"
#include "widgets/gimpbrusheditor.h" #include "widgets/gimpbrusheditor.h"
#include "widgets/gimpbrushfactoryview.h" #include "widgets/gimpbrushfactoryview.h"
#include "widgets/gimpbufferview.h" #include "widgets/gimpbufferview.h"
@ -346,7 +348,7 @@ dialogs_tool_options_new (GimpDialogFactory *factory,
gint view_size) gint view_size)
{ {
return gimp_tool_options_editor_new (context->gimp, return gimp_tool_options_editor_new (context->gimp,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -365,7 +367,7 @@ dialogs_error_console_new (GimpDialogFactory *factory,
gint view_size) gint view_size)
{ {
return gimp_error_console_new (context->gimp, return gimp_error_console_new (context->gimp,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -375,7 +377,7 @@ dialogs_cursor_view_new (GimpDialogFactory *factory,
gint view_size) gint view_size)
{ {
return gimp_cursor_view_new (context->gimp, return gimp_cursor_view_new (context->gimp,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -385,7 +387,7 @@ dialogs_dashboard_new (GimpDialogFactory *factory,
gint view_size) gint view_size)
{ {
return gimp_dashboard_new (context->gimp, 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->gimp->images,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -415,7 +417,7 @@ dialogs_brush_list_view_new (GimpDialogFactory *factory,
context, context,
TRUE, TRUE,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -428,7 +430,7 @@ dialogs_dynamics_list_view_new (GimpDialogFactory *factory,
context->gimp->dynamics_factory, context->gimp->dynamics_factory,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -441,7 +443,7 @@ dialogs_mypaint_brush_list_view_new (GimpDialogFactory *factory,
context->gimp->mybrush_factory, context->gimp->mybrush_factory,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory), menus_get_global_menu_factory (context->gimp),
"<MyPaintBrushes>", "<MyPaintBrushes>",
"/mypaint-brushes-popup", "/mypaint-brushes-popup",
"mypaint-brushes"); "mypaint-brushes");
@ -457,7 +459,7 @@ dialogs_pattern_list_view_new (GimpDialogFactory *factory,
context->gimp->pattern_factory, context->gimp->pattern_factory,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -470,7 +472,7 @@ dialogs_gradient_list_view_new (GimpDialogFactory *factory,
context->gimp->gradient_factory, context->gimp->gradient_factory,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory), menus_get_global_menu_factory (context->gimp),
"<Gradients>", "<Gradients>",
"/gradients-popup", "/gradients-popup",
"gradients"); "gradients");
@ -486,7 +488,7 @@ dialogs_palette_list_view_new (GimpDialogFactory *factory,
context->gimp->palette_factory, context->gimp->palette_factory,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory), menus_get_global_menu_factory (context->gimp),
"<Palettes>", "<Palettes>",
"/palettes-popup", "/palettes-popup",
"palettes"); "palettes");
@ -502,7 +504,7 @@ dialogs_font_list_view_new (GimpDialogFactory *factory,
context->gimp->font_factory, context->gimp->font_factory,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -515,7 +517,7 @@ dialogs_buffer_list_view_new (GimpDialogFactory *factory,
context->gimp->named_buffers, context->gimp->named_buffers,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -528,7 +530,7 @@ dialogs_tool_preset_list_view_new (GimpDialogFactory *factory,
context->gimp->tool_preset_factory, context->gimp->tool_preset_factory,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -541,7 +543,7 @@ dialogs_document_list_view_new (GimpDialogFactory *factory,
context->gimp->documents, context->gimp->documents,
context, context,
view_size, 0, view_size, 0,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -554,7 +556,7 @@ dialogs_template_list_view_new (GimpDialogFactory *factory,
context->gimp->templates, context->gimp->templates,
context, context,
view_size, 0, 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->gimp->images,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -584,7 +586,7 @@ dialogs_brush_grid_view_new (GimpDialogFactory *factory,
context, context,
TRUE, TRUE,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -597,7 +599,7 @@ dialogs_dynamics_grid_view_new (GimpDialogFactory *factory,
context->gimp->dynamics_factory, context->gimp->dynamics_factory,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -610,7 +612,7 @@ dialogs_mypaint_brush_grid_view_new (GimpDialogFactory *factory,
context->gimp->mybrush_factory, context->gimp->mybrush_factory,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory), menus_get_global_menu_factory (context->gimp),
"<MyPaintBrushes>", "<MyPaintBrushes>",
"/mypaint-brushes-popup", "/mypaint-brushes-popup",
"mypaint-brushes"); "mypaint-brushes");
@ -626,7 +628,7 @@ dialogs_pattern_grid_view_new (GimpDialogFactory *factory,
context->gimp->pattern_factory, context->gimp->pattern_factory,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -639,7 +641,7 @@ dialogs_gradient_grid_view_new (GimpDialogFactory *factory,
context->gimp->gradient_factory, context->gimp->gradient_factory,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory), menus_get_global_menu_factory (context->gimp),
"<Gradients>", "<Gradients>",
"/gradients-popup", "/gradients-popup",
"gradients"); "gradients");
@ -655,7 +657,7 @@ dialogs_palette_grid_view_new (GimpDialogFactory *factory,
context->gimp->palette_factory, context->gimp->palette_factory,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory), menus_get_global_menu_factory (context->gimp),
"<Palettes>", "<Palettes>",
"/palettes-popup", "/palettes-popup",
"palettes"); "palettes");
@ -671,7 +673,7 @@ dialogs_font_grid_view_new (GimpDialogFactory *factory,
context->gimp->font_factory, context->gimp->font_factory,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -684,7 +686,7 @@ dialogs_buffer_grid_view_new (GimpDialogFactory *factory,
context->gimp->named_buffers, context->gimp->named_buffers,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -697,7 +699,7 @@ dialogs_tool_preset_grid_view_new (GimpDialogFactory *factory,
context->gimp->tool_preset_factory, context->gimp->tool_preset_factory,
context, context,
view_size, 1, view_size, 1,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -710,7 +712,7 @@ dialogs_document_grid_view_new (GimpDialogFactory *factory,
context->gimp->documents, context->gimp->documents,
context, context,
view_size, 0, view_size, 0,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -723,7 +725,7 @@ dialogs_template_grid_view_new (GimpDialogFactory *factory,
context->gimp->templates, context->gimp->templates,
context, context,
view_size, 0, 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, return gimp_item_tree_view_new (GIMP_TYPE_LAYER_TREE_VIEW,
view_size, 2, TRUE, view_size, 2, TRUE,
gimp_context_get_image (context), gimp_context_get_image (context),
gimp_dialog_factory_get_menu_factory (factory), menus_get_global_menu_factory (context->gimp),
"<Layers>", "<Layers>",
"/layers-popup"); "/layers-popup");
} }
@ -758,7 +760,7 @@ dialogs_channel_list_view_new (GimpDialogFactory *factory,
return gimp_item_tree_view_new (GIMP_TYPE_CHANNEL_TREE_VIEW, return gimp_item_tree_view_new (GIMP_TYPE_CHANNEL_TREE_VIEW,
view_size, 1, TRUE, view_size, 1, TRUE,
gimp_context_get_image (context), gimp_context_get_image (context),
gimp_dialog_factory_get_menu_factory (factory), menus_get_global_menu_factory (context->gimp),
"<Channels>", "<Channels>",
"/channels-popup"); "/channels-popup");
} }
@ -775,7 +777,7 @@ dialogs_vectors_list_view_new (GimpDialogFactory *factory,
return gimp_item_tree_view_new (GIMP_TYPE_VECTORS_TREE_VIEW, return gimp_item_tree_view_new (GIMP_TYPE_VECTORS_TREE_VIEW,
view_size, 1, TRUE, view_size, 1, TRUE,
gimp_context_get_image (context), gimp_context_get_image (context),
gimp_dialog_factory_get_menu_factory (factory), menus_get_global_menu_factory (context->gimp),
"<Vectors>", "<Vectors>",
"/vectors-popup"); "/vectors-popup");
} }
@ -786,7 +788,7 @@ dialogs_colormap_editor_new (GimpDialogFactory *factory,
GimpUIManager *ui_manager, GimpUIManager *ui_manager,
gint view_size) 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 * GtkWidget *
@ -804,7 +806,7 @@ dialogs_selection_editor_new (GimpDialogFactory *factory,
GimpUIManager *ui_manager, GimpUIManager *ui_manager,
gint view_size) 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 * GtkWidget *
@ -813,7 +815,7 @@ dialogs_symmetry_editor_new (GimpDialogFactory *factory,
GimpUIManager *ui_manager, GimpUIManager *ui_manager,
gint view_size) 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 * GtkWidget *
@ -823,7 +825,7 @@ dialogs_undo_editor_new (GimpDialogFactory *factory,
gint view_size) gint view_size)
{ {
return gimp_undo_editor_new (context->gimp->config, return gimp_undo_editor_new (context->gimp->config,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -832,7 +834,7 @@ dialogs_sample_point_editor_new (GimpDialogFactory *factory,
GimpUIManager *ui_manager, GimpUIManager *ui_manager,
gint view_size) 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, GimpUIManager *ui_manager,
gint view_size) 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) gint view_size)
{ {
return gimp_brush_editor_new (context, return gimp_brush_editor_new (context,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -881,7 +883,7 @@ dialogs_dynamics_editor_get (GimpDialogFactory *factory,
gint view_size) gint view_size)
{ {
return gimp_dynamics_editor_new (context, return gimp_dynamics_editor_new (context,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -891,7 +893,7 @@ dialogs_gradient_editor_get (GimpDialogFactory *factory,
gint view_size) gint view_size)
{ {
return gimp_gradient_editor_new (context, return gimp_gradient_editor_new (context,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -901,7 +903,7 @@ dialogs_palette_editor_get (GimpDialogFactory *factory,
gint view_size) gint view_size)
{ {
return gimp_palette_editor_new (context, return gimp_palette_editor_new (context,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }
GtkWidget * GtkWidget *
@ -911,5 +913,5 @@ dialogs_tool_preset_editor_get (GimpDialogFactory *factory,
gint view_size) gint view_size)
{ {
return gimp_tool_preset_editor_new (context, return gimp_tool_preset_editor_new (context,
gimp_dialog_factory_get_menu_factory (factory)); menus_get_global_menu_factory (context->gimp));
} }

View file

@ -523,18 +523,14 @@ dialogs_restore_window (GimpDialogFactory *factory,
/* public functions */ /* public functions */
void void
dialogs_init (Gimp *gimp, dialogs_init (Gimp *gimp)
GimpMenuFactory *menu_factory)
{ {
GimpDialogFactory *factory = NULL; GimpDialogFactory *factory = NULL;
gint i = 0; gint i = 0;
g_return_if_fail (GIMP_IS_GIMP (gimp)); g_return_if_fail (GIMP_IS_GIMP (gimp));
g_return_if_fail (GIMP_IS_MENU_FACTORY (menu_factory));
factory = gimp_dialog_factory_new ("toplevel", factory = gimp_dialog_factory_new ("toplevel", gimp_get_user_context (gimp));
gimp_get_user_context (gimp),
menu_factory);
gimp_dialog_factory_set_singleton (factory); gimp_dialog_factory_set_singleton (factory);
for (i = 0; i < G_N_ELEMENTS (entries); i++) for (i = 0; i < G_N_ELEMENTS (entries); i++)

View file

@ -23,8 +23,7 @@ extern GimpDialogFactory *global_dialog_factory;
extern GimpContainer *global_recent_docks; extern GimpContainer *global_recent_docks;
void dialogs_init (Gimp *gimp, void dialogs_init (Gimp *gimp);
GimpMenuFactory *menu_factory);
void dialogs_exit (Gimp *gimp); void dialogs_exit (Gimp *gimp);
void dialogs_load_recent_docks (Gimp *gimp); void dialogs_load_recent_docks (Gimp *gimp);

View file

@ -25,6 +25,8 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "menus/menus.h"
#include "widgets/gimpactiongroup.h" #include "widgets/gimpactiongroup.h"
#include "widgets/gimpuimanager.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) 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; GimpActionGroup *action_group;
action_group = gimp_ui_manager_get_action_group (manager, "view"); 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) 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; GimpActionGroup *action_group;
action_group = gimp_ui_manager_get_action_group (manager, "view"); 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) 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; GimpActionGroup *action_group;
action_group = gimp_ui_manager_get_action_group (manager, "view"); action_group = gimp_ui_manager_get_action_group (manager, "view");

View file

@ -29,6 +29,8 @@
#include "core/gimpimage.h" #include "core/gimpimage.h"
#include "core/gimpimage-quick-mask.h" #include "core/gimpimage-quick-mask.h"
#include "menus/menus.h"
#include "widgets/gimpcairo-wilber.h" #include "widgets/gimpcairo-wilber.h"
#include "widgets/gimpuimanager.h" #include "widgets/gimpuimanager.h"
@ -349,7 +351,7 @@ gimp_display_shell_quick_mask_button_press (GtkWidget *widget,
if (window) 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, gimp_ui_manager_ui_popup_at_widget (manager,
"/quick-mask-popup", "/quick-mask-popup",
@ -380,7 +382,7 @@ gimp_display_shell_quick_mask_toggled (GtkWidget *widget,
if (window) 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, gimp_ui_manager_toggle_action (manager,
"quick-mask", "quick-mask-toggle", "quick-mask", "quick-mask-toggle",

View file

@ -34,6 +34,8 @@
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"
#include "menus/menus.h"
#include "widgets/gimphelp-ids.h" #include "widgets/gimphelp-ids.h"
#include "widgets/gimpmessagebox.h" #include "widgets/gimpmessagebox.h"
#include "widgets/gimpmessagedialog.h" #include "widgets/gimpmessagedialog.h"
@ -123,7 +125,7 @@ gimp_display_shell_close (GimpDisplayShell *shell,
if (window) 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 /* Activate the action instead of simply calling gimp_exit(), so
* the quit action's sensitivity is taken into account. * the quit action's sensitivity is taken into account.
@ -381,7 +383,7 @@ gimp_display_shell_close_response (GtkWidget *widget,
if (window) 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); gimp_image_window_set_active_shell (window, shell);

View file

@ -38,6 +38,8 @@
#include "core/gimpimage-pick-item.h" #include "core/gimpimage-pick-item.h"
#include "core/gimpitem.h" #include "core/gimpitem.h"
#include "menus/menus.h"
#include "widgets/gimpaction.h" #include "widgets/gimpaction.h"
#include "widgets/gimpcontrollers.h" #include "widgets/gimpcontrollers.h"
#include "widgets/gimpcontrollerkeyboard.h" #include "widgets/gimpcontrollerkeyboard.h"
@ -273,8 +275,7 @@ gimp_display_shell_canvas_no_image_events (GtkWidget *canvas,
GdkEventButton *bevent = (GdkEventButton *) event; GdkEventButton *bevent = (GdkEventButton *) event;
if (bevent->button == 1) if (bevent->button == 1)
{ {
GimpImageWindow *window = gimp_display_shell_get_window (shell); GimpUIManager *manager = menus_get_image_manager_singleton (shell->display->gimp);
GimpUIManager *manager = gimp_image_window_get_ui_manager (window);
gimp_ui_manager_activate_action (manager, "file", "file-open"); gimp_ui_manager_activate_action (manager, "file", "file-open");
} }
@ -2103,9 +2104,8 @@ static gboolean
gimp_display_shell_tab_pressed (GimpDisplayShell *shell, gimp_display_shell_tab_pressed (GimpDisplayShell *shell,
const GdkEventKey *kevent) const GdkEventKey *kevent)
{ {
GimpImageWindow *window = gimp_display_shell_get_window (shell); GimpUIManager *manager = menus_get_image_manager_singleton (shell->display->gimp);
GimpUIManager *manager = gimp_image_window_get_ui_manager (window); GimpImage *image = gimp_display_get_image (shell->display);
GimpImage *image = gimp_display_get_image (shell->display);
if (kevent->state & GDK_CONTROL_MASK) if (kevent->state & GDK_CONTROL_MASK)
{ {
@ -2292,11 +2292,9 @@ gimp_display_shell_initialize_tool (GimpDisplayShell *shell,
* just calling gimp_context_tool_changed(). See * just calling gimp_context_tool_changed(). See
* GimpGeglProcedure and bug #776370. * GimpGeglProcedure and bug #776370.
*/ */
GimpImageWindow *window; GimpUIManager *manager;
GimpUIManager *manager;
window = gimp_display_shell_get_window (shell); manager = menus_get_image_manager_singleton (shell->display->gimp);
manager = gimp_image_window_get_ui_manager (window);
gimp_filter_history_add (gimp, procedure); gimp_filter_history_add (gimp, procedure);
gimp_ui_manager_activate_action (manager, "filters", gimp_ui_manager_activate_action (manager, "filters",

View file

@ -51,6 +51,8 @@
#include "core/gimpprojection.h" #include "core/gimpprojection.h"
#include "core/gimptemplate.h" #include "core/gimptemplate.h"
#include "menus/menus.h"
#include "widgets/gimpdevices.h" #include "widgets/gimpdevices.h"
#include "widgets/gimphelp-ids.h" #include "widgets/gimphelp-ids.h"
#include "widgets/gimpuimanager.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) 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); gimp_ui_manager_update (manager, shell->display);
} }

View file

@ -62,6 +62,8 @@
#include "widgets/gimpviewrenderer.h" #include "widgets/gimpviewrenderer.h"
#include "widgets/gimpwidgets-utils.h" #include "widgets/gimpwidgets-utils.h"
#include "menus/menus.h"
#include "gimpdisplay.h" #include "gimpdisplay.h"
#include "gimpdisplay-foreach.h" #include "gimpdisplay-foreach.h"
#include "gimpdisplayshell.h" #include "gimpdisplayshell.h"
@ -110,7 +112,6 @@ typedef struct _GimpImageWindowPrivate GimpImageWindowPrivate;
struct _GimpImageWindowPrivate struct _GimpImageWindowPrivate
{ {
Gimp *gimp; Gimp *gimp;
GimpUIManager *menubar_manager;
GimpDialogFactory *dialog_factory; GimpDialogFactory *dialog_factory;
GList *shells; GList *shells;
@ -346,7 +347,7 @@ gimp_image_window_constructed (GObject *object)
{ {
GimpImageWindow *window = GIMP_IMAGE_WINDOW (object); GimpImageWindow *window = GIMP_IMAGE_WINDOW (object);
GimpImageWindowPrivate *private = GIMP_IMAGE_WINDOW_GET_PRIVATE (window); GimpImageWindowPrivate *private = GIMP_IMAGE_WINDOW_GET_PRIVATE (window);
GimpMenuFactory *menu_factory; GimpUIManager *menubar_manager;
GimpGuiConfig *config; GimpGuiConfig *config;
GimpMenuModel *model; GimpMenuModel *model;
gboolean use_gtk_menubar = TRUE; 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_GIMP (private->gimp));
gimp_assert (GIMP_IS_DIALOG_FACTORY (private->dialog_factory)); 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,
"<Image>",
window);
g_signal_connect_object (private->dialog_factory, "dock-window-added", g_signal_connect_object (private->dialog_factory, "dock-window-added",
G_CALLBACK (gimp_image_window_update_ui_manager), G_CALLBACK (gimp_image_window_update_ui_manager),
window, G_CONNECT_SWAPPED); window, G_CONNECT_SWAPPED);
@ -369,10 +364,11 @@ gimp_image_window_constructed (GObject *object)
G_CALLBACK (gimp_image_window_update_ui_manager), G_CALLBACK (gimp_image_window_update_ui_manager),
window, G_CONNECT_SWAPPED); 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), G_CALLBACK (gimp_image_window_show_tooltip),
window); window);
g_signal_connect (private->menubar_manager, "hide-tooltip", g_signal_connect (menubar_manager, "hide-tooltip",
G_CALLBACK (gimp_image_window_hide_tooltip), G_CALLBACK (gimp_image_window_hide_tooltip),
window); window);
@ -384,7 +380,7 @@ gimp_image_window_constructed (GObject *object)
gtk_widget_show (private->main_vbox); gtk_widget_show (private->main_vbox);
/* Create the menubar */ /* 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 #ifndef GDK_WINDOWING_QUARTZ
/* macOS has its native menubar system, which is implemented by /* macOS has its native menubar system, which is implemented by
@ -404,7 +400,7 @@ gimp_image_window_constructed (GObject *object)
} }
else else
{ {
private->menubar = gimp_menu_bar_new (model, private->menubar_manager); private->menubar = gimp_menu_bar_new (model, menubar_manager);
g_object_unref (model); g_object_unref (model);
gtk_box_pack_start (GTK_BOX (private->main_vbox), gtk_box_pack_start (GTK_BOX (private->main_vbox),
@ -446,7 +442,7 @@ gimp_image_window_constructed (GObject *object)
private->left_docks = private->left_docks =
gimp_dock_columns_new (gimp_get_user_context (private->gimp), gimp_dock_columns_new (gimp_get_user_context (private->gimp),
private->dialog_factory, private->dialog_factory,
private->menubar_manager); menubar_manager);
gtk_paned_pack1 (GTK_PANED (private->left_hpane), private->left_docks, gtk_paned_pack1 (GTK_PANED (private->left_hpane), private->left_docks,
FALSE, FALSE); FALSE, FALSE);
gtk_widget_set_visible (private->left_docks, config->single_window_mode); gtk_widget_set_visible (private->left_docks, config->single_window_mode);
@ -482,7 +478,7 @@ gimp_image_window_constructed (GObject *object)
private->right_docks = private->right_docks =
gimp_dock_columns_new (gimp_get_user_context (private->gimp), gimp_dock_columns_new (gimp_get_user_context (private->gimp),
private->dialog_factory, private->dialog_factory,
private->menubar_manager); menubar_manager);
gtk_paned_pack2 (GTK_PANED (private->right_hpane), private->right_docks, gtk_paned_pack2 (GTK_PANED (private->right_hpane), private->right_docks,
FALSE, FALSE); FALSE, FALSE);
gtk_widget_set_visible (private->right_docks, config->single_window_mode); 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; private->dialog_factory = NULL;
} }
g_clear_object (&private->menubar_manager);
if (private->update_ui_manager_idle_id) if (private->update_ui_manager_idle_id)
{ {
g_source_remove (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); GimpGuiConfig *config = GIMP_GUI_CONFIG (private->gimp->config);
if (config->single_window_mode) 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"); "file", "file-quit");
else if (shell) else if (shell)
gimp_display_shell_close (shell, FALSE); 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); 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 void
@ -1184,18 +1178,6 @@ gimp_image_window_destroy (GimpImageWindow *window)
gtk_widget_destroy (GTK_WIDGET (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 * GimpDockColumns *
gimp_image_window_get_left_docks (GimpImageWindow *window) 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_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->active_shell->display);
private->update_ui_manager_idle_id = 0; 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, gimp_image_window_shell_title_notify,
window); window);
if (private->menubar_manager) gimp_image_window_hide_tooltip (menus_get_image_manager_singleton (private->gimp), window);
gimp_image_window_hide_tooltip (private->menubar_manager, window);
if (private->update_ui_manager_idle_id) if (private->update_ui_manager_idle_id)
{ {

View file

@ -51,7 +51,6 @@ GimpImageWindow * gimp_image_window_new (Gimp *gi
GdkMonitor *monitor); GdkMonitor *monitor);
void gimp_image_window_destroy (GimpImageWindow *window); 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_left_docks (GimpImageWindow *window);
GimpDockColumns * gimp_image_window_get_right_docks (GimpImageWindow *window); GimpDockColumns * gimp_image_window_get_right_docks (GimpImageWindow *window);

View file

@ -29,6 +29,8 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "menus/menus.h"
#include "widgets/gimpdialogfactory.h" #include "widgets/gimpdialogfactory.h"
#include "widgets/gimpdock.h" #include "widgets/gimpdock.h"
#include "widgets/gimpdockbook.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)) if (! gimp_image_window_has_toolbox (window))
{ {
GimpDockColumns *columns; 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, widget = gimp_dialog_factory_dialog_new (factory, monitor,
ui_manager, ui_manager,

View file

@ -32,6 +32,10 @@
#include "display-types.h" #include "display-types.h"
#include "core/gimpcontext.h"
#include "menus/menus.h"
#include "vectors/gimpanchor.h" #include "vectors/gimpanchor.h"
#include "vectors/gimpbezierstroke.h" #include "vectors/gimpbezierstroke.h"
#include "vectors/gimpvectors.h" #include "vectors/gimpvectors.h"
@ -127,8 +131,6 @@ struct _GimpToolPathPrivate
GimpCanvasItem *path; GimpCanvasItem *path;
GList *items; GList *items;
GimpUIManager *ui_manager;
}; };
@ -314,13 +316,10 @@ gimp_tool_path_constructed (GObject *object)
static void static void
gimp_tool_path_dispose (GObject *object) gimp_tool_path_dispose (GObject *object)
{ {
GimpToolPath *path = GIMP_TOOL_PATH (object); GimpToolPath *path = GIMP_TOOL_PATH (object);
GimpToolPathPrivate *private = path->private;
gimp_tool_path_set_vectors (path, NULL); gimp_tool_path_set_vectors (path, NULL);
g_clear_object (&private->ui_manager);
G_OBJECT_CLASS (parent_class)->dispose (object); G_OBJECT_CLASS (parent_class)->dispose (object);
} }
@ -1298,21 +1297,17 @@ gimp_tool_path_get_popup (GimpToolWidget *widget,
{ {
GimpToolPath *path = GIMP_TOOL_PATH (widget); GimpToolPath *path = GIMP_TOOL_PATH (widget);
GimpToolPathPrivate *private = path->private; 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) image_window = gimp_display_shell_get_window (shell);
{ dialog_factory = gimp_dock_container_get_dialog_factory (GIMP_DOCK_CONTAINER (image_window));
GimpDisplayShell *shell = gimp_tool_widget_get_shell (widget);
GimpImageWindow *image_window;
GimpDialogFactory *dialog_factory;
image_window = gimp_display_shell_get_window (shell); menu_factory = menus_get_global_menu_factory (gimp_dialog_factory_get_context (dialog_factory)->gimp);
dialog_factory = gimp_dock_container_get_dialog_factory (GIMP_DOCK_CONTAINER (image_window)); ui_manager = gimp_menu_factory_get_manager (menu_factory, "<VectorToolPath>", widget);
private->ui_manager =
gimp_menu_factory_manager_new (gimp_dialog_factory_get_menu_factory (dialog_factory),
"<VectorToolPath>",
widget);
}
/* we're using a side effects of gimp_tool_path_get_function /* we're using a side effects of gimp_tool_path_get_function
* that update the private->cur_* variables. */ * that update the private->cur_* variables. */
@ -1320,10 +1315,10 @@ gimp_tool_path_get_popup (GimpToolWidget *widget,
if (private->cur_stroke) if (private->cur_stroke)
{ {
gimp_ui_manager_update (private->ui_manager, widget); gimp_ui_manager_update (ui_manager, widget);
*ui_path = "/vector-toolpath-popup"; *ui_path = "/vector-toolpath-popup";
return private->ui_manager; return ui_manager;
} }
return NULL; return NULL;

View file

@ -683,7 +683,7 @@ gui_pdb_dialog_new (Gimp *gimp,
"select-type", gimp_container_get_children_type (container), "select-type", gimp_container_get_children_type (container),
"initial-object", object, "initial-object", object,
"callback-name", callback_name, "callback-name", callback_name,
"menu-factory", global_menu_factory, "menu-factory", menus_get_global_menu_factory (gimp),
NULL); NULL);
names = gimp_properties_append_valist (dialog_type, names = gimp_properties_append_valist (dialog_type,

View file

@ -152,7 +152,6 @@ static void gui_check_unique_accelerators (Gimp *gimp);
/* private variables */ /* private variables */
static Gimp *the_gui_gimp = NULL; static Gimp *the_gui_gimp = NULL;
static GimpUIManager *image_ui_manager = NULL;
static GimpUIConfigurer *ui_configurer = NULL; static GimpUIConfigurer *ui_configurer = NULL;
static GdkMonitor *initial_monitor = NULL; static GdkMonitor *initial_monitor = NULL;
@ -506,10 +505,10 @@ gui_restore_callback (Gimp *gimp,
} }
actions_init (gimp); actions_init (gimp);
menus_init (gimp, global_action_factory); menus_init (gimp);
gimp_render_init (gimp); gimp_render_init (gimp);
dialogs_init (gimp, global_menu_factory); dialogs_init (gimp);
gimp_clipboard_init (gimp); gimp_clipboard_init (gimp);
if (gimp_get_clipboard_image (gimp)) if (gimp_get_clipboard_image (gimp))
@ -537,6 +536,7 @@ gui_restore_after_callback (Gimp *gimp,
GimpInitStatusFunc status_callback) GimpInitStatusFunc status_callback)
{ {
GimpGuiConfig *gui_config = GIMP_GUI_CONFIG (gimp->config); GimpGuiConfig *gui_config = GIMP_GUI_CONFIG (gimp->config);
GimpUIManager *image_ui_manager;
GimpDisplay *display; GimpDisplay *display;
if (gimp->be_verbose) if (gimp->be_verbose)
@ -568,9 +568,7 @@ gui_restore_after_callback (Gimp *gimp,
"gimp", gimp, "gimp", gimp,
NULL); NULL);
image_ui_manager = gimp_menu_factory_manager_new (global_menu_factory, image_ui_manager = menus_get_image_manager_singleton (gimp);
"<Image>",
gimp);
gimp_ui_manager_update (image_ui_manager, gimp); gimp_ui_manager_update (image_ui_manager, gimp);
/* Check that every accelerator is unique. */ /* Check that every accelerator is unique. */
@ -710,9 +708,6 @@ gui_exit_after_callback (Gimp *gimp,
gimp_action_history_exit (gimp); gimp_action_history_exit (gimp);
g_object_unref (image_ui_manager);
image_ui_manager = NULL;
g_object_unref (ui_configurer); g_object_unref (ui_configurer);
ui_configurer = NULL; 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 typedef struct

View file

@ -24,6 +24,8 @@
#include "menus-types.h" #include "menus-types.h"
#include "actions/actions.h"
#include "config/gimpconfig-file.h" #include "config/gimpconfig-file.h"
#include "config/gimpguiconfig.h" #include "config/gimpguiconfig.h"
@ -51,11 +53,6 @@ static void menus_remove_accels (gpointer data,
gboolean changed); gboolean changed);
/* global variables */
GimpMenuFactory * global_menu_factory = NULL;
/* private variables */ /* private variables */
static gboolean menurc_deleted = FALSE; static gboolean menurc_deleted = FALSE;
@ -64,17 +61,16 @@ static gboolean menurc_deleted = FALSE;
/* public functions */ /* public functions */
void void
menus_init (Gimp *gimp, menus_init (Gimp *gimp)
GimpActionFactory *action_factory)
{ {
GimpMenuFactory *global_menu_factory = NULL;
g_return_if_fail (GIMP_IS_GIMP (gimp)); 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 */ /* We need to make sure the property is installed before using it */
g_type_class_ref (GTK_TYPE_MENU); 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, "<Image>", gimp_menu_factory_manager_register (global_menu_factory, "<Image>",
"file", "file",
@ -401,10 +397,9 @@ void
menus_exit (Gimp *gimp) menus_exit (Gimp *gimp)
{ {
g_return_if_fail (GIMP_IS_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); g_object_unref (menus_get_global_menu_factory (gimp));
global_menu_factory = NULL;
} }
void void
@ -501,6 +496,29 @@ menus_remove (Gimp *gimp)
gtk_accel_map_foreach (gimp, menus_remove_accels); 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),
"<Image>", gimp);
return image_ui_manager;
}
/* private functions */ /* private functions */

View file

@ -19,20 +19,19 @@
#define __MENUS_H__ #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, gboolean menus_clear (Gimp *gimp,
GimpActionFactory *action_factory); GError **error);
void menus_exit (Gimp *gimp); void menus_remove (Gimp *gimp);
void menus_restore (Gimp *gimp); GimpMenuFactory * menus_get_global_menu_factory (Gimp *gimp);
void menus_save (Gimp *gimp, GimpUIManager * menus_get_image_manager_singleton (Gimp *gimp);
gboolean always_save);
gboolean menus_clear (Gimp *gimp,
GError **error);
void menus_remove (Gimp *gimp);
#endif /* __MENUS_H__ */ #endif /* __MENUS_H__ */

View file

@ -26,6 +26,8 @@
#include "display/gimpdisplayshell.h" #include "display/gimpdisplayshell.h"
#include "display/gimpimagewindow.h" #include "display/gimpimagewindow.h"
#include "menus/menus.h"
#include "widgets/gimpuimanager.h" #include "widgets/gimpuimanager.h"
#include "widgets/gimpdialogfactory.h" #include "widgets/gimpdialogfactory.h"
@ -316,26 +318,7 @@ else
GimpUIManager * GimpUIManager *
gimp_test_utils_get_ui_manager (Gimp *gimp) gimp_test_utils_get_ui_manager (Gimp *gimp)
{ {
GimpDisplay *display = NULL; return menus_get_image_manager_singleton (gimp);
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;
} }
/** /**

View file

@ -34,6 +34,8 @@
#include "display/gimpdisplayshell-transform.h" #include "display/gimpdisplayshell-transform.h"
#include "display/gimpimagewindow.h" #include "display/gimpimagewindow.h"
#include "menus/menus.h"
#include "widgets/gimpdialogfactory.h" #include "widgets/gimpdialogfactory.h"
#include "widgets/gimpdock.h" #include "widgets/gimpdock.h"
#include "widgets/gimpdockable.h" #include "widgets/gimpdockable.h"
@ -111,8 +113,7 @@ tool_options_editor_updates (gconstpointer data)
GimpDisplay *display = GIMP_DISPLAY (gimp_get_empty_display (gimp)); GimpDisplay *display = GIMP_DISPLAY (gimp_get_empty_display (gimp));
GimpDisplayShell *shell = gimp_display_get_shell (display); GimpDisplayShell *shell = gimp_display_get_shell (display);
GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (shell)); GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (shell));
GimpImageWindow *image_window = GIMP_IMAGE_WINDOW (toplevel); GimpUIManager *ui_manager = menus_get_image_manager_singleton (gimp);
GimpUIManager *ui_manager = gimp_image_window_get_ui_manager (image_window);
GtkWidget *dockable = gimp_dialog_factory_dialog_new (gimp_dialog_factory_get_singleton (), GtkWidget *dockable = gimp_dialog_factory_dialog_new (gimp_dialog_factory_get_singleton (),
gimp_widget_get_monitor (toplevel), gimp_widget_get_monitor (toplevel),
NULL /*ui_manager*/, NULL /*ui_manager*/,

View file

@ -35,6 +35,8 @@
#include "core/gimpimage.h" #include "core/gimpimage.h"
#include "core/gimptoolinfo.h" #include "core/gimptoolinfo.h"
#include "menus/menus.h"
#include "text/gimptext.h" #include "text/gimptext.h"
#include "text/gimptextlayout.h" #include "text/gimptextlayout.h"
@ -1354,7 +1356,7 @@ gimp_text_tool_editor_dialog (GimpTextTool *text_tool)
text_tool->editor_dialog = text_tool->editor_dialog =
gimp_text_options_editor_new (parent, tool->tool_info->gimp, options, 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"), _("GIMP Text Editor"),
text_tool->proxy, text_tool->buffer, text_tool->proxy, text_tool->buffer,
xres, yres); xres, yres);

View file

@ -45,6 +45,8 @@
#include "core/gimptoolinfo.h" #include "core/gimptoolinfo.h"
#include "core/gimpundostack.h" #include "core/gimpundostack.h"
#include "menus/menus.h"
#include "text/gimptext.h" #include "text/gimptext.h"
#include "text/gimptext-vectors.h" #include "text/gimptext-vectors.h"
#include "text/gimptextlayer.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->proxy);
g_clear_object (&text_tool->buffer); g_clear_object (&text_tool->buffer);
g_clear_object (&text_tool->ui_manager);
gimp_text_tool_editor_finalize (text_tool); gimp_text_tool_editor_finalize (text_tool);
@ -836,26 +837,17 @@ gimp_text_tool_get_popup (GimpTool *tool,
coords->x, coords->x,
coords->y)) coords->y))
{ {
if (! text_tool->ui_manager) GimpMenuFactory *menu_factory;
{ GimpUIManager *ui_manager;
GimpDisplayShell *shell = gimp_display_get_shell (tool->display);
GimpImageWindow *image_window;
GimpDialogFactory *dialog_factory;
image_window = gimp_display_shell_get_window (shell); menu_factory = menus_get_global_menu_factory (tool->tool_info->gimp);
dialog_factory = gimp_dock_container_get_dialog_factory (GIMP_DOCK_CONTAINER (image_window)); ui_manager = gimp_menu_factory_get_manager (menu_factory, "<TextTool>", text_tool);
text_tool->ui_manager = gimp_ui_manager_update (ui_manager, text_tool);
gimp_menu_factory_manager_new (gimp_dialog_factory_get_menu_factory (dialog_factory),
"<TextTool>",
text_tool);
}
gimp_ui_manager_update (text_tool->ui_manager, text_tool);
*ui_path = "/text-tool-popup"; *ui_path = "/text-tool-popup";
return text_tool->ui_manager; return ui_manager;
} }
return NULL; return NULL;

View file

@ -56,7 +56,6 @@ struct _GimpTextTool
GimpImage *image; GimpImage *image;
GtkWidget *confirm_dialog; GtkWidget *confirm_dialog;
GimpUIManager *ui_manager;
gboolean handle_rectangle_change_complete; gboolean handle_rectangle_change_complete;
gboolean text_box_fixed; gboolean text_box_fixed;

View file

@ -71,6 +71,7 @@ gimp_action_factory_finalize (GObject *object)
g_free (entry->identifier); g_free (entry->identifier);
g_free (entry->label); g_free (entry->label);
g_free (entry->icon_name); g_free (entry->icon_name);
g_clear_object (&entry->group);
g_slice_free (GimpActionFactoryEntry, entry); g_slice_free (GimpActionFactoryEntry, entry);
} }
@ -124,7 +125,7 @@ gimp_action_factory_group_register (GimpActionFactory *factory,
} }
GimpActionGroup * GimpActionGroup *
gimp_action_factory_group_new (GimpActionFactory *factory, gimp_action_factory_get_group (GimpActionFactory *factory,
const gchar *identifier, const gchar *identifier,
gpointer user_data) gpointer user_data)
{ {
@ -139,19 +140,24 @@ gimp_action_factory_group_new (GimpActionFactory *factory,
if (! strcmp (entry->identifier, identifier)) if (! strcmp (entry->identifier, identifier))
{ {
GimpActionGroup *group; if (entry->group == NULL)
{
GimpActionGroup *group;
group = gimp_action_group_new (factory->gimp, group = gimp_action_group_new (factory->gimp,
entry->identifier, entry->identifier,
entry->label, entry->label,
entry->icon_name, entry->icon_name,
user_data, user_data,
entry->update_func); entry->update_func);
if (entry->setup_func) if (entry->setup_func)
entry->setup_func (group); entry->setup_func (group);
return group; entry->group = group;
}
return entry->group;
} }
} }

View file

@ -34,6 +34,8 @@ struct _GimpActionFactoryEntry
gchar *icon_name; gchar *icon_name;
GimpActionGroupSetupFunc setup_func; GimpActionGroupSetupFunc setup_func;
GimpActionGroupUpdateFunc update_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, void gimp_action_factory_group_register (GimpActionFactory *factory,
const gchar *identifier, const gchar *identifier,
const gchar *label, const gchar *label,
const gchar *icon_name, const gchar *icon_name,
GimpActionGroupSetupFunc setup_func, GimpActionGroupSetupFunc setup_func,
GimpActionGroupUpdateFunc update_func); GimpActionGroupUpdateFunc update_func);
GimpActionGroup * gimp_action_factory_group_new (GimpActionFactory *factory, GimpActionGroup * gimp_action_factory_get_group (GimpActionFactory *factory,
const gchar *identifier, const gchar *identifier,
gpointer user_data); gpointer user_data);
#endif /* __GIMP_ACTION_FACTORY_H__ */ #endif /* __GIMP_ACTION_FACTORY_H__ */

View file

@ -422,6 +422,10 @@ gimp_action_group_add_actions (GimpActionGroup *group,
tooltip = gettext (entries[i].tooltip); 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, action = gimp_action_impl_new (entries[i].name, label, tooltip,
entries[i].icon_name, entries[i].icon_name,
entries[i].help_id, context); entries[i].help_id, context);
@ -473,6 +477,10 @@ gimp_action_group_add_toggle_actions (GimpActionGroup *group,
tooltip = gettext (entries[i].tooltip); 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, action = gimp_toggle_action_new (entries[i].name, label, tooltip,
entries[i].icon_name, entries[i].icon_name,
entries[i].help_id, context); entries[i].help_id, context);
@ -531,6 +539,10 @@ gimp_action_group_add_radio_actions (GimpActionGroup *group,
tooltip = gettext (entries[i].tooltip); 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, action = gimp_radio_action_new (entries[i].name, label, tooltip,
entries[i].icon_name, entries[i].icon_name,
entries[i].help_id, entries[i].help_id,
@ -594,6 +606,10 @@ gimp_action_group_add_enum_actions (GimpActionGroup *group,
tooltip = gettext (entries[i].tooltip); 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, action = gimp_enum_action_new (entries[i].name, label, tooltip,
entries[i].icon_name, entries[i].icon_name,
entries[i].help_id, entries[i].help_id,
@ -649,20 +665,31 @@ gimp_action_group_add_string_actions (GimpActionGroup *group,
tooltip = gettext (entries[i].tooltip); tooltip = gettext (entries[i].tooltip);
} }
action = gimp_string_action_new (entries[i].name, label, tooltip, /* XXX: as a special exception, because the dialogs_dockable_actions are
entries[i].icon_name, * added both in the dockable and dialogs action groups.
entries[i].help_id, */
entries[i].value, context); 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) if (callback)
g_signal_connect (action, "gimp-activate", g_signal_connect (action, "gimp-activate",
G_CALLBACK (callback), G_CALLBACK (callback),
group->user_data); 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_signal_emit (group, signals[ACTION_ADDED], 0, action);
g_object_unref (action); g_object_unref (action);
} }
} }
@ -702,6 +729,10 @@ gimp_action_group_add_double_actions (GimpActionGroup *group,
tooltip = gettext (entries[i].tooltip); 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, action = gimp_double_action_new (entries[i].name, label, tooltip,
entries[i].icon_name, entries[i].icon_name,
entries[i].help_id, entries[i].help_id,
@ -750,24 +781,44 @@ gimp_action_group_add_procedure_actions (GimpActionGroup *group,
continue; continue;
} }
action = gimp_procedure_action_new (entries[i].name, action = GIMP_PROCEDURE_ACTION (g_action_map_lookup_action (G_ACTION_MAP (group->gimp->app),
entries[i].label, entries[i].name));
entries[i].tooltip, if (G_LIKELY (action == NULL))
entries[i].icon_name, {
entries[i].help_id, action = gimp_procedure_action_new (entries[i].name,
entries[i].procedure, entries[i].label,
context); entries[i].tooltip,
entries[i].icon_name,
entries[i].help_id,
entries[i].procedure,
context);
if (callback) if (callback)
g_signal_connect (action, "gimp-activate", g_signal_connect (action, "gimp-activate",
G_CALLBACK (callback), G_CALLBACK (callback),
group->user_data); group->user_data);
gimp_action_group_add_action_with_accel (group, GIMP_ACTION (action), gimp_action_group_add_action_with_accel (group, GIMP_ACTION (action),
entries[i].accelerator); entries[i].accelerator);
g_signal_emit (group, signals[ACTION_ADDED], 0, action); 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);
}
} }
} }

View file

@ -140,7 +140,7 @@ gimp_controllers_restore (Gimp *gimp,
g_return_if_fail (manager != NULL); g_return_if_fail (manager != NULL);
g_return_if_fail (manager->ui_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); file = gimp_directory_file ("controllerrc", NULL);
@ -297,7 +297,6 @@ gimp_controller_manager_free (GimpControllerManager *manager)
manager->event_mapped_id); manager->event_mapped_id);
g_clear_object (&manager->controllers); g_clear_object (&manager->controllers);
g_clear_object (&manager->ui_manager);
g_slice_free (GimpControllerManager, manager); g_slice_free (GimpControllerManager, manager);
} }

View file

@ -36,6 +36,8 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "menus/menus.h"
#include "gimpcursor.h" #include "gimpcursor.h"
#include "gimpdialogfactory.h" #include "gimpdialogfactory.h"
#include "gimpdock.h" #include "gimpdock.h"
@ -61,7 +63,6 @@ enum
struct _GimpDialogFactoryPrivate struct _GimpDialogFactoryPrivate
{ {
GimpContext *context; GimpContext *context;
GimpMenuFactory *menu_factory;
GList *open_dialogs; GList *open_dialogs;
GList *session_infos; GList *session_infos;
@ -223,17 +224,14 @@ gimp_dialog_factory_finalize (GObject *object)
} }
GimpDialogFactory * GimpDialogFactory *
gimp_dialog_factory_new (const gchar *name, gimp_dialog_factory_new (const gchar *name,
GimpContext *context, GimpContext *context)
GimpMenuFactory *menu_factory)
{ {
GimpDialogFactory *factory; GimpDialogFactory *factory;
GimpGuiConfig *config; GimpGuiConfig *config;
g_return_val_if_fail (name != NULL, NULL); g_return_val_if_fail (name != NULL, NULL);
g_return_val_if_fail (GIMP_IS_CONTEXT (context), 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); 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); config = GIMP_GUI_CONFIG (context->gimp->config);
factory->p->context = context; factory->p->context = context;
factory->p->menu_factory = menu_factory;
factory->p->dialog_state = (config->hide_docks ? factory->p->dialog_state = (config->hide_docks ?
GIMP_DIALOGS_HIDDEN_EXPLICITLY : GIMP_DIALOGS_HIDDEN_EXPLICITLY :
GIMP_DIALOGS_SHOWN); GIMP_DIALOGS_SHOWN);
@ -494,7 +491,7 @@ gimp_dialog_factory_dialog_new_internal (GimpDialogFactory *factory,
* created in its dock's context. * created in its dock's context.
*/ */
dock = gimp_dock_with_window_new (factory, monitor, FALSE); 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_dock_add_book (GIMP_DOCK (dock),
GIMP_DOCKBOOK (dockbook), GIMP_DOCKBOOK (dockbook),
@ -726,14 +723,6 @@ gimp_dialog_factory_get_context (GimpDialogFactory *factory)
return factory->p->context; 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 * GList *
gimp_dialog_factory_get_open_dialogs (GimpDialogFactory *factory) gimp_dialog_factory_get_open_dialogs (GimpDialogFactory *factory)
{ {

View file

@ -112,8 +112,7 @@ struct _GimpDialogFactoryClass
GType gimp_dialog_factory_get_type (void) G_GNUC_CONST; GType gimp_dialog_factory_get_type (void) G_GNUC_CONST;
GimpDialogFactory * gimp_dialog_factory_new (const gchar *name, GimpDialogFactory * gimp_dialog_factory_new (const gchar *name,
GimpContext *context, GimpContext *context);
GimpMenuFactory *menu_factory);
void gimp_dialog_factory_register_entry (GimpDialogFactory *factory, void gimp_dialog_factory_register_entry (GimpDialogFactory *factory,
const gchar *identifier, const gchar *identifier,
@ -149,7 +148,6 @@ GtkWidget * gimp_dialog_factory_dialog_new (GimpDialogFactory
gboolean present); gboolean present);
GimpContext * gimp_dialog_factory_get_context (GimpDialogFactory *factory); 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_open_dialogs (GimpDialogFactory *factory);
GList * gimp_dialog_factory_get_session_infos (GimpDialogFactory *factory); GList * gimp_dialog_factory_get_session_infos (GimpDialogFactory *factory);

View file

@ -30,6 +30,8 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "menus/menus.h"
#include "gimpdialogfactory.h" #include "gimpdialogfactory.h"
#include "gimpdock.h" #include "gimpdock.h"
#include "gimpdockable.h" #include "gimpdockable.h"
@ -298,7 +300,7 @@ gimp_dock_dropped_cb (GtkWidget *notebook,
/* Create a new dockbook */ /* Create a new dockbook */
factory = gimp_dock_get_dialog_factory (dock); 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); gimp_dock_add_book (dock, GIMP_DOCKBOOK (new_dockbook), insert_index);
/* Add the dockable to new new dockbook */ /* Add the dockable to new new dockbook */

View file

@ -32,6 +32,8 @@
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "menus/menus.h"
#include "gimpdialogfactory.h" #include "gimpdialogfactory.h"
#include "gimpdnd.h" #include "gimpdnd.h"
#include "gimpdock.h" #include "gimpdock.h"
@ -543,7 +545,7 @@ gimp_dockable_detach (GimpDockable *dockable)
src_dock_window = gimp_dock_window_from_dock (src_dock); src_dock_window = gimp_dock_window_from_dock (src_dock);
dialog_factory = gimp_dock_get_dialog_factory (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, dock = gimp_dock_with_window_new (dialog_factory,
gimp_widget_get_monitor (GTK_WIDGET (dockable)), gimp_widget_get_monitor (GTK_WIDGET (dockable)),

View file

@ -36,6 +36,8 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "menus/menus.h"
#include "gimpactiongroup.h" #include "gimpactiongroup.h"
#include "gimpdialogfactory.h" #include "gimpdialogfactory.h"
#include "gimpdnd.h" #include "gimpdnd.h"
@ -261,8 +263,6 @@ gimp_dockbook_finalize (GObject *object)
{ {
GimpDockbook *dockbook = GIMP_DOCKBOOK (object); GimpDockbook *dockbook = GIMP_DOCKBOOK (object);
g_clear_object (&dockbook->p->ui_manager);
G_OBJECT_CLASS (parent_class)->finalize (object); 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); src_dock_window = gimp_dock_window_from_dock (src_dock);
dialog_factory = gimp_dock_get_dialog_factory (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, new_dock = gimp_dock_with_window_new (dialog_factory,
gimp_widget_get_monitor (page), gimp_widget_get_monitor (page),
@ -554,7 +554,7 @@ gimp_dockbook_show_menu (GimpDockbook *dockbook)
GimpDockable *dockable; GimpDockable *dockable;
gint page_num; gint page_num;
dockbook_ui_manager = gimp_dockbook_get_ui_manager (dockbook); dockbook_ui_manager = dockbook->p->ui_manager;
if (! dockbook_ui_manager) if (! dockbook_ui_manager)
return FALSE; return FALSE;
@ -612,7 +612,7 @@ gimp_dockbook_new (GimpMenuFactory *menu_factory)
dockbook = g_object_new (GIMP_TYPE_DOCKBOOK, NULL); 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,
"<Dockable>", "<Dockable>",
dockbook); 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: * gimp_dockbook_add_from_dialog_factory:
* @dockbook: The #DockBook * @dockbook: The #DockBook

View file

@ -71,8 +71,6 @@ void gimp_dockbook_set_dock (GimpDockbook
GimpDock *dock); GimpDock *dock);
GimpDock * gimp_dockbook_get_dock (GimpDockbook *dockbook); GimpDock * gimp_dockbook_get_dock (GimpDockbook *dockbook);
GimpUIManager * gimp_dockbook_get_ui_manager (GimpDockbook *dockbook);
GtkWidget * gimp_dockbook_add_from_dialog_factory (GimpDockbook *dockbook, GtkWidget * gimp_dockbook_add_from_dialog_factory (GimpDockbook *dockbook,
const gchar *identifiers); const gchar *identifiers);

View file

@ -30,6 +30,8 @@
#include "core/gimp.h" #include "core/gimp.h"
#include "core/gimpcontext.h" #include "core/gimpcontext.h"
#include "menus/menus.h"
#include "gimpdialogfactory.h" #include "gimpdialogfactory.h"
#include "gimpdock.h" #include "gimpdock.h"
#include "gimpdockable.h" #include "gimpdockable.h"
@ -405,14 +407,16 @@ gimp_dock_columns_prepare_dockbook (GimpDockColumns *dock_columns,
gint dock_index, gint dock_index,
GtkWidget **dockbook_p) GtkWidget **dockbook_p)
{ {
GimpMenuFactory *menu_factory; GimpDialogFactory *dialog_factory;
GtkWidget *dock; GimpMenuFactory *menu_factory;
GtkWidget *dockbook; GtkWidget *dock;
GtkWidget *dockbook;
dock = gimp_menu_dock_new (); dock = gimp_menu_dock_new ();
gimp_dock_columns_add_dock (dock_columns, GIMP_DOCK (dock), dock_index); 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); dockbook = gimp_dockbook_new (menu_factory);
gimp_dock_add_book (GIMP_DOCK (dock), GIMP_DOCKBOOK (dockbook), -1); gimp_dock_add_book (GIMP_DOCK (dock), GIMP_DOCKBOOK (dockbook), -1);

View file

@ -41,6 +41,8 @@
#include "core/gimplist.h" #include "core/gimplist.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"
#include "menus/menus.h"
#include "gimpcontainercombobox.h" #include "gimpcontainercombobox.h"
#include "gimpcontainerview.h" #include "gimpcontainerview.h"
#include "gimpdialogfactory.h" #include "gimpdialogfactory.h"
@ -313,14 +315,13 @@ gimp_dock_window_constructed (GObject *object)
/* Setup hints */ /* Setup hints */
gimp_window_set_hint (GTK_WINDOW (dock_window), config->dock_window_hint); gimp_window_set_hint (GTK_WINDOW (dock_window), config->dock_window_hint);
menu_factory = menu_factory = menus_get_global_menu_factory (gimp);
gimp_dialog_factory_get_menu_factory (dock_window->p->dialog_factory);
/* Make image window related keyboard shortcuts work also when a /* Make image window related keyboard shortcuts work also when a
* dock window is the focused window * dock window is the focused window
*/ */
dock_window->p->ui_manager = 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->p->ui_manager_name,
dock_window); dock_window);
@ -483,7 +484,6 @@ gimp_dock_window_dispose (GObject *object)
dock_window->p->image_flush_handler_id = 0; 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->dialog_factory);
g_clear_object (&dock_window->p->context); g_clear_object (&dock_window->p->context);

View file

@ -241,7 +241,7 @@ gimp_editor_constructed (GObject *object)
if (editor->priv->menu_factory && editor->priv->menu_identifier) if (editor->priv->menu_factory && editor->priv->menu_identifier)
{ {
editor->priv->ui_manager = 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->menu_identifier,
editor->priv->popup_data); editor->priv->popup_data);
@ -269,9 +269,6 @@ gimp_editor_dispose (GObject *object)
g_clear_pointer (&editor->priv->menu_identifier, g_free); 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_clear_pointer (&editor->priv->ui_path, g_free);
G_OBJECT_CLASS (parent_class)->dispose (object); 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); editor->priv->menu_factory = g_object_ref (menu_factory);
if (editor->priv->ui_manager) if (editor->priv->ui_manager)
{ g_signal_handlers_disconnect_by_func (editor->priv->ui_manager->gimp->config,
g_signal_handlers_disconnect_by_func (editor->priv->ui_manager->gimp->config, G_CALLBACK (gimp_editor_style_updated),
G_CALLBACK (gimp_editor_style_updated), editor);
editor);
g_object_unref (editor->priv->ui_manager);
}
editor->priv->ui_manager = gimp_menu_factory_manager_new (menu_factory, editor->priv->ui_manager = gimp_menu_factory_get_manager (menu_factory,
menu_identifier, menu_identifier,
popup_data); popup_data);
g_signal_connect_object (editor->priv->ui_manager->gimp->config, g_signal_connect_object (editor->priv->ui_manager->gimp->config,

View file

@ -95,6 +95,7 @@ gimp_menu_factory_finalize (GObject *object)
g_slice_free (GimpUIManagerUIEntry, ui_entry); g_slice_free (GimpUIManagerUIEntry, ui_entry);
} }
g_clear_object (&entry->manager);
g_list_free (entry->managed_uis); g_list_free (entry->managed_uis);
g_slice_free (GimpMenuFactoryEntry, entry); g_slice_free (GimpMenuFactoryEntry, entry);
@ -192,7 +193,7 @@ gimp_menu_factory_get_registered_menus (GimpMenuFactory *factory)
} }
GimpUIManager * GimpUIManager *
gimp_menu_factory_manager_new (GimpMenuFactory *factory, gimp_menu_factory_get_manager (GimpMenuFactory *factory,
const gchar *identifier, const gchar *identifier,
gpointer callback_data) gpointer callback_data)
{ {
@ -207,34 +208,37 @@ gimp_menu_factory_manager_new (GimpMenuFactory *factory,
if (! strcmp (entry->identifier, identifier)) if (! strcmp (entry->identifier, identifier))
{ {
GimpUIManager *manager; if (entry->manager == NULL)
GList *list;
manager = gimp_ui_manager_new (factory->p->gimp, entry->identifier);
for (list = entry->action_groups; list; list = g_list_next (list))
{ {
GimpActionGroup *group; GimpUIManager *manager;
GList *list;
group = gimp_action_factory_group_new (factory->p->action_factory, manager = gimp_ui_manager_new (factory->p->gimp, entry->identifier);
(const gchar *) list->data, entry->manager = manager;
callback_data);
gimp_ui_manager_add_action_group (manager, group); for (list = entry->action_groups; list; list = g_list_next (list))
g_object_unref (group); {
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)) return entry->manager;
{
GimpUIManagerUIEntry *ui_entry = list->data;
gimp_ui_manager_ui_register (manager,
ui_entry->ui_path,
ui_entry->basename,
ui_entry->setup_func);
}
return manager;
} }
} }

View file

@ -29,9 +29,11 @@ typedef struct _GimpMenuFactoryEntry GimpMenuFactoryEntry;
struct _GimpMenuFactoryEntry struct _GimpMenuFactoryEntry
{ {
gchar *identifier; gchar *identifier;
GList *action_groups; GList *action_groups;
GList *managed_uis; GList *managed_uis;
GimpUIManager *manager;
}; };
@ -67,9 +69,11 @@ void gimp_menu_factory_manager_register (GimpMenuFactory *fac
const gchar *first_group, const gchar *first_group,
...) G_GNUC_NULL_TERMINATED; ...) G_GNUC_NULL_TERMINATED;
GList * gimp_menu_factory_get_registered_menus (GimpMenuFactory *factory); 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, const gchar *identifier,
gpointer callback_data); gpointer callback_data);
GimpUIManager * gimp_menu_factory_get_image_manager (GimpMenuFactory *factory);
#endif /* __GIMP_MENU_FACTORY_H__ */ #endif /* __GIMP_MENU_FACTORY_H__ */

View file

@ -26,6 +26,10 @@
#include "widgets-types.h" #include "widgets-types.h"
#include "core/gimpcontext.h"
#include "menus/menus.h"
#include "gimpdialogfactory.h" #include "gimpdialogfactory.h"
#include "gimpdock.h" #include "gimpdock.h"
#include "gimpdockbook.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); g_return_val_if_fail (GIMP_IS_DOCK (dock), NULL);
dialog_factory = gimp_dock_get_dialog_factory (dock); 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); dockbook = gimp_dockbook_new (menu_factory);

View file

@ -118,7 +118,6 @@ gimp_text_editor_finalize (GObject *object)
GimpTextEditor *editor = GIMP_TEXT_EDITOR (object); GimpTextEditor *editor = GIMP_TEXT_EDITOR (object);
g_clear_pointer (&editor->font_name, g_free); g_clear_pointer (&editor->font_name, g_free);
g_clear_object (&editor->ui_manager);
G_OBJECT_CLASS (parent_class)->finalize (object); 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), G_CALLBACK (gimp_text_editor_text_changed),
editor, 0); editor, 0);
editor->ui_manager = gimp_menu_factory_manager_new (menu_factory, editor->ui_manager = gimp_menu_factory_get_manager (menu_factory,
"<TextEditor>", "<TextEditor>",
editor); editor);