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,
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);

View file

@ -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))

View file

@ -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),
"<MyPaintBrushes>",
"/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>",
"/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>",
"/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),
"<MyPaintBrushes>",
"/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>",
"/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>",
"/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>",
"/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>",
"/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>",
"/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));
}

View file

@ -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++)

View file

@ -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);

View file

@ -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");

View file

@ -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",

View file

@ -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);

View file

@ -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",

View file

@ -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);
}

View file

@ -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,
"<Image>",
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)
{

View file

@ -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);

View file

@ -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,

View file

@ -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),
"<VectorToolPath>",
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, "<VectorToolPath>", 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;

View file

@ -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,

View file

@ -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,
"<Image>",
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

View file

@ -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, "<Image>",
"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),
"<Image>", gimp);
return image_ui_manager;
}
/* private functions */

View file

@ -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__ */

View file

@ -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);
}
/**

View file

@ -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*/,

View file

@ -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);

View file

@ -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, "<TextTool>", text_tool);
text_tool->ui_manager =
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);
gimp_ui_manager_update (ui_manager, text_tool);
*ui_path = "/text-tool-popup";
return text_tool->ui_manager;
return ui_manager;
}
return NULL;

View file

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

View file

@ -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;
}
}

View file

@ -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__ */

View file

@ -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);
}
}
}

View file

@ -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);
}

View file

@ -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)
{

View file

@ -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);

View file

@ -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 */

View file

@ -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)),

View file

@ -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,
"<Dockable>",
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

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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,

View file

@ -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;
}
}

View file

@ -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__ */

View file

@ -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);

View file

@ -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,
"<TextEditor>",
editor);