fb3a5b3f7777520e56d9f8355edf65979318b4f8
[AGL/meta-agl.git] /
1 From 2c55093cda17dd16d98a8fb0d26717b29d5d0e75 Mon Sep 17 00:00:00 2001
2 From: Marius Vlad <marius.vlad@collabora.com>
3 Date: Thu, 28 Dec 2023 19:20:31 +0200
4 Subject: [PATCH 1/2] activation_area: Add missing width and height
5
6 Setting up an activation area can also require a different rectangle
7 size, so allow to set-up one.
8
9 Note that there's no actual check if the values are invalid, for
10 instance like exceeding the output's dimensions.
11
12 Bug-AGL: SPEC-5038
13 Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
14 ---
15  shell/configuration/configuration.cc |  8 ++++++++
16  shell/configuration/configuration.h  |  2 ++
17  shell/view/flutter_view.cc           |  3 ++-
18  shell/wayland/display.cc             | 10 +++++-----
19  shell/wayland/display.h              |  8 +++++++-
20  shell/wayland/window.cc              | 13 +++++++++----
21  shell/wayland/window.h               |  4 ++++
22  7 files changed, 37 insertions(+), 11 deletions(-)
23
24 diff --git a/shell/configuration/configuration.cc b/shell/configuration/configuration.cc
25 index 2cec924..63b7a82 100644
26 --- a/shell/configuration/configuration.cc
27 +++ b/shell/configuration/configuration.cc
28 @@ -104,9 +104,17 @@ void Configuration::getViewParameters(
29  
30      instance.view.activation_area_x = static_cast<uint32_t>(val["x"].GetInt());
31      instance.view.activation_area_y = static_cast<uint32_t>(val["y"].GetInt());
32 +    instance.view.activation_area_width =
33 +        static_cast<uint32_t>(val["width"].GetInt());
34 +    instance.view.activation_area_height =
35 +        static_cast<uint32_t>(val["height"].GetInt());
36  
37      SPDLOG_DEBUG("activation area x {}", instance.view.activation_area_x);
38      SPDLOG_DEBUG("activation area y {}", instance.view.activation_area_y);
39 +    SPDLOG_DEBUG("activation area width {}",
40 +                 instance.view.activation_area_width);
41 +    SPDLOG_DEBUG("activation area height {}",
42 +                 instance.view.activation_area_height);
43    }
44  }
45  
46 diff --git a/shell/configuration/configuration.h b/shell/configuration/configuration.h
47 index 0e3d721..b0ccbc9 100644
48 --- a/shell/configuration/configuration.h
49 +++ b/shell/configuration/configuration.h
50 @@ -44,6 +44,8 @@ class Configuration {
51        uint32_t height;
52        uint32_t activation_area_x;
53        uint32_t activation_area_y;
54 +      uint32_t activation_area_width;
55 +      uint32_t activation_area_height;
56        bool fullscreen;
57        bool fullscreen_set;
58        double pixel_ratio;
59 diff --git a/shell/view/flutter_view.cc b/shell/view/flutter_view.cc
60 index ca51f4e..7b48b85 100644
61 --- a/shell/view/flutter_view.cc
62 +++ b/shell/view/flutter_view.cc
63 @@ -67,9 +67,10 @@ FlutterView::FlutterView(Configuration::Config config,
64    m_wayland_window = std::make_shared<WaylandWindow>(
65        m_index, display, m_config.view.window_type,
66        m_wayland_display->GetWlOutput(m_config.view.wl_output_index),
67 -      m_config.view.wl_output_index, m_config.app_id, m_config.view.fullscreen, 
68 +      m_config.view.wl_output_index, m_config.app_id, m_config.view.fullscreen,
69        m_config.view.width, m_config.view.height, m_config.view.pixel_ratio,
70        m_config.view.activation_area_x, m_config.view.activation_area_y,
71 +      m_config.view.activation_area_width, m_config.view.activation_area_height,
72        m_backend.get(), m_config.view.ivi_surface_id);
73  }
74  
75 diff --git a/shell/wayland/display.cc b/shell/wayland/display.cc
76 index aba050a..0b97954 100644
77 --- a/shell/wayland/display.cc
78 +++ b/shell/wayland/display.cc
79 @@ -857,16 +857,16 @@ void Display::AglShellDoReady() const {
80  
81  void Display::AglShellDoSetupActivationArea(uint32_t x,
82                                              uint32_t y,
83 +                                            uint32_t width,
84 +                                            uint32_t height,
85                                              uint32_t index) {
86 -  uint32_t width = m_all_outputs[index]->width;
87 -  uint32_t height = m_all_outputs[index]->height - (2 * y);
88 -
89    if (!m_agl.shell)
90      return;
91  
92    if (m_all_outputs[index]->transform == WL_OUTPUT_TRANSFORM_90) {
93 -    width = m_all_outputs[index]->height;
94 -    height = m_all_outputs[index]->width - (2 * y);
95 +    uint32_t tmp_width = width;
96 +    width = height;
97 +    height = tmp_width;
98    }
99  
100    SPDLOG_DEBUG("Using custom rectangle [{}x{}+{}x{}] for activation", width,
101 diff --git a/shell/wayland/display.h b/shell/wayland/display.h
102 index b919047..a792ad7 100644
103 --- a/shell/wayland/display.h
104 +++ b/shell/wayland/display.h
105 @@ -172,6 +172,8 @@ class Display {
106     * @return void
107     * @param[in] x the x position for the activation rectangle
108     * @param[in] y the y position for the activation rectangle
109 +   * @param[in] width the width position for the activation rectangle
110 +   * @param[in] height the height position for the activation rectangle
111     * @param[index] the output, as a number
112     * @relation
113     *
114 @@ -193,7 +195,11 @@ class Display {
115     * |                 |
116     * --------------------
117     */
118 -  void AglShellDoSetupActivationArea(uint32_t x, uint32_t y, uint32_t index);
119 +  void AglShellDoSetupActivationArea(uint32_t x,
120 +                                     uint32_t y,
121 +                                     uint32_t width,
122 +                                     uint32_t height,
123 +                                     uint32_t index);
124  
125    /**
126     * @brief Set Engine
127 diff --git a/shell/wayland/window.cc b/shell/wayland/window.cc
128 index 373b0a2..f816e58 100644
129 --- a/shell/wayland/window.cc
130 +++ b/shell/wayland/window.cc
131 @@ -31,6 +31,8 @@ WaylandWindow::WaylandWindow(size_t index,
132                               double pixel_ratio,
133                               uint32_t activation_area_x,
134                               uint32_t activation_area_y,
135 +                             uint32_t activation_area_width,
136 +                             uint32_t activation_area_height,
137                               Backend* backend,
138                               uint32_t ivi_surface_id)
139      : m_index(index),
140 @@ -42,7 +44,8 @@ WaylandWindow::WaylandWindow(size_t index,
141        m_geometry({width, height}),
142        m_window_size({width, height}),
143        m_pixel_ratio(pixel_ratio),
144 -      m_activation_area({activation_area_x, activation_area_y}),
145 +      m_activation_area({activation_area_x, activation_area_y,
146 +                         activation_area_width, activation_area_height}),
147        m_type(get_window_type(type)),
148        m_app_id(std::move(app_id)),
149        m_ivi_surface_id(ivi_surface_id),
150 @@ -98,10 +101,12 @@ WaylandWindow::WaylandWindow(size_t index,
151      case WINDOW_BG:
152        m_display->AglShellDoBackground(m_base_surface, 0);
153        if (m_activation_area.x > 0 && m_activation_area.y > 0)
154 -        m_display->AglShellDoSetupActivationArea(m_activation_area.x,
155 -                                                 m_activation_area.y, 0);
156 +        m_display->AglShellDoSetupActivationArea(
157 +            m_activation_area.x, m_activation_area.y, m_activation_area.width,
158 +            m_activation_area.height, 0);
159        else
160 -        m_display->AglShellDoSetupActivationArea(0, 160, 0);
161 +        m_display->AglShellDoSetupActivationArea(0, 160, m_activation_area.width,
162 +                                                 m_activation_area.height, 0);
163        break;
164      case WINDOW_PANEL_TOP:
165        m_display->AglShellDoPanel(m_base_surface, AGL_SHELL_EDGE_TOP, 0);
166 diff --git a/shell/wayland/window.h b/shell/wayland/window.h
167 index 998a1c8..f66f70a 100644
168 --- a/shell/wayland/window.h
169 +++ b/shell/wayland/window.h
170 @@ -67,6 +67,8 @@ class WaylandWindow {
171                  double pixel_ratio,
172                  uint32_t activation_area_x,
173                  uint32_t activation_area_y,
174 +                uint32_t activation_area_width,
175 +                uint32_t activation_area_height,
176                  Backend* backend,
177                  uint32_t ivi_surface_id);
178  
179 @@ -166,6 +168,8 @@ class WaylandWindow {
180    struct {
181      uint32_t x;
182      uint32_t y;
183 +    uint32_t width;
184 +    uint32_t height;
185    } m_activation_area;
186    struct {
187      int32_t width;
188 -- 
189 2.35.1
190