2004-08-08 Michael Natterer <mitch@gimp.org> * app/plug-in/plug-in-proc.[ch] (plug_in_proc_def_get_sensitive): new function which checks a GimpImageType against the proc_def->image_types_val mask. * app/actions/plug-in-actions.c: use the new function here. Also separated setting the "Repeat last" and "Reshow last" actions' labels from setting their sensitivity and made them use the same sensitivity logic as all other plug-in actions. Fixes bug #149567.
281 lines
6.5 KiB
C
281 lines
6.5 KiB
C
/* The GIMP -- an image manipulation program
|
|
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include <string.h>
|
|
|
|
#include <glib-object.h>
|
|
#include <gdk-pixbuf/gdk-pixbuf.h>
|
|
|
|
#include "libgimpbase/gimpbase.h"
|
|
|
|
#include "plug-in-types.h"
|
|
|
|
#include "core/gimp.h"
|
|
|
|
#include "plug-in.h"
|
|
#include "plug-ins.h"
|
|
#include "plug-in-proc.h"
|
|
|
|
#include "gimp-intl.h"
|
|
|
|
|
|
PlugInProcDef *
|
|
plug_in_proc_def_new (void)
|
|
{
|
|
PlugInProcDef *proc_def = g_new0 (PlugInProcDef, 1);
|
|
|
|
proc_def->icon_data_length = -1;
|
|
|
|
return proc_def;
|
|
}
|
|
|
|
void
|
|
plug_in_proc_def_free (PlugInProcDef *proc_def)
|
|
{
|
|
gint i;
|
|
|
|
g_return_if_fail (proc_def != NULL);
|
|
|
|
g_free (proc_def->db_info.name);
|
|
g_free (proc_def->db_info.blurb);
|
|
g_free (proc_def->db_info.help);
|
|
g_free (proc_def->db_info.author);
|
|
g_free (proc_def->db_info.copyright);
|
|
g_free (proc_def->db_info.date);
|
|
|
|
for (i = 0; i < proc_def->db_info.num_args; i++)
|
|
{
|
|
g_free (proc_def->db_info.args[i].name);
|
|
g_free (proc_def->db_info.args[i].description);
|
|
}
|
|
|
|
for (i = 0; i < proc_def->db_info.num_values; i++)
|
|
{
|
|
g_free (proc_def->db_info.values[i].name);
|
|
g_free (proc_def->db_info.values[i].description);
|
|
}
|
|
|
|
g_free (proc_def->db_info.args);
|
|
g_free (proc_def->db_info.values);
|
|
|
|
g_free (proc_def->prog);
|
|
g_free (proc_def->menu_label);
|
|
|
|
g_list_foreach (proc_def->menu_paths, (GFunc) g_free, NULL);
|
|
g_list_free (proc_def->menu_paths);
|
|
|
|
g_free (proc_def->icon_data);
|
|
g_free (proc_def->image_types);
|
|
|
|
g_free (proc_def->extensions);
|
|
g_free (proc_def->prefixes);
|
|
g_free (proc_def->magics);
|
|
g_free (proc_def->mime_type);
|
|
|
|
g_slist_foreach (proc_def->extensions_list, (GFunc) g_free, NULL);
|
|
g_slist_free (proc_def->extensions_list);
|
|
|
|
g_slist_foreach (proc_def->prefixes_list, (GFunc) g_free, NULL);
|
|
g_slist_free (proc_def->prefixes_list);
|
|
|
|
g_slist_foreach (proc_def->magics_list, (GFunc) g_free, NULL);
|
|
g_slist_free (proc_def->magics_list);
|
|
|
|
g_free (proc_def);
|
|
}
|
|
|
|
const ProcRecord *
|
|
plug_in_proc_def_get_proc (const PlugInProcDef *proc_def)
|
|
{
|
|
g_return_val_if_fail (proc_def != NULL, NULL);
|
|
|
|
return &proc_def->db_info;
|
|
}
|
|
|
|
const gchar *
|
|
plug_in_proc_def_get_progname (const PlugInProcDef *proc_def)
|
|
{
|
|
g_return_val_if_fail (proc_def != NULL, NULL);
|
|
|
|
switch (proc_def->db_info.proc_type)
|
|
{
|
|
case GIMP_PLUGIN:
|
|
case GIMP_EXTENSION:
|
|
return proc_def->prog;
|
|
|
|
case GIMP_TEMPORARY:
|
|
return ((PlugIn *) proc_def->db_info.exec_method.temporary.plug_in)->prog;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
gchar *
|
|
plug_in_proc_def_get_label (const PlugInProcDef *proc_def,
|
|
const gchar *locale_domain)
|
|
{
|
|
const gchar *path;
|
|
gchar *stripped;
|
|
gchar *ellipses;
|
|
gchar *label;
|
|
|
|
g_return_val_if_fail (proc_def != NULL, NULL);
|
|
|
|
if (proc_def->menu_label)
|
|
path = dgettext (locale_domain, proc_def->menu_label);
|
|
else if (proc_def->menu_paths)
|
|
path = dgettext (locale_domain, proc_def->menu_paths->data);
|
|
else
|
|
return NULL;
|
|
|
|
stripped = gimp_strip_uline (path);
|
|
|
|
if (proc_def->menu_label)
|
|
label = g_strdup (stripped);
|
|
else
|
|
label = g_path_get_basename (stripped);
|
|
|
|
g_free (stripped);
|
|
|
|
ellipses = strstr (label, "...");
|
|
|
|
if (ellipses && ellipses == (label + strlen (label) - 3))
|
|
*ellipses = '\0';
|
|
|
|
return label;
|
|
}
|
|
|
|
const gchar *
|
|
plug_in_proc_def_get_stock_id (const PlugInProcDef *proc_def)
|
|
{
|
|
g_return_val_if_fail (proc_def != NULL, NULL);
|
|
|
|
switch (proc_def->icon_type)
|
|
{
|
|
case GIMP_ICON_TYPE_STOCK_ID:
|
|
return proc_def->icon_data;
|
|
|
|
default:
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
GdkPixbuf *
|
|
plug_in_proc_def_get_pixbuf (const PlugInProcDef *proc_def)
|
|
{
|
|
GdkPixbuf *pixbuf = NULL;
|
|
GError *error = NULL;
|
|
|
|
g_return_val_if_fail (proc_def != NULL, NULL);
|
|
|
|
switch (proc_def->icon_type)
|
|
{
|
|
case GIMP_ICON_TYPE_INLINE_PIXBUF:
|
|
pixbuf = gdk_pixbuf_new_from_inline (proc_def->icon_data_length,
|
|
proc_def->icon_data, TRUE, &error);
|
|
if (! pixbuf)
|
|
{
|
|
g_printerr (error->message);
|
|
g_clear_error (&error);
|
|
}
|
|
break;
|
|
|
|
case GIMP_ICON_TYPE_IMAGE_FILE:
|
|
pixbuf = gdk_pixbuf_new_from_file (proc_def->icon_data, &error);
|
|
if (! pixbuf)
|
|
{
|
|
g_printerr (error->message);
|
|
g_clear_error (&error);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return pixbuf;
|
|
}
|
|
|
|
gchar *
|
|
plug_in_proc_def_get_help_id (const PlugInProcDef *proc_def,
|
|
const gchar *help_domain)
|
|
{
|
|
gchar *help_id;
|
|
gchar *p;
|
|
|
|
g_return_val_if_fail (proc_def != NULL, NULL);
|
|
|
|
help_id = g_strdup (proc_def->db_info.name);
|
|
|
|
for (p = help_id; p && *p; p++)
|
|
if (*p == '_')
|
|
*p = '-';
|
|
|
|
if (help_domain)
|
|
{
|
|
gchar *domain_and_id;
|
|
|
|
domain_and_id = g_strconcat (help_domain, "?", help_id, NULL);
|
|
g_free (help_id);
|
|
|
|
return domain_and_id;
|
|
}
|
|
|
|
return help_id;
|
|
}
|
|
|
|
gboolean
|
|
plug_in_proc_def_get_sensitive (const PlugInProcDef *proc_def,
|
|
GimpImageType image_type)
|
|
{
|
|
gboolean sensitive;
|
|
|
|
g_return_val_if_fail (proc_def != NULL, FALSE);
|
|
|
|
switch (image_type)
|
|
{
|
|
case GIMP_RGB_IMAGE:
|
|
sensitive = proc_def->image_types_val & PLUG_IN_RGB_IMAGE;
|
|
break;
|
|
case GIMP_RGBA_IMAGE:
|
|
sensitive = proc_def->image_types_val & PLUG_IN_RGBA_IMAGE;
|
|
break;
|
|
case GIMP_GRAY_IMAGE:
|
|
sensitive = proc_def->image_types_val & PLUG_IN_GRAY_IMAGE;
|
|
break;
|
|
case GIMP_GRAYA_IMAGE:
|
|
sensitive = proc_def->image_types_val & PLUG_IN_GRAYA_IMAGE;
|
|
break;
|
|
case GIMP_INDEXED_IMAGE:
|
|
sensitive = proc_def->image_types_val & PLUG_IN_INDEXED_IMAGE;
|
|
break;
|
|
case GIMP_INDEXEDA_IMAGE:
|
|
sensitive = proc_def->image_types_val & PLUG_IN_INDEXEDA_IMAGE;
|
|
break;
|
|
default:
|
|
sensitive = FALSE;
|
|
break;
|
|
}
|
|
|
|
return sensitive ? TRUE : FALSE;
|
|
}
|