From 28fa2e5fc77d6266695f739f1a46ea158ec95ece Mon Sep 17 00:00:00 2001 From: Jehan Date: Wed, 24 Sep 2025 16:08:47 +0200 Subject: [PATCH] app, libgimp, pdb: new function gimp_link_layer_get_mime_type(). As discussed with NikcDC, this will be useful, for instance for the SVG export to know the mime type of the linked file. If not PNG, JPG or SVG, we may want to output a small warning that some viewers may not be able to read such files, since the SVG spec makes the support of these 3 formats only as mandatory. --- app/core/gimplink.c | 14 +++++++-- app/core/gimplink.h | 3 ++ app/pdb/internal-procs.c | 2 +- app/pdb/link-layer-cmds.c | 63 +++++++++++++++++++++++++++++++++++++ libgimp/gimp.def | 1 + libgimp/gimplinklayer_pdb.c | 45 ++++++++++++++++++++++++++ libgimp/gimplinklayer_pdb.h | 15 ++++----- pdb/groups/link_layer.pdb | 39 ++++++++++++++++++++++- 8 files changed, 171 insertions(+), 11 deletions(-) diff --git a/app/core/gimplink.c b/app/core/gimplink.c index 3c74785c8f..5dd15a828e 100644 --- a/app/core/gimplink.c +++ b/app/core/gimplink.c @@ -76,6 +76,7 @@ struct _GimpLinkPrivate GimpImageBaseType base_type; GimpPrecision precision; GimpPlugInProcedure *load_proc; + const gchar *mime_type; }; static void gimp_link_finalize (GObject *object); @@ -298,8 +299,8 @@ gimp_link_update_buffer (GimpLink *link, { GimpImage *image; GimpPDBStatusType status; - const gchar *mime_type = NULL; + link->p->mime_type = NULL; image = file_open_image (link->p->gimp, gimp_get_user_context (link->p->gimp), progress, @@ -313,7 +314,8 @@ gimp_link_update_buffer (GimpLink *link, */ GIMP_RUN_NONINTERACTIVE, &link->p->is_vector, - &status, &mime_type, &real_error); + &status, &link->p->mime_type, + &real_error); if (image && status == GIMP_PDB_SUCCESS) { @@ -635,6 +637,14 @@ gimp_link_set_absolute_path (GimpLink *link, link->p->absolute_path = absolute_path; } +const gchar * +gimp_link_get_mime_type (GimpLink *link) +{ + g_return_val_if_fail (GIMP_IS_LINK (link), NULL); + + return link->p->mime_type; +} + void gimp_link_freeze (GimpLink *link) { diff --git a/app/core/gimplink.h b/app/core/gimplink.h index a426e0525f..c449470d64 100644 --- a/app/core/gimplink.h +++ b/app/core/gimplink.h @@ -73,6 +73,9 @@ void gimp_link_set_file (GimpLink *layer, gboolean gimp_link_get_absolute_path (GimpLink *link); void gimp_link_set_absolute_path (GimpLink *link, gboolean absolute_path); + +const gchar * gimp_link_get_mime_type (GimpLink *link); + void gimp_link_freeze (GimpLink *link); void gimp_link_thaw (GimpLink *link); gboolean gimp_link_is_monitored (GimpLink *link); diff --git a/app/pdb/internal-procs.c b/app/pdb/internal-procs.c index 091d8900f6..c6d4b81a2e 100644 --- a/app/pdb/internal-procs.c +++ b/app/pdb/internal-procs.c @@ -30,7 +30,7 @@ #include "internal-procs.h" -/* 758 procedures registered total */ +/* 759 procedures registered total */ void internal_procs_init (GimpPDB *pdb) diff --git a/app/pdb/link-layer-cmds.c b/app/pdb/link-layer-cmds.c index 235b35ee97..60d89e6a02 100644 --- a/app/pdb/link-layer-cmds.c +++ b/app/pdb/link-layer-cmds.c @@ -213,6 +213,35 @@ link_layer_set_file_invoker (GimpProcedure *procedure, error ? *error : NULL); } +static GimpValueArray * +link_layer_get_mime_type_invoker (GimpProcedure *procedure, + Gimp *gimp, + GimpContext *context, + GimpProgress *progress, + const GimpValueArray *args, + GError **error) +{ + gboolean success = TRUE; + GimpValueArray *return_vals; + GimpLinkLayer *layer; + gchar *mimetype = NULL; + + layer = g_value_get_object (gimp_value_array_index (args, 0)); + + if (success) + { + mimetype = g_strdup (gimp_link_get_mime_type (gimp_link_layer_get_link (layer))); + } + + return_vals = gimp_procedure_get_return_values (procedure, success, + error ? *error : NULL); + + if (success) + g_value_take_string (gimp_value_array_index (return_vals, 1), mimetype); + + return return_vals; +} + void register_link_layer_procs (GimpPDB *pdb) { @@ -361,4 +390,38 @@ register_link_layer_procs (GimpPDB *pdb) GIMP_PARAM_READWRITE)); gimp_pdb_register_procedure (pdb, procedure); g_object_unref (procedure); + + /* + * gimp-link-layer-get-mime-type + */ + procedure = gimp_procedure_new (link_layer_get_mime_type_invoker, FALSE); + gimp_object_set_static_name (GIMP_OBJECT (procedure), + "gimp-link-layer-get-mime-type"); + gimp_procedure_set_static_help (procedure, + "Get the mime type of the monitored file.", + "This procedure returns the mime type of the file which is being monitored by @layer.\n" + "\n" + "Note that this will be the real mime type, corresponding to our format support, as returned by the [class@Gimp.LoadProcedure] which actually performs the external image file import.\n" + "\n" + "This function may also return %NULL in case of error (for instance if the external file doesn't exist anymore).", + NULL); + gimp_procedure_set_static_attribution (procedure, + "Jehan", + "Jehan", + "2025"); + gimp_procedure_add_argument (procedure, + gimp_param_spec_link_layer ("layer", + "layer", + "The link layer", + FALSE, + GIMP_PARAM_READWRITE)); + gimp_procedure_add_return_value (procedure, + gimp_param_spec_string ("mimetype", + "mimetype", + "The mime type of the monitored file", + FALSE, FALSE, FALSE, + NULL, + GIMP_PARAM_READWRITE)); + gimp_pdb_register_procedure (pdb, procedure); + g_object_unref (procedure); } diff --git a/libgimp/gimp.def b/libgimp/gimp.def index fd064241d2..8ddcafdc6e 100644 --- a/libgimp/gimp.def +++ b/libgimp/gimp.def @@ -684,6 +684,7 @@ EXPORTS gimp_link_layer_discard gimp_link_layer_get_by_id gimp_link_layer_get_file + gimp_link_layer_get_mime_type gimp_link_layer_get_type gimp_link_layer_monitor gimp_link_layer_new diff --git a/libgimp/gimplinklayer_pdb.c b/libgimp/gimplinklayer_pdb.c index 5fb2b897af..8e7ab96387 100644 --- a/libgimp/gimplinklayer_pdb.c +++ b/libgimp/gimplinklayer_pdb.c @@ -232,3 +232,48 @@ gimp_link_layer_set_file (GimpLinkLayer *layer, return success; } + +/** + * gimp_link_layer_get_mime_type: + * @layer: The link layer. + * + * Get the mime type of the monitored file. + * + * This procedure returns the mime type of the file which is being + * monitored by @layer. + * + * Note that this will be the real mime type, corresponding to our + * format support, as returned by the [class@Gimp.LoadProcedure] which + * actually performs the external image file import. + * + * This function may also return %NULL in case of error (for instance + * if the external file doesn't exist anymore). + * + * Returns: (transfer full): The mime type of the monitored file. + * The returned value must be freed with g_free(). + * + * Since: 3.2 + **/ +gchar * +gimp_link_layer_get_mime_type (GimpLinkLayer *layer) +{ + GimpValueArray *args; + GimpValueArray *return_vals; + gchar *mimetype = NULL; + + args = gimp_value_array_new_from_types (NULL, + GIMP_TYPE_LINK_LAYER, layer, + G_TYPE_NONE); + + return_vals = _gimp_pdb_run_procedure_array (gimp_get_pdb (), + "gimp-link-layer-get-mime-type", + args); + gimp_value_array_unref (args); + + if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS) + mimetype = GIMP_VALUES_DUP_STRING (return_vals, 1); + + gimp_value_array_unref (return_vals); + + return mimetype; +} diff --git a/libgimp/gimplinklayer_pdb.h b/libgimp/gimplinklayer_pdb.h index 482834bc60..e1b1ae0988 100644 --- a/libgimp/gimplinklayer_pdb.h +++ b/libgimp/gimplinklayer_pdb.h @@ -32,13 +32,14 @@ G_BEGIN_DECLS /* For information look into the C source or the html documentation */ -GimpLinkLayer* gimp_link_layer_new (GimpImage *image, - GFile *file); -gboolean gimp_link_layer_discard (GimpLinkLayer *layer); -gboolean gimp_link_layer_monitor (GimpLinkLayer *layer); -GFile* gimp_link_layer_get_file (GimpLinkLayer *layer); -gboolean gimp_link_layer_set_file (GimpLinkLayer *layer, - GFile *file); +GimpLinkLayer* gimp_link_layer_new (GimpImage *image, + GFile *file); +gboolean gimp_link_layer_discard (GimpLinkLayer *layer); +gboolean gimp_link_layer_monitor (GimpLinkLayer *layer); +GFile* gimp_link_layer_get_file (GimpLinkLayer *layer); +gboolean gimp_link_layer_set_file (GimpLinkLayer *layer, + GFile *file); +gchar* gimp_link_layer_get_mime_type (GimpLinkLayer *layer); G_END_DECLS diff --git a/pdb/groups/link_layer.pdb b/pdb/groups/link_layer.pdb index 84b9936bf6..ae419e2126 100644 --- a/pdb/groups/link_layer.pdb +++ b/pdb/groups/link_layer.pdb @@ -204,6 +204,42 @@ CODE ); } +sub link_layer_get_mime_type { + $blurb = 'Get the mime type of the monitored file.'; + + $help = <<'HELP'; +This procedure returns the mime type of the file which is being monitored by @layer. + + +Note that this will be the real mime type, corresponding to our format support, +as returned by the [class@Gimp.LoadProcedure] which actually performs the external +image file import. + + +This function may also return %NULL in case of error (for instance if the external +file doesn't exist anymore). +HELP + + &jehan_pdb_misc('2025', '3.2'); + + @inargs = ( + { name => 'layer', type => 'link_layer', + desc => 'The link layer' } + ); + + @outargs = ( + { name => 'mimetype', type => 'string', + desc => 'The mime type of the monitored file' } + ); + + %invoke = ( + code => <<'CODE' +{ + mimetype = g_strdup (gimp_link_get_mime_type (gimp_link_layer_get_link (layer))); +} +CODE + ); +} @headers = qw("core/gimplink.h" "core/gimplinklayer.h" "gimppdberror.h" @@ -213,7 +249,8 @@ CODE link_layer_discard link_layer_monitor link_layer_get_file - link_layer_set_file); + link_layer_set_file + link_layer_get_mime_type); %exports = (app => [@procs], lib => [@procs]);