diff --git a/tests/meson.build b/tests/meson.build index 586fe2f45e..6ff249f8a1 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -36,7 +36,7 @@ gtk_tests = [ ['testcombo'], ['testcombochange'], ['testdialog'], - ['testdnd'], + ['testdnd2'], ['testellipsise'], ['testemblems'], ['testentrycompletion'], @@ -45,6 +45,7 @@ gtk_tests = [ ['testexpander'], ['testfilechooserbutton'], ['testfilechooser'], + ['testfileportal'], ['testflowbox'], ['testfontchooser'], ['testfontoptions'], diff --git a/tests/testfileportal.c b/tests/testfileportal.c new file mode 100644 index 0000000000..0918af1d1b --- /dev/null +++ b/tests/testfileportal.c @@ -0,0 +1,130 @@ +/* simple.c + * Copyright (C) 1997 Red Hat, Inc + * Author: Elliot Lee + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library. If not, see . + */ +#include "config.h" +#include + +static void +drag_begin_cb (GtkWidget *widget, + GdkDragContext *context, + gpointer data) +{ + char **uris; + char *cwd; + + cwd = g_get_current_dir (); + uris = g_new0 (char *, 2); + uris[0] = g_strconcat ("file://", cwd, "/README.md", NULL); + g_free (cwd); + + g_signal_handlers_disconnect_by_func (widget, drag_begin_cb, NULL); + gtk_drag_set_icon_default (context); + + g_object_set_data_full (G_OBJECT (widget), "uris", g_strdupv ((char **)uris), (GDestroyNotify) g_strfreev); +} + +static void +drag_data_get (GtkWidget *widget, + GdkDragContext *context, + GtkSelectionData *selection, + unsigned int target_info, + unsigned int time, + gpointer data) +{ + char **uris = (char **)g_object_get_data (G_OBJECT (widget), "uris"); + + gtk_selection_data_set_uris (selection, uris); + + g_object_set_data (G_OBJECT (widget), "uris", NULL); +} + +static void +drag_data_received (GtkWidget *widget, + GdkDragContext *context, + int x, + int y, + GtkSelectionData *selection_data, + unsigned int info, + unsigned int time, + gpointer user_data) +{ + GtkLabel *label = user_data; + char **uris; + + uris = gtk_selection_data_get_uris (selection_data); + + if (uris) + { + gtk_label_set_label (label, uris[0]); + g_strfreev (uris); + } +} + +int +main (int argc, char *argv[]) +{ + GtkWidget *window, *label, *eventbox, *box; + GtkTargetEntry targets[] = { + { "application/vnd.portal.files", 0, 0 }, + }; + + gtk_init (&argc, &argv); + + window = g_object_connect (g_object_new (gtk_window_get_type (), + "type", GTK_WINDOW_TOPLEVEL, + "title", "hello world", + "resizable", FALSE, + "border_width", 10, + NULL), + "signal::destroy", gtk_main_quit, NULL, + NULL); + + box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + gtk_widget_show (box); + gtk_container_add (GTK_CONTAINER (window), box); + + eventbox = gtk_event_box_new (); + gtk_container_add (GTK_CONTAINER (box), eventbox); + gtk_widget_show (eventbox); + gtk_event_box_set_above_child (GTK_EVENT_BOX (eventbox), TRUE); + + label = gtk_label_new ("drag me"); + gtk_container_add (GTK_CONTAINER (eventbox), label); + + gtk_drag_source_set (eventbox, GDK_BUTTON1_MASK, targets, G_N_ELEMENTS (targets), GDK_ACTION_COPY); + g_signal_connect (eventbox, "drag-begin", G_CALLBACK (drag_begin_cb), NULL); + g_signal_connect (eventbox, "drag-data-get", G_CALLBACK (drag_data_get), NULL); + gtk_widget_show (label); + + eventbox = gtk_event_box_new (); + gtk_container_add (GTK_CONTAINER (box), eventbox); + gtk_widget_show (eventbox); + gtk_event_box_set_above_child (GTK_EVENT_BOX (eventbox), TRUE); + + label = gtk_label_new ("drop here"); + gtk_widget_show (label); + gtk_container_add (GTK_CONTAINER (eventbox), label); + gtk_drag_dest_set (eventbox, GTK_DEST_DEFAULT_ALL, targets, G_N_ELEMENTS (targets), GDK_ACTION_COPY); + + g_signal_connect (eventbox, "drag-data-received", G_CALLBACK (drag_data_received), label); + + gtk_widget_show (window); + + gtk_main (); + + return 0; +}