summaryrefslogtreecommitdiffstats
path: root/meta-agl-core/recipes-graphics/wayland/weston/0001-libweston-desktop-xdg-shell-Add-tiled-orientation-st.patch
blob: 02349c0981e9ce5c706088845b07ff5a10afd70a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
From 6ab4713d3eba589aa1f39eee2b48c81906d7ba87 Mon Sep 17 00:00:00 2001
From: Marius Vlad <marius.vlad@collabora.com>
Date: Tue, 16 Aug 2022 13:34:19 +0300
Subject: [PATCH] libweston/desktop/xdg-shell: Add tiled orientation states

With the help of a newly introduced function, weston_desktop_surface_set_orientation(),
this patch adds missing tiled states from the xdg-shell protocol.
The orientation state is passed on as a bitmask enumeration flag, which the
shell can set, allowing multiple tiling states at once.

These new states are incorporated the same way as the others, retaining
the set state, but also avoiding sending new configure events if nothing
changed since previously acked data.

Upstream-Status: Pending

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
(cherry-picked from 37a3025d893def991dec59587d17672aa3bf967a)

Note that this was actually ported because libweston-desktop is not
embedded into libweston and the structure changed in upstream.
---
 include/libweston-desktop/libweston-desktop.h | 11 ++++++
 libweston-desktop/internal.h                  |  2 +
 libweston-desktop/surface.c                   | 10 +++++
 libweston-desktop/xdg-shell.c                 | 38 +++++++++++++++++++
 4 files changed, 61 insertions(+)

diff --git a/include/libweston-desktop/libweston-desktop.h b/include/libweston-desktop/libweston-desktop.h
index 3e7ac73..c296d16 100644
--- a/include/libweston-desktop/libweston-desktop.h
+++ b/include/libweston-desktop/libweston-desktop.h
@@ -44,6 +44,14 @@ enum weston_desktop_surface_edge {
 	WESTON_DESKTOP_SURFACE_EDGE_BOTTOM_RIGHT = 10,
 };
 
+enum weston_top_level_tiled_orientation {
+	WESTON_TOP_LEVEL_TILED_ORIENTATION_NONE 	= 0 << 0,
+	WESTON_TOP_LEVEL_TILED_ORIENTATION_LEFT 	= 1 << 1,
+	WESTON_TOP_LEVEL_TILED_ORIENTATION_RIGHT 	= 1 << 2,
+	WESTON_TOP_LEVEL_TILED_ORIENTATION_TOP 		= 1 << 3,
+	WESTON_TOP_LEVEL_TILED_ORIENTATION_BOTTOM 	= 1 << 4,
+};
+
 struct weston_desktop;
 struct weston_desktop_client;
 struct weston_desktop_surface;
@@ -163,6 +171,9 @@ void
 weston_desktop_surface_set_size(struct weston_desktop_surface *surface,
 				int32_t width, int32_t height);
 void
