diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c
index dc8ab41695..df6fa6bf59 100644
--- a/gdk/wayland/gdkwindow-wayland.c
+++ b/gdk/wayland/gdkwindow-wayland.c
@@ -45,13 +45,6 @@ enum {
static guint signals[LAST_SIGNAL];
-/*
- * Define GNOME additional states to xdg-shell
- * The current reserved range for GNOME is 0x1000 - 0x1FFF
- */
-
-#define XDG_SURFACE_STATE_GNOME_TILED 0x1000
-
#define WINDOW_IS_TOPLEVEL_OR_FOREIGN(window) \
(GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
GDK_WINDOW_TYPE (window) != GDK_WINDOW_OFFSCREEN)
@@ -182,6 +175,10 @@ struct _GdkWindowImplWayland
gint rect_anchor_dx;
gint rect_anchor_dy;
} pending_move_to_rect;
+
+ struct {
+ GdkWindowState state;
+ } pending;
};
struct _GdkWindowImplWaylandClass
@@ -1252,16 +1249,15 @@ xdg_surface_configure (void *data,
break;
case XDG_SURFACE_STATE_RESIZING:
break;
- /* GNOME additional states to xdg-shell */
- case XDG_SURFACE_STATE_GNOME_TILED:
- new_state |= GDK_WINDOW_STATE_TILED;
- break;
default:
/* Unknown state */
break;
}
}
+ new_state |= impl->pending.state;
+ impl->pending.state = 0;
+
fixed_size =
new_state & (GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_FULLSCREEN | GDK_WINDOW_STATE_TILED);
@@ -2203,6 +2199,38 @@ gdk_wayland_window_get_type_hint (GdkWindow *window)
return impl->hint;
}
+static void
+gtk_surface_configure (void *data,
+ struct gtk_surface1 *gtk_surface,
+ struct wl_array *states)
+{
+ GdkWindow *window = GDK_WINDOW (data);
+ GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+ GdkWindowState new_state = 0;
+ uint32_t *p;
+
+ wl_array_for_each (p, states)
+ {
+ uint32_t state = *p;
+
+ switch (state)
+ {
+ case GTK_SURFACE1_STATE_TILED:
+ new_state |= GDK_WINDOW_STATE_TILED;
+ break;
+ default:
+ /* Unknown state */
+ break;
+ }
+ }
+
+ impl->pending.state |= new_state;
+}
+
+static const struct gtk_surface1_listener gtk_surface_listener = {
+ gtk_surface_configure
+};
+
static void
gdk_wayland_window_init_gtk_surface (GdkWindow *window)
{
@@ -2220,6 +2248,9 @@ gdk_wayland_window_init_gtk_surface (GdkWindow *window)
impl->display_server.gtk_surface =
gtk_shell1_get_gtk_surface (display->gtk_shell,
impl->display_server.wl_surface);
+ gtk_surface1_add_listener (impl->display_server.gtk_surface,
+ >k_surface_listener,
+ window);
}
static void
diff --git a/gdk/wayland/protocol/gtk-shell.xml b/gdk/wayland/protocol/gtk-shell.xml
index 2e750ea0f1..5cfdd42c23 100644
--- a/gdk/wayland/protocol/gtk-shell.xml
+++ b/gdk/wayland/protocol/gtk-shell.xml
@@ -46,6 +46,16 @@
+
+
+
+
+
+
+
+
+
+