source: mainline/uspace/lib/ui/test/wdecor.c

Last change on this file was 1fa6292, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 5 months ago

Remove a ton of duplicated code in libui/libgfxfont tests

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