diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt index 4a73241443..fb524303f0 100644 --- a/docs/reference/gtk/gtk4-sections.txt +++ b/docs/reference/gtk/gtk4-sections.txt @@ -5207,6 +5207,8 @@ gtk_selection_data_set_pixbuf gtk_selection_data_get_pixbuf gtk_selection_data_set_surface gtk_selection_data_get_surface +gtk_selection_data_set_texture +gtk_selection_data_get_texture gtk_selection_data_set_uris gtk_selection_data_get_uris gtk_selection_data_get_targets diff --git a/gtk/gtkselection.c b/gtk/gtkselection.c index b848485b9b..f90f5efd95 100644 --- a/gtk/gtkselection.c +++ b/gtk/gtkselection.c @@ -90,6 +90,7 @@ #include "gdk-pixbuf/gdk-pixbuf.h" #include "gdk/gdkcontentformatsprivate.h" +#include "gdk/gdktextureprivate.h" #ifdef GDK_WINDOWING_X11 #include "x11/gdkx.h" @@ -1555,6 +1556,69 @@ gtk_selection_data_get_pixbuf (const GtkSelectionData *selection_data) return result; } +/** + * gtk_selection_data_set_texture: + * @selection_data: a #GtkSelectionData + * @texture: a #GdkTexture + * + * Sets the contents of the selection from a #GdkTexture. + * The surface is converted to the form determined by + * @selection_data->target. + * + * Returns: %TRUE if the selection was successfully set, + * otherwise %FALSE. + * + * Since: 3.94 + **/ +gboolean +gtk_selection_data_set_texture (GtkSelectionData *selection_data, + GdkTexture *texture) +{ + cairo_surface_t *surface; + gboolean retval; + + g_return_val_if_fail (selection_data != NULL, FALSE); + g_return_val_if_fail (GDK_IS_TEXTURE (texture), FALSE); + + surface = gdk_texture_download_surface (texture); + retval = gtk_selection_data_set_surface (selection_data, surface); + cairo_surface_destroy (surface); + + return retval; +} + +/** + * gtk_selection_data_get_texture: + * @selection_data: a #GtkSelectionData + * + * Gets the contents of the selection data as a #GdkPixbuf. + * + * Returns: (nullable) (transfer full): if the selection data + * contained a recognized image type and it could be converted to a + * #GdkTexture, a newly allocated texture is returned, otherwise + * %NULL. If the result is non-%NULL it must be freed with + * g_object_unref(). + * + * Since: 3.94 + **/ +GdkTexture * +gtk_selection_data_get_texture (const GtkSelectionData *selection_data) +{ + GdkTexture *texture; + GdkPixbuf *pixbuf; + + g_return_val_if_fail (selection_data != NULL, NULL); + + pixbuf = gtk_selection_data_get_pixbuf (selection_data); + if (pixbuf == NULL) + return NULL; + + texture = gdk_texture_new_for_pixbuf (pixbuf); + g_object_unref (pixbuf); + + return texture; +} + /** * gtk_selection_data_set_uris: * @selection_data: a #GtkSelectionData diff --git a/gtk/gtkselection.h b/gtk/gtkselection.h index 3f0d69b7b4..b386b0f172 100644 --- a/gtk/gtkselection.h +++ b/gtk/gtkselection.h @@ -115,6 +115,11 @@ gboolean gtk_selection_data_set_surface (GtkSelectionData *selection_data, cairo_surface_t *surface); GDK_AVAILABLE_IN_ALL GdkPixbuf *gtk_selection_data_get_pixbuf (const GtkSelectionData *selection_data); +GDK_AVAILABLE_IN_3_94 +gboolean gtk_selection_data_set_texture (GtkSelectionData *selection_data, + GdkTexture *texture); +GDK_AVAILABLE_IN_3_94 +GdkTexture *gtk_selection_data_get_texture (const GtkSelectionData *selection_data); GDK_AVAILABLE_IN_ALL gboolean gtk_selection_data_set_uris (GtkSelectionData *selection_data, gchar **uris);