1 From 87e8811a2fc95b57f958e2bdfe5f3e434ecbff1e Mon Sep 17 00:00:00 2001
2 From: Roger Zanoni <rzanoni@igalia.com>
3 Date: Sun, 2 Jul 2023 11:11:07 +0200
4 Subject: [PATCH 9/9] Start using agl-shell version 4
7 ui/aura/agl/window_tree_host_agl.h | 1 +
8 ui/aura/agl/window_tree_host_platform_agl.cc | 4 +
9 ui/aura/agl/window_tree_host_platform_agl.h | 1 +
10 .../extensions/agl/host/agl_shell_wrapper.cc | 9 +
11 .../extensions/agl/host/agl_shell_wrapper.h | 1 +
12 .../agl/host/wayland_extensions_agl_impl.cc | 2 +-
13 .../extensions/agl/host/wayland_window_agl.cc | 10 +
14 .../extensions/agl/host/wayland_window_agl.h | 1 +
15 .../extensions/agl/protocol/agl-shell.xml | 185 +++++++++++++++++-
16 ui/platform_window/agl/platform_window_agl.h | 1 +
17 10 files changed, 213 insertions(+), 2 deletions(-)
19 diff --git a/ui/aura/agl/window_tree_host_agl.h b/ui/aura/agl/window_tree_host_agl.h
20 index b9aa451c8332e..c5213f75e623e 100644
21 --- a/ui/aura/agl/window_tree_host_agl.h
22 +++ b/ui/aura/agl/window_tree_host_agl.h
23 @@ -36,6 +36,7 @@ class AURA_EXPORT WindowTreeHostAgl {
24 virtual void SetAglBackground() {}
25 virtual void SetAglPanel(uint32_t edge) {}
26 virtual bool IsSurfaceConfigured() const { return false; }
27 + virtual void SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height) {}
31 diff --git a/ui/aura/agl/window_tree_host_platform_agl.cc b/ui/aura/agl/window_tree_host_platform_agl.cc
32 index 67190e1da6973..b9bae3f3b9bdc 100644
33 --- a/ui/aura/agl/window_tree_host_platform_agl.cc
34 +++ b/ui/aura/agl/window_tree_host_platform_agl.cc
35 @@ -51,4 +51,8 @@ bool WindowTreeHostPlatformAgl::IsSurfaceConfigured() const {
36 return window_tree_host_platform_->platform_window()->IsSurfaceConfigured();
39 +void WindowTreeHostPlatformAgl::SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height) {
40 + window_tree_host_platform_->platform_window()->SetupActivationArea(x, y, width, height);
44 diff --git a/ui/aura/agl/window_tree_host_platform_agl.h b/ui/aura/agl/window_tree_host_platform_agl.h
45 index e5a29fa1bfca3..30e160736e327 100644
46 --- a/ui/aura/agl/window_tree_host_platform_agl.h
47 +++ b/ui/aura/agl/window_tree_host_platform_agl.h
48 @@ -42,6 +42,7 @@ class AURA_EXPORT WindowTreeHostPlatformAgl : public aura::WindowTreeHost {
49 void SetAglBackground() override;
50 void SetAglPanel(uint32_t edge) override;
51 bool IsSurfaceConfigured() const override;
52 + void SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height) override;
55 aura::WindowTreeHostPlatform* window_tree_host_platform_;
56 diff --git a/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.cc b/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.cc
57 index c74fa5d9cd221..0d5d79c4738df 100644
58 --- a/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.cc
59 +++ b/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.cc
60 @@ -110,4 +110,13 @@ bool AglShellWrapper::WaitUntilBoundOk() {
64 +void AglShellWrapper::SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height) {
65 +#ifdef AGL_SHELL_SET_ACTIVATE_REGION_SINCE_VERSION
67 + connection_->wayland_output_manager()->GetPrimaryOutput()->get_output();
68 + agl_shell_set_activate_region(agl_shell_.get(), output, x, y,
74 diff --git a/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h b/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h
75 index 2ab765883057e..1c2074e1b4306 100644
76 --- a/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h
77 +++ b/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h
78 @@ -39,6 +39,7 @@ class AglShellWrapper {
79 void SetAglPanel(WaylandWindow* window, uint32_t edge);
80 void SetAglBackground(WaylandWindow* window);
82 + void SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height);
83 bool WaitUntilBoundOk();
85 static void AglShellBoundOk(void* data, struct agl_shell*);
86 diff --git a/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc
87 index 075b3010ea8a1..8f9d938cdd1f6 100644
88 --- a/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc
89 +++ b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc
90 @@ -32,7 +32,7 @@ namespace ui {
93 constexpr uint32_t kMinAglShellExtensionVersion = 1;
94 -constexpr uint32_t kMaxAglShellExtensionVersion = 3;
95 +constexpr uint32_t kMaxAglShellExtensionVersion = 4;
99 diff --git a/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.cc b/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.cc
100 index 97b21ae537658..f92406d455de1 100644
101 --- a/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.cc
102 +++ b/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.cc
103 @@ -83,4 +83,14 @@ void WaylandWindowAgl::SetAglPanel(uint32_t edge) {
104 connection()->ScheduleFlush();
107 +void WaylandWindowAgl::SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height) {
108 + if (!agl_extensions_->GetAglShell()) {
109 + LOG(ERROR) << "Agl shell wrapper is not created";
113 + agl_extensions_->GetAglShell()->SetupActivationArea(x, y, width, height);
114 + connection()->ScheduleFlush();
118 diff --git a/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.h b/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.h
119 index b2a922604c001..d21d2d9387215 100644
120 --- a/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.h
121 +++ b/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.h
122 @@ -39,6 +39,7 @@ class WaylandWindowAgl : public WaylandToplevelWindow {
123 void SetAglReady() override;
124 void SetAglBackground() override;
125 void SetAglPanel(uint32_t edge) override;
126 + void SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height) override;
129 WaylandExtensionsAgl* agl_extensions_;
130 diff --git a/ui/ozone/platform/wayland/extensions/agl/protocol/agl-shell.xml b/ui/ozone/platform/wayland/extensions/agl/protocol/agl-shell.xml
131 index ad5553d61f189..e010a80808c69 100644
132 --- a/ui/ozone/platform/wayland/extensions/agl/protocol/agl-shell.xml
133 +++ b/ui/ozone/platform/wayland/extensions/agl/protocol/agl-shell.xml
135 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
136 DEALINGS IN THE SOFTWARE.
138 - <interface name="agl_shell" version="3">
139 + <interface name="agl_shell" version="8">
140 <description summary="user interface for Automotive Grade Linux platform">
141 Starting with version 2 of the protocol, the client is required to wait
142 for the 'bound_ok' or 'bound_fail' events in order to proceed further.
143 @@ -174,6 +174,189 @@
144 <arg name="state" type="uint" enum="app_state"/>
147 + <request name="set_activate_region" since="4">
148 + <description summary="sets a specific region to activate">
149 + A hint for the compositor to use a custom area, rather than
150 + inferring the activation area. If any panels are used
151 + the compositor computes the activation area by subtracting the
152 + panels geometry area. If no panels are used then the entire output
153 + is being used. This request changes that as to hint the compositor
154 + to use the supplied rectangle and ignore any potential panels
155 + that might been set-up previously.
157 + In order for this request to take effect it will need to happen
158 + before the 'ready' request in order for the compositor to make use of it.
159 + Note that any 'set_panel' request be will not be honored, if this request
162 + The x and y coordinates use the top-left corner as the origin. The
163 + rectangle area shouldn't exceed the output area, while an area smaller
164 + than the output, would basically result in showing up the background
167 + <arg name="output" type="object" interface="wl_output"/>
168 + <arg name="x" type="int" summary="x position of rectangle"/>
169 + <arg name="y" type="int" summary="y position of rectangle"/>
170 + <arg name="width" type="int" summary="width of rectangle"/>
171 + <arg name="height" type="int" summary="height of rectangle"/>
174 + <request name="deactivate_app" since="5">
175 + <description summary="de-activate/hide window identified by app_id">
176 + Ask the compositor to hide the toplevel window for window
177 + management purposes. Depending on the window role, this request
178 + will either display the previously active window (or the background
179 + in case there's no previously active surface) or temporarily (or
180 + until a 'activate_app' is called upon) hide the surface.
182 + All the surfaces are identifiable by using the app_id, and no actions
183 + are taken in case the app_id is not/was not present.
185 + See xdg_toplevel.set_app_id from the xdg-shell protocol for a
186 + description of app_id.
188 + <arg name="app_id" type="string"/>
191 + <request name="set_app_float" since="6">
192 + <description summary="set the window identified by app_id as float">
193 + Makes the application identified by app_id as floating. If the
194 + application's window is already mapped, in a maximized, normal state,
195 + it would transition to the float state.
197 + For applications that want to modify their own state, this request
198 + must be done before the initial surface commit in order to take effect.
200 + If the application is already in floating state, this request wouldn't
203 + There's no persistence of this request, once the application terminated
204 + you'll to issue this request again for that particular app_id.
206 + The x, and y values would be initial position of the window where the
207 + window surface will be placed.
209 + See xdg_toplevel.set_app_id from the xdg-shell protocol for a
210 + description of app_id.
212 + <arg name="app_id" type="string"/>
213 + <arg name="x" type="int" summary="x position"/>
214 + <arg name="y" type="int" summary="y position"/>
217 + <request name="set_app_normal" since="6">
218 + <description summary="set the window identified by app_id as normally started">
219 + Returns the application identified by app_id as it was in the normal state.
220 + This is useful to come back from other states to the maximized state, the
221 + normal state applications are started.
223 + <arg name="app_id" type="string"/>
226 + <request name="set_app_fullscreen" since="7">
227 + <description summary="">
228 + Makes the application identified by app_id as fullscreen. If the
229 + application's window is already mapped, in a maximized, normal state,
230 + it would transition to the fullscreen state.
232 + For applications that want to modify their own state, this request
233 + must be done before the initial surface commit in order to take effect.
235 + If the application is already in fullscreen state, this request wouldn't
238 + There's no persistence of this request, once the application terminated
239 + you'll to issue this request again for that particular app_id.
241 + See xdg_toplevel.set_app_id from the xdg-shell protocol for a
242 + description of app_id.
244 + <arg name="app_id" type="string"/>
247 + <request name="set_app_output" since="8">
248 + <description summary="Assign an application to a particular output">
249 + This would allow the compositor to place an application on a particular
250 + output, if that output is indeed available. This can happen before
251 + application is started which would make the application start on that
252 + particular output. If the application is already started it would
253 + move the application to that output.
255 + There's no persistence of this request, once the application terminated
256 + you'll need to issue this request again for that particular app_id.
258 + See xdg_toplevel.set_app_id from the xdg-shell protocol for a
259 + description of app_id.
261 + <arg name="app_id" type="string"/>
262 + <arg name="output" type="object" interface="wl_output"/>
265 + <event name="app_on_output" since="8">
266 + <description summary="Event sent as a reponse to set_app_output">
267 + Clients can use this event to be notified when an application
268 + wants to be displayed on a certain output. This event is sent in
269 + response to the set_app_output request.
271 + See xdg_toplevel.set_app_id from the xdg-shell protocol for a
272 + description of app_id.
274 + <arg name="app_id" type="string"/>
275 + <arg name="output_name" type="string"/>
279 + <interface name="agl_shell_ext" version="1">
280 + <description summary="extended user interface for Automotive Grade Linux platform">
281 + This interface allows another client bind to the agl_shell interface,
282 + while there's another shell client already present.
284 + The client should first bind to this interface and then inform the
285 + compositor with the 'doas_shell_client' request and it wants to bind to
286 + the agl_shell interface. The client is still expected, if using a new
287 + version of the agl_shell interface, to wait for the 'bound_ok' and
288 + 'bound_fail' events before issueing any other requests/events.
290 + Note that this interface has its limitations, and the compositor would
291 + still refuse the act for 'set_panel' or 'set_background' requests
292 + of the agl_shell interface if there's already a client that used them.
294 + Any other requests or events should be delievered and handled as it would
295 + a client bound to the agl_shell interface.
298 + <enum name="doas_shell_client_status">
299 + <entry name="success" value="0"/>
300 + <entry name="failed" value="1"/>
303 + <request name="destroy" type="destructor">
304 + <description summary="destroys the factory object">
305 + Call the destructor once you're ready with agl_shell_ext interface.
306 + This would reset the state and would make any requests made
307 + on the agl_shell interface be terminated. The client would need
308 + to bind again the agl_shell_ext and issue a 'doas_shell_client'
313 + <request name="doas_shell_client">
314 + <description summary="Informs the compositor it wants to bind to the
315 + agl_shell interface">
316 + Prior to binding to agl_shell interface, this request would inform
317 + the compositor that it wants to gain access the agl_shell interface.
318 + The client is expected to wait for 'doas_shell_client_done' event and
319 + check for a successful status before going further with binding to
320 + the agl_shell interface.
324 + <event name="doas_done">
325 + <description summary="event sent as a reply to doas_shell_client">
326 + The client should check the status event to verify that the
327 + compositor was able to handle the request.
329 + <arg name="status" type="uint" enum="doas_shell_client_status"/>
333 diff --git a/ui/platform_window/agl/platform_window_agl.h b/ui/platform_window/agl/platform_window_agl.h
334 index cab1f42272772..b1a6150fff950 100644
335 --- a/ui/platform_window/agl/platform_window_agl.h
336 +++ b/ui/platform_window/agl/platform_window_agl.h
337 @@ -30,6 +30,7 @@ class PlatformWindowAgl {
338 virtual void SetAglBackground() {}
339 virtual void SetAglPanel(uint32_t edge) {}
340 virtual bool IsSurfaceConfigured() { return false; }
341 + virtual void SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height) {}