tests: Modernize testdnd2

This commit is contained in:
Benjamin Otte 2020-02-18 02:01:52 +01:00
parent b8cf7ea1c6
commit 7ae5fd357c

View File

@ -54,8 +54,7 @@ render_paintable_to_texture (GdkPaintable *paintable)
}
static GdkTexture *
get_image_texture (GtkImage *image,
int *out_size)
get_image_texture (GtkImage *image)
{
GtkIconTheme *icon_theme;
const char *icon_name;
@ -99,39 +98,6 @@ enum {
BOTTOM_RIGHT
};
void
image_drag_data_get (GtkWidget *widget,
GdkDrag *drag,
GtkSelectionData *selection_data,
gpointer data)
{
GdkTexture *texture;
const gchar *name;
int size;
if (gtk_selection_data_targets_include_image (selection_data, TRUE))
{
texture = get_image_texture (GTK_IMAGE (data), &size);
if (texture)
{
gtk_selection_data_set_texture (selection_data, texture);
g_object_unref (texture);
}
}
else if (gtk_selection_data_targets_include_text (selection_data))
{
if (gtk_image_get_storage_type (GTK_IMAGE (data)) == GTK_IMAGE_ICON_NAME)
name = gtk_image_get_icon_name (GTK_IMAGE (data));
else
name = "Boo!";
gtk_selection_data_set_text (selection_data, name, -1);
}
else
{
g_assert_not_reached ();
}
}
static void
got_texture (GObject *source,
GAsyncResult *result,
@ -313,51 +279,28 @@ update_source_icon (GtkDragSource *source,
g_object_unref (icon);
}
static GBytes *
get_data (const char *mimetype,
gpointer data)
static GdkContentProvider *
drag_prepare (GtkDragSource *source,
double x,
double y)
{
GtkWidget *image = data;
GdkContentFormats *formats;
gboolean want_text;
GtkImage *image = GTK_IMAGE (gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source)));
GdkTexture *texture;
GdkContentProvider *content;
formats = gdk_content_formats_new_for_gtype (G_TYPE_STRING);
formats = gdk_content_formats_union_serialize_mime_types (formats);
want_text = gdk_content_formats_contain_mime_type (formats, mimetype);
gdk_content_formats_unref (formats);
content = gdk_content_provider_new_typed (G_TYPE_STRING, gtk_image_get_icon_name (GTK_IMAGE (image)));
if (want_text)
texture = get_image_texture (image);
if (texture)
{
const char *text = gtk_image_get_icon_name (GTK_IMAGE (image));
return g_bytes_new (text, strlen (text) + 1);
content = gdk_content_provider_new_union ((GdkContentProvider *[2]) {
gdk_content_provider_new_typed (GDK_TYPE_TEXTURE, texture),
content,
}, 2);
g_object_unref (texture);
}
else if (strcmp (mimetype, "image/png") == 0)
{
int size;
GdkTexture *texture = get_image_texture (GTK_IMAGE (image), &size);
if (texture)
{
char *name = g_strdup ("drag-data-XXXXXX");
int fd;
char *data;
gsize size;
// FIXME: this is horrible
fd = g_mkstemp (name);
close (fd);
gdk_texture_save_to_png (texture, name);
g_object_unref (texture);
g_file_get_contents (name, &data, &size, NULL);
g_free (name);
return g_bytes_new_take (data, size);
}
}
return NULL;
return content;
}
static void
@ -389,7 +332,6 @@ make_image (const gchar *icon_name, int hotspot)
GtkDropTarget *dest;
GdkContentFormats *formats;
GdkContentFormatsBuilder *builder;
GdkContentProvider *content;
image = gtk_image_new_from_icon_name (icon_name);
gtk_image_set_icon_size (GTK_IMAGE (image), GTK_ICON_SIZE_LARGE);
@ -399,13 +341,11 @@ make_image (const gchar *icon_name, int hotspot)
gdk_content_formats_builder_add_gtype (builder, G_TYPE_STRING);
formats = gdk_content_formats_builder_free_to_formats (builder);
content = gdk_content_provider_new_with_formats (formats, get_data, image, NULL);
source = gtk_drag_source_new ();
gtk_drag_source_set_content (source, content);
gtk_drag_source_set_actions (source, GDK_ACTION_COPY|GDK_ACTION_MOVE|GDK_ACTION_ASK);
g_object_unref (content);
update_source_icon (source, icon_name, hotspot);
g_signal_connect (source, "prepare", G_CALLBACK (drag_prepare), NULL);
g_signal_connect (source, "drag-begin", G_CALLBACK (drag_begin), NULL);
g_signal_connect (source, "drag-end", G_CALLBACK (drag_end), NULL);
g_signal_connect (source, "drag-cancel", G_CALLBACK (drag_cancel), NULL);