 28f011eb05
			
		
	
	28f011eb05
	
	
	
		
			
			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
		
			
				
	
	
		
			69 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			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;
 | |
| }
 |