diff --git a/app/actions/filters-actions.c b/app/actions/filters-actions.c index 1b9dcf7d4f..d63a92e65b 100644 --- a/app/actions/filters-actions.c +++ b/app/actions/filters-actions.c @@ -865,7 +865,7 @@ filters_actions_history_changed (Gimp *gimp, "sensitive", sensitive, "procedure", proc, "label", label, - "icon-name", gimp_plug_in_procedure_get_icon_name (GIMP_PLUG_IN_PROCEDURE (proc)), + "icon-name", gimp_viewable_get_icon_name (GIMP_VIEWABLE (proc)), "tooltip", gimp_plug_in_procedure_get_blurb (GIMP_PLUG_IN_PROCEDURE (proc)), NULL); } diff --git a/app/actions/plug-in-actions.c b/app/actions/plug-in-actions.c index df9f3aeeb4..4f39d4d319 100644 --- a/app/actions/plug-in-actions.c +++ b/app/actions/plug-in-actions.c @@ -333,7 +333,7 @@ plug_in_actions_add_proc (GimpActionGroup *group, } entry.name = gimp_object_get_name (proc); - entry.icon_name = gimp_plug_in_procedure_get_icon_name (proc); + entry.icon_name = gimp_viewable_get_icon_name (GIMP_VIEWABLE (proc)); entry.label = label; entry.accelerator = NULL; entry.tooltip = gimp_plug_in_procedure_get_blurb (proc); diff --git a/app/core/gimp-batch.c b/app/core/gimp-batch.c index eaabf1a828..52b06fd452 100644 --- a/app/core/gimp-batch.c +++ b/app/core/gimp-batch.c @@ -20,7 +20,7 @@ #include #include -#include +#include #include #include "libgimpbase/gimpbase.h" diff --git a/app/core/gimp-filter-history.c b/app/core/gimp-filter-history.c index e17f18ed93..56a69c3b02 100644 --- a/app/core/gimp-filter-history.c +++ b/app/core/gimp-filter-history.c @@ -20,6 +20,7 @@ #include "config.h" #include +#include #include "libgimpbase/gimpbase.h" diff --git a/app/file/file-procedure.c b/app/file/file-procedure.c index 4a3c2d35b2..f2d9eb2f66 100644 --- a/app/file/file-procedure.c +++ b/app/file/file-procedure.c @@ -24,6 +24,7 @@ #include #include +#include #include "libgimpbase/gimpbase.h" diff --git a/app/main.c b/app/main.c index 2b348cc732..c3c1dba591 100644 --- a/app/main.c +++ b/app/main.c @@ -39,6 +39,8 @@ #ifndef GIMP_CONSOLE_COMPILATION #include +#else +#include #endif #include diff --git a/app/menus/plug-in-menus.c b/app/menus/plug-in-menus.c index 9bcf41d6c7..8da0ca4c13 100644 --- a/app/menus/plug-in-menus.c +++ b/app/menus/plug-in-menus.c @@ -20,6 +20,7 @@ #include #include +#include #include "libgimpbase/gimpbase.h" diff --git a/app/pdb/gimppdb-query.c b/app/pdb/gimppdb-query.c index 32a24af9bb..376b9ab01c 100644 --- a/app/pdb/gimppdb-query.c +++ b/app/pdb/gimppdb-query.c @@ -20,7 +20,8 @@ #include #include -#include +#include +#include #include "libgimpbase/gimpbase.h" diff --git a/app/pdb/gimpprocedure.c b/app/pdb/gimpprocedure.c index 2ec02a4ac0..da3b42a35d 100644 --- a/app/pdb/gimpprocedure.c +++ b/app/pdb/gimpprocedure.c @@ -70,7 +70,7 @@ static gboolean gimp_procedure_validate_args (GimpProcedure *procedure GError **error); -G_DEFINE_TYPE (GimpProcedure, gimp_procedure, GIMP_TYPE_OBJECT) +G_DEFINE_TYPE (GimpProcedure, gimp_procedure, GIMP_TYPE_VIEWABLE) #define parent_class gimp_procedure_parent_class diff --git a/app/pdb/gimpprocedure.h b/app/pdb/gimpprocedure.h index dd837d40a2..4cbae071a5 100644 --- a/app/pdb/gimpprocedure.h +++ b/app/pdb/gimpprocedure.h @@ -19,7 +19,7 @@ #define __GIMP_PROCEDURE_H__ -#include "core/gimpobject.h" +#include "core/gimpviewable.h" typedef GimpValueArray * (* GimpMarshalFunc) (GimpProcedure *procedure, @@ -42,7 +42,7 @@ typedef struct _GimpProcedureClass GimpProcedureClass; struct _GimpProcedure { - GimpObject parent_instance; + GimpViewable parent_instance; GimpPDBProcType proc_type; /* Type of procedure */ @@ -67,7 +67,7 @@ struct _GimpProcedure struct _GimpProcedureClass { - GimpObjectClass parent_class; + GimpViewableClass parent_class; GimpValueArray * (* execute) (GimpProcedure *procedure, Gimp *gimp, diff --git a/app/plug-in/gimpplugin-progress.c b/app/plug-in/gimpplugin-progress.c index 70d90e65e1..2aaff0e2cb 100644 --- a/app/plug-in/gimpplugin-progress.c +++ b/app/plug-in/gimpplugin-progress.c @@ -20,6 +20,7 @@ #include "config.h" #include +#include #include "plug-in-types.h" diff --git a/app/plug-in/gimppluginmanager-file.c b/app/plug-in/gimppluginmanager-file.c index 5022d14e8c..dc4e95121e 100644 --- a/app/plug-in/gimppluginmanager-file.c +++ b/app/plug-in/gimppluginmanager-file.c @@ -20,6 +20,7 @@ #include "config.h" #include +#include #include "plug-in-types.h" diff --git a/app/plug-in/gimppluginmanager-query.c b/app/plug-in/gimppluginmanager-query.c index 4c5ef6155b..2a65005641 100644 --- a/app/plug-in/gimppluginmanager-query.c +++ b/app/plug-in/gimppluginmanager-query.c @@ -22,6 +22,7 @@ #include #include +#include #include "libgimpbase/gimpbase.h" diff --git a/app/plug-in/gimppluginprocedure.c b/app/plug-in/gimppluginprocedure.c index c750e53fad..67d26ffde4 100644 --- a/app/plug-in/gimppluginprocedure.c +++ b/app/plug-in/gimppluginprocedure.c @@ -53,25 +53,28 @@ enum }; -static void gimp_plug_in_procedure_finalize (GObject *object); +static void gimp_plug_in_procedure_finalize (GObject *object); -static gint64 gimp_plug_in_procedure_get_memsize (GimpObject *object, - gint64 *gui_size); +static gint64 gimp_plug_in_procedure_get_memsize (GimpObject *object, + gint64 *gui_size); -static GimpValueArray * gimp_plug_in_procedure_execute (GimpProcedure *procedure, - Gimp *gimp, - GimpContext *context, - GimpProgress *progress, - GimpValueArray *args, - GError **error); -static void gimp_plug_in_procedure_execute_async (GimpProcedure *procedure, - Gimp *gimp, - GimpContext *context, - GimpProgress *progress, - GimpValueArray *args, - GimpObject *display); +static gchar * gimp_plug_in_procedure_get_description (GimpViewable *viewable, + gchar **tooltip); -GFile * gimp_plug_in_procedure_real_get_file (const GimpPlugInProcedure *procedure); +static GimpValueArray * gimp_plug_in_procedure_execute (GimpProcedure *procedure, + Gimp *gimp, + GimpContext *context, + GimpProgress *progress, + GimpValueArray *args, + GError **error); +static void gimp_plug_in_procedure_execute_async (GimpProcedure *procedure, + Gimp *gimp, + GimpContext *context, + GimpProgress *progress, + GimpValueArray *args, + GimpObject *display); + +static GFile * gimp_plug_in_procedure_real_get_file (const GimpPlugInProcedure *procedure); G_DEFINE_TYPE (GimpPlugInProcedure, gimp_plug_in_procedure, @@ -87,6 +90,7 @@ gimp_plug_in_procedure_class_init (GimpPlugInProcedureClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GimpObjectClass *gimp_object_class = GIMP_OBJECT_CLASS (klass); + GimpViewableClass *viewable_class = GIMP_VIEWABLE_CLASS (klass); GimpProcedureClass *proc_class = GIMP_PROCEDURE_CLASS (klass); gimp_plug_in_procedure_signals[MENU_PATH_ADDED] = @@ -99,15 +103,18 @@ gimp_plug_in_procedure_class_init (GimpPlugInProcedureClass *klass) G_TYPE_NONE, 1, G_TYPE_STRING); - object_class->finalize = gimp_plug_in_procedure_finalize; + object_class->finalize = gimp_plug_in_procedure_finalize; - gimp_object_class->get_memsize = gimp_plug_in_procedure_get_memsize; + gimp_object_class->get_memsize = gimp_plug_in_procedure_get_memsize; - proc_class->execute = gimp_plug_in_procedure_execute; - proc_class->execute_async = gimp_plug_in_procedure_execute_async; + viewable_class->default_icon_name = "system-run"; + viewable_class->get_description = gimp_plug_in_procedure_get_description; - klass->get_file = gimp_plug_in_procedure_real_get_file; - klass->menu_path_added = NULL; + proc_class->execute = gimp_plug_in_procedure_execute; + proc_class->execute_async = gimp_plug_in_procedure_execute_async; + + klass->get_file = gimp_plug_in_procedure_real_get_file; + klass->menu_path_added = NULL; } static void @@ -194,6 +201,18 @@ gimp_plug_in_procedure_get_memsize (GimpObject *object, gui_size); } +static gchar * +gimp_plug_in_procedure_get_description (GimpViewable *viewable, + gchar **tooltip) +{ + GimpPlugInProcedure *proc = GIMP_PLUG_IN_PROCEDURE (viewable); + + if (tooltip) + *tooltip = g_strdup (gimp_plug_in_procedure_get_blurb (proc)); + + return g_strdup (gimp_plug_in_procedure_get_label (proc)); +} + static GimpValueArray * gimp_plug_in_procedure_execute (GimpProcedure *procedure, Gimp *gimp, @@ -589,9 +608,43 @@ gimp_plug_in_procedure_set_icon (GimpPlugInProcedure *proc, const guint8 *icon_data, gint icon_data_length) { + guint8 *data_copy = NULL; + + g_return_if_fail (GIMP_IS_PLUG_IN_PROCEDURE (proc)); + + switch (proc->icon_type) + { + case GIMP_ICON_TYPE_ICON_NAME: + data_copy = (guint8 *) g_strdup ((gchar *) icon_data); + break; + + case GIMP_ICON_TYPE_INLINE_PIXBUF: + data_copy = g_memdup (icon_data, icon_data_length); + break; + + case GIMP_ICON_TYPE_IMAGE_FILE: + data_copy = (guint8 *) g_strdup ((gchar *) icon_data); + break; + + default: + g_return_if_reached (); + } + + gimp_plug_in_procedure_take_icon (proc, icon_type, + data_copy, icon_data_length); +} + +void +gimp_plug_in_procedure_take_icon (GimpPlugInProcedure *proc, + GimpIconType icon_type, + guint8 *icon_data, + gint icon_data_length) +{ + const gchar *icon_name = NULL; + GdkPixbuf *icon_pixbuf = NULL; + GError *error = NULL; + g_return_if_fail (GIMP_IS_PLUG_IN_PROCEDURE (proc)); - g_return_if_fail (icon_type == -1 || icon_data != NULL); - g_return_if_fail (icon_type == -1 || icon_data_length > 0); if (proc->icon_data) { @@ -605,64 +658,40 @@ gimp_plug_in_procedure_set_icon (GimpPlugInProcedure *proc, switch (proc->icon_type) { case GIMP_ICON_TYPE_ICON_NAME: - case GIMP_ICON_TYPE_IMAGE_FILE: proc->icon_data_length = -1; - proc->icon_data = (guint8 *) g_strdup ((gchar *) icon_data); + proc->icon_data = icon_data; + + icon_name = (const gchar *) proc->icon_data; break; case GIMP_ICON_TYPE_INLINE_PIXBUF: proc->icon_data_length = icon_data_length; - proc->icon_data = g_memdup (icon_data, icon_data_length); - break; - } -} + proc->icon_data = icon_data; -const gchar * -gimp_plug_in_procedure_get_icon_name (const GimpPlugInProcedure *proc) -{ - g_return_val_if_fail (GIMP_IS_PLUG_IN_PROCEDURE (proc), NULL); - - switch (proc->icon_type) - { - case GIMP_ICON_TYPE_ICON_NAME: - return (gchar *) proc->icon_data; - - default: - return NULL; - } -} - -GdkPixbuf * -gimp_plug_in_procedure_get_pixbuf (const GimpPlugInProcedure *proc) -{ - GdkPixbuf *pixbuf = NULL; - GError *error = NULL; - - g_return_val_if_fail (GIMP_IS_PLUG_IN_PROCEDURE (proc), NULL); - - switch (proc->icon_type) - { - case GIMP_ICON_TYPE_INLINE_PIXBUF: - pixbuf = gdk_pixbuf_new_from_inline (proc->icon_data_length, - proc->icon_data, TRUE, &error); + icon_pixbuf = gdk_pixbuf_new_from_inline (proc->icon_data_length, + proc->icon_data, TRUE, &error); break; case GIMP_ICON_TYPE_IMAGE_FILE: - pixbuf = gdk_pixbuf_new_from_file ((gchar *) proc->icon_data, - &error); - break; + proc->icon_data_length = -1; + proc->icon_data = icon_data; - default: + icon_pixbuf = gdk_pixbuf_new_from_file ((gchar *) proc->icon_data, + &error); break; } - if (! pixbuf && error) + if (! icon_pixbuf && error) { g_printerr ("%s\n", error->message); g_clear_error (&error); } - return pixbuf; + gimp_viewable_set_icon_name (GIMP_VIEWABLE (proc), icon_name); + g_object_set (proc, "icon-pixbuf", icon_pixbuf, NULL); + + if (icon_pixbuf) + g_object_unref (icon_pixbuf); } gchar * diff --git a/app/plug-in/gimppluginprocedure.h b/app/plug-in/gimppluginprocedure.h index 988d87386a..2f1270ce20 100644 --- a/app/plug-in/gimppluginprocedure.h +++ b/app/plug-in/gimppluginprocedure.h @@ -102,14 +102,17 @@ gboolean gimp_plug_in_procedure_add_menu_path (GimpPlugInProcedure GError **error); const gchar * gimp_plug_in_procedure_get_label (GimpPlugInProcedure *proc); + const gchar * gimp_plug_in_procedure_get_blurb (const GimpPlugInProcedure *proc); void gimp_plug_in_procedure_set_icon (GimpPlugInProcedure *proc, GimpIconType type, const guint8 *data, gint data_length); -const gchar * gimp_plug_in_procedure_get_icon_name (const GimpPlugInProcedure *proc); -GdkPixbuf * gimp_plug_in_procedure_get_pixbuf (const GimpPlugInProcedure *proc); +void gimp_plug_in_procedure_take_icon (GimpPlugInProcedure *proc, + GimpIconType type, + guint8 *data, + gint data_length); gchar * gimp_plug_in_procedure_get_help_id (const GimpPlugInProcedure *proc); diff --git a/app/plug-in/plug-in-rc.c b/app/plug-in/plug-in-rc.c index 0b673356d3..18146c3f9a 100644 --- a/app/plug-in/plug-in-rc.c +++ b/app/plug-in/plug-in-rc.c @@ -21,6 +21,7 @@ #include "config.h" #include +#include #include "libgimpbase/gimpbase.h" #include "libgimpbase/gimpprotocol.h" @@ -558,9 +559,8 @@ plug_in_icon_deserialize (GScanner *scanner, break; } - proc->icon_type = icon_type; - proc->icon_data_length = icon_data_length; - proc->icon_data = icon_data; + gimp_plug_in_procedure_take_icon (proc, icon_type, + icon_data, icon_data_length); if (! gimp_scanner_parse_token (scanner, G_TOKEN_RIGHT_PAREN)) return G_TOKEN_RIGHT_PAREN; diff --git a/app/widgets/gimpfileprocview.c b/app/widgets/gimpfileprocview.c index f3010c82d5..cb102d5035 100644 --- a/app/widgets/gimpfileprocview.c +++ b/app/widgets/gimpfileprocview.c @@ -23,6 +23,7 @@ #include #include +#include #include "widgets-types.h" diff --git a/app/widgets/gimpprocedureaction.c b/app/widgets/gimpprocedureaction.c index 5b0cc46972..1337647a2b 100644 --- a/app/widgets/gimpprocedureaction.c +++ b/app/widgets/gimpprocedureaction.c @@ -21,12 +21,13 @@ #include "config.h" #include +#include #include "widgets-types.h" #include "core/gimpmarshal.h" -#include "plug-in/gimppluginprocedure.h" /* FIXME history */ +#include "pdb/gimpprocedure.h" #include "gimpprocedureaction.h" @@ -52,7 +53,7 @@ static void gimp_procedure_action_set_property (GObject *object, static void gimp_procedure_action_get_property (GObject *object, guint prop_id, GValue *value, - GParamSpec *pspec); + GParamSpec *pspec); static void gimp_procedure_action_activate (GtkAction *action); static void gimp_procedure_action_connect_proxy (GtkAction *action, @@ -184,8 +185,9 @@ gimp_procedure_action_connect_proxy (GtkAction *action, { GdkPixbuf *pixbuf; - /* FIXME history */ - pixbuf = gimp_plug_in_procedure_get_pixbuf (GIMP_PLUG_IN_PROCEDURE (procedure_action->procedure)); + g_object_get (procedure_action->procedure, + "icon-pixbuf", &pixbuf, + NULL); if (pixbuf) {