pdb: move gimp_plugin_icon_register_invoker() from "plugin" to "pdb"

and call it gimp_pdb_set_proc_icon(). Change icon registration code in
libgimp/ and app/ so it's now possible to register icons for temporary
procedures.
This commit is contained in:
Michael Natterer 2019-09-08 16:22:32 +02:00
parent d89adebff8
commit 303ccbedad
16 changed files with 369 additions and 298 deletions

View File

@ -60,7 +60,8 @@ file_data_init (Gimp *gimp)
proc->menu_label = g_strdup (N_("GIMP brush"));
gimp_plug_in_procedure_set_icon (proc, GIMP_ICON_TYPE_ICON_NAME,
(const guint8 *) "gimp-brush",
strlen ("gimp-brush") + 1);
strlen ("gimp-brush") + 1,
NULL);
gimp_plug_in_procedure_set_image_types (proc, NULL);
gimp_plug_in_procedure_set_file_proc (proc, "gbr, gbp", "",
"20, string, GIMP");
@ -125,7 +126,8 @@ file_data_init (Gimp *gimp)
proc->menu_label = g_strdup (N_("GIMP brush"));
gimp_plug_in_procedure_set_icon (proc, GIMP_ICON_TYPE_ICON_NAME,
(const guint8 *) "gimp-brush",
strlen ("gimp-brush") + 1);
strlen ("gimp-brush") + 1,
NULL);
#if 0
/* do not register as file procedure */
@ -211,7 +213,8 @@ file_data_init (Gimp *gimp)
proc->menu_label = g_strdup (N_("GIMP brush (animated)"));
gimp_plug_in_procedure_set_icon (proc, GIMP_ICON_TYPE_ICON_NAME,
(const guint8 *) "gimp-brush",
strlen ("gimp-brush") + 1);
strlen ("gimp-brush") + 1,
NULL);
gimp_plug_in_procedure_set_image_types (proc, NULL);
gimp_plug_in_procedure_set_file_proc (proc, "gih", "", "");
gimp_plug_in_procedure_set_mime_types (proc, "image/gimp-x-gih");
@ -273,7 +276,8 @@ file_data_init (Gimp *gimp)
proc->menu_label = g_strdup (N_("GIMP brush (animated)"));
gimp_plug_in_procedure_set_icon (proc, GIMP_ICON_TYPE_ICON_NAME,
(const guint8 *) "gimp-brush",
strlen ("gimp-brush") + 1);
strlen ("gimp-brush") + 1,
NULL);
#if 0
/* do not register as file procedure */
@ -366,7 +370,8 @@ file_data_init (Gimp *gimp)
proc->menu_label = g_strdup (N_("GIMP pattern"));
gimp_plug_in_procedure_set_icon (proc, GIMP_ICON_TYPE_ICON_NAME,
(const guint8 *) "gimp-pattern",
strlen ("gimp-pattern") + 1);
strlen ("gimp-pattern") + 1,
NULL);
gimp_plug_in_procedure_set_image_types (proc, NULL);
gimp_plug_in_procedure_set_file_proc (proc, "pat", "",
"20,string,GPAT");
@ -427,7 +432,8 @@ file_data_init (Gimp *gimp)
proc->menu_label = g_strdup (N_("GIMP pattern"));
gimp_plug_in_procedure_set_icon (proc, GIMP_ICON_TYPE_ICON_NAME,
(const guint8 *) "gimp-pattern",
strlen ("gimp-pattern") + 1);
strlen ("gimp-pattern") + 1,
NULL);
#if 0
/* do not register as file procedure */
@ -508,7 +514,8 @@ file_data_init (Gimp *gimp)
proc->menu_label = g_strdup (N_("GIMP extension"));
gimp_plug_in_procedure_set_icon (proc, GIMP_ICON_TYPE_ICON_NAME,
(const guint8 *) "gimp-plugin",
strlen ("gimp-plugin") + 1);
strlen ("gimp-plugin") + 1,
NULL);
gimp_plug_in_procedure_set_file_proc (proc, "gex", "",
"20, string, GIMP");
gimp_plug_in_procedure_set_generic_file_proc (proc, TRUE);

