From 0a5ce16b841ed29497d055f788415945ca18aef8 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Thu, 24 Mar 2005 16:08:04 +0000 Subject: [PATCH] Added API to explicitly register dynamic menu items hierarchies. Fixes bug 2005-03-24 Michael Natterer Added API to explicitly register dynamic menu items hierarchies. Fixes bug #170623. * app/core/gimp.h: added "GSList *plug_in_menu_branches". * app/plug-in/plug-in-types.h * app/plug-in/plug-ins.[ch]: added API to register plug-in menu branches, just as for locale and help domans. Cleaned up handling of locale and help domains. (plug_ins_exit): free the registered menu branches. * app/actions/plug-in-actions.[ch] (plug_in_actions_add_branch): new function to explicitly add a menu branch action. (plug_in_actions_setup): add the registered menu branches to each new action group. (plug_in_actions_build_path): always strip the untranslated menu path from underlines before using it as hash table key or action name. * app/menus/plug-in-menus.c (plug_in_menus_add_proc): changed accordingly: strip underlines from untranslated menu paths before passing them to plug_in_menus_build_path(). * app/core/gimp-gui.[ch]: added gimp_menus_create_branch() plus vtable entry to access the new stuff from the core. Renamed the functions desling with items from gimp_foo_entry() to gimp_foo_item(). * app/gui/gui-vtable.c: implement create_branch() and add the branch action to all existing "plug-in" action groups. Note that we don't need to create any menus because that happens implicitly when adding menu items. * tools/pdbgen/pdb/plug_in.pdb (plugin_menu_branch_register): new PDB wrapper to access branch registering from plug-ins. * app/pdb/internal_procs.c * app/pdb/plug_in_cmds.c * libgimp/gimpplugin_pdb.[ch]: regenerated. * libgimp/gimp.def: changed accordingly. * plug-ins/script-fu/script-fu-scripts.c (script_fu_find_scripts): register the menu branches for all included scripts. --- ChangeLog | 51 +++++++ app/actions/plug-in-actions.c | 72 +++++++-- app/actions/plug-in-actions.h | 5 + app/core/gimp-gui.c | 77 ++++++---- app/core/gimp-gui.h | 118 +++++++------- app/core/gimp.h | 1 + app/gui/gui-vtable.c | 81 ++++++---- app/menus/plug-in-menus.c | 5 +- app/pdb/internal_procs.c | 52 +++---- app/pdb/plug_in_cmds.c | 75 ++++++++- app/plug-in/gimppluginmanager.c | 203 +++++++++++++++++-------- app/plug-in/gimppluginmanager.h | 26 ++++ app/plug-in/plug-in-types.h | 11 +- app/plug-in/plug-ins.c | 203 +++++++++++++++++-------- app/plug-in/plug-ins.h | 26 ++++ libgimp/gimp.def | 1 + libgimp/gimpplugin_pdb.c | 35 +++++ libgimp/gimpplugin_pdb.h | 22 +-- plug-ins/script-fu/script-fu-scripts.c | 46 ++++++ tools/pdbgen/pdb/plug_in.pdb | 48 +++++- 20 files changed, 849 insertions(+), 309 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6c85370d27..0f37607ef5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,54 @@ +2005-03-24 Michael Natterer + + Added API to explicitly register dynamic menu items hierarchies. + Fixes bug #170623. + + * app/core/gimp.h: added "GSList *plug_in_menu_branches". + + * app/plug-in/plug-in-types.h + + * app/plug-in/plug-ins.[ch]: added API to register plug-in menu + branches, just as for locale and help domans. Cleaned up handling + of locale and help domains. + + (plug_ins_exit): free the registered menu branches. + + * app/actions/plug-in-actions.[ch] (plug_in_actions_add_branch): + new function to explicitly add a menu branch action. + + (plug_in_actions_setup): add the registered menu branches to each + new action group. + + (plug_in_actions_build_path): always strip the untranslated menu + path from underlines before using it as hash table key or action + name. + + * app/menus/plug-in-menus.c (plug_in_menus_add_proc): changed + accordingly: strip underlines from untranslated menu paths before + passing them to plug_in_menus_build_path(). + + * app/core/gimp-gui.[ch]: added gimp_menus_create_branch() plus + vtable entry to access the new stuff from the core. Renamed the + functions desling with items from gimp_foo_entry() to + gimp_foo_item(). + + * app/gui/gui-vtable.c: implement create_branch() and add the + branch action to all existing "plug-in" action groups. Note that + we don't need to create any menus because that happens implicitly + when adding menu items. + + * tools/pdbgen/pdb/plug_in.pdb (plugin_menu_branch_register): new + PDB wrapper to access branch registering from plug-ins. + + * app/pdb/internal_procs.c + * app/pdb/plug_in_cmds.c + * libgimp/gimpplugin_pdb.[ch]: regenerated. + + * libgimp/gimp.def: changed accordingly. + + * plug-ins/script-fu/script-fu-scripts.c (script_fu_find_scripts): + register the menu branches for all included scripts. + 2005-03-24 Sven Neumann * app/widgets/gimpcolormapeditor.c: use a GimpColorHexEntry widget. diff --git a/app/actions/plug-in-actions.c b/app/actions/plug-in-actions.c index 101f42b9b4..639f741290 100644 --- a/app/actions/plug-in-actions.c +++ b/app/actions/plug-in-actions.c @@ -117,6 +117,18 @@ plug_in_actions_setup (GimpActionGroup *group) G_N_ELEMENTS (plug_in_repeat_actions), G_CALLBACK (plug_in_repeat_cmd_callback)); + for (list = group->gimp->plug_in_menu_branches; + list; + list = g_slist_next (list)) + { + PlugInMenuBranch *branch = list->data; + + plug_in_actions_add_branch (group, + branch->prog_name, + branch->menu_path, + branch->menu_label); + } + for (list = group->gimp->plug_in_proc_defs; list; list = g_slist_next (list)) @@ -284,7 +296,7 @@ plug_in_actions_add_path (GimpActionGroup *group, { const gchar *progname; const gchar *locale_domain; - gchar *path_translated = NULL; + const gchar *path_translated; g_return_if_fail (GIMP_IS_ACTION_GROUP (group)); g_return_if_fail (proc_def != NULL); @@ -325,6 +337,36 @@ plug_in_actions_remove_proc (GimpActionGroup *group, } } +void +plug_in_actions_add_branch (GimpActionGroup *group, + const gchar *progname, + const gchar *menu_path, + const gchar *menu_label) +{ + const gchar *locale_domain; + const gchar *path_translated; + const gchar *label_translated; + gchar *full; + gchar *full_translated; + + g_return_if_fail (GIMP_IS_ACTION_GROUP (group)); + g_return_if_fail (menu_path != NULL); + g_return_if_fail (menu_label != NULL); + + locale_domain = plug_ins_locale_domain (group->gimp, progname, NULL); + + path_translated = dgettext (locale_domain, menu_path); + label_translated = dgettext (locale_domain, menu_label); + + full = g_strconcat (menu_path, "/", menu_label, NULL); + full_translated = g_strconcat (path_translated, "/", label_translated, NULL); + + if (plug_in_actions_check_translation (full, full_translated)) + plug_in_actions_build_path (group, full, full_translated); + else + plug_in_actions_build_path (group, full, full); +} + /* private functions */ @@ -430,6 +472,8 @@ plug_in_actions_build_path (GimpActionGroup *group, const gchar *path_translated) { GHashTable *path_table; + gchar *copy_original; + gchar *copy_translated; gchar *p1, *p2; path_table = g_object_get_data (G_OBJECT (group), "plug-in-path-table"); @@ -444,13 +488,14 @@ plug_in_actions_build_path (GimpActionGroup *group, (GDestroyNotify) g_hash_table_destroy); } - p1 = strrchr (path_original, '/'); - p2 = strrchr (path_translated, '/'); + copy_original = gimp_strip_uline (path_original); + copy_translated = g_strdup (path_translated); - if (p1 && p2 && ! g_hash_table_lookup (path_table, path_original)) + p1 = strrchr (copy_original, '/'); + p2 = strrchr (copy_translated, '/'); + + if (p1 && p2 && ! g_hash_table_lookup (path_table, copy_original)) { - gchar *copy_original = g_strdup (path_original); - gchar *copy_translated = g_strdup (path_translated); gchar *label; GtkAction *action; @@ -458,24 +503,21 @@ plug_in_actions_build_path (GimpActionGroup *group, #if 0 g_print ("adding plug-in submenu '%s' (%s)\n", - path_original, label); + copy_original, label); #endif - action = gtk_action_new (path_original, label, NULL, NULL); + action = gtk_action_new (copy_original, label, NULL, NULL); gtk_action_group_add_action (GTK_ACTION_GROUP (group), action); g_object_unref (action); - g_hash_table_insert (path_table, g_strdup (path_original), action); - - p1 = strrchr (copy_original, '/'); - p2 = strrchr (copy_translated, '/'); + g_hash_table_insert (path_table, g_strdup (copy_original), action); *p1 = '\0'; *p2 = '\0'; plug_in_actions_build_path (group, copy_original, copy_translated); - - g_free (copy_original); - g_free (copy_translated); } + + g_free (copy_original); + g_free (copy_translated); } diff --git a/app/actions/plug-in-actions.h b/app/actions/plug-in-actions.h index 414e3fe3ab..70c2164941 100644 --- a/app/actions/plug-in-actions.h +++ b/app/actions/plug-in-actions.h @@ -32,5 +32,10 @@ void plug_in_actions_add_path (GimpActionGroup *group, void plug_in_actions_remove_proc (GimpActionGroup *group, PlugInProcDef *proc_def); +void plug_in_actions_add_branch (GimpActionGroup *group, + const gchar *progname, + const gchar *menu_path, + const gchar *menu_label); + #endif /* __PLUG_IN_ACTIONS_H__ */ diff --git a/app/core/gimp-gui.c b/app/core/gimp-gui.c index aa5f7019a3..9b7d5d1033 100644 --- a/app/core/gimp-gui.c +++ b/app/core/gimp-gui.c @@ -39,28 +39,29 @@ gimp_gui_init (Gimp *gimp) { g_return_if_fail (GIMP_IS_GIMP (gimp)); - gimp->gui.threads_enter = NULL; - gimp->gui.threads_leave = NULL; - gimp->gui.set_busy = NULL; - gimp->gui.unset_busy = NULL; - gimp->gui.message = NULL; - gimp->gui.help = NULL; - gimp->gui.get_program_class = NULL; - gimp->gui.get_display_name = NULL; - gimp->gui.get_theme_dir = NULL; - gimp->gui.display_get_by_id = NULL; - gimp->gui.display_get_id = NULL; - gimp->gui.display_create = NULL; - gimp->gui.display_delete = NULL; - gimp->gui.displays_reconnect = NULL; - gimp->gui.menus_init = NULL; - gimp->gui.menus_create = NULL; - gimp->gui.menus_delete = NULL; - gimp->gui.progress_new = NULL; - gimp->gui.progress_free = NULL; - gimp->gui.pdb_dialog_set = NULL; - gimp->gui.pdb_dialog_close = NULL; - gimp->gui.pdb_dialogs_check = NULL; + gimp->gui.threads_enter = NULL; + gimp->gui.threads_leave = NULL; + gimp->gui.set_busy = NULL; + gimp->gui.unset_busy = NULL; + gimp->gui.message = NULL; + gimp->gui.help = NULL; + gimp->gui.get_program_class = NULL; + gimp->gui.get_display_name = NULL; + gimp->gui.get_theme_dir = NULL; + gimp->gui.display_get_by_id = NULL; + gimp->gui.display_get_id = NULL; + gimp->gui.display_create = NULL; + gimp->gui.display_delete = NULL; + gimp->gui.displays_reconnect = NULL; + gimp->gui.menus_init = NULL; + gimp->gui.menus_create_item = NULL; + gimp->gui.menus_delete_item = NULL; + gimp->gui.menus_create_branch = NULL; + gimp->gui.progress_new = NULL; + gimp->gui.progress_free = NULL; + gimp->gui.pdb_dialog_set = NULL; + gimp->gui.pdb_dialog_close = NULL; + gimp->gui.pdb_dialogs_check = NULL; } void @@ -292,26 +293,40 @@ gimp_menus_init (Gimp *gimp, } void -gimp_menus_create_entry (Gimp *gimp, - PlugInProcDef *proc_def, - const gchar *menu_path) +gimp_menus_create_item (Gimp *gimp, + PlugInProcDef *proc_def, + const gchar *menu_path) { g_return_if_fail (GIMP_IS_GIMP (gimp)); g_return_if_fail (proc_def != NULL); - if (gimp->gui.menus_create) - gimp->gui.menus_create (gimp, proc_def, menu_path); + if (gimp->gui.menus_create_item) + gimp->gui.menus_create_item (gimp, proc_def, menu_path); } void -gimp_menus_delete_entry (Gimp *gimp, - PlugInProcDef *proc_def) +gimp_menus_delete_item (Gimp *gimp, + PlugInProcDef *proc_def) { g_return_if_fail (GIMP_IS_GIMP (gimp)); g_return_if_fail (proc_def != NULL); - if (gimp->gui.menus_delete) - gimp->gui.menus_delete (gimp, proc_def); + if (gimp->gui.menus_delete_item) + gimp->gui.menus_delete_item (gimp, proc_def); +} + +void +gimp_menus_create_branch (Gimp *gimp, + const gchar *progname, + const gchar *menu_path, + const gchar *menu_label) +{ + g_return_if_fail (GIMP_IS_GIMP (gimp)); + g_return_if_fail (menu_path != NULL); + g_return_if_fail (menu_label != NULL); + + if (gimp->gui.menus_create_branch) + gimp->gui.menus_create_branch (gimp, progname, menu_path, menu_label); } GimpProgress * diff --git a/app/core/gimp-gui.h b/app/core/gimp-gui.h index 86b15f28d4..fa02a48099 100644 --- a/app/core/gimp-gui.h +++ b/app/core/gimp-gui.h @@ -24,66 +24,70 @@ typedef struct _GimpGui GimpGui; struct _GimpGui { - void (* threads_enter) (Gimp *gimp); - void (* threads_leave) (Gimp *gimp); + void (* threads_enter) (Gimp *gimp); + void (* threads_leave) (Gimp *gimp); - void (* set_busy) (Gimp *gimp); - void (* unset_busy) (Gimp *gimp); + void (* set_busy) (Gimp *gimp); + void (* unset_busy) (Gimp *gimp); - void (* message) (Gimp *gimp, - const gchar *domain, - const gchar *message); - void (* help) (Gimp *gimp, - const gchar *help_domain, - const gchar *help_id); + void (* message) (Gimp *gimp, + const gchar *domain, + const gchar *message); + void (* help) (Gimp *gimp, + const gchar *help_domain, + const gchar *help_id); - const gchar * (* get_program_class) (Gimp *gimp); - gchar * (* get_display_name) (Gimp *gimp, - gint gdisp_ID, - gint *monitor_number); - const gchar * (* get_theme_dir) (Gimp *gimp); + const gchar * (* get_program_class) (Gimp *gimp); + gchar * (* get_display_name) (Gimp *gimp, + gint gdisp_ID, + gint *monitor_number); + const gchar * (* get_theme_dir) (Gimp *gimp); - GimpObject * (* display_get_by_id) (Gimp *gimp, - gint ID); - gint (* display_get_id) (GimpObject *display); - GimpObject * (* display_create) (GimpImage *gimage, - GimpUnit unit, - gdouble scale); - void (* display_delete) (GimpObject *display); - void (* displays_reconnect) (Gimp *gimp, - GimpImage *old_image, - GimpImage *new_image); + GimpObject * (* display_get_by_id) (Gimp *gimp, + gint ID); + gint (* display_get_id) (GimpObject *display); + GimpObject * (* display_create) (GimpImage *gimage, + GimpUnit unit, + gdouble scale); + void (* display_delete) (GimpObject *display); + void (* displays_reconnect) (Gimp *gimp, + GimpImage *old_image, + GimpImage *new_image); - void (* menus_init) (Gimp *gimp, - GSList *plug_in_defs, - const gchar *std_domain); - void (* menus_create) (Gimp *gimp, - PlugInProcDef *proc_def, - const gchar *menu_path); - void (* menus_delete) (Gimp *gimp, - PlugInProcDef *proc_def); + void (* menus_init) (Gimp *gimp, + GSList *plug_in_defs, + const gchar *std_domain); + void (* menus_create_item) (Gimp *gimp, + PlugInProcDef *proc_def, + const gchar *menu_path); + void (* menus_delete_item) (Gimp *gimp, + PlugInProcDef *proc_def); + void (* menus_create_branch) (Gimp *gimp, + const gchar *progname, + const gchar *menu_path, + const gchar *menu_label); - GimpProgress * (* progress_new) (Gimp *gimp, - gint display_ID); - void (* progress_free) (Gimp *gimp, - GimpProgress *progress); + GimpProgress * (* progress_new) (Gimp *gimp, + gint display_ID); + void (* progress_free) (Gimp *gimp, + GimpProgress *progress); - gboolean (* pdb_dialog_new) (Gimp *gimp, - GimpContext *context, - GimpContainer *container, - const gchar *title, - const gchar *callback_name, - const gchar *object_name, - va_list args); - gboolean (* pdb_dialog_set) (Gimp *gimp, - GimpContainer *container, - const gchar *callback_name, - const gchar *object_name, - va_list args); - gboolean (* pdb_dialog_close) (Gimp *gimp, - GimpContainer *container, - const gchar *callback_name); - void (* pdb_dialogs_check) (Gimp *gimp); + gboolean (* pdb_dialog_new) (Gimp *gimp, + GimpContext *context, + GimpContainer *container, + const gchar *title, + const gchar *callback_name, + const gchar *object_name, + va_list args); + gboolean (* pdb_dialog_set) (Gimp *gimp, + GimpContainer *container, + const gchar *callback_name, + const gchar *object_name, + va_list args); + gboolean (* pdb_dialog_close) (Gimp *gimp, + GimpContainer *container, + const gchar *callback_name); + void (* pdb_dialogs_check) (Gimp *gimp); }; @@ -120,11 +124,15 @@ void gimp_help (Gimp *gimp, void gimp_menus_init (Gimp *gimp, GSList *plug_in_defs, const gchar *std_plugins_domain); -void gimp_menus_create_entry (Gimp *gimp, +void gimp_menus_create_item (Gimp *gimp, PlugInProcDef *proc_def, const gchar *menu_path); -void gimp_menus_delete_entry (Gimp *gimp, +void gimp_menus_delete_item (Gimp *gimp, PlugInProcDef *proc_def); +void gimp_menus_create_branch (Gimp *gimp, + const gchar *progname, + const gchar *menu_path, + const gchar *menu_label); GimpProgress * gimp_new_progress (Gimp *gimp, gint display_ID); diff --git a/app/core/gimp.h b/app/core/gimp.h index ffe6da983e..2844dd3bc9 100644 --- a/app/core/gimp.h +++ b/app/core/gimp.h @@ -72,6 +72,7 @@ struct _Gimp gboolean write_pluginrc; GSList *plug_in_proc_defs; + GSList *plug_in_menu_branches; GSList *plug_in_locale_domains; GSList *plug_in_help_domains; diff --git a/app/gui/gui-vtable.c b/app/gui/gui-vtable.c index 314692191c..fea462e591 100644 --- a/app/gui/gui-vtable.c +++ b/app/gui/gui-vtable.c @@ -103,11 +103,15 @@ static void gui_displays_reconnect (Gimp *gimp, static void gui_menus_init (Gimp *gimp, GSList *plug_in_defs, const gchar *plugins_domain); -static void gui_menus_create_entry (Gimp *gimp, +static void gui_menus_create_item (Gimp *gimp, PlugInProcDef *proc_def, const gchar *menu_path); -static void gui_menus_delete_entry (Gimp *gimp, +static void gui_menus_delete_item (Gimp *gimp, PlugInProcDef *proc_def); +static void gui_menus_create_branch (Gimp *gimp, + const gchar *progname, + const gchar *menu_path, + const gchar *menu_label); static GimpProgress * gui_new_progress (Gimp *gimp, gint display_ID); static void gui_free_progress (Gimp *gimp, @@ -137,29 +141,30 @@ gui_vtable_init (Gimp *gimp) { g_return_if_fail (GIMP_IS_GIMP (gimp)); - gimp->gui.threads_enter = gui_threads_enter; - gimp->gui.threads_leave = gui_threads_leave; - gimp->gui.set_busy = gui_set_busy; - gimp->gui.unset_busy = gui_unset_busy; - gimp->gui.message = gui_message; - gimp->gui.help = gui_help; - gimp->gui.get_program_class = gui_get_program_class; - gimp->gui.get_display_name = gui_get_display_name; - gimp->gui.get_theme_dir = gui_get_theme_dir; - gimp->gui.display_get_by_id = gui_display_get_by_ID; - gimp->gui.display_get_id = gui_display_get_ID; - gimp->gui.display_create = gui_display_create; - gimp->gui.display_delete = gui_display_delete; - gimp->gui.displays_reconnect = gui_displays_reconnect; - gimp->gui.menus_init = gui_menus_init; - gimp->gui.menus_create = gui_menus_create_entry; - gimp->gui.menus_delete = gui_menus_delete_entry; - gimp->gui.progress_new = gui_new_progress; - gimp->gui.progress_free = gui_free_progress; - gimp->gui.pdb_dialog_new = gui_pdb_dialog_new; - gimp->gui.pdb_dialog_set = gui_pdb_dialog_set; - gimp->gui.pdb_dialog_close = gui_pdb_dialog_close; - gimp->gui.pdb_dialogs_check = gui_pdb_dialogs_check; + gimp->gui.threads_enter = gui_threads_enter; + gimp->gui.threads_leave = gui_threads_leave; + gimp->gui.set_busy = gui_set_busy; + gimp->gui.unset_busy = gui_unset_busy; + gimp->gui.message = gui_message; + gimp->gui.help = gui_help; + gimp->gui.get_program_class = gui_get_program_class; + gimp->gui.get_display_name = gui_get_display_name; + gimp->gui.get_theme_dir = gui_get_theme_dir; + gimp->gui.display_get_by_id = gui_display_get_by_ID; + gimp->gui.display_get_id = gui_display_get_ID; + gimp->gui.display_create = gui_display_create; + gimp->gui.display_delete = gui_display_delete; + gimp->gui.displays_reconnect = gui_displays_reconnect; + gimp->gui.menus_init = gui_menus_init; + gimp->gui.menus_create_item = gui_menus_create_item; + gimp->gui.menus_delete_item = gui_menus_delete_item; + gimp->gui.menus_create_branch = gui_menus_create_branch; + gimp->gui.progress_new = gui_new_progress; + gimp->gui.progress_free = gui_free_progress; + gimp->gui.pdb_dialog_new = gui_pdb_dialog_new; + gimp->gui.pdb_dialog_set = gui_pdb_dialog_set; + gimp->gui.pdb_dialog_close = gui_pdb_dialog_close; + gimp->gui.pdb_dialogs_check = gui_pdb_dialogs_check; } @@ -435,9 +440,9 @@ gui_menus_delete_proc (Gimp *gimp, } static void -gui_menus_create_entry (Gimp *gimp, - PlugInProcDef *proc_def, - const gchar *menu_path) +gui_menus_create_item (Gimp *gimp, + PlugInProcDef *proc_def, + const gchar *menu_path) { GList *list; @@ -467,8 +472,8 @@ gui_menus_create_entry (Gimp *gimp, } static void -gui_menus_delete_entry (Gimp *gimp, - PlugInProcDef *proc_def) +gui_menus_delete_item (Gimp *gimp, + PlugInProcDef *proc_def) { GList *list; @@ -483,6 +488,22 @@ gui_menus_delete_entry (Gimp *gimp, } } +static void +gui_menus_create_branch (Gimp *gimp, + const gchar *progname, + const gchar *menu_path, + const gchar *menu_label) +{ + GList *list; + + for (list = gimp_action_groups_from_name ("plug-in"); + list; + list = g_list_next (list)) + { + plug_in_actions_add_branch (list->data, progname, menu_path, menu_label); + } +} + static GimpProgress * gui_new_progress (Gimp *gimp, gint display_ID) diff --git a/app/menus/plug-in-menus.c b/app/menus/plug-in-menus.c index c117c14b24..529c5cf09f 100644 --- a/app/menus/plug-in-menus.c +++ b/app/menus/plug-in-menus.c @@ -211,6 +211,7 @@ plug_in_menus_add_proc (GimpUIManager *manager, { gchar *path; gchar *merge_key; + gchar *stripped_path; gchar *action_path; guint merge_id; guint menu_merge_id; @@ -262,8 +263,10 @@ plug_in_menus_add_proc (GimpUIManager *manager, GUINT_TO_POINTER (menu_merge_id)); } + stripped_path = gimp_strip_uline (path); action_path = plug_in_menus_build_path (manager, ui_path, menu_merge_id, - path, FALSE); + stripped_path, FALSE); + g_free (stripped_path); if (! action_path) { diff --git a/app/pdb/internal_procs.c b/app/pdb/internal_procs.c index 4eb9a009a3..9c20af7b40 100644 --- a/app/pdb/internal_procs.c +++ b/app/pdb/internal_procs.c @@ -74,7 +74,7 @@ void register_transform_tools_procs (Gimp *gimp); void register_undo_procs (Gimp *gimp); void register_unit_procs (Gimp *gimp); -/* 455 procedures registered total */ +/* 456 procedures registered total */ void internal_procs_init (Gimp *gimp, @@ -107,13 +107,13 @@ internal_procs_init (Gimp *gimp, (* status_callback) (NULL, _("Display procedures"), 0.178); register_display_procs (gimp); - (* status_callback) (NULL, _("Drawable procedures"), 0.187); + (* status_callback) (NULL, _("Drawable procedures"), 0.186); register_drawable_procs (gimp); - (* status_callback) (NULL, _("Transformation procedures"), 0.262); + (* status_callback) (NULL, _("Transformation procedures"), 0.261); register_drawable_transform_procs (gimp); - (* status_callback) (NULL, _("Edit procedures"), 0.297); + (* status_callback) (NULL, _("Edit procedures"), 0.296); register_edit_procs (gimp); (* status_callback) (NULL, _("File Operations"), 0.316); @@ -122,70 +122,70 @@ internal_procs_init (Gimp *gimp, (* status_callback) (NULL, _("Floating selections"), 0.338); register_floating_sel_procs (gimp); - (* status_callback) (NULL, _("Font UI"), 0.352); + (* status_callback) (NULL, _("Font UI"), 0.351); register_font_select_procs (gimp); - (* status_callback) (NULL, _("Fonts"), 0.358); + (* status_callback) (NULL, _("Fonts"), 0.357); register_fonts_procs (gimp); - (* status_callback) (NULL, _("Gimprc procedures"), 0.363); + (* status_callback) (NULL, _("Gimprc procedures"), 0.362); register_gimprc_procs (gimp); - (* status_callback) (NULL, _("Gradient"), 0.376); + (* status_callback) (NULL, _("Gradient"), 0.375); register_gradient_procs (gimp); - (* status_callback) (NULL, _("Gradient UI"), 0.442); + (* status_callback) (NULL, _("Gradient UI"), 0.441); register_gradient_select_procs (gimp); - (* status_callback) (NULL, _("Gradients"), 0.448); + (* status_callback) (NULL, _("Gradients"), 0.447); register_gradients_procs (gimp); - (* status_callback) (NULL, _("Guide procedures"), 0.459); + (* status_callback) (NULL, _("Guide procedures"), 0.458); register_guides_procs (gimp); - (* status_callback) (NULL, _("Help procedures"), 0.473); + (* status_callback) (NULL, _("Help procedures"), 0.471); register_help_procs (gimp); - (* status_callback) (NULL, _("Image"), 0.475); + (* status_callback) (NULL, _("Image"), 0.474); register_image_procs (gimp); - (* status_callback) (NULL, _("Layer"), 0.611); + (* status_callback) (NULL, _("Layer"), 0.61); register_layer_procs (gimp); - (* status_callback) (NULL, _("Message procedures"), 0.67); + (* status_callback) (NULL, _("Message procedures"), 0.669); register_message_procs (gimp); - (* status_callback) (NULL, _("Miscellaneous"), 0.677); + (* status_callback) (NULL, _("Miscellaneous"), 0.675); register_misc_procs (gimp); - (* status_callback) (NULL, _("Paint Tool procedures"), 0.681); + (* status_callback) (NULL, _("Paint Tool procedures"), 0.68); register_paint_tools_procs (gimp); - (* status_callback) (NULL, _("Palette"), 0.714); + (* status_callback) (NULL, _("Palette"), 0.713); register_palette_procs (gimp); - (* status_callback) (NULL, _("Palette UI"), 0.745); + (* status_callback) (NULL, _("Palette UI"), 0.743); register_palette_select_procs (gimp); - (* status_callback) (NULL, _("Palettes"), 0.752); + (* status_callback) (NULL, _("Palettes"), 0.75); register_palettes_procs (gimp); - (* status_callback) (NULL, _("Parasite procedures"), 0.76); + (* status_callback) (NULL, _("Parasite procedures"), 0.759); register_parasite_procs (gimp); - (* status_callback) (NULL, _("Paths"), 0.787); + (* status_callback) (NULL, _("Paths"), 0.785); register_paths_procs (gimp); - (* status_callback) (NULL, _("Pattern"), 0.822); + (* status_callback) (NULL, _("Pattern"), 0.82); register_pattern_procs (gimp); - (* status_callback) (NULL, _("Pattern UI"), 0.826); + (* status_callback) (NULL, _("Pattern UI"), 0.825); register_pattern_select_procs (gimp); - (* status_callback) (NULL, _("Patterns"), 0.833); + (* status_callback) (NULL, _("Patterns"), 0.831); register_patterns_procs (gimp); - (* status_callback) (NULL, _("Plug-in"), 0.842); + (* status_callback) (NULL, _("Plug-in"), 0.84); register_plug_in_procs (gimp); (* status_callback) (NULL, _("Procedural database"), 0.853); diff --git a/app/pdb/plug_in_cmds.c b/app/pdb/plug_in_cmds.c index 241a866bf8..02d2c44117 100644 --- a/app/pdb/plug_in_cmds.c +++ b/app/pdb/plug_in_cmds.c @@ -48,6 +48,7 @@ static ProcRecord plugins_query_proc; static ProcRecord plugin_domain_register_proc; static ProcRecord plugin_help_register_proc; static ProcRecord plugin_menu_register_proc; +static ProcRecord plugin_menu_branch_register_proc; static ProcRecord plugin_icon_register_proc; void @@ -57,6 +58,7 @@ register_plug_in_procs (Gimp *gimp) procedural_db_register (gimp, &plugin_domain_register_proc); procedural_db_register (gimp, &plugin_help_register_proc); procedural_db_register (gimp, &plugin_menu_register_proc); + procedural_db_register (gimp, &plugin_menu_branch_register_proc); procedural_db_register (gimp, &plugin_icon_register_proc); } @@ -526,7 +528,7 @@ plugin_menu_register_invoker (Gimp *gimp, if (! gimp->no_interface && proc_def->db_info.proc_type == GIMP_TEMPORARY) { - gimp_menus_create_entry (gimp, proc_def, menu_path); + gimp_menus_create_item (gimp, proc_def, menu_path); } } } @@ -588,6 +590,77 @@ static ProcRecord plugin_menu_register_proc = { { plugin_menu_register_invoker } } }; +static Argument * +plugin_menu_branch_register_invoker (Gimp *gimp, + GimpContext *context, + GimpProgress *progress, + Argument *args) +{ + gboolean success = TRUE; + gchar *menu_path; + gchar *menu_name; + + menu_path = (gchar *) args[0].value.pdb_pointer; + if (menu_path == NULL || !g_utf8_validate (menu_path, -1, NULL)) + success = FALSE; + + menu_name = (gchar *) args[1].value.pdb_pointer; + if (menu_name == NULL || !g_utf8_validate (menu_name, -1, NULL)) + success = FALSE; + + if (success) + { + if (gimp->current_plug_in) + { + plug_ins_menu_branch_add (gimp, gimp->current_plug_in->prog, + menu_path, menu_name); + + if (! gimp->no_interface) + { + gimp_menus_create_branch (gimp, gimp->current_plug_in->prog, + menu_path, menu_name); + } + else + success = FALSE; + } + else + success = FALSE; + } + + return procedural_db_return_args (&plugin_menu_branch_register_proc, success); +} + +static ProcArg plugin_menu_branch_register_inargs[] = +{ + { + GIMP_PDB_STRING, + "menu_path", + "The sub-menu's menu path" + }, + { + GIMP_PDB_STRING, + "menu_name", + "The name of the sub-menu" + } +}; + +static ProcRecord plugin_menu_branch_register_proc = +{ + "gimp_plugin_menu_branch_register", + "Register a sub-menu.", + "This procedure installs an sub-menu which does not belong to any procedure.", + "Michael Natterer ", + "Michael Natterer ", + "2005", + NULL, + GIMP_INTERNAL, + 2, + plugin_menu_branch_register_inargs, + 0, + NULL, + { { plugin_menu_branch_register_invoker } } +}; + static Argument * plugin_icon_register_invoker (Gimp *gimp, GimpContext *context, diff --git a/app/plug-in/gimppluginmanager.c b/app/plug-in/gimppluginmanager.c index 3e7157aa28..7aa4aec468 100644 --- a/app/plug-in/gimppluginmanager.c +++ b/app/plug-in/gimppluginmanager.c @@ -53,17 +53,17 @@ #define STD_PLUGINS_DOMAIN GETTEXT_PACKAGE "-std-plug-ins" -typedef struct _PlugInLocaleDomainDef PlugInLocaleDomainDef; -typedef struct _PlugInHelpDomainDef PlugInHelpDomainDef; +typedef struct _PlugInLocaleDomain PlugInLocaleDomain; +typedef struct _PlugInHelpDomain PlugInHelpDomain; -struct _PlugInLocaleDomainDef +struct _PlugInLocaleDomain { gchar *prog_name; gchar *domain_name; gchar *domain_path; }; -struct _PlugInHelpDomainDef +struct _PlugInHelpDomain { gchar *prog_name; gchar *domain_name; @@ -273,45 +273,16 @@ plug_ins_init (Gimp *gimp, PlugInDef *plug_in_def = list->data; if (plug_in_def->locale_domain_name) - { - PlugInLocaleDomainDef *def; - - def = g_new (PlugInLocaleDomainDef, 1); - - def->prog_name = g_strdup (plug_in_def->prog); - def->domain_name = g_strdup (plug_in_def->locale_domain_name); - def->domain_path = g_strdup (plug_in_def->locale_domain_path); - - gimp->plug_in_locale_domains = - g_slist_prepend (gimp->plug_in_locale_domains, def); - -#ifdef VERBOSE - g_print ("added locale domain \"%s\" for path \"%s\"\n", - def->domain_name ? def->domain_name : "(null)", - def->domain_path ? - gimp_filename_to_utf8 (def->domain_path) : "(null)"); -#endif - } + plug_ins_locale_domain_add (gimp, + plug_in_def->prog, + plug_in_def->locale_domain_name, + plug_in_def->locale_domain_path); if (plug_in_def->help_domain_name) - { - PlugInHelpDomainDef *def; - - def = g_new (PlugInHelpDomainDef, 1); - - def->prog_name = g_strdup (plug_in_def->prog); - def->domain_name = g_strdup (plug_in_def->help_domain_name); - def->domain_uri = g_strdup (plug_in_def->help_domain_uri); - - gimp->plug_in_help_domains = - g_slist_prepend (gimp->plug_in_help_domains, def); - -#ifdef VERBOSE - g_print ("added help domain \"%s\" for base uri \"%s\"\n", - def->domain_name ? def->domain_name : "(null)", - def->domain_uri ? def->domain_uri : "(null)"); -#endif - } + plug_ins_help_domain_add (gimp, + plug_in_def->prog, + plug_in_def->help_domain_name, + plug_in_def->help_domain_uri); } if (! gimp->no_interface) @@ -382,14 +353,27 @@ plug_ins_exit (Gimp *gimp) plug_in_exit (gimp); + for (list = gimp->plug_in_menu_branches; list; list = list->next) + { + PlugInMenuBranch *branch = list->data; + + g_free (branch->prog_name); + g_free (branch->menu_path); + g_free (branch->menu_label); + g_free (branch); + } + + g_slist_free (gimp->plug_in_menu_branches); + gimp->plug_in_menu_branches = NULL; + for (list = gimp->plug_in_locale_domains; list; list = list->next) { - PlugInLocaleDomainDef *def = list->data; + PlugInLocaleDomain *domain = list->data; - g_free (def->prog_name); - g_free (def->domain_name); - g_free (def->domain_path); - g_free (def); + g_free (domain->prog_name); + g_free (domain->domain_name); + g_free (domain->domain_path); + g_free (domain); } g_slist_free (gimp->plug_in_locale_domains); @@ -397,12 +381,12 @@ plug_ins_exit (Gimp *gimp) for (list = gimp->plug_in_help_domains; list; list = list->next) { - PlugInHelpDomainDef *def = list->data; + PlugInHelpDomain *domain = list->data; - g_free (def->prog_name); - g_free (def->domain_name); - g_free (def->domain_uri); - g_free (def); + g_free (domain->prog_name); + g_free (domain->domain_name); + g_free (domain->domain_uri); + g_free (domain); } g_slist_free (gimp->plug_in_help_domains); @@ -641,7 +625,7 @@ plug_ins_temp_proc_def_add (Gimp *gimp, if (! gimp->no_interface) { if (proc_def->menu_label || proc_def->menu_paths) - gimp_menus_create_entry (gimp, proc_def, NULL); + gimp_menus_create_item (gimp, proc_def, NULL); } /* Register the procedural database entry */ @@ -661,7 +645,7 @@ plug_ins_temp_proc_def_remove (Gimp *gimp, if (! gimp->no_interface) { if (proc_def->menu_label || proc_def->menu_paths) - gimp_menus_delete_entry (gimp, proc_def); + gimp_menus_delete_item (gimp, proc_def); } /* Unregister the procedural database entry */ @@ -674,6 +658,63 @@ plug_ins_temp_proc_def_remove (Gimp *gimp, plug_in_proc_def_free (proc_def); } +void +plug_ins_menu_branch_add (Gimp *gimp, + const gchar *prog_name, + const gchar *menu_path, + const gchar *menu_label) +{ + PlugInMenuBranch *branch; + + g_return_if_fail (GIMP_IS_GIMP (gimp)); + g_return_if_fail (prog_name != NULL); + g_return_if_fail (menu_path != NULL); + g_return_if_fail (menu_label != NULL); + + branch = g_new (PlugInMenuBranch, 1); + + branch->prog_name = g_strdup (prog_name); + branch->menu_path = g_strdup (menu_path); + branch->menu_label = g_strdup (menu_label); + + gimp->plug_in_menu_branches = g_slist_append (gimp->plug_in_menu_branches, + branch); + +#ifdef VERBOSE + g_print ("added menu branch \"%s\" at path \"%s\"\n", + branch->menu_label, branch->menu_path); +#endif +} + +void +plug_ins_locale_domain_add (Gimp *gimp, + const gchar *prog_name, + const gchar *domain_name, + const gchar *domain_path) +{ + PlugInLocaleDomain *domain; + + g_return_if_fail (GIMP_IS_GIMP (gimp)); + g_return_if_fail (prog_name != NULL); + g_return_if_fail (domain_name != NULL); + + domain = g_new (PlugInLocaleDomain, 1); + + domain->prog_name = g_strdup (prog_name); + domain->domain_name = g_strdup (domain_name); + domain->domain_path = g_strdup (domain_path); + + gimp->plug_in_locale_domains = g_slist_prepend (gimp->plug_in_locale_domains, + domain); + +#ifdef VERBOSE + g_print ("added locale domain \"%s\" for path \"%s\"\n", + domain->domain_name ? domain->domain_name : "(null)", + domain->domain_path ? + gimp_filename_to_utf8 (domain->domain_path) : "(null)"); +#endif +} + const gchar * plug_ins_locale_domain (Gimp *gimp, const gchar *prog_name, @@ -692,20 +733,49 @@ plug_ins_locale_domain (Gimp *gimp, for (list = gimp->plug_in_locale_domains; list; list = list->next) { - PlugInLocaleDomainDef *def = list->data; + PlugInLocaleDomain *domain = list->data; - if (def && def->prog_name && ! strcmp (def->prog_name, prog_name)) + if (domain && domain->prog_name && + ! strcmp (domain->prog_name, prog_name)) { - if (domain_path && def->domain_path) - *domain_path = def->domain_path; + if (domain_path && domain->domain_path) + *domain_path = domain->domain_path; - return def->domain_name; + return domain->domain_name; } } return STD_PLUGINS_DOMAIN; } +void +plug_ins_help_domain_add (Gimp *gimp, + const gchar *prog_name, + const gchar *domain_name, + const gchar *domain_uri) +{ + PlugInHelpDomain *domain; + + g_return_if_fail (GIMP_IS_GIMP (gimp)); + g_return_if_fail (prog_name != NULL); + g_return_if_fail (domain_name != NULL); + + domain = g_new (PlugInHelpDomain, 1); + + domain->prog_name = g_strdup (prog_name); + domain->domain_name = g_strdup (domain_name); + domain->domain_uri = g_strdup (domain_uri); + + gimp->plug_in_help_domains = g_slist_prepend (gimp->plug_in_help_domains, + domain); + +#ifdef VERBOSE + g_print ("added help domain \"%s\" for base uri \"%s\"\n", + domain->domain_name ? domain->domain_name : "(null)", + domain->domain_uri ? domain->domain_uri : "(null)"); +#endif +} + const gchar * plug_ins_help_domain (Gimp *gimp, const gchar *prog_name, @@ -724,14 +794,15 @@ plug_ins_help_domain (Gimp *gimp, for (list = gimp->plug_in_help_domains; list; list = list->next) { - PlugInHelpDomainDef *def = list->data; + PlugInHelpDomain *domain = list->data; - if (def && def->prog_name && ! strcmp (def->prog_name, prog_name)) + if (domain && domain->prog_name && + ! strcmp (domain->prog_name, prog_name)) { - if (domain_uri && def->domain_uri) - *domain_uri = def->domain_uri; + if (domain_uri && domain->domain_uri) + *domain_uri = domain->domain_uri; - return def->domain_name; + return domain->domain_name; } } @@ -758,10 +829,10 @@ plug_ins_help_domains (Gimp *gimp, for (list = gimp->plug_in_help_domains, i = 0; list; list = list->next, i++) { - PlugInHelpDomainDef *def = list->data; + PlugInHelpDomain *domain = list->data; - (*help_domains)[i] = g_strdup (def->domain_name); - (*help_uris)[i] = g_strdup (def->domain_uri); + (*help_domains)[i] = g_strdup (domain->domain_name); + (*help_uris)[i] = g_strdup (domain->domain_uri); } return n_domains; diff --git a/app/plug-in/gimppluginmanager.h b/app/plug-in/gimppluginmanager.h index f82ec9b541..69bb5a32df 100644 --- a/app/plug-in/gimppluginmanager.h +++ b/app/plug-in/gimppluginmanager.h @@ -22,6 +22,14 @@ #define __PLUG_INS_H__ +struct _PlugInMenuBranch +{ + gchar *prog_name; + gchar *menu_path; + gchar *menu_label; +}; + + void plug_ins_init (Gimp *gimp, GimpContext *context, GimpInitStatusFunc status_callback); @@ -61,11 +69,29 @@ void plug_ins_temp_proc_def_add (Gimp *gimp, void plug_ins_temp_proc_def_remove (Gimp *gimp, PlugInProcDef *proc_def); +/* Add a menu branch */ +void plug_ins_menu_branch_add (Gimp *gimp, + const gchar *prog_name, + const gchar *menu_path, + const gchar *menu_label); + +/* Add a locale domain */ +void plug_ins_locale_domain_add (Gimp *gimp, + const gchar *prog_name, + const gchar *domain_name, + const gchar *domain_path); + /* Retrieve a plug-ins locale domain */ const gchar * plug_ins_locale_domain (Gimp *gimp, const gchar *prog_name, const gchar **locale_path); +/* Add a help domain */ +void plug_ins_help_domain_add (Gimp *gimp, + const gchar *prog_name, + const gchar *domain_name, + const gchar *domain_uri); + /* Retrieve a plug-ins help domain */ const gchar * plug_ins_help_domain (Gimp *gimp, const gchar *prog_name, diff --git a/app/plug-in/plug-in-types.h b/app/plug-in/plug-in-types.h index 951152e12c..50b76f9c6c 100644 --- a/app/plug-in/plug-in-types.h +++ b/app/plug-in/plug-in-types.h @@ -25,11 +25,12 @@ #include "plug-in/plug-in-enums.h" -typedef struct _PlugIn PlugIn; -typedef struct _PlugInDef PlugInDef; -typedef struct _PlugInProcDef PlugInProcDef; -typedef struct _PlugInProcFrame PlugInProcFrame; -typedef struct _PlugInShm PlugInShm; +typedef struct _PlugIn PlugIn; +typedef struct _PlugInDef PlugInDef; +typedef struct _PlugInMenuBranch PlugInMenuBranch; +typedef struct _PlugInProcDef PlugInProcDef; +typedef struct _PlugInProcFrame PlugInProcFrame; +typedef struct _PlugInShm PlugInShm; #endif /* __PLUG_IN_TYPES_H__ */ diff --git a/app/plug-in/plug-ins.c b/app/plug-in/plug-ins.c index 3e7157aa28..7aa4aec468 100644 --- a/app/plug-in/plug-ins.c +++ b/app/plug-in/plug-ins.c @@ -53,17 +53,17 @@ #define STD_PLUGINS_DOMAIN GETTEXT_PACKAGE "-std-plug-ins" -typedef struct _PlugInLocaleDomainDef PlugInLocaleDomainDef; -typedef struct _PlugInHelpDomainDef PlugInHelpDomainDef; +typedef struct _PlugInLocaleDomain PlugInLocaleDomain; +typedef struct _PlugInHelpDomain PlugInHelpDomain; -struct _PlugInLocaleDomainDef +struct _PlugInLocaleDomain { gchar *prog_name; gchar *domain_name; gchar *domain_path; }; -struct _PlugInHelpDomainDef +struct _PlugInHelpDomain { gchar *prog_name; gchar *domain_name; @@ -273,45 +273,16 @@ plug_ins_init (Gimp *gimp, PlugInDef *plug_in_def = list->data; if (plug_in_def->locale_domain_name) - { - PlugInLocaleDomainDef *def; - - def = g_new (PlugInLocaleDomainDef, 1); - - def->prog_name = g_strdup (plug_in_def->prog); - def->domain_name = g_strdup (plug_in_def->locale_domain_name); - def->domain_path = g_strdup (plug_in_def->locale_domain_path); - - gimp->plug_in_locale_domains = - g_slist_prepend (gimp->plug_in_locale_domains, def); - -#ifdef VERBOSE - g_print ("added locale domain \"%s\" for path \"%s\"\n", - def->domain_name ? def->domain_name : "(null)", - def->domain_path ? - gimp_filename_to_utf8 (def->domain_path) : "(null)"); -#endif - } + plug_ins_locale_domain_add (gimp, + plug_in_def->prog, + plug_in_def->locale_domain_name, + plug_in_def->locale_domain_path); if (plug_in_def->help_domain_name) - { - PlugInHelpDomainDef *def; - - def = g_new (PlugInHelpDomainDef, 1); - - def->prog_name = g_strdup (plug_in_def->prog); - def->domain_name = g_strdup (plug_in_def->help_domain_name); - def->domain_uri = g_strdup (plug_in_def->help_domain_uri); - - gimp->plug_in_help_domains = - g_slist_prepend (gimp->plug_in_help_domains, def); - -#ifdef VERBOSE - g_print ("added help domain \"%s\" for base uri \"%s\"\n", - def->domain_name ? def->domain_name : "(null)", - def->domain_uri ? def->domain_uri : "(null)"); -#endif - } + plug_ins_help_domain_add (gimp, + plug_in_def->prog, + plug_in_def->help_domain_name, + plug_in_def->help_domain_uri); } if (! gimp->no_interface) @@ -382,14 +353,27 @@ plug_ins_exit (Gimp *gimp) plug_in_exit (gimp); + for (list = gimp->plug_in_menu_branches; list; list = list->next) + { + PlugInMenuBranch *branch = list->data; + + g_free (branch->prog_name); + g_free (branch->menu_path); + g_free (branch->menu_label); + g_free (branch); + } + + g_slist_free (gimp->plug_in_menu_branches); + gimp->plug_in_menu_branches = NULL; + for (list = gimp->plug_in_locale_domains; list; list = list->next) { - PlugInLocaleDomainDef *def = list->data; + PlugInLocaleDomain *domain = list->data; - g_free (def->prog_name); - g_free (def->domain_name); - g_free (def->domain_path); - g_free (def); + g_free (domain->prog_name); + g_free (domain->domain_name); + g_free (domain->domain_path); + g_free (domain); } g_slist_free (gimp->plug_in_locale_domains); @@ -397,12 +381,12 @@ plug_ins_exit (Gimp *gimp) for (list = gimp->plug_in_help_domains; list; list = list->next) { - PlugInHelpDomainDef *def = list->data; + PlugInHelpDomain *domain = list->data; - g_free (def->prog_name); - g_free (def->domain_name); - g_free (def->domain_uri); - g_free (def); + g_free (domain->prog_name); + g_free (domain->domain_name); + g_free (domain->domain_uri); + g_free (domain); } g_slist_free (gimp->plug_in_help_domains); @@ -641,7 +625,7 @@ plug_ins_temp_proc_def_add (Gimp *gimp, if (! gimp->no_interface) { if (proc_def->menu_label || proc_def->menu_paths) - gimp_menus_create_entry (gimp, proc_def, NULL); + gimp_menus_create_item (gimp, proc_def, NULL); } /* Register the procedural database entry */ @@ -661,7 +645,7 @@ plug_ins_temp_proc_def_remove (Gimp *gimp, if (! gimp->no_interface) { if (proc_def->menu_label || proc_def->menu_paths) - gimp_menus_delete_entry (gimp, proc_def); + gimp_menus_delete_item (gimp, proc_def); } /* Unregister the procedural database entry */ @@ -674,6 +658,63 @@ plug_ins_temp_proc_def_remove (Gimp *gimp, plug_in_proc_def_free (proc_def); } +void +plug_ins_menu_branch_add (Gimp *gimp, + const gchar *prog_name, + const gchar *menu_path, + const gchar *menu_label) +{ + PlugInMenuBranch *branch; + + g_return_if_fail (GIMP_IS_GIMP (gimp)); + g_return_if_fail (prog_name != NULL); + g_return_if_fail (menu_path != NULL); + g_return_if_fail (menu_label != NULL); + + branch = g_new (PlugInMenuBranch, 1); + + branch->prog_name = g_strdup (prog_name); + branch->menu_path = g_strdup (menu_path); + branch->menu_label = g_strdup (menu_label); + + gimp->plug_in_menu_branches = g_slist_append (gimp->plug_in_menu_branches, + branch); + +#ifdef VERBOSE + g_print ("added menu branch \"%s\" at path \"%s\"\n", + branch->menu_label, branch->menu_path); +#endif +} + +void +plug_ins_locale_domain_add (Gimp *gimp, + const gchar *prog_name, + const gchar *domain_name, + const gchar *domain_path) +{ + PlugInLocaleDomain *domain; + + g_return_if_fail (GIMP_IS_GIMP (gimp)); + g_return_if_fail (prog_name != NULL); + g_return_if_fail (domain_name != NULL); + + domain = g_new (PlugInLocaleDomain, 1); + + domain->prog_name = g_strdup (prog_name); + domain->domain_name = g_strdup (domain_name); + domain->domain_path = g_strdup (domain_path); + + gimp->plug_in_locale_domains = g_slist_prepend (gimp->plug_in_locale_domains, + domain); + +#ifdef VERBOSE + g_print ("added locale domain \"%s\" for path \"%s\"\n", + domain->domain_name ? domain->domain_name : "(null)", + domain->domain_path ? + gimp_filename_to_utf8 (domain->domain_path) : "(null)"); +#endif +} + const gchar * plug_ins_locale_domain (Gimp *gimp, const gchar *prog_name, @@ -692,20 +733,49 @@ plug_ins_locale_domain (Gimp *gimp, for (list = gimp->plug_in_locale_domains; list; list = list->next) { - PlugInLocaleDomainDef *def = list->data; + PlugInLocaleDomain *domain = list->data; - if (def && def->prog_name && ! strcmp (def->prog_name, prog_name)) + if (domain && domain->prog_name && + ! strcmp (domain->prog_name, prog_name)) { - if (domain_path && def->domain_path) - *domain_path = def->domain_path; + if (domain_path && domain->domain_path) + *domain_path = domain->domain_path; - return def->domain_name; + return domain->domain_name; } } return STD_PLUGINS_DOMAIN; } +void +plug_ins_help_domain_add (Gimp *gimp, + const gchar *prog_name, + const gchar *domain_name, + const gchar *domain_uri) +{ + PlugInHelpDomain *domain; + + g_return_if_fail (GIMP_IS_GIMP (gimp)); + g_return_if_fail (prog_name != NULL); + g_return_if_fail (domain_name != NULL); + + domain = g_new (PlugInHelpDomain, 1); + + domain->prog_name = g_strdup (prog_name); + domain->domain_name = g_strdup (domain_name); + domain->domain_uri = g_strdup (domain_uri); + + gimp->plug_in_help_domains = g_slist_prepend (gimp->plug_in_help_domains, + domain); + +#ifdef VERBOSE + g_print ("added help domain \"%s\" for base uri \"%s\"\n", + domain->domain_name ? domain->domain_name : "(null)", + domain->domain_uri ? domain->domain_uri : "(null)"); +#endif +} + const gchar * plug_ins_help_domain (Gimp *gimp, const gchar *prog_name, @@ -724,14 +794,15 @@ plug_ins_help_domain (Gimp *gimp, for (list = gimp->plug_in_help_domains; list; list = list->next) { - PlugInHelpDomainDef *def = list->data; + PlugInHelpDomain *domain = list->data; - if (def && def->prog_name && ! strcmp (def->prog_name, prog_name)) + if (domain && domain->prog_name && + ! strcmp (domain->prog_name, prog_name)) { - if (domain_uri && def->domain_uri) - *domain_uri = def->domain_uri; + if (domain_uri && domain->domain_uri) + *domain_uri = domain->domain_uri; - return def->domain_name; + return domain->domain_name; } } @@ -758,10 +829,10 @@ plug_ins_help_domains (Gimp *gimp, for (list = gimp->plug_in_help_domains, i = 0; list; list = list->next, i++) { - PlugInHelpDomainDef *def = list->data; + PlugInHelpDomain *domain = list->data; - (*help_domains)[i] = g_strdup (def->domain_name); - (*help_uris)[i] = g_strdup (def->domain_uri); + (*help_domains)[i] = g_strdup (domain->domain_name); + (*help_uris)[i] = g_strdup (domain->domain_uri); } return n_domains; diff --git a/app/plug-in/plug-ins.h b/app/plug-in/plug-ins.h index f82ec9b541..69bb5a32df 100644 --- a/app/plug-in/plug-ins.h +++ b/app/plug-in/plug-ins.h @@ -22,6 +22,14 @@ #define __PLUG_INS_H__ +struct _PlugInMenuBranch +{ + gchar *prog_name; + gchar *menu_path; + gchar *menu_label; +}; + + void plug_ins_init (Gimp *gimp, GimpContext *context, GimpInitStatusFunc status_callback); @@ -61,11 +69,29 @@ void plug_ins_temp_proc_def_add (Gimp *gimp, void plug_ins_temp_proc_def_remove (Gimp *gimp, PlugInProcDef *proc_def); +/* Add a menu branch */ +void plug_ins_menu_branch_add (Gimp *gimp, + const gchar *prog_name, + const gchar *menu_path, + const gchar *menu_label); + +/* Add a locale domain */ +void plug_ins_locale_domain_add (Gimp *gimp, + const gchar *prog_name, + const gchar *domain_name, + const gchar *domain_path); + /* Retrieve a plug-ins locale domain */ const gchar * plug_ins_locale_domain (Gimp *gimp, const gchar *prog_name, const gchar **locale_path); +/* Add a help domain */ +void plug_ins_help_domain_add (Gimp *gimp, + const gchar *prog_name, + const gchar *domain_name, + const gchar *domain_uri); + /* Retrieve a plug-ins help domain */ const gchar * plug_ins_help_domain (Gimp *gimp, const gchar *prog_name, diff --git a/libgimp/gimp.def b/libgimp/gimp.def index c5719dd523..057d74e712 100644 --- a/libgimp/gimp.def +++ b/libgimp/gimp.def @@ -471,6 +471,7 @@ EXPORTS gimp_plugin_help_register gimp_plugin_icon_register gimp_plugin_menu_register + gimp_plugin_menu_branch_register gimp_posterize gimp_procedural_db_dump gimp_procedural_db_get_data diff --git a/libgimp/gimpplugin_pdb.c b/libgimp/gimpplugin_pdb.c index 1c86b2d27c..69ee9321a7 100644 --- a/libgimp/gimpplugin_pdb.c +++ b/libgimp/gimpplugin_pdb.c @@ -133,6 +133,41 @@ gimp_plugin_menu_register (const gchar *procedure_name, return success; } +/** + * gimp_plugin_menu_branch_register: + * @menu_path: The sub-menu's menu path. + * @menu_name: The name of the sub-menu. + * + * Register a sub-menu. + * + * This procedure installs an sub-menu which does not belong to any + * procedure. + * + * Returns: TRUE on success. + * + * Since: GIMP 2.4 + */ +gboolean +gimp_plugin_menu_branch_register (const gchar *menu_path, + const gchar *menu_name) +{ + GimpParam *return_vals; + gint nreturn_vals; + gboolean success = TRUE; + + return_vals = gimp_run_procedure ("gimp_plugin_menu_branch_register", + &nreturn_vals, + GIMP_PDB_STRING, menu_path, + GIMP_PDB_STRING, menu_name, + GIMP_PDB_END); + + success = return_vals[0].data.d_status == GIMP_PDB_SUCCESS; + + gimp_destroy_params (return_vals, nreturn_vals); + + return success; +} + /** * _gimp_plugin_icon_register: * @procedure_name: The procedure for which to install the icon. diff --git a/libgimp/gimpplugin_pdb.h b/libgimp/gimpplugin_pdb.h index e5d3b13427..de72022d5a 100644 --- a/libgimp/gimpplugin_pdb.h +++ b/libgimp/gimpplugin_pdb.h @@ -29,16 +29,18 @@ G_BEGIN_DECLS /* For information look into the C source or the html documentation */ -gboolean gimp_plugin_domain_register (const gchar *domain_name, - const gchar *domain_path); -gboolean gimp_plugin_help_register (const gchar *domain_name, - const gchar *domain_uri); -gboolean gimp_plugin_menu_register (const gchar *procedure_name, - const gchar *menu_path); -gboolean _gimp_plugin_icon_register (const gchar *procedure_name, - GimpIconType icon_type, - gint icon_data_length, - const guint8 *icon_data); +gboolean gimp_plugin_domain_register (const gchar *domain_name, + const gchar *domain_path); +gboolean gimp_plugin_help_register (const gchar *domain_name, + const gchar *domain_uri); +gboolean gimp_plugin_menu_register (const gchar *procedure_name, + const gchar *menu_path); +gboolean gimp_plugin_menu_branch_register (const gchar *menu_path, + const gchar *menu_name); +gboolean _gimp_plugin_icon_register (const gchar *procedure_name, + GimpIconType icon_type, + gint icon_data_length, + const guint8 *icon_data); G_END_DECLS diff --git a/plug-ins/script-fu/script-fu-scripts.c b/plug-ins/script-fu/script-fu-scripts.c index d1de943db2..2243be04f4 100644 --- a/plug-ins/script-fu/script-fu-scripts.c +++ b/plug-ins/script-fu/script-fu-scripts.c @@ -129,6 +129,52 @@ script_fu_find_scripts (void) script_fu_load_script, NULL); + gimp_plugin_menu_branch_register ("/Xtns", + N_("_Script-Fu")); + gimp_plugin_menu_branch_register ("/Xtns/Script-Fu", + N_("_Buttons")); + gimp_plugin_menu_branch_register ("/Xtns/Script-Fu", + N_("_Logos")); + gimp_plugin_menu_branch_register ("/Xtns/Script-Fu", + N_("Make Br_ush")); + gimp_plugin_menu_branch_register ("/Xtns/Script-Fu", + N_("_Misc")); + gimp_plugin_menu_branch_register ("/Xtns/Script-Fu", + N_("_Patterns")); + gimp_plugin_menu_branch_register ("/Xtns/Script-Fu", + N_("_Test")); + gimp_plugin_menu_branch_register ("/Xtns/Script-Fu", + N_("_Utils")); + gimp_plugin_menu_branch_register ("/Xtns/Script-Fu", + N_("_Web Page Themes")); + gimp_plugin_menu_branch_register ("/Xtns/Script-Fu/Web Page Themes", + N_("_Alien Glow")); + gimp_plugin_menu_branch_register ("/Xtns/Script-Fu/Web Page Themes", + N_("_Beveled Pattern")); + gimp_plugin_menu_branch_register ("/Xtns/Script-Fu/Web Page Themes", + N_("_Classic.Gimp.Org")); + + gimp_plugin_menu_branch_register ("", + N_("S_cript-Fu")); + gimp_plugin_menu_branch_register ("/Script-Fu", + N_("_Alchemy")); + gimp_plugin_menu_branch_register ("/Script-Fu", + N_("Alpha to _Logo")); + gimp_plugin_menu_branch_register ("/Script-Fu", + N_("A_nimators")); + gimp_plugin_menu_branch_register ("/Script-Fu", + N_("_Decor")); + gimp_plugin_menu_branch_register ("/Script-Fu", + N_("_Render")); + gimp_plugin_menu_branch_register ("/Script-Fu", + N_("_Selection")); + gimp_plugin_menu_branch_register ("/Script-Fu", + N_("S_hadow")); + gimp_plugin_menu_branch_register ("/Script-Fu", + N_("Stencil _Ops")); + gimp_plugin_menu_branch_register ("/Script-Fu", + N_("_Utils")); + /* Now that all scripts are read in and sorted, tell gimp about them */ g_tree_foreach (script_tree, (GTraverseFunc) script_fu_install_script, diff --git a/tools/pdbgen/pdb/plug_in.pdb b/tools/pdbgen/pdb/plug_in.pdb index 76daed1164..0f9b332a0a 100644 --- a/tools/pdbgen/pdb/plug_in.pdb +++ b/tools/pdbgen/pdb/plug_in.pdb @@ -354,7 +354,7 @@ HELP if (! gimp->no_interface && proc_def->db_info.proc_type == GIMP_TEMPORARY) { - gimp_menus_create_entry (gimp, proc_def, menu_path); + gimp_menus_create_item (gimp, proc_def, menu_path); } } } @@ -385,6 +385,47 @@ CODE ); } +sub plugin_menu_branch_register { + $blurb = "Register a sub-menu."; + + $help = <'; + $date = '2005'; + $since = '2.4'; + + @inargs = ( + { name => 'menu_path', type => 'string', + desc => "The sub-menu's menu path" }, + { name => 'menu_name', type => 'string', + desc => 'The name of the sub-menu' } + ); + + %invoke = ( + code => <<'CODE', +{ + if (gimp->current_plug_in) + { + plug_ins_menu_branch_add (gimp, gimp->current_plug_in->prog, + menu_path, menu_name); + + if (! gimp->no_interface) + { + gimp_menus_create_branch (gimp, gimp->current_plug_in->prog, + menu_path, menu_name); + } + else + success = FALSE; + } + else + success = FALSE; +} +CODE + ); +} + sub plugin_icon_register { $blurb = "Register an icon for a plug-in procedure."; @@ -478,8 +519,9 @@ CODE @procs = qw(plugins_query plugin_domain_register plugin_help_register - plugin_menu_register plugin_icon_register); -%exports = (app => [@procs], lib => [@procs[1,2,3,4]]); + plugin_menu_register plugin_menu_branch_register + plugin_icon_register); +%exports = (app => [@procs], lib => [@procs[1,2,3,4,5]]); $desc = 'Plug-in';