Commit e5ed52b6 authored by Jonas Ådahl's avatar Jonas Ådahl

tests: Add testforeign

Add a test for exporting a handle. There are no GTK+ API for this, but
only per backend GDK API, and so far only Wayland is supported. There
is a private GdkWindow API but it's not exposed externally.
parent dba57db1
......@@ -176,6 +176,10 @@ noinst_PROGRAMS = $(TEST_PROGS) \
testpopupat \
noinst_PROGRAMS += testforeign
if USE_X11
noinst_PROGRAMS += testerrors
......@@ -365,6 +369,9 @@ testfontchooserdialog_SOURCES = \
testfontoptions_SOURCES = \
testforeign_SOURCES = \
testgrid_SOURCES = \
#include <gtk/gtk.h>
#include <gdk/wayland/gdkwayland.h>
static GtkWidget *window;
static GtkWidget *label;
static GtkWidget *entry;
static GtkWidget *unexport_button;
static char *export_handle;
int export_count;
static void
update_ui (void)
gboolean can_unexport;
char *label_text;
gtk_entry_set_text (GTK_ENTRY (entry), export_handle ? export_handle : "");
label_text = g_strdup_printf ("Export count: %d", export_count);
gtk_label_set_text (GTK_LABEL (label), label_text);
g_free (label_text);
can_unexport = !!export_handle;
gtk_widget_set_sensitive (unexport_button, can_unexport);
static void
exported_callback (GdkWindow *window,
const char *handle,
gpointer user_data)
if (!export_handle)
export_handle = g_strdup (handle);
g_assert (g_str_equal (handle, export_handle));
update_ui ();
static void
export_callback (GtkWidget *widget,
gpointer data)
if (!gdk_wayland_window_export_handle (gtk_widget_get_window (window),
g_strdup ("user_data"), g_free))
g_error ("Failed to export window");
update_ui ();
static void
unexport_callback (GtkWidget *widget,
gpointer data)
gdk_wayland_window_unexport_handle (gtk_widget_get_window (window));
if (export_count == 0)
g_clear_pointer (&export_handle, g_free);
update_ui ();
main (int argc,
char *argv[])
GdkDisplay *display;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *export_button;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
display = gtk_widget_get_display (window);
if (!GDK_IS_WAYLAND_DISPLAY (display))
g_error ("This test is only works on Wayland");
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
label = gtk_label_new (NULL);
entry = gtk_entry_new ();
gtk_editable_set_editable (GTK_EDITABLE (entry), FALSE);
export_button = gtk_button_new_with_label ("Export");
unexport_button = gtk_button_new_with_label("Unexport");
g_signal_connect (export_button, "clicked",
G_CALLBACK (export_callback), NULL);
g_signal_connect (unexport_button, "clicked",
G_CALLBACK (unexport_callback), NULL);
gtk_container_add (GTK_CONTAINER (hbox), export_button);
gtk_container_add (GTK_CONTAINER (hbox), unexport_button);
gtk_container_add (GTK_CONTAINER (vbox), entry);
gtk_container_add (GTK_CONTAINER (vbox), label);
gtk_container_add (GTK_CONTAINER (vbox), hbox);
gtk_container_add (GTK_CONTAINER (window), vbox);
update_ui ();
g_signal_connect (window, "delete-event", G_CALLBACK (gtk_main_quit), NULL);
gtk_widget_show_all (window);
gtk_main ();
return 0;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment