Merge lp:~alan-griffiths/mir/resize-examples into lp:mir
- resize-examples
- Merge into development-branch
Status: | Merged |
---|---|
Approved by: | Alberto Aguirre |
Approved revision: | no longer in the source branch. |
Merged at revision: | 4188 |
Proposed branch: | lp:~alan-griffiths/mir/resize-examples |
Merge into: | lp:mir |
Prerequisite: | lp:~alan-griffiths/mir/mir_window_get_connection |
Diff against target: |
514 lines (+222/-124) 10 files modified
examples/client_helpers.cpp (+38/-1) examples/client_helpers.h (+1/-0) examples/client_touch_validator.cpp (+4/-1) examples/eglapp.c (+18/-16) examples/eglapp.h (+1/-0) examples/eglsquare.cpp (+120/-100) examples/multi_stream.cpp (+6/-6) examples/prerendered_frames.c (+32/-0) examples/target.c (+1/-0) src/utils/vanity.c (+1/-0) |
To merge this branch: | bzr merge lp:~alan-griffiths/mir/resize-examples |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Mir CI Bot | continuous-integration | Approve | |
Alberto Aguirre (community) | Approve | ||
Review via email: mp+325170@code.launchpad.net |
Commit message
Fix window resize logic in example code
Description of the change
Alberto Aguirre (albaguirre) wrote : | # |
It looks like this would be a pretty common thing a client needs to do:
mir_
MirWindowSpec* spec = mir_create_
mir_
mir_
mir_
Maybe a convenience api should be introduced? maybe mir_window_
Mir CI Bot (mir-ci-bot) wrote : | # |
PASSED: Continuous integration, rev:4193
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Preview Diff
1 | === modified file 'examples/client_helpers.cpp' |
2 | --- examples/client_helpers.cpp 2017-05-23 10:51:47 +0000 |
3 | +++ examples/client_helpers.cpp 2017-06-06 15:58:12 +0000 |
4 | @@ -51,8 +51,14 @@ |
5 | } |
6 | |
7 | mir::examples::NormalWindow::NormalWindow( |
8 | + Connection& connection, unsigned int width, unsigned int height, MirRenderSurface* surface) : |
9 | + window{create_window(connection, width, height, surface), &mir_window_release_sync} |
10 | +{ |
11 | +} |
12 | + |
13 | +mir::examples::NormalWindow::NormalWindow( |
14 | mir::examples::Connection& connection, unsigned int width, unsigned int height, mir::examples::Context& eglcontext) : |
15 | - window{create_window(connection, width, height, eglcontext.mir_surface()), &mir_window_release_sync} |
16 | + NormalWindow(connection, width, height, eglcontext.mir_surface()) |
17 | { |
18 | } |
19 | |
20 | @@ -61,6 +67,34 @@ |
21 | return window.get(); |
22 | } |
23 | |
24 | +namespace |
25 | +{ |
26 | +void handle_window_event(MirWindow* window, MirEvent const* event, void* context) |
27 | +{ |
28 | + auto const surface = (MirRenderSurface*)context; |
29 | + |
30 | + switch (mir_event_get_type(event)) |
31 | + { |
32 | + case mir_event_type_resize: |
33 | + { |
34 | + MirResizeEvent const* resize = mir_event_get_resize_event(event); |
35 | + int const new_width = mir_resize_event_get_width(resize); |
36 | + int const new_height = mir_resize_event_get_height(resize); |
37 | + |
38 | + mir_render_surface_set_size(surface, new_width, new_height); |
39 | + MirWindowSpec* spec = mir_create_window_spec(mir_window_get_connection(window)); |
40 | + mir_window_spec_add_render_surface(spec, surface, new_width, new_height, 0, 0); |
41 | + mir_window_apply_spec(window, spec); |
42 | + mir_window_spec_release(spec); |
43 | + break; |
44 | + } |
45 | + |
46 | + default: |
47 | + break; |
48 | + } |
49 | +} |
50 | +} |
51 | + |
52 | MirWindow* me::NormalWindow::create_window( |
53 | MirConnection* connection, unsigned int width, unsigned int height, MirRenderSurface* surface) |
54 | { |
55 | @@ -72,7 +106,10 @@ |
56 | mir_window_spec_set_name(spec.get(), __PRETTY_FUNCTION__); |
57 | |
58 | if (surface) |
59 | + { |
60 | mir_window_spec_add_render_surface(spec.get(), surface, width, height, 0, 0); |
61 | + mir_window_spec_set_event_handler(spec.get(), &handle_window_event, surface); |
62 | + } |
63 | |
64 | auto window = mir_create_window_sync(spec.get()); |
65 | return window; |
66 | |
67 | === modified file 'examples/client_helpers.h' |
68 | --- examples/client_helpers.h 2017-05-26 13:52:51 +0000 |
69 | +++ examples/client_helpers.h 2017-06-06 15:58:12 +0000 |
70 | @@ -86,6 +86,7 @@ |
71 | public: |
72 | NormalWindow(Connection& connection, unsigned int width, unsigned int height); |
73 | NormalWindow(Connection& connection, unsigned int width, unsigned int height, Context& eglcontext); |
74 | + NormalWindow(Connection& connection, unsigned int width, unsigned int height, MirRenderSurface* surface); |
75 | |
76 | operator MirWindow*() const; |
77 | private: |
78 | |
79 | === modified file 'examples/client_touch_validator.cpp' |
80 | --- examples/client_touch_validator.cpp 2017-05-08 03:04:26 +0000 |
81 | +++ examples/client_touch_validator.cpp 2017-06-06 15:58:12 +0000 |
82 | @@ -134,7 +134,7 @@ |
83 | state->record_event(tev); |
84 | } |
85 | |
86 | -void on_event(MirWindow * /*surface*/, const MirEvent *event, void *context) |
87 | +void on_event(MirWindow *window, const MirEvent *event, void *context) |
88 | { |
89 | TouchState *state = (TouchState*)context; |
90 | |
91 | @@ -143,6 +143,9 @@ |
92 | case mir_event_type_input: |
93 | on_input_event(state, mir_event_get_input_event(event)); |
94 | break; |
95 | + case mir_event_type_resize: |
96 | + egl_app_handle_resize_event(window, mir_event_get_resize_event(event)); |
97 | + break; |
98 | case mir_event_type_close_window: |
99 | abort(); |
100 | break; |
101 | |
102 | === modified file 'examples/eglapp.c' |
103 | --- examples/eglapp.c 2017-05-19 16:18:30 +0000 |
104 | +++ examples/eglapp.c 2017-06-06 15:58:12 +0000 |
105 | @@ -183,13 +183,24 @@ |
106 | * support for event queuing (directing them to another thread) or |
107 | * full single-threaded callbacks. (LP: #1194384). |
108 | */ |
109 | - { |
110 | - MirResizeEvent const* resize = mir_event_get_resize_event(ev); |
111 | - int const new_width = mir_resize_event_get_width(resize); |
112 | - int const new_height = mir_resize_event_get_height(resize); |
113 | - |
114 | - printf("Resized to %dx%d\n", new_width, new_height); |
115 | - if (surface) |
116 | + egl_app_handle_resize_event(window, mir_event_get_resize_event(ev)); |
117 | + break; |
118 | + case mir_event_type_close_window: |
119 | + printf("Received close event from server.\n"); |
120 | + running = 0; |
121 | + break; |
122 | + default: |
123 | + break; |
124 | + } |
125 | +} |
126 | + |
127 | +void egl_app_handle_resize_event(MirWindow* window, MirResizeEvent const* resize) |
128 | +{ |
129 | + int const new_width = mir_resize_event_get_width(resize); |
130 | + int const new_height = mir_resize_event_get_height(resize); |
131 | + |
132 | + printf("Resized to %dx%d\n", new_width, new_height); |
133 | + if (surface) |
134 | { |
135 | mir_render_surface_set_size(surface, new_width, new_height); |
136 | MirWindowSpec* spec = mir_create_window_spec(connection); |
137 | @@ -197,15 +208,6 @@ |
138 | mir_window_apply_spec(window, spec); |
139 | mir_window_spec_release(spec); |
140 | } |
141 | - } |
142 | - break; |
143 | - case mir_event_type_close_window: |
144 | - printf("Received close event from server.\n"); |
145 | - running = 0; |
146 | - break; |
147 | - default: |
148 | - break; |
149 | - } |
150 | } |
151 | |
152 | static void show_help(struct mir_eglapp_arg const* const* arg_lists) |
153 | |
154 | === modified file 'examples/eglapp.h' |
155 | --- examples/eglapp.h 2017-05-08 03:04:26 +0000 |
156 | +++ examples/eglapp.h 2017-06-06 15:58:12 +0000 |
157 | @@ -45,6 +45,7 @@ |
158 | mir_eglapp_bool mir_eglapp_running(void); |
159 | void mir_eglapp_cleanup(void); |
160 | void mir_eglapp_handle_event(MirWindow* window, MirEvent const* ev, void* unused); |
161 | +void egl_app_handle_resize_event(MirWindow* window, MirResizeEvent const* resize); |
162 | double mir_eglapp_display_hz(void); |
163 | |
164 | MirConnection* mir_eglapp_native_connection(); |
165 | |
166 | === modified file 'examples/eglsquare.cpp' |
167 | --- examples/eglsquare.cpp 2017-06-05 09:37:52 +0000 |
168 | +++ examples/eglsquare.cpp 2017-06-06 15:58:12 +0000 |
169 | @@ -127,106 +127,126 @@ |
170 | if (worker.joinable()) worker.join(); |
171 | } |
172 | |
173 | - void on_event(MirEvent const* ev) |
174 | - { |
175 | - if (mir_event_get_type(ev) != mir_event_type_input) |
176 | - return; |
177 | - float x{0.0f}; |
178 | - float y{0.0f}; |
179 | - auto ievent = mir_event_get_input_event(ev); |
180 | - if (mir_input_event_get_type(ievent) == mir_input_event_type_touch) |
181 | - { |
182 | - auto tev = mir_input_event_get_touch_event(ievent); |
183 | - x = mir_touch_event_axis_value(tev, 0, mir_touch_axis_x); |
184 | - y = mir_touch_event_axis_value(tev, 0, mir_touch_axis_y); |
185 | - } |
186 | - else if (mir_input_event_get_type(ievent) == mir_input_event_type_pointer) |
187 | - { |
188 | - auto pev = mir_input_event_get_pointer_event(ievent); |
189 | - x = mir_pointer_event_axis_value(pev, mir_pointer_axis_x); |
190 | - y = mir_pointer_event_axis_value(pev, mir_pointer_axis_y); |
191 | - } |
192 | - else |
193 | - { |
194 | - return; |
195 | - } |
196 | - |
197 | - pos = Pos{x, y}; |
198 | - cv.notify_one(); |
199 | - } |
200 | - |
201 | - SquareRenderingSurface(SquareRenderingSurface const&) = delete; |
202 | - SquareRenderingSurface& operator=(SquareRenderingSurface const&) = delete; |
203 | -private: |
204 | - struct OutputDimensions |
205 | - { |
206 | - unsigned int const width; |
207 | - unsigned int const height; |
208 | - } const dimensions; |
209 | - |
210 | - me::Context context; |
211 | - me::NormalWindow window; |
212 | - RenderProgram program; |
213 | - |
214 | - OutputDimensions active_output_dimensions(MirConnection* connection) |
215 | - { |
216 | - unsigned int width{0}; |
217 | - unsigned int height{0}; |
218 | - auto display_config = mir_connection_create_display_configuration(connection); |
219 | - auto num_outputs = mir_display_config_get_num_outputs(display_config); |
220 | - for (auto i = 0; i < num_outputs; i++) |
221 | - { |
222 | - auto output = mir_display_config_get_output(display_config, i); |
223 | - auto state = mir_output_get_connection_state(output); |
224 | - if (state == mir_output_connection_state_connected && mir_output_is_enabled(output)) |
225 | - { |
226 | - auto mode = mir_output_get_current_mode(output); |
227 | - width = mir_output_mode_get_width(mode); |
228 | - height = mir_output_mode_get_height(mode); |
229 | - break; |
230 | - } |
231 | - } |
232 | - mir_display_config_release(display_config); |
233 | - if (width == 0 || height == 0) |
234 | - throw std::logic_error("could not determine display size"); |
235 | - return {width, height}; |
236 | - } |
237 | - |
238 | - static void on_event(MirWindow*, const MirEvent *event, void *context) |
239 | - { |
240 | - auto surface = reinterpret_cast<SquareRenderingSurface*>(context); |
241 | - if (surface) surface->on_event(event); |
242 | - } |
243 | - |
244 | -private: |
245 | - void do_work() |
246 | - { |
247 | - std::unique_lock<decltype(mutex)> lock(mutex); |
248 | - |
249 | - while (true) |
250 | - { |
251 | - cv.wait(lock); |
252 | - |
253 | - if (!running) return; |
254 | - |
255 | - Pos pos = this->pos; |
256 | - |
257 | - context.make_current(); |
258 | - program.draw( |
259 | - pos.x/static_cast<float>(dimensions.width)*2.0 - 1.0, |
260 | - pos.y/static_cast<float>(dimensions.height)*-2.0 + 1.0); |
261 | - context.swapbuffers(); |
262 | - } |
263 | - } |
264 | - |
265 | - struct Pos { float x; float y; }; |
266 | - std::atomic<Pos> pos; |
267 | - |
268 | - std::thread worker; |
269 | - std::condition_variable cv; |
270 | - std::mutex mutex; |
271 | - bool running{true}; |
272 | -}; |
273 | + void on_event(MirEvent const* event) |
274 | + { |
275 | + switch (mir_event_get_type(event)) |
276 | + { |
277 | + case mir_event_type_resize: |
278 | + { |
279 | + MirResizeEvent const* resize = mir_event_get_resize_event(event); |
280 | + int const new_width = mir_resize_event_get_width(resize); |
281 | + int const new_height = mir_resize_event_get_height(resize); |
282 | + |
283 | + mir_render_surface_set_size(context.mir_surface(), new_width, new_height); |
284 | + MirWindowSpec* spec = mir_create_window_spec(mir_window_get_connection(window)); |
285 | + mir_window_spec_add_render_surface(spec, context.mir_surface(), new_width, new_height, 0, 0); |
286 | + mir_window_apply_spec(window, spec); |
287 | + mir_window_spec_release(spec); |
288 | + break; |
289 | + } |
290 | + |
291 | + case mir_event_type_input: |
292 | + { |
293 | + float x{0.0f}; |
294 | + float y{0.0f}; |
295 | + auto ievent = mir_event_get_input_event(event); |
296 | + if (mir_input_event_get_type(ievent) == mir_input_event_type_touch) |
297 | + { |
298 | + auto tev = mir_input_event_get_touch_event(ievent); |
299 | + x = mir_touch_event_axis_value(tev, 0, mir_touch_axis_x); |
300 | + y = mir_touch_event_axis_value(tev, 0, mir_touch_axis_y); |
301 | + } |
302 | + else if (mir_input_event_get_type(ievent) == mir_input_event_type_pointer) |
303 | + { |
304 | + auto pev = mir_input_event_get_pointer_event(ievent); |
305 | + x = mir_pointer_event_axis_value(pev, mir_pointer_axis_x); |
306 | + y = mir_pointer_event_axis_value(pev, mir_pointer_axis_y); |
307 | + } |
308 | + else |
309 | + { |
310 | + return; |
311 | + } |
312 | + |
313 | + pos = Pos{x, y}; |
314 | + cv.notify_one(); |
315 | + } |
316 | + |
317 | + default:; |
318 | + } |
319 | + } |
320 | + |
321 | + SquareRenderingSurface(SquareRenderingSurface const&) = delete; |
322 | + SquareRenderingSurface& operator=(SquareRenderingSurface const&) = delete; |
323 | + private: |
324 | + struct OutputDimensions |
325 | + { |
326 | + unsigned int const width; |
327 | + unsigned int const height; |
328 | + } const dimensions; |
329 | + |
330 | + me::Context context; |
331 | + me::NormalWindow window; |
332 | + RenderProgram program; |
333 | + |
334 | + OutputDimensions active_output_dimensions(MirConnection* connection) |
335 | + { |
336 | + unsigned int width{0}; |
337 | + unsigned int height{0}; |
338 | + auto display_config = mir_connection_create_display_configuration(connection); |
339 | + auto num_outputs = mir_display_config_get_num_outputs(display_config); |
340 | + for (auto i = 0; i < num_outputs; i++) |
341 | + { |
342 | + auto output = mir_display_config_get_output(display_config, i); |
343 | + auto state = mir_output_get_connection_state(output); |
344 | + if (state == mir_output_connection_state_connected && mir_output_is_enabled(output)) |
345 | + { |
346 | + auto mode = mir_output_get_current_mode(output); |
347 | + width = mir_output_mode_get_width(mode); |
348 | + height = mir_output_mode_get_height(mode); |
349 | + break; |
350 | + } |
351 | + } |
352 | + mir_display_config_release(display_config); |
353 | + if (width == 0 || height == 0) |
354 | + throw std::logic_error("could not determine display size"); |
355 | + return {width, height}; |
356 | + } |
357 | + |
358 | + static void on_event(MirWindow*, const MirEvent *event, void *context) |
359 | + { |
360 | + auto surface = reinterpret_cast<SquareRenderingSurface*>(context); |
361 | + if (surface) surface->on_event(event); |
362 | + } |
363 | + |
364 | + private: |
365 | + void do_work() |
366 | + { |
367 | + std::unique_lock<decltype(mutex)> lock(mutex); |
368 | + |
369 | + while (true) |
370 | + { |
371 | + cv.wait(lock); |
372 | + |
373 | + if (!running) return; |
374 | + |
375 | + Pos pos = this->pos; |
376 | + |
377 | + context.make_current(); |
378 | + program.draw( |
379 | + pos.x/static_cast<float>(dimensions.width)*2.0 - 1.0, |
380 | + pos.y/static_cast<float>(dimensions.height)*-2.0 + 1.0); |
381 | + context.swapbuffers(); |
382 | + } |
383 | + } |
384 | + |
385 | + struct Pos { float x; float y; }; |
386 | + std::atomic<Pos> pos; |
387 | + |
388 | + std::thread worker; |
389 | + std::condition_variable cv; |
390 | + std::mutex mutex; |
391 | + bool running{true}; |
392 | + }; |
393 | } |
394 | |
395 | int main(int argc, char *argv[]) |
396 | |
397 | === modified file 'examples/multi_stream.cpp' |
398 | --- examples/multi_stream.cpp 2017-05-23 10:51:47 +0000 |
399 | +++ examples/multi_stream.cpp 2017-06-06 15:58:12 +0000 |
400 | @@ -49,8 +49,6 @@ |
401 | |
402 | int displacement_x{0}; |
403 | int displacement_y{0}; |
404 | - int width{0}; |
405 | - int height{0}; |
406 | |
407 | MyBufferStream& operator=(MyBufferStream &&) = default; |
408 | MyBufferStream(MyBufferStream &&) = default; |
409 | @@ -278,7 +276,7 @@ |
410 | 0 |
411 | }; |
412 | |
413 | - me::NormalWindow window{connection, 200, 200}; |
414 | + me::NormalWindow window{connection, 200, 200, stream[0]}; |
415 | |
416 | while (poll(&signal_poll, 1, 0) <= 0) |
417 | { |
418 | @@ -302,8 +300,12 @@ |
419 | auto spec = mir_create_window_spec(connection); |
420 | for (auto& s : stream) |
421 | { |
422 | + int width{0}; |
423 | + int height{0}; |
424 | + mir_render_surface_get_size(s, &width, &height); |
425 | + |
426 | mir_buffer_stream_swap_buffers_sync(s); |
427 | - mir_window_spec_add_render_surface(spec, s, s.width, s.height, s.displacement_x, s.displacement_y); |
428 | + mir_window_spec_add_render_surface(spec, s, width, height, s.displacement_x, s.displacement_y); |
429 | } |
430 | mir_window_apply_spec(window, spec); |
431 | mir_window_spec_release(spec); |
432 | @@ -322,8 +324,6 @@ |
433 | int displacement_y) |
434 | : displacement_x{displacement_x}, |
435 | displacement_y{displacement_y}, |
436 | - width{width}, |
437 | - height{height}, |
438 | stream{mir_connection_create_render_surface_sync(connection, width, height), &mir_render_surface_release}, |
439 | bs{get_stream(connection, width, height)} |
440 | { |
441 | |
442 | === modified file 'examples/prerendered_frames.c' |
443 | --- examples/prerendered_frames.c 2017-05-19 13:49:04 +0000 |
444 | +++ examples/prerendered_frames.c 2017-06-06 15:58:12 +0000 |
445 | @@ -92,6 +92,36 @@ |
446 | rendering = 0; |
447 | } |
448 | |
449 | +static void handle_window_event(MirWindow* window, MirEvent const* event, void* context) |
450 | +{ |
451 | + MirRenderSurface* const surface = (MirRenderSurface*)context; |
452 | + |
453 | + switch (mir_event_get_type(event)) |
454 | + { |
455 | + case mir_event_type_resize: |
456 | + { |
457 | + MirResizeEvent const* resize = mir_event_get_resize_event(event); |
458 | + int const new_width = mir_resize_event_get_width(resize); |
459 | + int const new_height = mir_resize_event_get_height(resize); |
460 | + |
461 | + mir_render_surface_set_size(surface, new_width, new_height); |
462 | + MirWindowSpec* spec = mir_create_window_spec(mir_window_get_connection(window)); |
463 | + mir_window_spec_add_render_surface(spec, surface, new_width, new_height, 0, 0); |
464 | + mir_window_apply_spec(window, spec); |
465 | + mir_window_spec_release(spec); |
466 | + break; |
467 | + } |
468 | + |
469 | + case mir_event_type_close_window: |
470 | + printf("Received close event from server.\n"); |
471 | + rendering = 0; |
472 | + break; |
473 | + |
474 | + default: |
475 | + break; |
476 | + } |
477 | +} |
478 | + |
479 | int main(int argc, char** argv) |
480 | { |
481 | static char const *socket_file = NULL; |
482 | @@ -165,6 +195,8 @@ |
483 | MirWindowSpec* spec = mir_create_normal_window_spec(connection, width, height); |
484 | mir_window_spec_add_render_surface( |
485 | spec, surface, width, height, displacement_x, displacement_y); |
486 | + mir_window_spec_set_event_handler(spec, &handle_window_event, surface); |
487 | + mir_window_spec_set_name(spec, "prerendered_frames"); |
488 | MirWindow* window = mir_create_window_sync(spec); |
489 | if (!mir_window_is_valid(window)) |
490 | { |
491 | |
492 | === modified file 'examples/target.c' |
493 | --- examples/target.c 2017-05-08 03:04:26 +0000 |
494 | +++ examples/target.c 2017-06-06 15:58:12 +0000 |
495 | @@ -196,6 +196,7 @@ |
496 | get_all_touch_points(mir_event_get_input_event(event), &state->touch); |
497 | break; |
498 | case mir_event_type_resize: |
499 | + egl_app_handle_resize_event(surface, mir_event_get_resize_event(event)); |
500 | state->resized = true; |
501 | break; |
502 | case mir_event_type_close_window: |
503 | |
504 | === modified file 'src/utils/vanity.c' |
505 | --- src/utils/vanity.c 2017-05-08 03:04:26 +0000 |
506 | +++ src/utils/vanity.c 2017-06-06 15:58:12 +0000 |
507 | @@ -176,6 +176,7 @@ |
508 | handled = on_surface_event(mir_event_get_window_event(event), state); |
509 | break; |
510 | case mir_event_type_resize: |
511 | + egl_app_handle_resize_event(surface, mir_event_get_resize_event(event)); |
512 | state->resized = true; |
513 | break; |
514 | default: |
LGTM.