+weston_desktop_surface_set_orientation(struct weston_desktop_surface *surface,
+				       enum weston_top_level_tiled_orientation tile_orientation);
+void
 weston_desktop_surface_close(struct weston_desktop_surface *surface);
 void
 weston_desktop_surface_add_metadata_listener(struct weston_desktop_surface *surface,
diff --git a/libweston-desktop/internal.h b/libweston-desktop/internal.h
index 2606d27..8afdede 100644
--- a/libweston-desktop/internal.h
+++ b/libweston-desktop/internal.h
@@ -100,6 +100,8 @@ struct weston_desktop_surface_implementation {
 			     void *user_data, bool resizing);
 	void (*set_size)(struct weston_desktop_surface *surface,
 			 void *user_data, int32_t width, int32_t height);
+	void (*set_orientation)(struct weston_desktop_surface *surface,
+				void *user_data, enum weston_top_level_tiled_orientation tiled_orientation);
 	void (*committed)(struct weston_desktop_surface *surface, void *user_data,
 		          int32_t sx, int32_t sy);
 	void (*update_position)(struct weston_desktop_surface *surface,
diff --git a/libweston-desktop/surface.c b/libweston-desktop/surface.c
index 433f08a..6b3f4ae 100644
--- a/libweston-desktop/surface.c
+++ b/libweston-desktop/surface.c
@@ -506,6 +506,16 @@ weston_desktop_surface_set_size(struct weston_desktop_surface *surface, int32_t
 						  width, height);
 }
 
+WL_EXPORT void
+weston_desktop_surface_set_orientation(struct weston_desktop_surface *surface,
+				       enum weston_top_level_tiled_orientation tile_orientation)
+{
+	if (surface->implementation->set_orientation != NULL)
+		surface->implementation->set_orientation(surface,
+							 surface->implementation_data,
+							 tile_orientation);
+}
+
 WL_EXPORT void
 weston_desktop_surface_close(struct weston_desktop_surface *surface)
 {
diff --git a/libweston-desktop/xdg-shell.c b/libweston-desktop/xdg-shell.c
index ff76c39..1e49147 100644
--- a/libweston-desktop/xdg-shell.c
+++ b/libweston-desktop/xdg-shell.c
@@ -94,6 +94,7 @@ struct weston_desktop_xdg_toplevel_state {
 	bool fullscreen;
 	bool resizing;
 	bool activated;
+	uint32_t tiled_orientation;
 };
 
 struct weston_desktop_xdg_toplevel_configure {
@@ -624,6 +625,29 @@ weston_desktop_xdg_toplevel_send_configure(struct weston_desktop_xdg_toplevel *t
 		s = wl_array_add(&states, sizeof(uint32_t));
 		*s = XDG_TOPLEVEL_STATE_ACTIVATED;
 	}
+	if (toplevel->pending.state.tiled_orientation &
+	    WESTON_TOP_LEVEL_TILED_ORIENTATION_LEFT) {
+		s = wl_array_add(&states, sizeof(uint32_t));
+		*s = XDG_TOPLEVEL_STATE_TILED_LEFT;
+	}
+
+	if (toplevel->pending.state.tiled_orientation &
+	    WESTON_TOP_LEVEL_TILED_ORIENTATION_RIGHT) {
+		s = wl_array_add(&states, sizeof(uint32_t));
+		*s = XDG_TOPLEVEL_STATE_TILED_RIGHT;
+	}
+
+	if (toplevel->pending.state.tiled_orientation &
+	    WESTON_TOP_LEVEL_TILED_ORIENTATION_TOP) {
+		s = wl_array_add(&states, sizeof(uint32_t));
+		*s = XDG_TOPLEVEL_STATE_TILED_TOP;
+	}
+
+	if (toplevel->pending.state.tiled_orientation &
+	    WESTON_TOP_LEVEL_TILED_ORIENTATION_BOTTOM) {
+		s = wl_array_add(&states, sizeof(uint32_t));
+		*s = XDG_TOPLEVEL_STATE_TILED_BOTTOM;
+	}
 
 	xdg_toplevel_send_configure(toplevel->resource,
 				    toplevel->pending.size.width,
@@ -686,6 +710,16 @@ weston_desktop_xdg_toplevel_set_size(struct weston_desktop_surface *dsurface,
 	weston_desktop_xdg_surface_schedule_configure(&toplevel->base);
 }
 
+static void
+weston_desktop_xdg_toplevel_set_orientation(struct weston_desktop_surface *surface, void *user_data,
+					    enum weston_top_level_tiled_orientation tiled_orientation)
+{
+	struct weston_desktop_xdg_toplevel *toplevel = user_data;
+
+	toplevel->pending.state.tiled_orientation = tiled_orientation;
+	weston_desktop_xdg_surface_schedule_configure(&toplevel->base);
+}
+
 static void
 weston_desktop_xdg_toplevel_committed(struct weston_desktop_xdg_toplevel *toplevel,
 				      int32_t sx, int32_t sy)
@@ -1096,6 +1130,9 @@ weston_desktop_xdg_toplevel_state_compare(struct weston_desktop_xdg_toplevel *to
 		return false;
 	if (toplevel->pending.state.resizing != configured.state.resizing)
 		return false;
+	if (toplevel->pending.state.tiled_orientation !=
+	    configured.state.tiled_orientation)
+		return false;
 
 	if (toplevel->pending.size.width == configured.size.width &&
 	    toplevel->pending.size.height == configured.size.height)
@@ -1440,6 +1477,7 @@ static const struct weston_desktop_surface_implementation weston_desktop_xdg_sur
 	.set_resizing = weston_desktop_xdg_toplevel_set_resizing,
 	.set_activated = weston_desktop_xdg_toplevel_set_activated,
 	.set_size = weston_desktop_xdg_toplevel_set_size,
+	.set_orientation = weston_desktop_xdg_toplevel_set_orientation,
 
 	.get_maximized = weston_desktop_xdg_toplevel_get_maximized,
 	.get_fullscreen = weston_desktop_xdg_toplevel_get_fullscreen,
-- 
2.35.1