diff --git a/app/file-data/file-data-gbr.c b/app/file-data/file-data-gbr.c index ef3aaee5b9..4d16781848 100644 --- a/app/file-data/file-data-gbr.c +++ b/app/file-data/file-data-gbr.c @@ -435,6 +435,7 @@ file_gbr_image_to_brush (GimpImage *image, gint height; g_return_val_if_fail (n_drawables > 0, NULL); + g_return_val_if_fail (drawables != NULL, NULL); if (n_drawables > 1) { diff --git a/app/file-data/file-data-pat.c b/app/file-data/file-data-pat.c index fac6cf2f72..7d7f2c1a39 100644 --- a/app/file-data/file-data-pat.c +++ b/app/file-data/file-data-pat.c @@ -256,6 +256,7 @@ file_pat_image_to_pattern (GimpImage *image, gint height; g_return_val_if_fail (n_drawables > 0, NULL); + g_return_val_if_fail (drawables != NULL, NULL); if (n_drawables > 1) { diff --git a/libgimp/gimp.def b/libgimp/gimp.def index 0d0db0d95c..a41fdaa452 100644 --- a/libgimp/gimp.def +++ b/libgimp/gimp.def @@ -704,7 +704,6 @@ EXPORTS gimp_pdb_procedure_exists gimp_pdb_query_procedures gimp_pdb_run_procedure - gimp_pdb_run_procedure_argv gimp_pdb_run_procedure_array gimp_pdb_run_procedure_config gimp_pdb_run_procedure_valist diff --git a/libgimp/gimppdb.c b/libgimp/gimppdb.c index fab20a87d9..e6cfcbb537 100644 --- a/libgimp/gimppdb.c +++ b/libgimp/gimppdb.c @@ -20,6 +20,8 @@ #include "config.h" +#include + #include "gimp.h" #include "libgimpbase/gimpprotocol.h" @@ -192,11 +194,15 @@ gimp_pdb_lookup_procedure (GimpPDB *pdb, * gimp_pdb_run_procedure: (skip) * @pdb: the #GimpPDB object. * @procedure_name: the procedure registered name. - * @first_type: the #GType of the first argument, or #G_TYPE_NONE. + * @first_arg_name: the name of an argument of @procedure_name. * @...: the call arguments. * * Runs the procedure named @procedure_name with arguments given as - * list of (#GType, value) pairs, terminated by #G_TYPE_NONE. + * list of `(const gchar *, GType, value)` triplet, terminated by %NULL. + * + * The order of arguments does not matter and if any argument is missing, its + * default value will be used. The %GType must correspond to the argument type + * as registered for @procedure_name. * * Returns: (transfer full): the return values for the procedure call. * @@ -205,7 +211,7 @@ gimp_pdb_lookup_procedure (GimpPDB *pdb, GimpValueArray * gimp_pdb_run_procedure (GimpPDB *pdb, const gchar *procedure_name, - GType first_type, + const gchar *first_arg_name, ...) { GimpValueArray *return_values; @@ -214,10 +220,10 @@ gimp_pdb_run_procedure (GimpPDB *pdb, g_return_val_if_fail (GIMP_IS_PDB (pdb), NULL); g_return_val_if_fail (gimp_is_canonical_identifier (procedure_name), NULL); - va_start (args, first_type); + va_start (args, first_arg_name); return_values = gimp_pdb_run_procedure_valist (pdb, procedure_name, - first_type, args); + first_arg_name, args); va_end (args); @@ -228,11 +234,11 @@ gimp_pdb_run_procedure (GimpPDB *pdb, * gimp_pdb_run_procedure_valist: (skip) * @pdb: the #GimpPDB object. * @procedure_name: the procedure registered name. - * @first_type: the #GType of the first argument, or #G_TYPE_NONE. + * @first_arg_name: the name of an argument of @procedure_name. * @args: the call arguments. * - * Runs the procedure named @procedure_name with @args given in the - * order as passed to [method@PDB.run_procedure]. + * Runs the procedure named @procedure_name with arguments name, type and value + * given in the order as passed to [method@PDB.run_procedure]. * * Returns: (transfer full): the return values for the procedure call. * @@ -241,71 +247,70 @@ gimp_pdb_run_procedure (GimpPDB *pdb, GimpValueArray * gimp_pdb_run_procedure_valist (GimpPDB *pdb, const gchar *procedure_name, - GType first_type, + const gchar *first_arg_name, va_list args) { - GimpValueArray *arguments; - GimpValueArray *return_values; - gchar *error_msg = NULL; + GimpValueArray *return_values; + GimpProcedure *procedure; + GimpProcedureConfig *config; + const gchar *arg_name; g_return_val_if_fail (GIMP_IS_PDB (pdb), NULL); g_return_val_if_fail (gimp_is_canonical_identifier (procedure_name), NULL); - arguments = gimp_value_array_new_from_types_valist (&error_msg, - first_type, - args); + procedure = gimp_pdb_lookup_procedure (pdb, procedure_name); + config = gimp_procedure_create_config (procedure); - if (! arguments) + arg_name = first_arg_name; + + while (arg_name != NULL) { - GError *error = g_error_new_literal (GIMP_PDB_ERROR, - GIMP_PDB_ERROR_INTERNAL_ERROR, - error_msg); - g_printerr ("%s: %s", G_STRFUNC, error_msg); - g_free (error_msg); + GParamSpec *pspec; + gchar *error = NULL; + GValue value = G_VALUE_INIT; + GType type; - return gimp_procedure_new_return_values (NULL, - GIMP_PDB_CALLING_ERROR, - error); + type = va_arg (args, GType); + + if (type == G_TYPE_NONE) + { + g_warning ("%s: invalid argument '%s' with type G_TYPE_NONE.", G_STRFUNC, arg_name); + g_clear_object (&config); + return NULL; + } + + g_value_init (&value, type); + + G_VALUE_COLLECT (&value, args, G_VALUE_NOCOPY_CONTENTS, &error); + + if (error) + { + g_warning ("%s: %s", G_STRFUNC, error); + g_free (error); + g_clear_object (&config); + return NULL; + } + + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (config), arg_name); + if (pspec == NULL) + g_warning ("%s: %s has no property named '%s'", + G_STRFUNC, + g_type_name (G_TYPE_FROM_INSTANCE (config)), + arg_name); + else if (! g_type_is_a (type, pspec->value_type)) + g_warning ("%s: value of type %s is incompatible with argument '%s' of type %s", + G_STRFUNC, g_type_name (type), + arg_name, g_type_name (pspec->value_type)); + else + g_object_set_property (G_OBJECT (config), arg_name, &value); + + g_value_unset (&value); + + arg_name = va_arg (args, const gchar *); } - return_values = gimp_pdb_run_procedure_array (pdb, procedure_name, - arguments); - gimp_value_array_unref (arguments); - - return return_values; -} - -/** - * gimp_pdb_run_procedure_argv: (rename-to gimp_pdb_run_procedure) - * @pdb: the #GimpPDB object. - * @procedure_name: the registered name to call. - * @arguments: (array length=n_arguments) (nullable): the call arguments or %NULL. - * @n_arguments: the number of arguments. - * - * Runs the procedure named @procedure_name with @arguments. - * - * Returns: (transfer full): the return values for the procedure call. - * - * Since: 3.0 - */ -GimpValueArray * -gimp_pdb_run_procedure_argv (GimpPDB *pdb, - const gchar *procedure_name, - const GValue *arguments, - gint n_arguments) -{ - GimpValueArray *args; - GimpValueArray *return_values; - - g_return_val_if_fail (GIMP_IS_PDB (pdb), NULL); - g_return_val_if_fail (gimp_is_canonical_identifier (procedure_name), NULL); - /* Not require arguments != NULL. - * gimp_value_array_new_from_values(NULL, 0) will return empty GValueArray. - */ - - args = gimp_value_array_new_from_values (arguments, n_arguments); - return_values = gimp_pdb_run_procedure_array (pdb, procedure_name, args); - gimp_value_array_unref (args); + return_values = gimp_pdb_run_procedure_config (pdb, procedure_name, config); + g_clear_object (&config); return return_values; } diff --git a/libgimp/gimppdb.h b/libgimp/gimppdb.h index 22aca57d21..054560a40c 100644 --- a/libgimp/gimppdb.h +++ b/libgimp/gimppdb.h @@ -75,16 +75,12 @@ GimpProcedure * gimp_pdb_lookup_procedure (GimpPDB *pdb, GimpValueArray * gimp_pdb_run_procedure (GimpPDB *pdb, const gchar *procedure_name, - GType first_type, - ...); + const gchar *first_arg_name, + ...) G_GNUC_NULL_TERMINATED; GimpValueArray * gimp_pdb_run_procedure_valist (GimpPDB *pdb, const gchar *procedure_name, - GType first_type, + const gchar *first_arg_name, va_list args); -GimpValueArray * gimp_pdb_run_procedure_argv (GimpPDB *pdb, - const gchar *procedure_name, - const GValue *arguments, - gint n_arguments); GimpValueArray * gimp_pdb_run_procedure_array (GimpPDB *pdb, const gchar *procedure_name, const GimpValueArray *arguments); diff --git a/libgimp/gimpsaveproceduredialog.c b/libgimp/gimpsaveproceduredialog.c index 08771b7e73..dbdc449470 100644 --- a/libgimp/gimpsaveproceduredialog.c +++ b/libgimp/gimpsaveproceduredialog.c @@ -330,9 +330,9 @@ gimp_save_procedure_dialog_edit_metadata_thread (gpointer data) GimpSaveProcedureDialog *dialog = data; gimp_pdb_run_procedure (gimp_get_pdb (), "plug-in-metadata-editor", - GIMP_TYPE_RUN_MODE, GIMP_RUN_INTERACTIVE, - GIMP_TYPE_IMAGE, dialog->priv->image, - G_TYPE_NONE); + "run-mode", GIMP_TYPE_RUN_MODE, GIMP_RUN_INTERACTIVE, + "image", GIMP_TYPE_IMAGE, dialog->priv->image, + NULL); g_mutex_lock (&dialog->priv->metadata_thread_mutex); g_thread_unref (dialog->priv->metadata_thread); diff --git a/plug-ins/common/file-gbr.c b/plug-ins/common/file-gbr.c index 346e65f7b0..ead07b45ae 100644 --- a/plug-ins/common/file-gbr.c +++ b/plug-ins/common/file-gbr.c @@ -231,7 +231,6 @@ gbr_save (GimpProcedure *procedure, if (status == GIMP_PDB_SUCCESS) { - GimpValueArray *args; GimpValueArray *save_retvals; GimpObjectArray *drawables_array; gint spacing; @@ -241,21 +240,19 @@ gbr_save (GimpProcedure *procedure, "spacing", &spacing, NULL); - drawables_array = gimp_object_array_new (GIMP_TYPE_ITEM, (GObject **) drawables, + drawables_array = gimp_object_array_new (GIMP_TYPE_DRAWABLE, (GObject **) drawables, n_drawables, FALSE); - args = gimp_value_array_new_from_types (NULL, - GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, - GIMP_TYPE_IMAGE, image, - G_TYPE_INT, n_drawables, - GIMP_TYPE_OBJECT_ARRAY, drawables_array, - G_TYPE_FILE, file, - G_TYPE_INT, spacing, - G_TYPE_STRING, description, - G_TYPE_NONE); - save_retvals = gimp_pdb_run_procedure_array (gimp_get_pdb (), - "file-gbr-save-internal", - args); - gimp_value_array_unref (args); + save_retvals = + gimp_pdb_run_procedure (gimp_get_pdb (), + "file-gbr-save-internal", + "image", GIMP_TYPE_IMAGE, image, + "num-drawables", G_TYPE_INT, n_drawables, + "drawables", GIMP_TYPE_OBJECT_ARRAY, drawables_array, + "file", G_TYPE_FILE, file, + "spacing", G_TYPE_INT, spacing, + "name", G_TYPE_STRING, description, + NULL); + gimp_object_array_free (drawables_array); g_free (description); diff --git a/plug-ins/common/file-gih.c b/plug-ins/common/file-gih.c index 742b87c3fe..d85111552f 100644 --- a/plug-ins/common/file-gih.c +++ b/plug-ins/common/file-gih.c @@ -382,29 +382,25 @@ gih_save (GimpProcedure *procedure, if (status == GIMP_PDB_SUCCESS) { - GimpValueArray *save_retvals; - gchar *paramstring; - GimpValueArray *args; + GimpValueArray *save_retvals; + GimpObjectArray *drawables_array; + gchar *paramstring; paramstring = gimp_pixpipe_params_build (&gihparams); - args = gimp_value_array_new_from_types (NULL, - GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, - GIMP_TYPE_IMAGE, image, - G_TYPE_INT, n_drawables, - GIMP_TYPE_OBJECT_ARRAY, NULL, - G_TYPE_FILE, file, - G_TYPE_INT, spacing, - G_TYPE_STRING, description, - G_TYPE_STRING, paramstring, - G_TYPE_NONE); - gimp_value_set_object_array (gimp_value_array_index (args, 3), - GIMP_TYPE_ITEM, (GObject **) drawables, n_drawables); - - save_retvals = gimp_pdb_run_procedure_array (gimp_get_pdb (), - "file-gih-save-internal", - args); - gimp_value_array_unref (args); + drawables_array = gimp_object_array_new (GIMP_TYPE_DRAWABLE, (GObject **) drawables, + n_drawables, FALSE); + save_retvals = gimp_pdb_run_procedure (gimp_get_pdb (), + "file-gih-save-internal", + "image", GIMP_TYPE_IMAGE, image, + "num-drawables", G_TYPE_INT, n_drawables, + "drawables", GIMP_TYPE_OBJECT_ARRAY, drawables_array, + "file", G_TYPE_FILE, file, + "spacing", G_TYPE_INT, spacing, + "name", G_TYPE_STRING, description, + "params", G_TYPE_STRING, paramstring, + NULL); + gimp_object_array_free (drawables_array); if (GIMP_VALUES_GET_ENUM (save_retvals, 0) == GIMP_PDB_SUCCESS) { diff --git a/plug-ins/common/file-pat.c b/plug-ins/common/file-pat.c index 700ffd5d76..197fe6d8fb 100644 --- a/plug-ins/common/file-pat.c +++ b/plug-ins/common/file-pat.c @@ -209,28 +209,23 @@ pat_save (GimpProcedure *procedure, if (status == GIMP_PDB_SUCCESS) { - GimpValueArray *save_retvals; - GimpValueArray *args; + GimpValueArray *save_retvals; + GimpObjectArray *drawables_array; + + drawables_array = gimp_object_array_new (GIMP_TYPE_DRAWABLE, (GObject **) drawables, n_drawables, FALSE); g_object_get (config, "description", &description, NULL); - args = gimp_value_array_new_from_types (NULL, - GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, - GIMP_TYPE_IMAGE, image, - G_TYPE_INT, n_drawables, - GIMP_TYPE_OBJECT_ARRAY, NULL, - G_TYPE_FILE, file, - G_TYPE_STRING, description, - G_TYPE_NONE); - gimp_value_set_object_array (gimp_value_array_index (args, 3), - GIMP_TYPE_ITEM, (GObject **) drawables, n_drawables); - - save_retvals = gimp_pdb_run_procedure_array (gimp_get_pdb (), - "file-pat-save-internal", - args); - gimp_value_array_unref (args); + save_retvals = gimp_pdb_run_procedure (gimp_get_pdb (), + "file-pat-save-internal", + "image", GIMP_TYPE_IMAGE, image, + "num-drawables", G_TYPE_INT, n_drawables, + "drawables", GIMP_TYPE_OBJECT_ARRAY, drawables_array, + "file", G_TYPE_FILE, file, + "name", G_TYPE_STRING, description, + NULL); if (GIMP_VALUES_GET_ENUM (save_retvals, 0) != GIMP_PDB_SUCCESS) { @@ -243,6 +238,7 @@ pat_save (GimpProcedure *procedure, } gimp_value_array_unref (save_retvals); + gimp_object_array_free (drawables_array); } if (export == GIMP_EXPORT_EXPORT) diff --git a/plug-ins/common/file-pix.c b/plug-ins/common/file-pix.c index 6c1a5e87a0..32a52367d9 100644 --- a/plug-ins/common/file-pix.c +++ b/plug-ins/common/file-pix.c @@ -613,9 +613,9 @@ load_esm_image (GInputStream *input, return_vals = gimp_pdb_run_procedure (gimp_get_pdb (), "file-jpeg-load", - GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, - G_TYPE_FILE, temp_file, - G_TYPE_NONE); + "run-mode", GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, + "file", G_TYPE_FILE, temp_file, + NULL); if (return_vals) { diff --git a/plug-ins/common/plugin-browser.c b/plug-ins/common/plugin-browser.c index 22a90d14d4..e0b87300eb 100644 --- a/plug-ins/common/plugin-browser.c +++ b/plug-ins/common/plugin-browser.c @@ -373,8 +373,8 @@ browser_search (GimpBrowser *gimp_browser, return_vals = gimp_pdb_run_procedure (gimp_get_pdb (), "gimp-plug-ins-query", - G_TYPE_STRING, search_text, - G_TYPE_NONE); + "search-string", G_TYPE_STRING, search_text, + NULL); if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS) { diff --git a/plug-ins/file-icns/file-icns-load.c b/plug-ins/file-icns/file-icns-load.c index 259dcc2b2e..f6fe19f74e 100644 --- a/plug-ins/file-icns/file-icns-load.c +++ b/plug-ins/file-icns/file-icns-load.c @@ -442,9 +442,9 @@ icns_attach_image (GimpImage *image, return_vals = gimp_pdb_run_procedure (gimp_get_pdb (), procedure_name, - GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, - G_TYPE_FILE, temp_file, - G_TYPE_NONE); + "run-mode", GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, + "file", G_TYPE_FILE, temp_file, + NULL); } if (temp_image && return_vals) diff --git a/plug-ins/file-icns/file-icns-save.c b/plug-ins/file-icns/file-icns-save.c index 09448fe62b..7c284d0eaf 100644 --- a/plug-ins/file-icns/file-icns-save.c +++ b/plug-ins/file-icns/file-icns-save.c @@ -469,20 +469,20 @@ icns_export_image (GFile *file, return_vals = gimp_pdb_run_procedure (gimp_get_pdb (), "file-png-save", - GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, - GIMP_TYPE_IMAGE, image, - G_TYPE_INT, 1, - GIMP_TYPE_OBJECT_ARRAY, args, - G_TYPE_FILE, temp_file, - G_TYPE_BOOLEAN, FALSE, - G_TYPE_INT, 9, - G_TYPE_BOOLEAN, FALSE, - G_TYPE_BOOLEAN, FALSE, - G_TYPE_BOOLEAN, FALSE, - G_TYPE_BOOLEAN, FALSE, - G_TYPE_BOOLEAN, FALSE, - G_TYPE_BOOLEAN, FALSE, - G_TYPE_NONE); + "run-mode", GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, + "image", GIMP_TYPE_IMAGE, image, + "num-drawables", G_TYPE_INT, 1, + "drawables", GIMP_TYPE_OBJECT_ARRAY, args, + "file", G_TYPE_FILE, temp_file, + "interlaced", G_TYPE_BOOLEAN, FALSE, + "compression", G_TYPE_INT, 9, + "bkgd", G_TYPE_BOOLEAN, FALSE, + "offs", G_TYPE_BOOLEAN, FALSE, + "phys", G_TYPE_BOOLEAN, FALSE, + "time", G_TYPE_BOOLEAN, FALSE, + "save-transparent", G_TYPE_BOOLEAN, FALSE, + "optimize-palette", G_TYPE_BOOLEAN, FALSE, + NULL); gimp_object_array_free (args); g_clear_pointer (&drawables, g_free); diff --git a/plug-ins/file-ico/ico-dialog.c b/plug-ins/file-ico/ico-dialog.c index 1e4d3e74d5..89c14a29ca 100644 --- a/plug-ins/file-ico/ico-dialog.c +++ b/plug-ins/file-ico/ico-dialog.c @@ -507,11 +507,11 @@ ico_dialog_update_icon_preview (GtkWidget *dialog, return_vals = gimp_pdb_run_procedure (gimp_get_pdb (), "plug-in-threshold-alpha", - GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, - GIMP_TYPE_IMAGE, tmp_image, - GIMP_TYPE_DRAWABLE, tmp_layer, - G_TYPE_INT, ICO_ALPHA_THRESHOLD, - G_TYPE_NONE); + "run-mode", GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, + "image", GIMP_TYPE_IMAGE, tmp_image, + "drawable", GIMP_TYPE_DRAWABLE, tmp_layer, + "threshold", G_TYPE_INT, ICO_ALPHA_THRESHOLD, + NULL); gimp_value_array_unref (return_vals); diff --git a/plug-ins/file-ico/ico-save.c b/plug-ins/file-ico/ico-save.c index 222131f82b..8aac7f45aa 100644 --- a/plug-ins/file-ico/ico-save.c +++ b/plug-ins/file-ico/ico-save.c @@ -828,11 +828,11 @@ ico_image_get_reduced_buf (GimpDrawable *layer, return_vals = gimp_pdb_run_procedure (gimp_get_pdb (), "plug-in-threshold-alpha", - GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, - GIMP_TYPE_IMAGE, tmp_image, - GIMP_TYPE_DRAWABLE, tmp_layer, - G_TYPE_INT, ICO_ALPHA_THRESHOLD, - G_TYPE_NONE); + "run-mode", GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, + "image", GIMP_TYPE_IMAGE, tmp_image, + "drawable", GIMP_TYPE_DRAWABLE, tmp_layer, + "threshold", G_TYPE_INT, ICO_ALPHA_THRESHOLD, + NULL); gimp_value_array_unref (return_vals); } diff --git a/plug-ins/file-jpeg/jpeg-load.c b/plug-ins/file-jpeg/jpeg-load.c index d3dae05c16..84bf326dd5 100644 --- a/plug-ins/file-jpeg/jpeg-load.c +++ b/plug-ins/file-jpeg/jpeg-load.c @@ -499,12 +499,12 @@ load_image (GFile *file, return_vals = gimp_pdb_run_procedure (gimp_get_pdb (), "file-psd-load-metadata", - GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, - G_TYPE_FILE, temp_file, - G_TYPE_INT, photoshop_len, - GIMP_TYPE_IMAGE, image, - G_TYPE_BOOLEAN, FALSE, - G_TYPE_NONE); + "run-mode", GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, + "file", G_TYPE_FILE, temp_file, + "size", G_TYPE_INT, photoshop_len, + "image", GIMP_TYPE_IMAGE, image, + "metadata-type", G_TYPE_BOOLEAN, FALSE, + NULL); g_file_delete (temp_file, NULL, NULL); g_object_unref (temp_file); diff --git a/plug-ins/file-tiff/file-tiff-load.c b/plug-ins/file-tiff/file-tiff-load.c index a26e7af275..a230bb5e67 100644 --- a/plug-ins/file-tiff/file-tiff-load.c +++ b/plug-ins/file-tiff/file-tiff-load.c @@ -1769,12 +1769,12 @@ load_image (GFile *file, return_vals = gimp_pdb_run_procedure (gimp_get_pdb (), "file-psd-load-metadata", - GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, - G_TYPE_FILE, temp_file, - G_TYPE_INT, photoshop_len, - GIMP_TYPE_IMAGE, *image, - G_TYPE_BOOLEAN, FALSE, - G_TYPE_NONE); + "run-mode", GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, + "file", G_TYPE_FILE, temp_file, + "size", G_TYPE_INT, photoshop_len, + "image", GIMP_TYPE_IMAGE, *image, + "metadata-type", G_TYPE_BOOLEAN, FALSE, + NULL); g_file_delete (temp_file, NULL, NULL); g_object_unref (temp_file); @@ -1811,13 +1811,13 @@ load_image (GFile *file, return_vals = gimp_pdb_run_procedure (gimp_get_pdb (), "file-psd-load-metadata", - GIMP_TYPE_RUN_MODE, run_mode, - G_TYPE_FILE, temp_file, - G_TYPE_INT, photoshop_len, - GIMP_TYPE_IMAGE, *image, - G_TYPE_BOOLEAN, TRUE, - G_TYPE_BOOLEAN, is_cmyk, - G_TYPE_NONE); + "run-mode", GIMP_TYPE_RUN_MODE, run_mode, + "file", G_TYPE_FILE, temp_file, + "size", G_TYPE_INT, photoshop_len, + "image", GIMP_TYPE_IMAGE, *image, + "metadata-type", G_TYPE_BOOLEAN, TRUE, + "cmyk", G_TYPE_BOOLEAN, is_cmyk, + NULL); g_file_delete (temp_file, NULL, NULL); g_object_unref (temp_file); diff --git a/plug-ins/help/help.c b/plug-ins/help/help.c index 94cfaf9c31..b73f38e770 100644 --- a/plug-ins/help/help.c +++ b/plug-ins/help/help.c @@ -331,8 +331,8 @@ help_load_idle (gpointer data) return_vals = gimp_pdb_run_procedure (gimp_get_pdb (), idle_help->procedure, - G_TYPE_STRING, uri, - G_TYPE_NONE); + "domain-names", G_TYPE_STRING, uri, + NULL); gimp_value_array_unref (return_vals); g_free (uri); diff --git a/plug-ins/print/print.c b/plug-ins/print/print.c index 9d91a6c2a5..87849f2ed3 100644 --- a/plug-ins/print/print.c +++ b/plug-ins/print/print.c @@ -403,7 +403,7 @@ page_setup (GimpImage *image) return_vals = gimp_pdb_run_procedure (gimp_get_pdb (), name, - GIMP_TYPE_IMAGE, image, + "image", GIMP_TYPE_IMAGE, image, G_TYPE_NONE); gimp_value_array_unref (return_vals); diff --git a/plug-ins/script-fu/libscriptfu/scheme-wrapper.c b/plug-ins/script-fu/libscriptfu/scheme-wrapper.c index 58a210f697..4c127324f3 100644 --- a/plug-ins/script-fu/libscriptfu/scheme-wrapper.c +++ b/plug-ins/script-fu/libscriptfu/scheme-wrapper.c @@ -638,18 +638,17 @@ script_fu_marshal_procedure_call (scheme *sc, gboolean permissive, gboolean deprecated) { - GimpProcedure *procedure; - GimpValueArray *args; - GimpValueArray *values = NULL; - gchar *proc_name; - GParamSpec **arg_specs; - gint n_arg_specs; - gint actual_arg_count; - gint consumed_arg_count = 0; - gchar error_str[1024]; - gint i; - pointer return_val = sc->NIL; - + GimpProcedure *procedure; + GimpProcedureConfig *config; + GimpValueArray *values = NULL; + gchar *proc_name; + GParamSpec **arg_specs; + gint n_arg_specs; + gint actual_arg_count; + gint consumed_arg_count = 0; + gchar error_str[1024]; + gint i; + pointer return_val = sc->NIL; g_debug ("In %s()", G_STRFUNC); @@ -688,6 +687,7 @@ script_fu_marshal_procedure_call (scheme *sc, return script_error (sc, error_str, 0); } + config = gimp_procedure_create_config (procedure); arg_specs = gimp_procedure_get_arguments (procedure, &n_arg_specs); actual_arg_count = sc->vptr->list_length (sc, a) - 1; @@ -720,8 +720,6 @@ script_fu_marshal_procedure_call (scheme *sc, } /* Marshall the supplied arguments */ - args = gimp_value_array_new (n_arg_specs); - for (i = 0; i < n_arg_specs; i++) { GParamSpec *arg_spec = arg_specs[i]; @@ -846,8 +844,7 @@ script_fu_marshal_procedure_call (scheme *sc, { g_printerr (" "); for (j = 0; j < count; ++j) - g_printerr (" \"%s\"", - args[i].data.d_strv[j]); + g_printerr (" \"%s\"", array[j]); g_printerr ("\n"); } } @@ -988,7 +985,12 @@ script_fu_marshal_procedure_call (scheme *sc, */ gint32 *array; - n_elements = GIMP_VALUES_GET_INT (args, i - 1); + if (i == 0) + return script_error (sc, "The first argument cannot be an array", a); + else if (! g_type_is_a (arg_specs[i - 1]->value_type, G_TYPE_INT)) + return script_error (sc, "Array arguments must be preceded by an int argument (number of items)", a); + + g_object_get (config, arg_specs[i - 1]->name, &n_elements, NULL); if (n_elements > sc->vptr->vector_length (vector)) return script_length_error_in_vector (sc, i, proc_name, n_elements, vector); @@ -1054,7 +1056,12 @@ script_fu_marshal_procedure_call (scheme *sc, { gdouble *array; - n_elements = GIMP_VALUES_GET_INT (args, i - 1); + if (i == 0) + return script_error (sc, "The first argument cannot be an array", a); + else if (! g_type_is_a (arg_specs[i - 1]->value_type, G_TYPE_INT)) + return script_error (sc, "Array arguments must be preceded by an int argument (number of items)", a); + + g_object_get (config, arg_specs[i - 1]->name, &n_elements, NULL); if (n_elements > sc->vptr->vector_length (vector)) return script_length_error_in_vector (sc, i, proc_name, n_elements, vector); @@ -1138,7 +1145,12 @@ script_fu_marshal_procedure_call (scheme *sc, { GimpRGB *array; - n_elements = GIMP_VALUES_GET_INT (args, i - 1); + if (i == 0) + return script_error (sc, "The first argument cannot be an array", a); + else if (! g_type_is_a (arg_specs[i - 1]->value_type, G_TYPE_INT)) + return script_error (sc, "Array arguments must be preceded by an int argument (number of items)", a); + + g_object_get (config, arg_specs[i - 1]->name, &n_elements, NULL); if (n_elements > sc->vptr->vector_length (vector)) return script_length_error_in_vector (sc, i, proc_name, n_elements, vector); @@ -1283,7 +1295,7 @@ script_fu_marshal_procedure_call (scheme *sc, return implementation_error (sc, error_str, 0); } debug_gvalue (&value); - gimp_value_array_append (args, &value); + g_object_set_property (G_OBJECT (config), arg_specs[i]->name, &value); g_value_unset (&value); } @@ -1292,9 +1304,9 @@ script_fu_marshal_procedure_call (scheme *sc, return script_error (sc, "A script cannot refresh scripts", 0); g_debug ("calling %s", proc_name); - values = gimp_pdb_run_procedure_array (gimp_get_pdb (), - proc_name, args); + values = gimp_pdb_run_procedure_config (gimp_get_pdb (), proc_name, config); g_debug ("done."); + g_clear_object (&config); /* Check the return status */ if (! values) @@ -1326,7 +1338,6 @@ script_fu_marshal_procedure_call (scheme *sc, gimp_value_array_unref (values); /* free arguments and values */ - gimp_value_array_unref (args); /* The callback is NULL except for script-fu-server. See explanation there. */ if (post_command_callback != NULL)