wayland: consider edge constraints in surface configuration
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>
Thu, 17 Aug 2017 03:35:52 +0000 (00:35 -0300)
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>
Tue, 3 Oct 2017 23:06:46 +0000 (20:06 -0300)
Now that GTK windows have the ability to properly handle
per-edge tiling constraints, this patch extends GTK's
internal Wayland protocol to have a proper enum with the
relevant edge data.

Once this approach is validated, we can think of upstreaming
this work as an official Wayland protocol extension.

https://bugzilla.gnome.org/show_bug.cgi?id=783669

gdk/wayland/gdkdisplay-wayland.c
gdk/wayland/gdkwindow-wayland.c
gdk/wayland/protocol/gtk-shell.xml

index 380611c7b1ad7cb433d445085bab779996b4a93c..3814157557e998a439c9c7365fd7193fae043b22 100644 (file)
@@ -82,6 +82,8 @@
 
 #define MIN_SYSTEM_BELL_DELAY_MS 20
 
+#define GTK_SHELL1_VERSION       2
+
 static void _gdk_wayland_display_load_cursor_theme (GdkWaylandDisplay *display_wayland);
 
 G_DEFINE_TYPE (GdkWaylandDisplay, gdk_wayland_display, GDK_TYPE_DISPLAY)
@@ -371,7 +373,7 @@ gdk_registry_handle_global (void               *data,
       display_wayland->gtk_shell =
         wl_registry_bind(display_wayland->wl_registry, id,
                          &gtk_shell1_interface,
-                         1);
+                         MIN (version, GTK_SHELL1_VERSION));
       _gdk_wayland_screen_set_has_gtk_shell (display_wayland->screen);
       display_wayland->gtk_shell_version = version;
     }
index e25c782d0fb42f21bc12894b61c6b32ca32347c5..77a6e978f8463ccd8bc4d830b0b9ffd42251ceeb 100644 (file)
@@ -2961,6 +2961,57 @@ gtk_surface_configure (void                *data,
         case GTK_SURFACE1_STATE_TILED:
           new_state |= GDK_WINDOW_STATE_TILED;
           break;
+
+        /* Since v2 */
+        case GTK_SURFACE1_STATE_TILED_TOP:
+          new_state |= GDK_WINDOW_STATE_TOP_TILED;
+          break;
+        case GTK_SURFACE1_STATE_TILED_RIGHT:
+          new_state |= GDK_WINDOW_STATE_RIGHT_TILED;
+          break;
+        case GTK_SURFACE1_STATE_TILED_BOTTOM:
+          new_state |= GDK_WINDOW_STATE_BOTTOM_TILED;
+          break;
+        case GTK_SURFACE1_STATE_TILED_LEFT:
+          new_state |= GDK_WINDOW_STATE_LEFT_TILED;
+          break;
+        default:
+          /* Unknown state */
+          break;
+        }
+    }
+
+  impl->pending.state |= new_state;
+}
+
+static void
+gtk_surface_configure_edges (void                *data,
+                             struct gtk_surface1 *gtk_surface,
+                             struct wl_array     *edge_constraints)
+{
+  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, edge_constraints)
+    {
+      uint32_t constraint = *p;
+
+      switch (constraint)
+        {
+        case GTK_SURFACE1_EDGE_CONSTRAINT_RESIZABLE_TOP:
+          new_state |= GDK_WINDOW_STATE_TOP_RESIZABLE;
+          break;
+        case GTK_SURFACE1_EDGE_CONSTRAINT_RESIZABLE_RIGHT:
+          new_state |= GDK_WINDOW_STATE_TOP_TILED;
+          break;
+        case GTK_SURFACE1_EDGE_CONSTRAINT_RESIZABLE_BOTTOM:
+          new_state |= GDK_WINDOW_STATE_BOTTOM_RESIZABLE;
+          break;
+        case GTK_SURFACE1_EDGE_CONSTRAINT_RESIZABLE_LEFT:
+          new_state |= GDK_WINDOW_STATE_LEFT_RESIZABLE;
+          break;
         default:
           /* Unknown state */
           break;
@@ -2971,7 +3022,8 @@ gtk_surface_configure (void                *data,
 }
 
 static const struct gtk_surface1_listener gtk_surface_listener = {
-  gtk_surface_configure
+  gtk_surface_configure,
+  gtk_surface_configure_edges
 };
 
 static void
index 5cfdd42c2341135065abfd5d553924ebf56ebce2..8191fa9cfbaa506a02c40b37e961d7b1ca32b747 100644 (file)
@@ -1,6 +1,6 @@
 <protocol name="gtk">
 
-  <interface name="gtk_shell1" version="1">
+  <interface name="gtk_shell1" version="2">
     <description summary="gtk specific extensions">
       gtk_shell is a protocol extension providing additional features for
       clients implementing it.
@@ -30,7 +30,7 @@
     </request>
   </interface>
 
-  <interface name="gtk_surface1" version="1">
+  <interface name="gtk_surface1" version="2">
     <request name="set_dbus_properties">
       <arg name="application_id" type="string" allow-null="true"/>
       <arg name="app_menu_path" type="string" allow-null="true"/>
 
     <enum name="state">
       <entry name="tiled" value="1"/>
+
+      <entry name="tiled_top" value="2" since="2" />
+      <entry name="tiled_right" value="3" since="2" />
+      <entry name="tiled_bottom" value="4" since="2" />
+      <entry name="tiled_left" value="5"  since="2" />
+    </enum>
+
+    <enum name="edge_constraint" since="2">
+      <entry name="resizable_top" value="1"/>
+      <entry name="resizable_right" value="2"/>
+      <entry name="resizable_bottom" value="3"/>
+      <entry name="resizable_left" value="4"/>
     </enum>
 
     <event name="configure">
       <arg name="states" type="array"/>
     </event>
+
+    <event name="configure_edges" since="2">
+      <arg name="constraints" type="array"/>
+    </event>
   </interface>
 
 </protocol>