source: mainline/uspace/lib/ui/test/wdecor.c@ 8d1bcd7

ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 8d1bcd7 was 8d1bcd7, checked in by Jiri Svoboda <jiri@…>, 21 months ago

Handover between system menu and menu bar

We can move between them using Left and Right keys in either closed
or open state. One can now open system menu with F10, Left, Down in
a window with menu bar, or just F10 in a window without menu bar.

  • Property mode set to 100644
File size: 45.1 KB
Line 
1/*
2 * Copyright (c) 2023 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <gfx/context.h>
30#include <gfx/coord.h>
31#include <mem.h>
32#include <pcut/pcut.h>
33#include <stdbool.h>
34#include <ui/pbutton.h>
35#include <ui/resource.h>
36#include <ui/wdecor.h>
37#include "../private/wdecor.h"
38
39PCUT_INIT;
40
41PCUT_TEST_SUITE(wdecor);
42
43static errno_t testgc_set_clip_rect(void *, gfx_rect_t *);
44static errno_t testgc_set_color(void *, gfx_color_t *);
45static errno_t testgc_fill_rect(void *, gfx_rect_t *);
46static errno_t testgc_update(void *);
47static errno_t testgc_bitmap_create(void *, gfx_bitmap_params_t *,
48 gfx_bitmap_alloc_t *, void **);
49static errno_t testgc_bitmap_destroy(void *);
50static errno_t testgc_bitmap_render(void *, gfx_rect_t *, gfx_coord2_t *);
51static errno_t testgc_bitmap_get_alloc(void *, gfx_bitmap_alloc_t *);
52
53static gfx_context_ops_t ops = {
54 .set_clip_rect = testgc_set_clip_rect,
55 .set_color = testgc_set_color,
56 .fill_rect = testgc_fill_rect,
57 .update = testgc_update,
58 .bitmap_create = testgc_bitmap_create,
59 .bitmap_destroy = testgc_bitmap_destroy,
60 .bitmap_render = testgc_bitmap_render,
61 .bitmap_get_alloc = testgc_bitmap_get_alloc
62};
63
64static void test_wdecor_sysmenu_open(ui_wdecor_t *, void *, sysarg_t);
65static void test_wdecor_sysmenu_left(ui_wdecor_t *, void *, sysarg_t);
66static void test_wdecor_sysmenu_right(ui_wdecor_t *, void *, sysarg_t);
67static void test_wdecor_sysmenu_accel(ui_wdecor_t *, void *, char32_t,
68 sysarg_t);
69static void test_wdecor_minimize(ui_wdecor_t *, void *);
70static void test_wdecor_maximize(ui_wdecor_t *, void *);
71static void test_wdecor_unmaximize(ui_wdecor_t *, void *);
72static void test_wdecor_close(ui_wdecor_t *, void *);
73static void test_wdecor_move(ui_wdecor_t *, void *, gfx_coord2_t *, sysarg_t);
74static void test_wdecor_resize(ui_wdecor_t *, void *, ui_wdecor_rsztype_t,
75 gfx_coord2_t *, sysarg_t);
76static void test_wdecor_set_cursor(ui_wdecor_t *, void *, ui_stock_cursor_t);
77
78static ui_wdecor_cb_t test_wdecor_cb = {
79 .sysmenu_open = test_wdecor_sysmenu_open,
80 .sysmenu_left = test_wdecor_sysmenu_left,
81 .sysmenu_right = test_wdecor_sysmenu_right,
82 .sysmenu_accel = test_wdecor_sysmenu_accel,
83 .minimize = test_wdecor_minimize,
84 .maximize = test_wdecor_maximize,
85 .unmaximize = test_wdecor_unmaximize,
86 .close = test_wdecor_close,
87 .move = test_wdecor_move,
88 .resize = test_wdecor_resize,
89 .set_cursor = test_wdecor_set_cursor
90};
91
92static ui_wdecor_cb_t dummy_wdecor_cb = {
93};
94
95typedef struct {
96 bool bm_created;
97 bool bm_destroyed;
98 gfx_bitmap_params_t bm_params;
99 void *bm_pixels;
100 gfx_rect_t bm_srect;
101 gfx_coord2_t bm_offs;
102 bool bm_rendered;
103 bool bm_got_alloc;
104} test_gc_t;
105
106typedef struct {
107 test_gc_t *tgc;
108 gfx_bitmap_alloc_t alloc;
109 bool myalloc;
110} testgc_bitmap_t;
111
112typedef struct {
113 bool sysmenu_open;
114 bool sysmenu_left;
115 bool sysmenu_right;
116 bool sysmenu_accel;
117 bool minimize;
118 bool maximize;
119 bool unmaximize;
120 bool close;
121 bool move;
122 gfx_coord2_t pos;
123 sysarg_t pos_id;
124 sysarg_t idev_id;
125 char32_t accel;
126 bool resize;
127 ui_wdecor_rsztype_t rsztype;
128 bool set_cursor;
129 ui_stock_cursor_t cursor;
130} test_cb_resp_t;
131
132/** Create and destroy window decoration */
133PCUT_TEST(create_destroy)
134{
135 ui_wdecor_t *wdecor = NULL;
136 errno_t rc;
137
138 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
139 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
140 PCUT_ASSERT_NOT_NULL(wdecor);
141
142 ui_wdecor_destroy(wdecor);
143}
144
145/** ui_wdecor_destroy() can take NULL argument (no-op) */
146PCUT_TEST(destroy_null)
147{
148 ui_wdecor_destroy(NULL);
149}
150
151/** Set window decoration rectangle sets internal field */
152PCUT_TEST(set_rect)
153{
154 gfx_context_t *gc = NULL;
155 test_gc_t tgc;
156 ui_resource_t *resource = NULL;
157 ui_wdecor_t *wdecor;
158 gfx_rect_t rect;
159 errno_t rc;
160
161 memset(&tgc, 0, sizeof(tgc));
162 rc = gfx_context_new(&ops, &tgc, &gc);
163 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
164
165 rc = ui_resource_create(gc, false, &resource);
166 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
167 PCUT_ASSERT_NOT_NULL(resource);
168
169 rc = ui_wdecor_create(resource, "Hello", ui_wds_none, &wdecor);
170 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
171
172 rect.p0.x = 1;
173 rect.p0.y = 2;
174 rect.p1.x = 3;
175 rect.p1.y = 4;
176
177 ui_wdecor_set_rect(wdecor, &rect);
178 PCUT_ASSERT_INT_EQUALS(rect.p0.x, wdecor->rect.p0.x);
179 PCUT_ASSERT_INT_EQUALS(rect.p0.y, wdecor->rect.p0.y);
180 PCUT_ASSERT_INT_EQUALS(rect.p1.x, wdecor->rect.p1.x);
181 PCUT_ASSERT_INT_EQUALS(rect.p1.y, wdecor->rect.p1.y);
182
183 ui_wdecor_destroy(wdecor);
184 ui_resource_destroy(resource);
185
186 rc = gfx_context_delete(gc);
187 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
188}
189
190/** Set window decoration active sets internal field */
191PCUT_TEST(set_active)
192{
193 ui_wdecor_t *wdecor;
194 errno_t rc;
195
196 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
197 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
198
199 PCUT_ASSERT_TRUE(wdecor->active);
200
201 ui_wdecor_set_active(wdecor, false);
202 PCUT_ASSERT_FALSE(wdecor->active);
203
204 ui_wdecor_set_active(wdecor, true);
205 PCUT_ASSERT_TRUE(wdecor->active);
206
207 ui_wdecor_destroy(wdecor);
208}
209
210/** Set window decoration maximized sets internal field */
211PCUT_TEST(set_maximized)
212{
213 ui_wdecor_t *wdecor;
214 errno_t rc;
215
216 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
217 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
218
219 PCUT_ASSERT_TRUE(wdecor->active);
220
221 ui_wdecor_set_maximized(wdecor, false);
222 PCUT_ASSERT_FALSE(wdecor->maximized);
223
224 ui_wdecor_set_maximized(wdecor, true);
225 PCUT_ASSERT_TRUE(wdecor->maximized);
226
227 ui_wdecor_destroy(wdecor);
228}
229
230/** Setting system menu handle as active/inactive */
231PCUT_TEST(sysmenu_hdl_set_active)
232{
233 errno_t rc;
234 gfx_context_t *gc = NULL;
235 test_gc_t tgc;
236 ui_resource_t *resource = NULL;
237 ui_wdecor_t *wdecor;
238
239 memset(&tgc, 0, sizeof(tgc));
240 rc = gfx_context_new(&ops, &tgc, &gc);
241 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
242
243 rc = ui_resource_create(gc, false, &resource);
244 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
245 PCUT_ASSERT_NOT_NULL(resource);
246
247 rc = ui_wdecor_create(resource, "Hello", ui_wds_decorated, &wdecor);
248 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
249
250 PCUT_ASSERT_FALSE(wdecor->sysmenu_hdl_active);
251 ui_wdecor_sysmenu_hdl_set_active(wdecor, true);
252 PCUT_ASSERT_TRUE(wdecor->sysmenu_hdl_active);
253 ui_wdecor_sysmenu_hdl_set_active(wdecor, false);
254 PCUT_ASSERT_FALSE(wdecor->sysmenu_hdl_active);
255
256 ui_wdecor_destroy(wdecor);
257 ui_resource_destroy(resource);
258
259 rc = gfx_context_delete(gc);
260 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
261}
262
263/** Paint system menu handle */
264PCUT_TEST(sysmenu_hdl_paint)
265{
266 errno_t rc;
267 gfx_context_t *gc = NULL;
268 test_gc_t tgc;
269 ui_resource_t *resource = NULL;
270 ui_wdecor_t *wdecor;
271 ui_wdecor_geom_t geom;
272
273 memset(&tgc, 0, sizeof(tgc));
274 rc = gfx_context_new(&ops, &tgc, &gc);
275 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
276
277 rc = ui_resource_create(gc, false, &resource);
278 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
279 PCUT_ASSERT_NOT_NULL(resource);
280
281 rc = ui_wdecor_create(resource, "Hello", ui_wds_decorated, &wdecor);
282 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
283
284 ui_wdecor_get_geom(wdecor, &geom);
285 rc = ui_wdecor_sysmenu_hdl_paint(wdecor, &geom.sysmenu_hdl_rect);
286 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
287
288 ui_wdecor_destroy(wdecor);
289 ui_resource_destroy(resource);
290
291 rc = gfx_context_delete(gc);
292 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
293}
294
295/** Paint window decoration */
296PCUT_TEST(paint)
297{
298 errno_t rc;
299 gfx_context_t *gc = NULL;
300 test_gc_t tgc;
301 ui_resource_t *resource = NULL;
302 ui_wdecor_t *wdecor;
303
304 memset(&tgc, 0, sizeof(tgc));
305 rc = gfx_context_new(&ops, &tgc, &gc);
306 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
307
308 rc = ui_resource_create(gc, false, &resource);
309 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
310 PCUT_ASSERT_NOT_NULL(resource);
311
312 rc = ui_wdecor_create(resource, "Hello", ui_wds_decorated, &wdecor);
313 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
314
315 rc = ui_wdecor_paint(wdecor);
316 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
317
318 ui_wdecor_destroy(wdecor);
319 ui_resource_destroy(resource);
320
321 rc = gfx_context_delete(gc);
322 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
323}
324
325/** Test ui_wdecor_sysmenu_open() */
326PCUT_TEST(sysmenu_open)
327{
328 errno_t rc;
329 ui_wdecor_t *wdecor;
330 test_cb_resp_t resp;
331
332 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
333 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
334
335 /* Sysmenu open callback with no callbacks set */
336 ui_wdecor_sysmenu_open(wdecor, 42);
337
338 /* Sysmenu open callback with sysmenu callback not implemented */
339 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
340 ui_wdecor_sysmenu_open(wdecor, 42);
341
342 /* Sysmenu open callback with real callback set */
343 resp.sysmenu_open = false;
344 resp.idev_id = 0;
345 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
346 ui_wdecor_sysmenu_open(wdecor, 42);
347 PCUT_ASSERT_TRUE(resp.sysmenu_open);
348 PCUT_ASSERT_INT_EQUALS(42, resp.idev_id);
349
350 ui_wdecor_destroy(wdecor);
351}
352
353/** Test ui_wdecor_sysmenu_left() */
354PCUT_TEST(sysmenu_left)
355{
356 errno_t rc;
357 ui_wdecor_t *wdecor;
358 test_cb_resp_t resp;
359
360 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
361 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
362
363 /* Sysmenu left callback with no callbacks set */
364 ui_wdecor_sysmenu_left(wdecor, 42);
365
366 /* Sysmenu left callback with sysmenu callback not implemented */
367 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
368 ui_wdecor_sysmenu_left(wdecor, 42);
369
370 /* Sysmenu left callback with real callback set */
371 resp.sysmenu_left = false;
372 resp.idev_id = 0;
373 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
374 ui_wdecor_sysmenu_left(wdecor, 42);
375 PCUT_ASSERT_TRUE(resp.sysmenu_left);
376 PCUT_ASSERT_INT_EQUALS(42, resp.idev_id);
377
378 ui_wdecor_destroy(wdecor);
379}
380
381/** Test ui_wdecor_sysmenu_right() */
382PCUT_TEST(sysmenu_right)
383{
384 errno_t rc;
385 ui_wdecor_t *wdecor;
386 test_cb_resp_t resp;
387
388 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
389 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
390
391 /* Sysmenu right callback with no callbacks set */
392 ui_wdecor_sysmenu_right(wdecor, 42);
393
394 /* Sysmenu right callback with sysmenu callback not implemented */
395 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
396 ui_wdecor_sysmenu_right(wdecor, 42);
397
398 /* Sysmenu right callback with real callback set */
399 resp.sysmenu_right = false;
400 resp.idev_id = 0;
401 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
402 ui_wdecor_sysmenu_right(wdecor, 42);
403 PCUT_ASSERT_TRUE(resp.sysmenu_right);
404 PCUT_ASSERT_INT_EQUALS(42, resp.idev_id);
405
406 ui_wdecor_destroy(wdecor);
407}
408
409/** Test ui_wdecor_sysmenu_accel() */
410PCUT_TEST(sysmenu_accel)
411{
412 errno_t rc;
413 ui_wdecor_t *wdecor;
414 test_cb_resp_t resp;
415
416 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
417 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
418
419 /* Sysmenu accelerator callback with no callbacks set */
420 ui_wdecor_sysmenu_accel(wdecor, 'a', 42);
421
422 /* Sysmenu accelerator callback with sysmenu callback not implemented */
423 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
424 ui_wdecor_sysmenu_accel(wdecor, 'a', 42);
425
426 /* Sysmenu accelerator callback with real callback set */
427 resp.sysmenu_accel = false;
428 resp.idev_id = 0;
429 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
430 ui_wdecor_sysmenu_accel(wdecor, 'a', 42);
431 PCUT_ASSERT_TRUE(resp.sysmenu_accel);
432 PCUT_ASSERT_INT_EQUALS('a', resp.accel);
433 PCUT_ASSERT_INT_EQUALS(42, resp.idev_id);
434
435 ui_wdecor_destroy(wdecor);
436}
437
438/** Test ui_wdecor_minimize() */
439PCUT_TEST(minimize)
440{
441 errno_t rc;
442 ui_wdecor_t *wdecor;
443 test_cb_resp_t resp;
444
445 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
446 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
447
448 /* Minimize callback with no callbacks set */
449 ui_wdecor_minimize(wdecor);
450
451 /* Minimize callback with minimize callback not implemented */
452 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
453 ui_wdecor_minimize(wdecor);
454
455 /* Minimize callback with real callback set */
456 resp.minimize = false;
457 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
458 ui_wdecor_minimize(wdecor);
459 PCUT_ASSERT_TRUE(resp.minimize);
460
461 ui_wdecor_destroy(wdecor);
462}
463
464/** Test ui_wdecor_maximize() */
465PCUT_TEST(maximize)
466{
467 errno_t rc;
468 ui_wdecor_t *wdecor;
469 test_cb_resp_t resp;
470
471 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
472 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
473
474 /* Maximize callback with no callbacks set */
475 ui_wdecor_maximize(wdecor);
476
477 /* Maxmimize callback with maximize callback not implemented */
478 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
479 ui_wdecor_maximize(wdecor);
480
481 /* Maximize callback with real callback set */
482 resp.maximize = false;
483 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
484 ui_wdecor_maximize(wdecor);
485 PCUT_ASSERT_TRUE(resp.maximize);
486
487 ui_wdecor_destroy(wdecor);
488}
489
490/** Test ui_wdecor_unmaximize() */
491PCUT_TEST(unmaximize)
492{
493 errno_t rc;
494 ui_wdecor_t *wdecor;
495 test_cb_resp_t resp;
496
497 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
498 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
499
500 /* Unmaximize callback with no callbacks set */
501 ui_wdecor_unmaximize(wdecor);
502
503 /* Unmaximize callback with unmaximize callback not implemented */
504 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
505 ui_wdecor_unmaximize(wdecor);
506
507 /* Unmaximize callback with real callback set */
508 resp.unmaximize = false;
509 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
510 ui_wdecor_unmaximize(wdecor);
511 PCUT_ASSERT_TRUE(resp.unmaximize);
512
513 ui_wdecor_destroy(wdecor);
514}
515
516/** Test ui_wdecor_close() */
517PCUT_TEST(close)
518{
519 errno_t rc;
520 ui_wdecor_t *wdecor;
521 test_cb_resp_t resp;
522
523 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
524 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
525
526 /* Close callback with no callbacks set */
527 ui_wdecor_close(wdecor);
528
529 /* Close callback with close callback not implemented */
530 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
531 ui_wdecor_close(wdecor);
532
533 /* Close callback with real callback set */
534 resp.close = false;
535 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
536 ui_wdecor_close(wdecor);
537 PCUT_ASSERT_TRUE(resp.close);
538
539 ui_wdecor_destroy(wdecor);
540}
541
542/** Test ui_wdecor_move() */
543PCUT_TEST(move)
544{
545 errno_t rc;
546 ui_wdecor_t *wdecor;
547 test_cb_resp_t resp;
548 gfx_coord2_t pos;
549 sysarg_t pos_id;
550
551 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
552 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
553
554 pos.x = 3;
555 pos.y = 4;
556 pos_id = 5;
557
558 /* Move callback with no callbacks set */
559 ui_wdecor_move(wdecor, &pos, pos_id);
560
561 /* Move callback with move callback not implemented */
562 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
563 ui_wdecor_move(wdecor, &pos, pos_id);
564
565 /* Move callback with real callback set */
566 resp.move = false;
567 resp.pos.x = 0;
568 resp.pos.y = 0;
569 resp.pos_id = 0;
570 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
571 ui_wdecor_move(wdecor, &pos, pos_id);
572 PCUT_ASSERT_TRUE(resp.move);
573 PCUT_ASSERT_INT_EQUALS(pos.x, resp.pos.x);
574 PCUT_ASSERT_INT_EQUALS(pos.y, resp.pos.y);
575 PCUT_ASSERT_INT_EQUALS(pos_id, resp.pos_id);
576
577 ui_wdecor_destroy(wdecor);
578}
579
580/** Test ui_wdecor_resize() */
581PCUT_TEST(resize)
582{
583 errno_t rc;
584 ui_wdecor_t *wdecor;
585 test_cb_resp_t resp;
586 ui_wdecor_rsztype_t rsztype;
587 gfx_coord2_t pos;
588 sysarg_t pos_id;
589
590 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
591 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
592
593 rsztype = ui_wr_bottom;
594 pos.x = 3;
595 pos.y = 4;
596 pos_id = 5;
597
598 /* Resize callback with no callbacks set */
599 ui_wdecor_resize(wdecor, rsztype, &pos, pos_id);
600
601 /* Resize callback with move callback not implemented */
602 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
603 ui_wdecor_resize(wdecor, rsztype, &pos, pos_id);
604
605 /* Resize callback with real callback set */
606 resp.resize = false;
607 resp.rsztype = ui_wr_none;
608 resp.pos.x = 0;
609 resp.pos.y = 0;
610 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
611 ui_wdecor_resize(wdecor, rsztype, &pos, pos_id);
612 PCUT_ASSERT_TRUE(resp.resize);
613 PCUT_ASSERT_INT_EQUALS(rsztype, resp.rsztype);
614 PCUT_ASSERT_INT_EQUALS(pos.x, resp.pos.x);
615 PCUT_ASSERT_INT_EQUALS(pos.y, resp.pos.y);
616 PCUT_ASSERT_INT_EQUALS(pos_id, resp.pos_id);
617
618 ui_wdecor_destroy(wdecor);
619}
620
621/** Test ui_wdecor_set_cursor() */
622PCUT_TEST(set_cursor)
623{
624 errno_t rc;
625 ui_wdecor_t *wdecor;
626 test_cb_resp_t resp;
627 ui_stock_cursor_t cursor;
628
629 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
630 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
631
632 cursor = ui_curs_size_uldr;
633
634 /* Set cursor callback with no callbacks set */
635 ui_wdecor_set_cursor(wdecor, cursor);
636
637 /* Set cursor callback with move callback not implemented */
638 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
639 ui_wdecor_set_cursor(wdecor, cursor);
640
641 /* Set cursor callback with real callback set */
642 resp.set_cursor = false;
643 resp.cursor = ui_curs_arrow;
644 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
645 ui_wdecor_set_cursor(wdecor, cursor);
646 PCUT_ASSERT_TRUE(resp.set_cursor);
647 PCUT_ASSERT_INT_EQUALS(cursor, resp.cursor);
648
649 ui_wdecor_destroy(wdecor);
650}
651
652/** Clicking the close button generates close callback */
653PCUT_TEST(close_btn_clicked)
654{
655 gfx_context_t *gc = NULL;
656 test_gc_t tgc;
657 ui_resource_t *resource = NULL;
658 ui_wdecor_t *wdecor;
659 gfx_rect_t rect;
660 test_cb_resp_t resp;
661 errno_t rc;
662
663 memset(&tgc, 0, sizeof(tgc));
664 rc = gfx_context_new(&ops, &tgc, &gc);
665 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
666
667 rc = ui_resource_create(gc, false, &resource);
668 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
669 PCUT_ASSERT_NOT_NULL(resource);
670
671 rc = ui_wdecor_create(resource, "Hello", ui_wds_decorated, &wdecor);
672 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
673
674 rect.p0.x = 10;
675 rect.p0.y = 20;
676 rect.p1.x = 100;
677 rect.p1.y = 200;
678
679 ui_wdecor_set_rect(wdecor, &rect);
680
681 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, (void *) &resp);
682
683 resp.close = false;
684
685 ui_pbutton_clicked(wdecor->btn_close);
686 PCUT_ASSERT_TRUE(resp.close);
687
688 ui_wdecor_destroy(wdecor);
689 ui_resource_destroy(resource);
690
691 rc = gfx_context_delete(gc);
692 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
693}
694
695/** Button press on title bar generates move callback */
696PCUT_TEST(pos_event_move)
697{
698 errno_t rc;
699 gfx_rect_t rect;
700 pos_event_t event;
701 gfx_context_t *gc = NULL;
702 test_gc_t tgc;
703 test_cb_resp_t resp;
704 ui_resource_t *resource = NULL;
705 ui_wdecor_t *wdecor;
706
707 memset(&tgc, 0, sizeof(tgc));
708 rc = gfx_context_new(&ops, &tgc, &gc);
709 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
710
711 rc = ui_resource_create(gc, false, &resource);
712 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
713 PCUT_ASSERT_NOT_NULL(resource);
714
715 rc = ui_wdecor_create(resource, "Hello", ui_wds_decorated, &wdecor);
716 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
717
718 rect.p0.x = 10;
719 rect.p0.y = 20;
720 rect.p1.x = 100;
721 rect.p1.y = 200;
722
723 ui_wdecor_set_rect(wdecor, &rect);
724
725 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, (void *) &resp);
726
727 resp.move = false;
728 resp.pos.x = 0;
729 resp.pos.y = 0;
730
731 event.type = POS_PRESS;
732 event.hpos = 50;
733 event.vpos = 25;
734 ui_wdecor_pos_event(wdecor, &event);
735
736 PCUT_ASSERT_TRUE(resp.move);
737 PCUT_ASSERT_INT_EQUALS(event.hpos, resp.pos.x);
738 PCUT_ASSERT_INT_EQUALS(event.vpos, resp.pos.y);
739
740 ui_wdecor_destroy(wdecor);
741 ui_resource_destroy(resource);
742
743 rc = gfx_context_delete(gc);
744 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
745}
746
747/** Pressing F10 generates sysmenu event.
748 *
749 * Note that in a window with menu bar the menu bar would claim F10
750 * so it would never be delivered to window decoration.
751 */
752PCUT_TEST(kbd_f10_sysmenu)
753{
754 errno_t rc;
755 gfx_rect_t rect;
756 kbd_event_t event;
757 gfx_context_t *gc = NULL;
758 test_gc_t tgc;
759 test_cb_resp_t resp;
760 ui_resource_t *resource = NULL;
761 ui_wdecor_t *wdecor;
762
763 memset(&tgc, 0, sizeof(tgc));
764 rc = gfx_context_new(&ops, &tgc, &gc);
765 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
766
767 rc = ui_resource_create(gc, false, &resource);
768 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
769 PCUT_ASSERT_NOT_NULL(resource);
770
771 rc = ui_wdecor_create(resource, "Hello", ui_wds_decorated, &wdecor);
772 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
773
774 rect.p0.x = 10;
775 rect.p0.y = 20;
776 rect.p1.x = 100;
777 rect.p1.y = 200;
778
779 ui_wdecor_set_rect(wdecor, &rect);
780
781 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, (void *) &resp);
782
783 resp.sysmenu_open = false;
784
785 event.type = KEY_PRESS;
786 event.mods = 0;
787 event.key = KC_F10;
788 event.kbd_id = 42;
789 ui_wdecor_kbd_event(wdecor, &event);
790
791 PCUT_ASSERT_TRUE(resp.sysmenu_open);
792 PCUT_ASSERT_INT_EQUALS(event.kbd_id, resp.idev_id);
793
794 ui_wdecor_destroy(wdecor);
795 ui_resource_destroy(resource);
796
797 rc = gfx_context_delete(gc);
798 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
799}
800
801/** Down key with active sysmenu handle generates sysmenu open event */
802PCUT_TEST(kbd_down_sysmenu)
803{
804 errno_t rc;
805 gfx_rect_t rect;
806 kbd_event_t event;
807 gfx_context_t *gc = NULL;
808 test_gc_t tgc;
809 test_cb_resp_t resp;
810 ui_resource_t *resource = NULL;
811 ui_wdecor_t *wdecor;
812
813 memset(&tgc, 0, sizeof(tgc));
814 rc = gfx_context_new(&ops, &tgc, &gc);
815 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
816
817 rc = ui_resource_create(gc, false, &resource);
818 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
819 PCUT_ASSERT_NOT_NULL(resource);
820
821 rc = ui_wdecor_create(resource, "Hello", ui_wds_decorated, &wdecor);
822 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
823
824 rect.p0.x = 10;
825 rect.p0.y = 20;
826 rect.p1.x = 100;
827 rect.p1.y = 200;
828
829 ui_wdecor_set_rect(wdecor, &rect);
830
831 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, (void *) &resp);
832
833 ui_wdecor_sysmenu_hdl_set_active(wdecor, true);
834
835 resp.sysmenu_open = false;
836
837 event.type = KEY_PRESS;
838 event.mods = 0;
839 event.key = KC_DOWN;
840 event.kbd_id = 42;
841 ui_wdecor_kbd_event(wdecor, &event);
842
843 PCUT_ASSERT_TRUE(resp.sysmenu_open);
844 PCUT_ASSERT_INT_EQUALS(event.kbd_id, resp.idev_id);
845
846 ui_wdecor_destroy(wdecor);
847 ui_resource_destroy(resource);
848
849 rc = gfx_context_delete(gc);
850 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
851}
852
853/** Left key with active sysmenu handle generates sysmenu left event */
854PCUT_TEST(kbd_left_sysmenu)
855{
856 errno_t rc;
857 gfx_rect_t rect;
858 kbd_event_t event;
859 gfx_context_t *gc = NULL;
860 test_gc_t tgc;
861 test_cb_resp_t resp;
862 ui_resource_t *resource = NULL;
863 ui_wdecor_t *wdecor;
864
865 memset(&tgc, 0, sizeof(tgc));
866 rc = gfx_context_new(&ops, &tgc, &gc);
867 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
868
869 rc = ui_resource_create(gc, false, &resource);
870 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
871 PCUT_ASSERT_NOT_NULL(resource);
872
873 rc = ui_wdecor_create(resource, "Hello", ui_wds_decorated, &wdecor);
874 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
875
876 rect.p0.x = 10;
877 rect.p0.y = 20;
878 rect.p1.x = 100;
879 rect.p1.y = 200;
880
881 ui_wdecor_set_rect(wdecor, &rect);
882
883 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, (void *) &resp);
884
885 ui_wdecor_sysmenu_hdl_set_active(wdecor, true);
886
887 resp.sysmenu_left = false;
888
889 event.type = KEY_PRESS;
890 event.mods = 0;
891 event.key = KC_LEFT;
892 event.kbd_id = 42;
893 ui_wdecor_kbd_event(wdecor, &event);
894
895 PCUT_ASSERT_TRUE(resp.sysmenu_left);
896 PCUT_ASSERT_INT_EQUALS(event.kbd_id, resp.idev_id);
897
898 ui_wdecor_destroy(wdecor);
899 ui_resource_destroy(resource);
900
901 rc = gfx_context_delete(gc);
902 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
903}
904
905/** Right key with active sysmenu handle generates sysmenu right event */
906PCUT_TEST(kbd_right_sysmenu)
907{
908 errno_t rc;
909 gfx_rect_t rect;
910 kbd_event_t event;
911 gfx_context_t *gc = NULL;
912 test_gc_t tgc;
913 test_cb_resp_t resp;
914 ui_resource_t *resource = NULL;
915 ui_wdecor_t *wdecor;
916
917 memset(&tgc, 0, sizeof(tgc));
918 rc = gfx_context_new(&ops, &tgc, &gc);
919 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
920
921 rc = ui_resource_create(gc, false, &resource);
922 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
923 PCUT_ASSERT_NOT_NULL(resource);
924
925 rc = ui_wdecor_create(resource, "Hello", ui_wds_decorated, &wdecor);
926 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
927
928 rect.p0.x = 10;
929 rect.p0.y = 20;
930 rect.p1.x = 100;
931 rect.p1.y = 200;
932
933 ui_wdecor_set_rect(wdecor, &rect);
934
935 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, (void *) &resp);
936
937 ui_wdecor_sysmenu_hdl_set_active(wdecor, true);
938
939 resp.sysmenu_right = false;
940
941 event.type = KEY_PRESS;
942 event.mods = 0;
943 event.key = KC_RIGHT;
944 event.kbd_id = 42;
945 ui_wdecor_kbd_event(wdecor, &event);
946
947 PCUT_ASSERT_TRUE(resp.sysmenu_right);
948 PCUT_ASSERT_INT_EQUALS(event.kbd_id, resp.idev_id);
949
950 ui_wdecor_destroy(wdecor);
951 ui_resource_destroy(resource);
952
953 rc = gfx_context_delete(gc);
954 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
955}
956
957/** Character key with active sysmenu handle generates sysmenu accel event */
958PCUT_TEST(kbd_accel_sysmenu)
959{
960 errno_t rc;
961 gfx_rect_t rect;
962 kbd_event_t event;
963 gfx_context_t *gc = NULL;
964 test_gc_t tgc;
965 test_cb_resp_t resp;
966 ui_resource_t *resource = NULL;
967 ui_wdecor_t *wdecor;
968
969 memset(&tgc, 0, sizeof(tgc));
970 rc = gfx_context_new(&ops, &tgc, &gc);
971 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
972
973 rc = ui_resource_create(gc, false, &resource);
974 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
975 PCUT_ASSERT_NOT_NULL(resource);
976
977 rc = ui_wdecor_create(resource, "Hello", ui_wds_decorated, &wdecor);
978 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
979
980 rect.p0.x = 10;
981 rect.p0.y = 20;
982 rect.p1.x = 100;
983 rect.p1.y = 200;
984
985 ui_wdecor_set_rect(wdecor, &rect);
986
987 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, (void *) &resp);
988
989 ui_wdecor_sysmenu_hdl_set_active(wdecor, true);
990
991 resp.sysmenu_accel = false;
992
993 event.type = KEY_PRESS;
994 event.mods = 0;
995 event.key = KC_A;
996 event.c = 'a';
997 event.kbd_id = 42;
998 ui_wdecor_kbd_event(wdecor, &event);
999
1000 PCUT_ASSERT_TRUE(resp.sysmenu_accel);
1001 PCUT_ASSERT_INT_EQUALS(event.c, resp.accel);
1002 PCUT_ASSERT_INT_EQUALS(event.kbd_id, resp.idev_id);
1003
1004 ui_wdecor_destroy(wdecor);
1005 ui_resource_destroy(resource);
1006
1007 rc = gfx_context_delete(gc);
1008 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1009}
1010
1011/** ui_wdecor_get_geom() with ui_wds_none produces the correct geometry */
1012PCUT_TEST(get_geom_none)
1013{
1014 gfx_context_t *gc = NULL;
1015 test_gc_t tgc;
1016 ui_resource_t *resource = NULL;
1017 ui_wdecor_t *wdecor;
1018 gfx_rect_t rect;
1019 ui_wdecor_geom_t geom;
1020 errno_t rc;
1021
1022 memset(&tgc, 0, sizeof(tgc));
1023 rc = gfx_context_new(&ops, &tgc, &gc);
1024 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1025
1026 rc = ui_resource_create(gc, false, &resource);
1027 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1028 PCUT_ASSERT_NOT_NULL(resource);
1029
1030 rc = ui_wdecor_create(resource, "Hello", ui_wds_none, &wdecor);
1031 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1032
1033 rect.p0.x = 10;
1034 rect.p0.y = 20;
1035 rect.p1.x = 100;
1036 rect.p1.y = 200;
1037
1038 ui_wdecor_set_rect(wdecor, &rect);
1039 ui_wdecor_get_geom(wdecor, &geom);
1040
1041 PCUT_ASSERT_INT_EQUALS(10, geom.interior_rect.p0.x);
1042 PCUT_ASSERT_INT_EQUALS(20, geom.interior_rect.p0.y);
1043 PCUT_ASSERT_INT_EQUALS(100, geom.interior_rect.p1.x);
1044 PCUT_ASSERT_INT_EQUALS(200, geom.interior_rect.p1.y);
1045
1046 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p0.x);
1047 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p0.y);
1048 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p1.x);
1049 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p1.y);
1050
1051 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p0.x);
1052 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p0.y);
1053 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p1.x);
1054 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p1.y);
1055
1056 PCUT_ASSERT_INT_EQUALS(0, geom.caption_rect.p0.x);
1057 PCUT_ASSERT_INT_EQUALS(0, geom.caption_rect.p0.y);
1058 PCUT_ASSERT_INT_EQUALS(0, geom.caption_rect.p1.x);
1059 PCUT_ASSERT_INT_EQUALS(0, geom.caption_rect.p1.y);
1060
1061 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p0.x);
1062 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p0.y);
1063 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p1.x);
1064 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p1.y);
1065
1066 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p0.x);
1067 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p0.y);
1068 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p1.x);
1069 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p1.y);
1070
1071 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.x);
1072 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.y);
1073 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p1.x);
1074 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p1.y);
1075
1076 PCUT_ASSERT_INT_EQUALS(10, geom.app_area_rect.p0.x);
1077 PCUT_ASSERT_INT_EQUALS(20, geom.app_area_rect.p0.y);
1078 PCUT_ASSERT_INT_EQUALS(100, geom.app_area_rect.p1.x);
1079 PCUT_ASSERT_INT_EQUALS(200, geom.app_area_rect.p1.y);
1080
1081 ui_wdecor_destroy(wdecor);
1082 ui_resource_destroy(resource);
1083
1084 rc = gfx_context_delete(gc);
1085 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1086}
1087
1088/** ui_wdecor_get_geom() with ui_wds_frame produces the correct geometry */
1089PCUT_TEST(get_geom_frame)
1090{
1091 gfx_context_t *gc = NULL;
1092 test_gc_t tgc;
1093 ui_resource_t *resource = NULL;
1094 ui_wdecor_t *wdecor;
1095 gfx_rect_t rect;
1096 ui_wdecor_geom_t geom;
1097 errno_t rc;
1098
1099 memset(&tgc, 0, sizeof(tgc));
1100 rc = gfx_context_new(&ops, &tgc, &gc);
1101 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1102
1103 rc = ui_resource_create(gc, false, &resource);
1104 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1105 PCUT_ASSERT_NOT_NULL(resource);
1106
1107 rc = ui_wdecor_create(resource, "Hello", ui_wds_frame, &wdecor);
1108 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1109
1110 rect.p0.x = 10;
1111 rect.p0.y = 20;
1112 rect.p1.x = 100;
1113 rect.p1.y = 200;
1114
1115 ui_wdecor_set_rect(wdecor, &rect);
1116 ui_wdecor_get_geom(wdecor, &geom);
1117
1118 PCUT_ASSERT_INT_EQUALS(14, geom.interior_rect.p0.x);
1119 PCUT_ASSERT_INT_EQUALS(24, geom.interior_rect.p0.y);
1120 PCUT_ASSERT_INT_EQUALS(96, geom.interior_rect.p1.x);
1121 PCUT_ASSERT_INT_EQUALS(196, geom.interior_rect.p1.y);
1122
1123 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p0.x);
1124 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p0.y);
1125 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p1.x);
1126 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p1.y);
1127
1128 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p0.x);
1129 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p0.y);
1130 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p1.x);
1131 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p1.y);
1132
1133 PCUT_ASSERT_INT_EQUALS(0, geom.caption_rect.p0.x);
1134 PCUT_ASSERT_INT_EQUALS(0, geom.caption_rect.p0.y);
1135 PCUT_ASSERT_INT_EQUALS(0, geom.caption_rect.p1.x);
1136 PCUT_ASSERT_INT_EQUALS(0, geom.caption_rect.p1.y);
1137
1138 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p0.x);
1139 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p0.y);
1140 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p1.x);
1141 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p1.y);
1142
1143 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p0.x);
1144 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p0.y);
1145 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p1.x);
1146 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p1.y);
1147
1148 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.x);
1149 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.y);
1150 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p1.x);
1151 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p1.y);
1152
1153 PCUT_ASSERT_INT_EQUALS(14, geom.app_area_rect.p0.x);
1154 PCUT_ASSERT_INT_EQUALS(24, geom.app_area_rect.p0.y);
1155 PCUT_ASSERT_INT_EQUALS(96, geom.app_area_rect.p1.x);
1156 PCUT_ASSERT_INT_EQUALS(196, geom.app_area_rect.p1.y);
1157
1158 ui_wdecor_destroy(wdecor);
1159 ui_resource_destroy(resource);
1160
1161 rc = gfx_context_delete(gc);
1162 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1163}
1164
1165/** ui_wdecor_get_geom() with ui_wds_frame | ui_wds_titlebar */
1166PCUT_TEST(get_geom_frame_titlebar)
1167{
1168 gfx_context_t *gc = NULL;
1169 test_gc_t tgc;
1170 ui_resource_t *resource = NULL;
1171 ui_wdecor_t *wdecor;
1172 gfx_rect_t rect;
1173 ui_wdecor_geom_t geom;
1174 errno_t rc;
1175
1176 memset(&tgc, 0, sizeof(tgc));
1177 rc = gfx_context_new(&ops, &tgc, &gc);
1178 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1179
1180 rc = ui_resource_create(gc, false, &resource);
1181 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1182 PCUT_ASSERT_NOT_NULL(resource);
1183
1184 rc = ui_wdecor_create(resource, "Hello", ui_wds_frame | ui_wds_titlebar,
1185 &wdecor);
1186 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1187
1188 rect.p0.x = 10;
1189 rect.p0.y = 20;
1190 rect.p1.x = 100;
1191 rect.p1.y = 200;
1192
1193 ui_wdecor_set_rect(wdecor, &rect);
1194 ui_wdecor_get_geom(wdecor, &geom);
1195
1196 PCUT_ASSERT_INT_EQUALS(14, geom.interior_rect.p0.x);
1197 PCUT_ASSERT_INT_EQUALS(24, geom.interior_rect.p0.y);
1198 PCUT_ASSERT_INT_EQUALS(96, geom.interior_rect.p1.x);
1199 PCUT_ASSERT_INT_EQUALS(196, geom.interior_rect.p1.y);
1200
1201 PCUT_ASSERT_INT_EQUALS(14, geom.title_bar_rect.p0.x);
1202 PCUT_ASSERT_INT_EQUALS(24, geom.title_bar_rect.p0.y);
1203 PCUT_ASSERT_INT_EQUALS(96, geom.title_bar_rect.p1.x);
1204 PCUT_ASSERT_INT_EQUALS(46, geom.title_bar_rect.p1.y);
1205
1206 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p0.x);
1207 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p0.y);
1208 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p1.x);
1209 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p1.y);
1210
1211 PCUT_ASSERT_INT_EQUALS(18, geom.caption_rect.p0.x);
1212 PCUT_ASSERT_INT_EQUALS(24, geom.caption_rect.p0.y);
1213 PCUT_ASSERT_INT_EQUALS(91, geom.caption_rect.p1.x);
1214 PCUT_ASSERT_INT_EQUALS(46, geom.caption_rect.p1.y);
1215
1216 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p0.x);
1217 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p0.y);
1218 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p1.x);
1219 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p1.y);
1220
1221 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p0.x);
1222 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p0.y);
1223 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p1.x);
1224 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p1.y);
1225
1226 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.x);
1227 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.y);
1228 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p1.x);
1229 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p1.y);
1230
1231 PCUT_ASSERT_INT_EQUALS(14, geom.app_area_rect.p0.x);
1232 PCUT_ASSERT_INT_EQUALS(46, geom.app_area_rect.p0.y);
1233 PCUT_ASSERT_INT_EQUALS(96, geom.app_area_rect.p1.x);
1234 PCUT_ASSERT_INT_EQUALS(196, geom.app_area_rect.p1.y);
1235
1236 ui_wdecor_destroy(wdecor);
1237 ui_resource_destroy(resource);
1238
1239 rc = gfx_context_delete(gc);
1240 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1241}
1242
1243/** ui_wdecor_get_geom() with ui_wds_decorated produces the correct geometry */
1244PCUT_TEST(get_geom_decorated)
1245{
1246 gfx_context_t *gc = NULL;
1247 test_gc_t tgc;
1248 ui_resource_t *resource = NULL;
1249 ui_wdecor_t *wdecor;
1250 gfx_rect_t rect;
1251 ui_wdecor_geom_t geom;
1252 errno_t rc;
1253
1254 memset(&tgc, 0, sizeof(tgc));
1255 rc = gfx_context_new(&ops, &tgc, &gc);
1256 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1257
1258 rc = ui_resource_create(gc, false, &resource);
1259 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1260 PCUT_ASSERT_NOT_NULL(resource);
1261
1262 rc = ui_wdecor_create(resource, "Hello", ui_wds_decorated, &wdecor);
1263 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1264
1265 rect.p0.x = 10;
1266 rect.p0.y = 20;
1267 rect.p1.x = 100;
1268 rect.p1.y = 200;
1269
1270 ui_wdecor_set_rect(wdecor, &rect);
1271 ui_wdecor_get_geom(wdecor, &geom);
1272
1273 PCUT_ASSERT_INT_EQUALS(14, geom.interior_rect.p0.x);
1274 PCUT_ASSERT_INT_EQUALS(24, geom.interior_rect.p0.y);
1275 PCUT_ASSERT_INT_EQUALS(96, geom.interior_rect.p1.x);
1276 PCUT_ASSERT_INT_EQUALS(196, geom.interior_rect.p1.y);
1277
1278 PCUT_ASSERT_INT_EQUALS(14, geom.title_bar_rect.p0.x);
1279 PCUT_ASSERT_INT_EQUALS(24, geom.title_bar_rect.p0.y);
1280 PCUT_ASSERT_INT_EQUALS(96, geom.title_bar_rect.p1.x);
1281 PCUT_ASSERT_INT_EQUALS(46, geom.title_bar_rect.p1.y);
1282
1283 PCUT_ASSERT_INT_EQUALS(15, geom.sysmenu_hdl_rect.p0.x);
1284 PCUT_ASSERT_INT_EQUALS(25, geom.sysmenu_hdl_rect.p0.y);
1285 PCUT_ASSERT_INT_EQUALS(35, geom.sysmenu_hdl_rect.p1.x);
1286 PCUT_ASSERT_INT_EQUALS(45, geom.sysmenu_hdl_rect.p1.y);
1287
1288 PCUT_ASSERT_INT_EQUALS(38, geom.caption_rect.p0.x);
1289 PCUT_ASSERT_INT_EQUALS(24, geom.caption_rect.p0.y);
1290 PCUT_ASSERT_INT_EQUALS(51, geom.caption_rect.p1.x);
1291 PCUT_ASSERT_INT_EQUALS(46, geom.caption_rect.p1.y);
1292
1293 PCUT_ASSERT_INT_EQUALS(55, geom.btn_min_rect.p0.x);
1294 PCUT_ASSERT_INT_EQUALS(25, geom.btn_min_rect.p0.y);
1295 PCUT_ASSERT_INT_EQUALS(75, geom.btn_min_rect.p1.x);
1296 PCUT_ASSERT_INT_EQUALS(45, geom.btn_min_rect.p1.y);
1297
1298 /* Maximize button is not in ui_wds_decorated */
1299 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p0.x);
1300 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p0.y);
1301 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p1.x);
1302 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p1.y);
1303
1304 PCUT_ASSERT_INT_EQUALS(75, geom.btn_close_rect.p0.x);
1305 PCUT_ASSERT_INT_EQUALS(25, geom.btn_close_rect.p0.y);
1306 PCUT_ASSERT_INT_EQUALS(95, geom.btn_close_rect.p1.x);
1307 PCUT_ASSERT_INT_EQUALS(45, geom.btn_close_rect.p1.y);
1308
1309 PCUT_ASSERT_INT_EQUALS(14, geom.app_area_rect.p0.x);
1310 PCUT_ASSERT_INT_EQUALS(46, geom.app_area_rect.p0.y);
1311 PCUT_ASSERT_INT_EQUALS(96, geom.app_area_rect.p1.x);
1312 PCUT_ASSERT_INT_EQUALS(196, geom.app_area_rect.p1.y);
1313
1314 ui_wdecor_destroy(wdecor);
1315 ui_resource_destroy(resource);
1316
1317 rc = gfx_context_delete(gc);
1318 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1319}
1320
1321/** ui_wdecor_rect_from_app() correctly converts application to window rect */
1322PCUT_TEST(rect_from_app)
1323{
1324 gfx_rect_t arect;
1325 gfx_rect_t rect;
1326
1327 arect.p0.x = 14;
1328 arect.p0.y = 46;
1329 arect.p1.x = 96;
1330 arect.p1.y = 196;
1331
1332 ui_wdecor_rect_from_app(ui_wds_none, &arect, &rect);
1333
1334 PCUT_ASSERT_INT_EQUALS(14, rect.p0.x);
1335 PCUT_ASSERT_INT_EQUALS(46, rect.p0.y);
1336 PCUT_ASSERT_INT_EQUALS(96, rect.p1.x);
1337 PCUT_ASSERT_INT_EQUALS(196, rect.p1.y);
1338
1339 ui_wdecor_rect_from_app(ui_wds_frame, &arect, &rect);
1340
1341 PCUT_ASSERT_INT_EQUALS(10, rect.p0.x);
1342 PCUT_ASSERT_INT_EQUALS(42, rect.p0.y);
1343 PCUT_ASSERT_INT_EQUALS(100, rect.p1.x);
1344 PCUT_ASSERT_INT_EQUALS(200, rect.p1.y);
1345
1346 ui_wdecor_rect_from_app(ui_wds_decorated, &arect, &rect);
1347
1348 PCUT_ASSERT_INT_EQUALS(10, rect.p0.x);
1349 PCUT_ASSERT_INT_EQUALS(20, rect.p0.y);
1350 PCUT_ASSERT_INT_EQUALS(100, rect.p1.x);
1351 PCUT_ASSERT_INT_EQUALS(200, rect.p1.y);
1352
1353}
1354
1355/** Test ui_wdecor_get_rsztype() */
1356PCUT_TEST(get_rsztype)
1357{
1358 gfx_context_t *gc = NULL;
1359 test_gc_t tgc;
1360 ui_resource_t *resource = NULL;
1361 ui_wdecor_t *wdecor;
1362 gfx_rect_t rect;
1363 ui_wdecor_rsztype_t rsztype;
1364 gfx_coord2_t pos;
1365 errno_t rc;
1366
1367 memset(&tgc, 0, sizeof(tgc));
1368 rc = gfx_context_new(&ops, &tgc, &gc);
1369 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1370
1371 rc = ui_resource_create(gc, false, &resource);
1372 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1373 PCUT_ASSERT_NOT_NULL(resource);
1374
1375 rc = ui_wdecor_create(resource, "Hello", ui_wds_resizable, &wdecor);
1376 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1377
1378 rect.p0.x = 10;
1379 rect.p0.y = 20;
1380 rect.p1.x = 100;
1381 rect.p1.y = 200;
1382
1383 ui_wdecor_set_rect(wdecor, &rect);
1384
1385 /* Outside of the window */
1386 pos.x = 0;
1387 pos.y = -1;
1388 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
1389 PCUT_ASSERT_EQUALS(ui_wr_none, rsztype);
1390
1391 /* Middle of the window */
1392 pos.x = 50;
1393 pos.y = 100;
1394 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
1395 PCUT_ASSERT_EQUALS(ui_wr_none, rsztype);
1396
1397 /* Top-left corner, but not on edge */
1398 pos.x = 20;
1399 pos.y = 30;
1400 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
1401 PCUT_ASSERT_EQUALS(ui_wr_none, rsztype);
1402
1403 /* Top-left corner on top edge */
1404 pos.x = 20;
1405 pos.y = 20;
1406 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
1407 PCUT_ASSERT_EQUALS(ui_wr_top_left, rsztype);
1408
1409 /* Top-left corner on left edge */
1410 pos.x = 10;
1411 pos.y = 30;
1412 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
1413 PCUT_ASSERT_EQUALS(ui_wr_top_left, rsztype);
1414
1415 /* Top-right corner on top edge */
1416 pos.x = 90;
1417 pos.y = 20;
1418 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
1419 PCUT_ASSERT_EQUALS(ui_wr_top_right, rsztype);
1420
1421 /* Top-right corner on right edge */
1422 pos.x = 99;
1423 pos.y = 30;
1424 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
1425 PCUT_ASSERT_EQUALS(ui_wr_top_right, rsztype);
1426
1427 /* Top edge */
1428 pos.x = 50;
1429 pos.y = 20;
1430 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
1431 PCUT_ASSERT_EQUALS(ui_wr_top, rsztype);
1432
1433 /* Bottom edge */
1434 pos.x = 50;
1435 pos.y = 199;
1436 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
1437 PCUT_ASSERT_EQUALS(ui_wr_bottom, rsztype);
1438
1439 /* Left edge */
1440 pos.x = 10;
1441 pos.y = 100;
1442 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
1443 PCUT_ASSERT_EQUALS(ui_wr_left, rsztype);
1444
1445 /* Right edge */
1446 pos.x = 99;
1447 pos.y = 100;
1448 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
1449 PCUT_ASSERT_EQUALS(ui_wr_right, rsztype);
1450
1451 ui_wdecor_destroy(wdecor);
1452
1453 /* Non-resizable window */
1454
1455 rc = ui_wdecor_create(resource, "Hello", ui_wds_none, &wdecor);
1456 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1457
1458 rect.p0.x = 10;
1459 rect.p0.y = 20;
1460 rect.p1.x = 100;
1461 rect.p1.y = 200;
1462
1463 ui_wdecor_set_rect(wdecor, &rect);
1464
1465 pos.x = 10;
1466 pos.y = 20;
1467 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
1468 PCUT_ASSERT_EQUALS(ui_wr_none, rsztype);
1469
1470 ui_wdecor_destroy(wdecor);
1471 ui_resource_destroy(resource);
1472
1473 rc = gfx_context_delete(gc);
1474 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1475}
1476
1477/** Test ui_wdecor_cursor_from_rsztype() */
1478PCUT_TEST(cursor_from_rsztype)
1479{
1480 PCUT_ASSERT_EQUALS(ui_curs_arrow,
1481 ui_wdecor_cursor_from_rsztype(ui_wr_none));
1482 PCUT_ASSERT_EQUALS(ui_curs_size_ud,
1483 ui_wdecor_cursor_from_rsztype(ui_wr_top));
1484 PCUT_ASSERT_EQUALS(ui_curs_size_ud,
1485 ui_wdecor_cursor_from_rsztype(ui_wr_bottom));
1486 PCUT_ASSERT_EQUALS(ui_curs_size_lr,
1487 ui_wdecor_cursor_from_rsztype(ui_wr_left));
1488 PCUT_ASSERT_EQUALS(ui_curs_size_lr,
1489 ui_wdecor_cursor_from_rsztype(ui_wr_right));
1490 PCUT_ASSERT_EQUALS(ui_curs_size_uldr,
1491 ui_wdecor_cursor_from_rsztype(ui_wr_top_left));
1492 PCUT_ASSERT_EQUALS(ui_curs_size_uldr,
1493 ui_wdecor_cursor_from_rsztype(ui_wr_bottom_right));
1494 PCUT_ASSERT_EQUALS(ui_curs_size_urdl,
1495 ui_wdecor_cursor_from_rsztype(ui_wr_top_right));
1496 PCUT_ASSERT_EQUALS(ui_curs_size_urdl,
1497 ui_wdecor_cursor_from_rsztype(ui_wr_bottom_left));
1498}
1499
1500/** Test ui_wdecor_frame_pos_event() */
1501PCUT_TEST(frame_pos_event)
1502{
1503 gfx_context_t *gc = NULL;
1504 test_gc_t tgc;
1505 ui_resource_t *resource = NULL;
1506 ui_wdecor_t *wdecor;
1507 gfx_rect_t rect;
1508 test_cb_resp_t resp;
1509 pos_event_t event;
1510 errno_t rc;
1511
1512 memset(&tgc, 0, sizeof(tgc));
1513 rc = gfx_context_new(&ops, &tgc, &gc);
1514 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1515
1516 rc = ui_resource_create(gc, false, &resource);
1517 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1518 PCUT_ASSERT_NOT_NULL(resource);
1519
1520 rc = ui_wdecor_create(resource, "Hello", ui_wds_resizable, &wdecor);
1521 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1522
1523 rect.p0.x = 10;
1524 rect.p0.y = 20;
1525 rect.p1.x = 100;
1526 rect.p1.y = 200;
1527
1528 ui_wdecor_set_rect(wdecor, &rect);
1529 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
1530
1531 /* Release on window border should do nothing */
1532 resp.resize = false;
1533 event.type = POS_RELEASE;
1534 event.hpos = 10;
1535 event.vpos = 10;
1536 ui_wdecor_frame_pos_event(wdecor, &event);
1537 PCUT_ASSERT_FALSE(resp.resize);
1538
1539 /* Press in the middle of the window should do nothing */
1540 resp.resize = false;
1541 event.type = POS_PRESS;
1542 event.hpos = 50;
1543 event.vpos = 100;
1544 ui_wdecor_frame_pos_event(wdecor, &event);
1545 PCUT_ASSERT_FALSE(resp.resize);
1546
1547 /* Press on window border should cause resize to be called */
1548 resp.resize = false;
1549 event.type = POS_PRESS;
1550 event.hpos = 10;
1551 event.vpos = 20;
1552 ui_wdecor_frame_pos_event(wdecor, &event);
1553 PCUT_ASSERT_TRUE(resp.resize);
1554
1555 ui_wdecor_destroy(wdecor);
1556 ui_resource_destroy(resource);
1557
1558 rc = gfx_context_delete(gc);
1559 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1560}
1561
1562static errno_t testgc_set_clip_rect(void *arg, gfx_rect_t *rect)
1563{
1564 (void) arg;
1565 (void) rect;
1566 return EOK;
1567}
1568
1569static errno_t testgc_set_color(void *arg, gfx_color_t *color)
1570{
1571 (void) arg;
1572 (void) color;
1573 return EOK;
1574}
1575
1576static errno_t testgc_fill_rect(void *arg, gfx_rect_t *rect)
1577{
1578 (void) arg;
1579 (void) rect;
1580 return EOK;
1581}
1582
1583static errno_t testgc_update(void *arg)
1584{
1585 (void) arg;
1586 return EOK;
1587}
1588
1589static errno_t testgc_bitmap_create(void *arg, gfx_bitmap_params_t *params,
1590 gfx_bitmap_alloc_t *alloc, void **rbm)
1591{
1592 test_gc_t *tgc = (test_gc_t *) arg;
1593 testgc_bitmap_t *tbm;
1594
1595 tbm = calloc(1, sizeof(testgc_bitmap_t));
1596 if (tbm == NULL)
1597 return ENOMEM;
1598
1599 if (alloc == NULL) {
1600 tbm->alloc.pitch = (params->rect.p1.x - params->rect.p0.x) *
1601 sizeof(uint32_t);
1602 tbm->alloc.off0 = 0;
1603 tbm->alloc.pixels = calloc(sizeof(uint32_t),
1604 (params->rect.p1.x - params->rect.p0.x) *
1605 (params->rect.p1.y - params->rect.p0.y));
1606 tbm->myalloc = true;
1607 if (tbm->alloc.pixels == NULL) {
1608 free(tbm);
1609 return ENOMEM;
1610 }
1611 } else {
1612 tbm->alloc = *alloc;
1613 }
1614
1615 tbm->tgc = tgc;
1616 tgc->bm_created = true;
1617 tgc->bm_params = *params;
1618 tgc->bm_pixels = tbm->alloc.pixels;
1619 *rbm = (void *)tbm;
1620 return EOK;
1621}
1622
1623static errno_t testgc_bitmap_destroy(void *bm)
1624{
1625 testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
1626 if (tbm->myalloc)
1627 free(tbm->alloc.pixels);
1628 tbm->tgc->bm_destroyed = true;
1629 free(tbm);
1630 return EOK;
1631}
1632
1633static errno_t testgc_bitmap_render(void *bm, gfx_rect_t *srect,
1634 gfx_coord2_t *offs)
1635{
1636 testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
1637 tbm->tgc->bm_rendered = true;
1638 tbm->tgc->bm_srect = *srect;
1639 tbm->tgc->bm_offs = *offs;
1640 return EOK;
1641}
1642
1643static errno_t testgc_bitmap_get_alloc(void *bm, gfx_bitmap_alloc_t *alloc)
1644{
1645 testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
1646 *alloc = tbm->alloc;
1647 tbm->tgc->bm_got_alloc = true;
1648 return EOK;
1649}
1650
1651static void test_wdecor_sysmenu_open(ui_wdecor_t *wdecor, void *arg,
1652 sysarg_t idev_id)
1653{
1654 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1655
1656 resp->sysmenu_open = true;
1657 resp->idev_id = idev_id;
1658}
1659
1660static void test_wdecor_sysmenu_left(ui_wdecor_t *wdecor, void *arg,
1661 sysarg_t idev_id)
1662{
1663 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1664
1665 resp->sysmenu_left = true;
1666 resp->idev_id = idev_id;
1667}
1668
1669static void test_wdecor_sysmenu_right(ui_wdecor_t *wdecor, void *arg,
1670 sysarg_t idev_id)
1671{
1672 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1673
1674 resp->sysmenu_right = true;
1675 resp->idev_id = idev_id;
1676}
1677
1678static void test_wdecor_sysmenu_accel(ui_wdecor_t *wdecor, void *arg,
1679 char32_t accel, sysarg_t idev_id)
1680{
1681 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1682
1683 resp->sysmenu_accel = true;
1684 resp->accel = accel;
1685 resp->idev_id = idev_id;
1686}
1687
1688static void test_wdecor_minimize(ui_wdecor_t *wdecor, void *arg)
1689{
1690 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1691
1692 resp->minimize = true;
1693}
1694
1695static void test_wdecor_maximize(ui_wdecor_t *wdecor, void *arg)
1696{
1697 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1698
1699 resp->maximize = true;
1700}
1701
1702static void test_wdecor_unmaximize(ui_wdecor_t *wdecor, void *arg)
1703{
1704 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1705
1706 resp->unmaximize = true;
1707}
1708
1709static void test_wdecor_close(ui_wdecor_t *wdecor, void *arg)
1710{
1711 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1712
1713 resp->close = true;
1714}
1715
1716static void test_wdecor_move(ui_wdecor_t *wdecor, void *arg, gfx_coord2_t *pos,
1717 sysarg_t pos_id)
1718{
1719 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1720
1721 resp->move = true;
1722 resp->pos = *pos;
1723 resp->pos_id = pos_id;
1724}
1725
1726static void test_wdecor_resize(ui_wdecor_t *wdecor, void *arg,
1727 ui_wdecor_rsztype_t rsztype, gfx_coord2_t *pos, sysarg_t pos_id)
1728{
1729 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1730
1731 resp->resize = true;
1732 resp->rsztype = rsztype;
1733 resp->pos = *pos;
1734 resp->pos_id = pos_id;
1735}
1736
1737static void test_wdecor_set_cursor(ui_wdecor_t *wdecor, void *arg,
1738 ui_stock_cursor_t cursor)
1739{
1740 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1741
1742 resp->set_cursor = true;
1743 resp->cursor = cursor;
1744}
1745
1746PCUT_EXPORT(wdecor);
Note: See TracBrowser for help on using the repository browser.