gtk/tests/testpopup.c
Olivier Fourdan 28f011eb05 wayland: prefer subsurface when possible
Quite a few applications use GTK_WINDOW_POPUP to create various
temporary windows and place then on screen. That works fine on X11 but
on Wayland there is no global coordinate system for regular surfaces.

If the application is using a gdk temp window and set a parent with
gtk_window_transient_for(), the gdk wayland backend has all it needs to
create a subsurface that can be placed at will by the application.

Bugzilla: https://bugzilla.gnome.org/show_bug.cgi?id=759738
2016-01-08 10:33:26 +01:00

69 lines
1.6 KiB
C

#include <gtk/gtk.h>
static gboolean
draw_popup (GtkWidget *widget,
cairo_t *cr,
gpointer data)
{
cairo_set_source_rgb (cr, 1, 0, 0);
cairo_paint (cr);
return FALSE;
}
static gboolean
place_popup (GtkWidget *parent,
GdkEvent *event,
GtkWidget *popup)
{
GdkEventMotion *ev_motion = (GdkEventMotion *) event;
gint width, height;
gtk_window_get_size (GTK_WINDOW (popup), &width, &height);
gtk_window_move (GTK_WINDOW (popup),
(int) ev_motion->x_root - width / 2,
(int) ev_motion->y_root - height / 2);
return FALSE;
}
static gboolean
on_map_event (GtkWidget *parent,
GdkEvent *event,
gpointer data)
{
GtkWidget *popup;
popup = gtk_window_new (GTK_WINDOW_POPUP);
gtk_widget_set_size_request (GTK_WIDGET (popup), 20, 20);
gtk_widget_set_app_paintable (GTK_WIDGET (popup), TRUE);
gtk_window_set_transient_for (GTK_WINDOW (popup), GTK_WINDOW (parent));
g_signal_connect (popup, "draw", G_CALLBACK (draw_popup), NULL);
g_signal_connect (parent, "motion-notify-event", G_CALLBACK (place_popup), popup);
gtk_widget_show (popup);
return FALSE;
}
int
main (int argc, char *argv[])
{
GtkWidget *window;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_events (window, GDK_POINTER_MOTION_MASK);
g_signal_connect (window, "destroy", gtk_main_quit, NULL);
g_signal_connect (window, "map-event", G_CALLBACK (on_map_event), NULL);
gtk_widget_show (window);
gtk_main ();
return 0;
}