View File

@ -443,6 +443,44 @@ pdb_get_proc_menu_paths_invoker (GimpProcedure *procedure,
return return_vals;
}
static GimpValueArray *
pdb_set_proc_icon_invoker (GimpProcedure *procedure,
Gimp *gimp,
GimpContext *context,
GimpProgress *progress,
const GimpValueArray *args,
GError **error)
{
gboolean success = TRUE;
const gchar *procedure_name;
gint icon_type;
gint icon_data_length;
const guint8 *icon_data;
procedure_name = g_value_get_string (gimp_value_array_index (args, 0));
icon_type = g_value_get_enum (gimp_value_array_index (args, 1));
icon_data_length = g_value_get_int (gimp_value_array_index (args, 2));
icon_data = gimp_value_get_uint8_array (gimp_value_array_index (args, 3));
if (success)
{
GimpPlugIn *plug_in = gimp->plug_in_manager->current_plug_in;
if (plug_in &&
gimp_pdb_is_canonical_procedure (procedure_name, error))
{
success = gimp_plug_in_set_proc_icon (plug_in, procedure_name,
icon_type,
icon_data, icon_data_length);
}
else
success = FALSE;
}
return gimp_procedure_get_return_values (procedure, success,
error ? *error : NULL);
}
static GimpValueArray *
pdb_get_proc_documentation_invoker (GimpProcedure *procedure,
Gimp *gimp,
@ -1067,6 +1105,47 @@ register_pdb_procs (GimpPDB *pdb)
gimp_pdb_register_procedure (pdb, procedure);
g_object_unref (procedure);
/*
* gimp-pdb-set-proc-icon
*/
procedure = gimp_procedure_new (pdb_set_proc_icon_invoker);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-pdb-set-proc-icon");
gimp_procedure_set_static_strings (procedure,
"Register an icon for a plug-in procedure.",
"This procedure installs an icon for the given procedure.",
"Michael Natterer <mitch@gimp.org>",
"Michael Natterer",
"2019",
NULL);
gimp_procedure_add_argument (procedure,
gimp_param_spec_string ("procedure-name",
"procedure name",
"The procedure for which to install the icon",
FALSE, FALSE, TRUE,
NULL,
GIMP_PARAM_READWRITE));
gimp_procedure_add_argument (procedure,
g_param_spec_enum ("icon-type",
"icon type",
"The type of the icon",
GIMP_TYPE_ICON_TYPE,
GIMP_ICON_TYPE_ICON_NAME,
GIMP_PARAM_READWRITE));
gimp_procedure_add_argument (procedure,
g_param_spec_int ("icon-data-length",
"icon data length",
"The length of 'icon-data'",
1, G_MAXINT32, 1,
GIMP_PARAM_READWRITE));
gimp_procedure_add_argument (procedure,
gimp_param_spec_uint8_array ("icon-data",
"icon data",
"The procedure's icon. The format depends on the 'icon_type' parameter",
GIMP_PARAM_READWRITE));
gimp_pdb_register_procedure (pdb, procedure);
g_object_unref (procedure);
/*
* gimp-pdb-get-proc-documentation
*/

View File

@ -182,52 +182,6 @@ plugin_menu_branch_register_invoker (GimpProcedure *procedure,
error ? *error : NULL);
}
static GimpValueArray *
plugin_icon_register_invoker (GimpProcedure *procedure,
Gimp *gimp,
GimpContext *context,
GimpProgress *progress,
const GimpValueArray *args,
GError **error)
{
gboolean success = TRUE;
const gchar *procedure_name;
gint icon_type;
gint icon_data_length;
const guint8 *icon_data;
procedure_name = g_value_get_string (gimp_value_array_index (args, 0));
icon_type = g_value_get_enum (gimp_value_array_index (args, 1));
icon_data_length = g_value_get_int (gimp_value_array_index (args, 2));
icon_data = gimp_value_get_uint8_array (gimp_value_array_index (args, 3));
if (success)
{
GimpPlugIn *plug_in = gimp->plug_in_manager->current_plug_in;
if (plug_in &&
plug_in->call_mode == GIMP_PLUG_IN_CALL_QUERY &&
gimp_pdb_is_canonical_procedure (procedure_name, error))
{
GimpPlugInProcedure *proc;
proc = gimp_plug_in_procedure_find (plug_in->plug_in_def->procedures,
procedure_name);
if (proc)
gimp_plug_in_procedure_set_icon (proc, icon_type,
icon_data, icon_data_length);
else
success = FALSE;
}
else
success = FALSE;
}
return gimp_procedure_get_return_values (procedure, success,
error ? *error : NULL);
}
static GimpValueArray *
plugin_set_pdb_error_handler_invoker (GimpProcedure *procedure,
Gimp *gimp,
@ -449,47 +403,6 @@ register_plug_in_procs (GimpPDB *pdb)
gimp_pdb_register_procedure (pdb, procedure);
g_object_unref (procedure);
/*
* gimp-plugin-icon-register
*/
procedure = gimp_procedure_new (plugin_icon_register_invoker);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"gimp-plugin-icon-register");
gimp_procedure_set_static_strings (procedure,
"Register an icon for a plug-in procedure.",
"This procedure installs an icon for the given procedure.",
"Michael Natterer <mitch@gimp.org>",
"Michael Natterer",
"2004",
NULL);
gimp_procedure_add_argument (procedure,
gimp_param_spec_string ("procedure-name",
"procedure name",
"The procedure for which to install the icon",
FALSE, FALSE, TRUE,
NULL,
GIMP_PARAM_READWRITE));
gimp_procedure_add_argument (procedure,
g_param_spec_enum ("icon-type",
"icon type",
"The type of the icon",
GIMP_TYPE_ICON_TYPE,
GIMP_ICON_TYPE_ICON_NAME,
GIMP_PARAM_READWRITE));
gimp_procedure_add_argument (procedure,
g_param_spec_int ("icon-data-length",
"icon data length",
"The length of 'icon-data'",
1, G_MAXINT32, 1,
GIMP_PARAM_READWRITE));
gimp_procedure_add_argument (procedure,
gimp_param_spec_uint8_array ("icon-data",
"icon data",
"The procedure's icon. The format depends on the 'icon_type' parameter",
GIMP_PARAM_READWRITE));
gimp_pdb_register_procedure (pdb, procedure);
g_object_unref (procedure);
/*
* gimp-plugin-set-pdb-error-handler
*/

