app: fix plug-in procedure sensitivity with no image types set.

In particular, when setting a sensitivity mask but no image types, the
procedure was always sensitive.
Also make gimp_plug_in_procedure_get_sensitive() more robust.
This commit is contained in:
Jehan
2025-02-14 19:49:00 +01:00
parent c4c3a2f25d
commit 059e9344a1
2 changed files with 37 additions and 27 deletions

View File

@ -117,9 +117,7 @@ plug_in_actions_update (GimpActionGroup *group,
{ {
GimpPlugInProcedure *proc = list->data; GimpPlugInProcedure *proc = list->data;
if (proc->menu_label && if (proc->menu_label && ! proc->file_proc)
! proc->file_proc &&
proc->image_types_val)
{ {
GimpProcedure *procedure = GIMP_PROCEDURE (proc); GimpProcedure *procedure = GIMP_PROCEDURE (proc);
gboolean sensitive; gboolean sensitive;

View File

@ -142,6 +142,7 @@ gimp_plug_in_procedure_init (GimpPlugInProcedure *proc)
GIMP_PROCEDURE (proc)->proc_type = GIMP_PDB_PROC_TYPE_PLUGIN; GIMP_PROCEDURE (proc)->proc_type = GIMP_PDB_PROC_TYPE_PLUGIN;
proc->icon_data_length = -1; proc->icon_data_length = -1;
proc->sensitivity_mask = GIMP_PROCEDURE_SENSITIVE_DRAWABLE;
} }
static void static void
@ -318,37 +319,45 @@ gimp_plug_in_procedure_get_sensitive (GimpProcedure *procedure,
image_type = gimp_babl_format_get_image_type (format); image_type = gimp_babl_format_get_image_type (format);
} }
switch (image_type) if (proc->image_types_val)
{ {
case GIMP_RGB_IMAGE: switch (image_type)
sensitive = proc->image_types_val & GIMP_PLUG_IN_RGB_IMAGE; {
break; case GIMP_RGB_IMAGE:
case GIMP_RGBA_IMAGE: sensitive = proc->image_types_val & GIMP_PLUG_IN_RGB_IMAGE;
sensitive = proc->image_types_val & GIMP_PLUG_IN_RGBA_IMAGE; break;
break; case GIMP_RGBA_IMAGE:
case GIMP_GRAY_IMAGE: sensitive = proc->image_types_val & GIMP_PLUG_IN_RGBA_IMAGE;
sensitive = proc->image_types_val & GIMP_PLUG_IN_GRAY_IMAGE; break;
break; case GIMP_GRAY_IMAGE:
case GIMP_GRAYA_IMAGE: sensitive = proc->image_types_val & GIMP_PLUG_IN_GRAY_IMAGE;
sensitive = proc->image_types_val & GIMP_PLUG_IN_GRAYA_IMAGE; break;
break; case GIMP_GRAYA_IMAGE:
case GIMP_INDEXED_IMAGE: sensitive = proc->image_types_val & GIMP_PLUG_IN_GRAYA_IMAGE;
sensitive = proc->image_types_val & GIMP_PLUG_IN_INDEXED_IMAGE; break;
break; case GIMP_INDEXED_IMAGE:
case GIMP_INDEXEDA_IMAGE: sensitive = proc->image_types_val & GIMP_PLUG_IN_INDEXED_IMAGE;
sensitive = proc->image_types_val & GIMP_PLUG_IN_INDEXEDA_IMAGE; break;
break; case GIMP_INDEXEDA_IMAGE:
default: sensitive = proc->image_types_val & GIMP_PLUG_IN_INDEXEDA_IMAGE;
break; break;
default:
sensitive = FALSE;
break;
}
}
else
{
sensitive = (image_type != -1);
} }
if (! image && if (! image &&
(proc->sensitivity_mask & GIMP_PROCEDURE_SENSITIVE_NO_IMAGE) != 0) (proc->sensitivity_mask & GIMP_PROCEDURE_SENSITIVE_NO_IMAGE) != 0)
sensitive = TRUE; sensitive = TRUE;
else if (g_list_length (drawables) == 1 && proc->sensitivity_mask != 0 && else if (g_list_length (drawables) == 1 &&
(proc->sensitivity_mask & GIMP_PROCEDURE_SENSITIVE_DRAWABLE) == 0) (proc->sensitivity_mask & GIMP_PROCEDURE_SENSITIVE_DRAWABLE) == 0)
sensitive = FALSE; sensitive = FALSE;
else if (g_list_length (drawables) == 0 && else if (image && g_list_length (drawables) == 0 &&
(proc->sensitivity_mask & GIMP_PROCEDURE_SENSITIVE_NO_DRAWABLES) == 0) (proc->sensitivity_mask & GIMP_PROCEDURE_SENSITIVE_NO_DRAWABLES) == 0)
sensitive = FALSE; sensitive = FALSE;
else if (g_list_length (drawables) > 1 && else if (g_list_length (drawables) > 1 &&
@ -1091,7 +1100,10 @@ gimp_plug_in_procedure_set_sensitivity_mask (GimpPlugInProcedure *proc,
{ {
g_return_if_fail (GIMP_IS_PLUG_IN_PROCEDURE (proc)); g_return_if_fail (GIMP_IS_PLUG_IN_PROCEDURE (proc));
proc->sensitivity_mask = sensitivity_mask; if (sensitivity_mask == 0)
proc->sensitivity_mask = GIMP_PROCEDURE_SENSITIVE_DRAWABLE;
else
proc->sensitivity_mask = sensitivity_mask;
} }
static GSList * static GSList *