From a1eeca490f26e9fa74a5d4dcc35fd3e2f43681a0 Mon Sep 17 00:00:00 2001 From: Jehan Date: Wed, 14 Aug 2019 14:56:28 +0200 Subject: [PATCH] libgimp: support all GimpItem subclasses as argument and return values. --- libgimp/gimpgpparams-body.c | 82 +++++++++++++++++++++++++++++-------- libgimp/gimpgpparams.c | 2 + 2 files changed, 68 insertions(+), 16 deletions(-) diff --git a/libgimp/gimpgpparams-body.c b/libgimp/gimpgpparams-body.c index 3134da66a0..4ec7ab4bc9 100644 --- a/libgimp/gimpgpparams-body.c +++ b/libgimp/gimpgpparams-body.c @@ -173,26 +173,26 @@ _gimp_param_spec_to_gp_param_def (GParamSpec *pspec, * included from app/ which won't know of the types. */ if (g_strcmp0 (g_type_name (pspec->value_type), "GimpImage") == 0) - { - param_def->type_name = "GimpParamImageID"; - param_def->param_def_type = GP_PARAM_DEF_TYPE_ID; - param_def->meta.m_id.none_ok = TRUE; - } + param_def->type_name = "GimpParamImageID"; + if (g_strcmp0 (g_type_name (pspec->value_type), "GimpDisplay") == 0) + param_def->type_name = "GimpParamDisplayID"; else if (g_strcmp0 (g_type_name (pspec->value_type), "GimpItem") == 0) - { - param_def->type_name = "GimpParamItemID"; - param_def->param_def_type = GP_PARAM_DEF_TYPE_ID; - param_def->meta.m_id.none_ok = TRUE; - } + param_def->type_name = "GimpParamItemID"; else if (g_strcmp0 (g_type_name (pspec->value_type), "GimpDrawable") == 0) - { - param_def->type_name = "GimpParamDrawableID"; - param_def->param_def_type = GP_PARAM_DEF_TYPE_ID; - param_def->meta.m_id.none_ok = TRUE; - } + param_def->type_name = "GimpParamDrawableID"; else if (g_strcmp0 (g_type_name (pspec->value_type), "GimpLayer") == 0) + param_def->type_name = "GimpParamLayerID"; + else if (g_strcmp0 (g_type_name (pspec->value_type), "GimpChannel") == 0) + param_def->type_name = "GimpParamChannelID"; + else if (g_strcmp0 (g_type_name (pspec->value_type), "GimpLayerMask") == 0) + param_def->type_name = "GimpParamLayerMaskID"; + else if (g_strcmp0 (g_type_name (pspec->value_type), "GimpSelection") == 0) + param_def->type_name = "GimpParamSelectionID"; + else if (g_strcmp0 (g_type_name (pspec->value_type), "GimpVectors") == 0) + param_def->type_name = "GimpParamVectorsID"; + + if (G_PARAM_SPEC_TYPE_NAME (pspec) != param_def->type_name) { - param_def->type_name = "GimpParamLayerID"; param_def->param_def_type = GP_PARAM_DEF_TYPE_ID; param_def->meta.m_id.none_ok = TRUE; } @@ -610,6 +610,56 @@ _gimp_value_to_gp_param (const GValue *value, _gimp_param_spec_to_gp_param_def (g_value_get_param (value), ¶m->data.d_param_def); } + else if (G_VALUE_HOLDS_OBJECT (value)) + { +#ifdef __LIBGIMP_GPPARAMS__ + GObject *object = g_value_get_object (value); + const gchar *type_name = NULL; + + if (full_copy) + g_clear_pointer (¶m->type_name, g_free); + + if (GIMP_IS_IMAGE (object)) + { + type_name = "GimpImageID"; + param->param_type = GP_PARAM_TYPE_INT; + param->data.d_int = gimp_image_get_id (GIMP_IMAGE (object)); + } + if (GIMP_IS_DISPLAY (object)) + { + type_name = "GimpDisplayID"; + param->param_type = GP_PARAM_TYPE_INT; + param->data.d_int = gimp_display_get_id (GIMP_DISPLAY (object)); + } + else if (GIMP_IS_ITEM (object)) + { + param->param_type = GP_PARAM_TYPE_INT; + param->data.d_int = gimp_item_get_id (GIMP_ITEM (object)); + + if (GIMP_IS_LAYER (object)) + type_name = "GimpLayerID"; + else if (GIMP_IS_LAYER_MASK (object)) + type_name = "GimpLayerMaskID"; + else if (GIMP_IS_SELECTION (object)) + type_name = "GimpSelectionID"; + else if (GIMP_IS_VECTORS (object)) + type_name = "GimpVectorsID"; + else if (GIMP_IS_CHANNEL (object)) + type_name = "GimpChannelID"; + else if (GIMP_IS_DRAWABLE (object)) + type_name = "GimpDrawableID"; + else + type_name = "GimpItemID"; + } + if (type_name) + { + if (full_copy) + param->type_name = g_strdup (type_name); + else + param->type_name = (gchar *) type_name; + } +#endif /* __LIBGIMP_GPPARAMS__ */ + } if (param->param_type == -1) g_printerr ("%s: GValue contains unsupported type '%s'\n", diff --git a/libgimp/gimpgpparams.c b/libgimp/gimpgpparams.c index a7bfd1daaf..b78a060482 100644 --- a/libgimp/gimpgpparams.c +++ b/libgimp/gimpgpparams.c @@ -37,7 +37,9 @@ /* include the implementation, they are shared between app/ and * libgimp/ but need different headers. */ +#define __LIBGIMP_GPPARAMS__ #include "gimpgpparams-body.c" +#undef __LIBGIMP_GPPARAMS__ GParamSpec * _gimp_gp_param_def_to_param_spec (gpointer gimp,