app: do not assume procedures always have a run mode.

This is especially true since procedures are defined by plug-ins,
possibly third-party. So they may not have a first run mode parameter.
Also we don't want plug-ins to generate CRITICALs in the core
application.
Therefore before trying to get and/or set the run mode parameter, always
check that this first parameter exists, and if so, is it a GimpRunMode
enum?

Fixes similar errors:
> GIMP-CRITICAL: gimp_value_array_index: assertion 'index < value_array->n_values' failed

Moreover it also makes sense to allow plug-ins to not have such
parameter. What if you make a plug-in which always work in a single mode
and don't ever plan/want to make it work interactively for instance?

Lastly old Python 2 plug-ins didn't even have a run mode parameter (I
guess our old Python 2 wrapper was getting rid of it?).
This commit is contained in:
Jehan 2019-08-01 18:20:31 +02:00
parent c059839e78
commit 71d0251d2c
1 changed files with 46 additions and 21 deletions

View File

@ -60,7 +60,8 @@ procedure_commands_get_run_mode_arg (GimpProcedure *procedure)
n_args++;
}
gimp_value_array_truncate (args, n_args);
if (n_args > 0)
gimp_value_array_truncate (args, n_args);
return args;
}
@ -75,9 +76,13 @@ procedure_commands_get_data_args (GimpProcedure *procedure,
args = gimp_procedure_get_arguments (procedure);
/* initialize the first argument */
g_value_set_enum (gimp_value_array_index (args, n_args),
GIMP_RUN_INTERACTIVE);
n_args++;
if (gimp_value_array_length (args) > n_args &&
GIMP_IS_PARAM_SPEC_RUN_MODE (procedure->args[n_args]))
{
g_value_set_enum (gimp_value_array_index (args, n_args),
GIMP_RUN_INTERACTIVE);
n_args++;
}
if (gimp_value_array_length (args) > n_args &&
GIMP_IS_PARAM_SPEC_STRING (procedure->args[n_args]))
@ -96,7 +101,8 @@ procedure_commands_get_data_args (GimpProcedure *procedure,
}
}
gimp_value_array_truncate (args, n_args);
if (n_args > 0)
gimp_value_array_truncate (args, n_args);
return args;
}
@ -111,9 +117,13 @@ procedure_commands_get_image_args (GimpProcedure *procedure,
args = gimp_procedure_get_arguments (procedure);
/* initialize the first argument */
g_value_set_enum (gimp_value_array_index (args, n_args),
GIMP_RUN_INTERACTIVE);
n_args++;
if (gimp_value_array_length (args) > n_args &&
GIMP_IS_PARAM_SPEC_RUN_MODE (procedure->args[n_args]))
{
g_value_set_enum (gimp_value_array_index (args, n_args),
GIMP_RUN_INTERACTIVE);
n_args++;
}
if (gimp_value_array_length (args) > n_args &&
GIMP_IS_PARAM_SPEC_IMAGE_ID (procedure->args[n_args]))
@ -131,7 +141,8 @@ procedure_commands_get_image_args (GimpProcedure *procedure,
}
}
gimp_value_array_truncate (args, n_args);
if (n_args)
gimp_value_array_truncate (args, n_args);
return args;
}
@ -147,9 +158,13 @@ procedure_commands_get_item_args (GimpProcedure *procedure,
args = gimp_procedure_get_arguments (procedure);
/* initialize the first argument */
g_value_set_enum (gimp_value_array_index (args, n_args),
GIMP_RUN_INTERACTIVE);
n_args++;
if (gimp_value_array_length (args) > n_args &&
GIMP_IS_PARAM_SPEC_RUN_MODE (procedure->args[n_args]))
{
g_value_set_enum (gimp_value_array_index (args, n_args),
GIMP_RUN_INTERACTIVE);
n_args++;
}
if (gimp_value_array_length (args) > n_args &&
GIMP_IS_PARAM_SPEC_IMAGE_ID (procedure->args[n_args]))
@ -180,7 +195,8 @@ procedure_commands_get_item_args (GimpProcedure *procedure,
}
}
gimp_value_array_truncate (args, n_args);
if (n_args)
gimp_value_array_truncate (args, n_args);
return args;
}
@ -196,9 +212,13 @@ procedure_commands_get_display_args (GimpProcedure *procedure,
args = gimp_procedure_get_arguments (procedure);
/* initialize the first argument */
g_value_set_enum (gimp_value_array_index (args, n_args),
GIMP_RUN_INTERACTIVE);
n_args++;
if (gimp_value_array_length (args) > n_args &&
GIMP_IS_PARAM_SPEC_RUN_MODE (procedure->args[n_args]))
{
g_value_set_enum (gimp_value_array_index (args, n_args),
GIMP_RUN_INTERACTIVE);
n_args++;
}
if (gimp_value_array_length (args) > n_args &&
GIMP_IS_PARAM_SPEC_DISPLAY_ID (procedure->args[n_args]))
@ -256,7 +276,8 @@ procedure_commands_get_display_args (GimpProcedure *procedure,
n_args++;
}
gimp_value_array_truncate (args, n_args);
if (n_args)
gimp_value_array_truncate (args, n_args);
return args;
}
@ -275,8 +296,10 @@ procedure_commands_run_procedure (GimpProcedure *procedure,
g_return_val_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress), FALSE);
g_return_val_if_fail (args != NULL, FALSE);
g_value_set_enum (gimp_value_array_index (args, 0),
GIMP_RUN_NONINTERACTIVE);
if (gimp_value_array_length (args) > 0 &&
GIMP_IS_PARAM_SPEC_RUN_MODE (procedure->args[0]))
g_value_set_enum (gimp_value_array_index (args, 0),
GIMP_RUN_NONINTERACTIVE);
return_vals = gimp_procedure_execute (procedure, gimp,
gimp_get_user_context (gimp),
@ -313,8 +336,10 @@ procedure_commands_run_procedure_async (GimpProcedure *procedure,
g_return_val_if_fail (display == NULL || GIMP_IS_DISPLAY (display), FALSE);
g_return_val_if_fail (args != NULL, FALSE);
g_value_set_enum (gimp_value_array_index (args, 0),
run_mode);
if (gimp_value_array_length (args) > 0 &&
GIMP_IS_PARAM_SPEC_RUN_MODE (procedure->args[0]))
g_value_set_enum (gimp_value_array_index (args, 0),
run_mode);
gimp_procedure_execute_async (procedure, gimp,
gimp_get_user_context (gimp),