wayland/xdg-shell: Add toplevel tile state support

The second version of xdg_wm_base added toplevel tile states (top,
right, bottom, left), so lets communicate that.
This commit is contained in:
Jonas Ådahl 2018-10-24 14:45:11 +02:00
parent 4f3de88b3d
commit 4673eeaf5f
2 changed files with 23 additions and 8 deletions

View File

@ -37,7 +37,7 @@
/* Global/master objects (version exported by wl_registry and negotiated through bind) */ /* Global/master objects (version exported by wl_registry and negotiated through bind) */
#define META_WL_COMPOSITOR_VERSION 4 #define META_WL_COMPOSITOR_VERSION 4
#define META_WL_DATA_DEVICE_MANAGER_VERSION 3 #define META_WL_DATA_DEVICE_MANAGER_VERSION 3
#define META_XDG_WM_BASE_VERSION 1 #define META_XDG_WM_BASE_VERSION 2
#define META_ZXDG_SHELL_V6_VERSION 1 #define META_ZXDG_SHELL_V6_VERSION 1
#define META_WL_SHELL_VERSION 1 #define META_WL_SHELL_VERSION 1
#define META_WL_SEAT_VERSION 5 #define META_WL_SEAT_VERSION 5

View File

@ -583,9 +583,15 @@ add_state_value (struct wl_array *states,
} }
static void static void
fill_states (struct wl_array *states, fill_states (MetaWaylandXdgToplevel *xdg_toplevel,
MetaWindow *window) struct wl_array *states)
{ {
MetaWaylandSurfaceRole *surface_role =
META_WAYLAND_SURFACE_ROLE (xdg_toplevel);
MetaWaylandSurface *surface =
meta_wayland_surface_role_get_surface (surface_role);
MetaWindow *window = surface->window;
if (META_WINDOW_MAXIMIZED (window)) if (META_WINDOW_MAXIMIZED (window))
add_state_value (states, XDG_TOPLEVEL_STATE_MAXIMIZED); add_state_value (states, XDG_TOPLEVEL_STATE_MAXIMIZED);
if (meta_window_is_fullscreen (window)) if (meta_window_is_fullscreen (window))
@ -594,6 +600,19 @@ fill_states (struct wl_array *states,
add_state_value (states, XDG_TOPLEVEL_STATE_RESIZING); add_state_value (states, XDG_TOPLEVEL_STATE_RESIZING);
if (meta_window_appears_focused (window)) if (meta_window_appears_focused (window))
add_state_value (states, XDG_TOPLEVEL_STATE_ACTIVATED); add_state_value (states, XDG_TOPLEVEL_STATE_ACTIVATED);
if (wl_resource_get_version (xdg_toplevel->resource) >=
XDG_TOPLEVEL_STATE_TILED_LEFT_SINCE_VERSION)
{
if (window->edge_constraints.top != META_EDGE_CONSTRAINT_NONE)
add_state_value (states, XDG_TOPLEVEL_STATE_TILED_TOP);
if (window->edge_constraints.right != META_EDGE_CONSTRAINT_NONE)
add_state_value (states, XDG_TOPLEVEL_STATE_TILED_RIGHT);
if (window->edge_constraints.bottom != META_EDGE_CONSTRAINT_NONE)
add_state_value (states, XDG_TOPLEVEL_STATE_TILED_BOTTOM);
if (window->edge_constraints.left != META_EDGE_CONSTRAINT_NONE)
add_state_value (states, XDG_TOPLEVEL_STATE_TILED_LEFT);
}
} }
static void static void
@ -603,15 +622,11 @@ meta_wayland_xdg_toplevel_send_configure (MetaWaylandXdgToplevel *xdg_toplevel,
MetaWaylandSerial *sent_serial) MetaWaylandSerial *sent_serial)
{ {
MetaWaylandXdgSurface *xdg_surface = META_WAYLAND_XDG_SURFACE (xdg_toplevel); MetaWaylandXdgSurface *xdg_surface = META_WAYLAND_XDG_SURFACE (xdg_toplevel);
MetaWaylandSurfaceRole *surface_role =
META_WAYLAND_SURFACE_ROLE (xdg_toplevel);
MetaWaylandSurface *surface =
meta_wayland_surface_role_get_surface (surface_role);
struct wl_array states; struct wl_array states;
uint32_t serial; uint32_t serial;
wl_array_init (&states); wl_array_init (&states);
fill_states (&states, surface->window); fill_states (xdg_toplevel, &states);
xdg_toplevel_send_configure (xdg_toplevel->resource, xdg_toplevel_send_configure (xdg_toplevel->resource,
new_width, new_height, new_width, new_height,