[RFC weston v2 2/2] xwayland: support programmatically maximizing views

Ilia Bozhinov ammen99 at gmail.com
Tue Jun 27 20:51:36 UTC 2017


Currently the xwayland implementation of desktop surfaces doesn't do
anything when weston_desktop_surface_set_maximized/fullscreen() is called.
In order to support this, we have to add xwayland internal interfaces
for sending those requests to the xwayland window and call them when
needed.

Signed-off-by: Ilia Bozhinov <ammen99 at gmail.com>
---
 libweston-desktop/xwayland.c           | 26 ++++++++++++++++++++++++++
 xwayland/window-manager.c              | 24 ++++++++++++++++++++++++
 xwayland/xwayland-internal-interface.h |  2 ++
 3 files changed, 52 insertions(+)

diff --git a/libweston-desktop/xwayland.c b/libweston-desktop/xwayland.c
index 9ab9dfbf..751d466c 100644
--- a/libweston-desktop/xwayland.c
+++ b/libweston-desktop/xwayland.c
@@ -193,6 +193,18 @@ weston_desktop_xwayland_surface_get_maximized(struct weston_desktop_surface *dsu
 	return surface->maximized;
 }
 
+static void
+weston_desktop_xwayland_surface_set_maximized(struct weston_desktop_surface *dsurface,
+					      void *user_data, bool maximized)
+{
+	struct weston_desktop_xwayland_surface *surface = user_data;
+	struct weston_surface *wsurface =
+		weston_desktop_surface_get_surface(surface->surface);
+
+	surface->client_interface->send_maximized(wsurface, maximized);
+	surface->maximized = maximized;
+}
+
 static bool
 weston_desktop_xwayland_surface_get_fullscreen(struct weston_desktop_surface *dsurface,
 					       void *user_data)
@@ -202,12 +214,26 @@ weston_desktop_xwayland_surface_get_fullscreen(struct weston_desktop_surface *ds
 	return surface->fullscreen;
 }
 
+static void
+weston_desktop_xwayland_surface_set_fullscreen(struct weston_desktop_surface *dsurface,
+		void *user_data, bool fullscreen)
+{
+	struct weston_desktop_xwayland_surface *surface = user_data;
+	struct weston_surface *wsurface =
+		weston_desktop_surface_get_surface(surface->surface);
+
+	surface->client_interface->send_fullscreen(wsurface, fullscreen);
+	surface->fullscreen = fullscreen;
+}
+
 static const struct weston_desktop_surface_implementation weston_desktop_xwayland_surface_internal_implementation = {
 	.committed = weston_desktop_xwayland_surface_committed,
 	.set_size = weston_desktop_xwayland_surface_set_size,
 
 	.get_maximized = weston_desktop_xwayland_surface_get_maximized,
+	.set_maximized = weston_desktop_xwayland_surface_set_maximized,
 	.get_fullscreen = weston_desktop_xwayland_surface_get_fullscreen,
+	.set_fullscreen = weston_desktop_xwayland_surface_set_fullscreen,
 
 	.destroy = weston_desktop_xwayland_surface_destroy,
 };
diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
index b0f78e2d..66fd7936 100644
--- a/xwayland/window-manager.c
+++ b/xwayland/window-manager.c
@@ -2617,8 +2617,32 @@ send_position(struct weston_surface *surface, int32_t x, int32_t y)
 	}
 }
 
+static void send_maximized(struct weston_surface *surface, bool maximized)
+{
+	struct weston_wm_window *window = get_wm_window(surface);
+
+	if (window->maximized_horz == maximized &&
+	    window->maximized_vert == maximized)
+		return;
+
+	window->maximized_horz = window->maximized_vert = maximized;
+	weston_wm_window_set_net_wm_state(window);
+}
+
+static void send_fullscreen(struct weston_surface *surface, bool fullscreen)
+{
+	struct weston_wm_window *window = get_wm_window(surface);
+	if (window->fullscreen == fullscreen)
+		return;
+
+	window->fullscreen = fullscreen;
+	weston_wm_window_set_net_wm_state(window);
+}
+
 static const struct weston_xwayland_client_interface shell_client = {
 	send_configure,
+	send_maximized,
+	send_fullscreen
 };
 
 static int
diff --git a/xwayland/xwayland-internal-interface.h b/xwayland/xwayland-internal-interface.h
index 10964440..48716b14 100644
--- a/xwayland/xwayland-internal-interface.h
+++ b/xwayland/xwayland-internal-interface.h
@@ -31,6 +31,8 @@ struct weston_desktop_xwayland_surface;
 
 struct weston_xwayland_client_interface {
 	void (*send_configure)(struct weston_surface *surface, int32_t width, int32_t height);
+	void (*send_maximized)(struct weston_surface *surface, bool maximized);
+	void (*send_fullscreen)(struct weston_surface *surface, bool fullscreen);
 };
 
 struct weston_desktop_xwayland_interface {
-- 
2.13.0



More information about the wayland-devel mailing list