summaryrefslogtreecommitdiff
path: root/gtk/gtkwindow.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtkwindow.c')
-rw-r--r--gtk/gtkwindow.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 8394fc4546..0fc90293e8 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -6319,7 +6319,19 @@ popover_realize (GtkWidget *widget,
popover_get_rect (popover, window, &rect);
- attributes.window_type = GDK_WINDOW_CHILD;
+#ifdef GDK_WINDOWING_WAYLAND
+ if (GDK_IS_WAYLAND_DISPLAY (gtk_widget_get_display (widget)))
+ {
+ attributes.window_type = GDK_WINDOW_SUBSURFACE;
+ parent_window = gdk_screen_get_root_window (gtk_widget_get_screen (widget));
+ }
+ else
+#endif
+ {
+ attributes.window_type = GDK_WINDOW_CHILD;
+ parent_window = gtk_widget_get_window (GTK_WIDGET (window));
+ }
+
attributes.wclass = GDK_INPUT_OUTPUT;
attributes.x = rect.x;
attributes.y = rect.y;
@@ -6330,10 +6342,15 @@ popover_realize (GtkWidget *widget,
GDK_EXPOSURE_MASK;
attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL;
- parent_window = gtk_widget_get_window (GTK_WIDGET (window));
popover->window = gdk_window_new (parent_window, &attributes, attributes_mask);
gtk_widget_register_window (GTK_WIDGET (window), popover->window);
+#ifdef GDK_WINDOWING_WAYLAND
+ if (GDK_IS_WAYLAND_DISPLAY (gtk_widget_get_display (widget)))
+ gdk_window_set_transient_for (popover->window,
+ gtk_widget_get_window (GTK_WIDGET (window)));
+#endif
+
gtk_widget_set_parent_window (popover->widget, popover->window);
}
@@ -7123,6 +7140,11 @@ popover_unrealize (GtkWidget *widget,
GtkWindowPopover *popover,
GtkWindow *window)
{
+#ifdef GDK_WINDOWING_WAYLAND
+ if (GDK_IS_WAYLAND_DISPLAY (gtk_widget_get_display (widget)))
+ gdk_window_set_transient_for (popover->window, NULL);
+#endif
+
gtk_widget_unregister_window (GTK_WIDGET (window), popover->window);
gtk_widget_unrealize (popover->widget);
gdk_window_destroy (popover->window);