View File

@ -924,21 +924,70 @@ gimp_plug_in_add_proc_menu_path (GimpPlugIn *plug_in,
break;
}
if (! proc->menu_label)
if (! gimp_plug_in_procedure_add_menu_path (proc, menu_path, &error))
{
gimp_message (plug_in->manager->gimp, NULL, GIMP_MESSAGE_ERROR,
"Plug-in \"%s\"\n(%s)\n"
"attempted to register the procedure \"%s\" "
"in the menu \"%s\", but the procedure has no label. "
"This is not allowed.",
gimp_object_get_name (plug_in),
gimp_file_get_utf8_name (plug_in->file),
proc_name, menu_path);
gimp_message_literal (plug_in->manager->gimp, NULL, GIMP_MESSAGE_ERROR,
error->message);
g_clear_error (&error);
return FALSE;
}
if (! gimp_plug_in_procedure_add_menu_path (proc, menu_path, &error))
return TRUE;
}
gboolean
gimp_plug_in_set_proc_icon (GimpPlugIn *plug_in,
const gchar *proc_name,
GimpIconType type,
const guint8 *data,
gint data_length)
{
GimpPlugInProcedure *proc = NULL;
GError *error = NULL;
g_return_val_if_fail (GIMP_IS_PLUG_IN (plug_in), FALSE);
g_return_val_if_fail (proc_name != NULL, FALSE);
if (plug_in->plug_in_def)
proc = gimp_plug_in_procedure_find (plug_in->plug_in_def->procedures,
proc_name);
if (! proc)
proc = gimp_plug_in_procedure_find (plug_in->temp_procedures, proc_name);
if (! proc)
{
gimp_message (plug_in->manager->gimp, NULL, GIMP_MESSAGE_ERROR,
"Plug-in \"%s\"\n(%s)\n"
"attempted to set the icon "
"for the procedure \"%s\".\n"
"It has however not installed that procedure. "
"This is not allowed.",
gimp_object_get_name (plug_in),
gimp_file_get_utf8_name (plug_in->file),
proc_name);
return FALSE;
}
switch (GIMP_PROCEDURE (proc)->proc_type)
{
case GIMP_PDB_PROC_TYPE_INTERNAL:
return FALSE;
case GIMP_PDB_PROC_TYPE_PLUGIN:
case GIMP_PDB_PROC_TYPE_EXTENSION:
if (plug_in->call_mode != GIMP_PLUG_IN_CALL_QUERY &&
plug_in->call_mode != GIMP_PLUG_IN_CALL_INIT)
return FALSE;
case GIMP_PDB_PROC_TYPE_TEMPORARY:
break;
}
if (! gimp_plug_in_procedure_set_icon (proc, type, data, data_length,
&error))
{
gimp_message_literal (plug_in->manager->gimp, NULL, GIMP_MESSAGE_ERROR,
error->message);

View File

@ -108,6 +108,11 @@ const gchar * gimp_plug_in_get_undo_desc (GimpPlugIn *plug_in);
gboolean gimp_plug_in_add_proc_menu_path (GimpPlugIn *plug_in,
const gchar *proc_name,
const gchar *menu_path);
gboolean gimp_plug_in_set_proc_icon (GimpPlugIn *plug_in,
const gchar *proc_name,
GimpIconType type,
const guint8 *data,
gint data_length);
void gimp_plug_in_add_temp_proc (GimpPlugIn *plug_in,
GimpTemporaryProcedure *procedure);

View File

@ -818,30 +818,31 @@ gimp_plug_in_procedure_add_menu_path (GimpPlugInProcedure *proc,
return FALSE;
}
void
gimp_plug_in_procedure_set_icon (GimpPlugInProcedure *proc,
GimpIconType icon_type,
const guint8 *icon_data,
gint icon_data_length)
gboolean
gimp_plug_in_procedure_set_icon (GimpPlugInProcedure *proc,
GimpIconType icon_type,
const guint8 *icon_data,
gint icon_data_length,
GError **error)
{
g_return_if_fail (GIMP_IS_PLUG_IN_PROCEDURE (proc));
gimp_plug_in_procedure_take_icon (proc, icon_type,
g_memdup (icon_data, icon_data_length),
icon_data_length);
return gimp_plug_in_procedure_take_icon (proc, icon_type,
g_memdup (icon_data, icon_data_length),
icon_data_length, error);
}
void
gimp_plug_in_procedure_take_icon (GimpPlugInProcedure *proc,
GimpIconType icon_type,
guint8 *icon_data,
gint icon_data_length)
gboolean
gimp_plug_in_procedure_take_icon (GimpPlugInProcedure *proc,
GimpIconType icon_type,
guint8 *icon_data,
gint icon_data_length,
GError **error)
{
const gchar *icon_name = NULL;
GdkPixbuf *icon_pixbuf = NULL;
GError *error = NULL;
gboolean success = TRUE;
g_return_if_fail (GIMP_IS_PLUG_IN_PROCEDURE (proc));
g_return_val_if_fail (GIMP_IS_PLUG_IN_PROCEDURE (proc), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
if (proc->icon_data)
{
@ -869,15 +870,26 @@ gimp_plug_in_procedure_take_icon (GimpPlugInProcedure *proc,
loader = gdk_pixbuf_loader_new ();
gdk_pixbuf_loader_write (loader,
proc->icon_data,
proc->icon_data_length,
NULL);
gdk_pixbuf_loader_close (loader, NULL);
icon_pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
if (! gdk_pixbuf_loader_write (loader,
proc->icon_data,
proc->icon_data_length,
error))
{
gdk_pixbuf_loader_close (loader, NULL);
success = FALSE;
}
else if (! gdk_pixbuf_loader_close (loader, error))
{
success = FALSE;
}
if (icon_pixbuf)
g_object_ref (icon_pixbuf);
if (success)
{
icon_pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
if (icon_pixbuf)
g_object_ref (icon_pixbuf);
}
g_object_unref (loader);
break;
@ -887,14 +899,11 @@ gimp_plug_in_procedure_take_icon (GimpPlugInProcedure *proc,
proc->icon_data = icon_data;
icon_pixbuf = gdk_pixbuf_new_from_file ((gchar *) proc->icon_data,
&error);
break;
}
error);
if (! icon_pixbuf && error)
{
g_printerr ("%s: %s\n", G_STRFUNC, error->message);
g_clear_error (&error);
if (! icon_pixbuf)
success = FALSE;
break;
}
gimp_viewable_set_icon_name (GIMP_VIEWABLE (proc), icon_name);
@ -902,6 +911,8 @@ gimp_plug_in_procedure_take_icon (GimpPlugInProcedure *proc,
if (icon_pixbuf)
g_object_unref (icon_pixbuf);
return success;
}
static GimpPlugInImageType

View File

@ -111,14 +111,16 @@ gboolean gimp_plug_in_procedure_add_menu_path (GimpPlugInProcedure *pro
const gchar *menu_path,
GError **error);
void gimp_plug_in_procedure_set_icon (GimpPlugInProcedure *proc,
gboolean gimp_plug_in_procedure_set_icon (GimpPlugInProcedure *proc,
GimpIconType type,
const guint8 *data,
gint data_length);
void gimp_plug_in_procedure_take_icon (GimpPlugInProcedure *proc,
gint data_length,
GError **error);
gboolean gimp_plug_in_procedure_take_icon (GimpPlugInProcedure *proc,
GimpIconType type,
guint8 *data,
gint data_length);
gint data_length,
GError **error);
void gimp_plug_in_procedure_set_image_types (GimpPlugInProcedure *proc,
const gchar *image_types);

View File

@ -593,7 +593,8 @@ plug_in_icon_deserialize (GScanner *scanner,
}
gimp_plug_in_procedure_take_icon (proc, icon_type,
icon_data, icon_data_length);
icon_data, icon_data_length,
NULL);
if (! gimp_scanner_parse_token (scanner, G_TOKEN_RIGHT_PAREN))
return G_TOKEN_RIGHT_PAREN;

View File

@ -114,7 +114,8 @@ xcf_init (Gimp *gimp)
proc->menu_label = g_strdup (N_("GIMP XCF image"));
gimp_plug_in_procedure_set_icon (proc, GIMP_ICON_TYPE_ICON_NAME,
(const guint8 *) "gimp-wilber",
strlen ("gimp-wilber") + 1);
strlen ("gimp-wilber") + 1,
NULL);
gimp_plug_in_procedure_set_image_types (proc, "RGB*, GRAY*, INDEXED*");
gimp_plug_in_procedure_set_file_proc (proc, "xcf", "", NULL);
gimp_plug_in_procedure_set_mime_types (proc, "image/x-xcf");
@ -185,7 +186,8 @@ xcf_init (Gimp *gimp)
proc->menu_label = g_strdup (N_("GIMP XCF image"));
gimp_plug_in_procedure_set_icon (proc, GIMP_ICON_TYPE_ICON_NAME,
(const guint8 *) "gimp-wilber",
strlen ("gimp-wilber") + 1);
strlen ("gimp-wilber") + 1,
NULL);
gimp_plug_in_procedure_set_image_types (proc, NULL);
gimp_plug_in_procedure_set_file_proc (proc, "xcf", "",
"0,string,gimp\\040xcf\\040");

View File

@ -422,6 +422,51 @@ _gimp_pdb_get_proc_menu_paths (const gchar *procedure_name,
return menu_paths;
}
/**
* _gimp_pdb_set_proc_icon:
* @procedure_name: The procedure for which to install the icon.
* @icon_type: The type of the icon.
* @icon_data_length: The length of 'icon-data'.
* @icon_data: (array length=icon_data_length) (element-type guint8): The procedure's icon. The format depends on the 'icon_type' parameter.
*
* Register an icon for a plug-in procedure.
*
* This procedure installs an icon for the given procedure.
*
* Returns: TRUE on success.
*
* Since: 3.0
**/
gboolean
_gimp_pdb_set_proc_icon (const gchar *procedure_name,
GimpIconType icon_type,
gint icon_data_length,
const guint8 *icon_data)
{
GimpValueArray *args;
GimpValueArray *return_vals;
gboolean success = TRUE;
args = gimp_value_array_new_from_types (NULL,
G_TYPE_STRING, procedure_name,
GIMP_TYPE_ICON_TYPE, icon_type,
G_TYPE_INT, icon_data_length,
GIMP_TYPE_UINT8_ARRAY, NULL,
G_TYPE_NONE);
gimp_value_set_uint8_array (gimp_value_array_index (args, 3), icon_data, icon_data_length);
return_vals = gimp_pdb_run_procedure_array (gimp_get_pdb (),
"gimp-pdb-set-proc-icon",
args);
gimp_value_array_unref (args);
success = GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS;
gimp_value_array_unref (return_vals);
return success;
}
/**
* _gimp_pdb_get_proc_documentation:
* @procedure_name: The procedure name.

View File

@ -54,6 +54,10 @@ G_GNUC_INTERNAL gboolean _gimp_pdb_add_proc_menu_path (const gchar
const gchar *menu_path);
G_GNUC_INTERNAL gchar** _gimp_pdb_get_proc_menu_paths (const gchar *procedure_name,
gint *num_menu_paths);
G_GNUC_INTERNAL gboolean _gimp_pdb_set_proc_icon (const gchar *procedure_name,
GimpIconType icon_type,
gint icon_data_length,
const guint8 *icon_data);
G_GNUC_INTERNAL gboolean _gimp_pdb_get_proc_documentation (const gchar *procedure_name,
gchar **blurb,
gchar **help,

View File

@ -149,51 +149,6 @@ _gimp_plugin_menu_branch_register (const gchar *menu_path,
return success;
}
/**
* _gimp_plugin_icon_register:
* @procedure_name: The procedure for which to install the icon.
* @icon_type: The type of the icon.
* @icon_data_length: The length of 'icon-data'.
* @icon_data: (array length=icon_data_length) (element-type guint8): The procedure's icon. The format depends on the 'icon_type' parameter.
*
* Register an icon for a plug-in procedure.
*
* This procedure installs an icon for the given procedure.
*
* Returns: TRUE on success.
*
* Since: 2.2
**/
gboolean
_gimp_plugin_icon_register (const gchar *procedure_name,
GimpIconType icon_type,
gint icon_data_length,
const guint8 *icon_data)
{
GimpValueArray *args;
GimpValueArray *return_vals;
gboolean success = TRUE;
args = gimp_value_array_new_from_types (NULL,
G_TYPE_STRING, procedure_name,
GIMP_TYPE_ICON_TYPE, icon_type,
G_TYPE_INT, icon_data_length,
GIMP_TYPE_UINT8_ARRAY, NULL,
G_TYPE_NONE);
gimp_value_set_uint8_array (gimp_value_array_index (args, 3), icon_data, icon_data_length);
return_vals = gimp_pdb_run_procedure_array (gimp_get_pdb (),
"gimp-plugin-icon-register",
args);
gimp_value_array_unref (args);
success = GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS;
gimp_value_array_unref (return_vals);
return success;
}
/**
* _gimp_plugin_set_pdb_error_handler:
* @handler: Who is responsible for handling procedure call errors.

View File

@ -38,10 +38,6 @@ G_GNUC_INTERNAL gboolean _gimp_plugin_help_register (const gc
const gchar *domain_uri);
G_GNUC_INTERNAL gboolean _gimp_plugin_menu_branch_register (const gchar *menu_path,
const gchar *menu_name);
G_GNUC_INTERNAL gboolean _gimp_plugin_icon_register (const gchar *procedure_name,
GimpIconType icon_type,
gint icon_data_length,
const guint8 *icon_data);
G_GNUC_INTERNAL gboolean _gimp_plugin_set_pdb_error_handler (GimpPDBErrorHandler handler);
G_GNUC_INTERNAL GimpPDBErrorHandler _gimp_plugin_get_pdb_error_handler (void);

View File

@ -288,6 +288,65 @@ gimp_procedure_get_property (GObject *object,
}
}
static void
gimp_procedure_install_icon (GimpProcedure *procedure)
{
GimpIconType icon_type;
guint8 *icon_data = NULL;
gsize icon_data_length = 0;
icon_type = gimp_procedure_get_icon_type (procedure);
switch (icon_type)
{
case GIMP_ICON_TYPE_ICON_NAME:
{
icon_data = (guint8 *) gimp_procedure_get_icon_name (procedure);
if (icon_data)
icon_data_length = strlen ((gchar *) icon_data) + 1;
}
break;
case GIMP_ICON_TYPE_PIXBUF:
{
GdkPixbuf *pixbuf = gimp_procedure_get_icon_pixbuf (procedure);
if (pixbuf)
gdk_pixbuf_save_to_buffer (pixbuf,
(gchar **) &icon_data, &icon_data_length,
"png", NULL, NULL);
}
break;
case GIMP_ICON_TYPE_IMAGE_FILE:
{
GFile *file = gimp_procedure_get_icon_file (procedure);
if (file)
{
icon_data = (guchar *) g_file_get_uri (file);
icon_data_length = strlen ((gchar *) icon_data) + 1;
}
}
break;
}
if (icon_data)
_gimp_pdb_set_proc_icon (gimp_procedure_get_name (procedure),
icon_type, icon_data_length, icon_data);
switch (icon_type)
{
case GIMP_ICON_TYPE_ICON_NAME:
break;
case GIMP_ICON_TYPE_PIXBUF:
case GIMP_ICON_TYPE_IMAGE_FILE:
g_free (icon_data);
break;
}
}
static void
gimp_procedure_real_install (GimpProcedure *procedure)
{
@ -298,9 +357,6 @@ gimp_procedure_real_install (GimpProcedure *procedure)
GList *list;
GimpPlugIn *plug_in;
GPProcInstall proc_install;
GimpIconType icon_type;
guint8 *icon_data = NULL;
gsize icon_data_length = 0;
gint i;
g_return_if_fail (procedure->priv->installed == FALSE);
@ -341,60 +397,11 @@ gimp_procedure_real_install (GimpProcedure *procedure)
&proc_install, plug_in))
gimp_quit ();
icon_type = gimp_procedure_get_icon_type (procedure);
switch (icon_type)
{
case GIMP_ICON_TYPE_ICON_NAME:
{
icon_data = (guint8 *) gimp_procedure_get_icon_name (procedure);
if (icon_data)
icon_data_length = strlen ((gchar *) icon_data) + 1;
}
break;
case GIMP_ICON_TYPE_PIXBUF:
{
GdkPixbuf *pixbuf = gimp_procedure_get_icon_pixbuf (procedure);
if (pixbuf)
gdk_pixbuf_save_to_buffer (pixbuf,
(gchar **) &icon_data, &icon_data_length,
"png", NULL, NULL);
}
break;
case GIMP_ICON_TYPE_IMAGE_FILE:
{
GFile *file = gimp_procedure_get_icon_file (procedure);
if (file)
{
icon_data = (guchar *) g_file_get_uri (file);
icon_data_length = strlen ((gchar *) icon_data) + 1;
}
}
break;
}
if (icon_data)
_gimp_plugin_icon_register (gimp_procedure_get_name (procedure),
icon_type, icon_data_length, icon_data);
switch (icon_type)
{
case GIMP_ICON_TYPE_ICON_NAME:
break;
case GIMP_ICON_TYPE_PIXBUF:
case GIMP_ICON_TYPE_IMAGE_FILE:
g_free (icon_data);
break;
}
g_free (proc_install.params);
g_free (proc_install.return_vals);
gimp_procedure_install_icon (procedure);
for (list = gimp_procedure_get_menu_paths (procedure);
list;
list = g_list_next (list))
@ -1642,6 +1649,9 @@ gimp_procedure_set_icon (GimpProcedure *procedure,
default:
g_return_if_reached ();
}
if (procedure->priv->installed)
gimp_procedure_install_icon (procedure);
}

View File

@ -437,6 +437,48 @@ CODE
);
}
sub pdb_set_proc_icon {
$blurb = "Register an icon for a plug-in procedure.";
$help = <<HELP;
This procedure installs an icon for the given procedure.
HELP
&mitch_pdb_misc('2019', '3.0');
$lib_private = 1;
@inargs = (
{ name => 'procedure_name', type => 'string', non_empty => 1,
desc => 'The procedure for which to install the icon' },
{ name => 'icon_type', type => 'enum GimpIconType',
desc => 'The type of the icon' },
{ name => 'icon_data', type => 'int8array',
desc => "The procedure's icon. The format depends on the
'icon_type' parameter",
array => { name => 'icon_data_length', type => '1 <= int32',
desc => "The length of 'icon-data'" } }
);
%invoke = (
code => <<'CODE'
{
GimpPlugIn *plug_in = gimp->plug_in_manager->current_plug_in;
if (plug_in &&
gimp_pdb_is_canonical_procedure (procedure_name, error))
{
success = gimp_plug_in_set_proc_icon (plug_in, procedure_name,
icon_type,
icon_data, icon_data_length);
}
else
success = FALSE;
}
CODE
);
}
sub pdb_get_proc_documentation {
$blurb = <<'BLURB';
Queries the procedural database for documentation on the specified procedure.
@ -813,6 +855,7 @@ CODE
pdb_get_proc_menu_label
pdb_add_proc_menu_path
pdb_get_proc_menu_paths
pdb_set_proc_icon
pdb_get_proc_documentation
pdb_get_proc_attribution
pdb_get_proc_argument

View File

@ -183,56 +183,6 @@ CODE
);
}
sub plugin_icon_register {
$blurb = "Register an icon for a plug-in procedure.";
$help = <<HELP;
This procedure installs an icon for the given procedure.
HELP
&mitch_pdb_misc('2004', '2.2');
$lib_private = 1;
@inargs = (
{ name => 'procedure_name', type => 'string', non_empty => 1,
desc => 'The procedure for which to install the icon' },
{ name => 'icon_type', type => 'enum GimpIconType',
desc => 'The type of the icon' },
{ name => 'icon_data', type => 'int8array',
desc => "The procedure's icon. The format depends on the
'icon_type' parameter",
array => { name => 'icon_data_length', type => '1 <= int32',
desc => "The length of 'icon-data'" } }
);
%invoke = (
code => <<'CODE'
{
GimpPlugIn *plug_in = gimp->plug_in_manager->current_plug_in;
if (plug_in &&
plug_in->call_mode == GIMP_PLUG_IN_CALL_QUERY &&
gimp_pdb_is_canonical_procedure (procedure_name, error))
{
GimpPlugInProcedure *proc;
proc = gimp_plug_in_procedure_find (plug_in->plug_in_def->procedures,
procedure_name);
if (proc)
gimp_plug_in_procedure_set_icon (proc, icon_type,
icon_data, icon_data_length);
else
success = FALSE;
}
else
success = FALSE;
}
CODE
);
}
sub plugin_set_pdb_error_handler {
$blurb = "Sets an error handler for procedure calls.";
@ -322,11 +272,10 @@ CODE
plugin_domain_register
plugin_help_register
plugin_menu_branch_register
plugin_icon_register
plugin_set_pdb_error_handler
plugin_get_pdb_error_handler);
%exports = (app => [@procs], lib => [@procs[1,2,3,4,5,6]]);
%exports = (app => [@procs], lib => [@procs[1,2,3,4,5]]);
$desc = 'Plug-in';