Changeset 8d1bcd7 in mainline for uspace/lib/ui/test/wdecor.c


Ignore:
Timestamp:
2023-09-26T20:26:55Z (8 months ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5afc1aa
Parents:
ed1a948
Message:

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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ui/test/wdecor.c

    red1a948 r8d1bcd7  
    6262};
    6363
    64 static void test_wdecor_sysmenu(ui_wdecor_t *, void *, sysarg_t);
     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);
    6569static void test_wdecor_minimize(ui_wdecor_t *, void *);
    6670static void test_wdecor_maximize(ui_wdecor_t *, void *);
     
    7377
    7478static ui_wdecor_cb_t test_wdecor_cb = {
    75         .sysmenu = test_wdecor_sysmenu,
     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,
    7683        .minimize = test_wdecor_minimize,
    7784        .maximize = test_wdecor_maximize,
     
    104111
    105112typedef struct {
    106         bool sysmenu;
     113        bool sysmenu_open;
     114        bool sysmenu_left;
     115        bool sysmenu_right;
     116        bool sysmenu_accel;
    107117        bool minimize;
    108118        bool maximize;
     
    113123        sysarg_t pos_id;
    114124        sysarg_t idev_id;
     125        char32_t accel;
    115126        bool resize;
    116127        ui_wdecor_rsztype_t rsztype;
     
    312323}
    313324
    314 /** Test ui_wdecor_sysmenu() */
    315 PCUT_TEST(sysmenu)
     325/** Test ui_wdecor_sysmenu_open() */
     326PCUT_TEST(sysmenu_open)
    316327{
    317328        errno_t rc;
     
    322333        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    323334
    324         /* Sysmenu callback with no callbacks set */
    325         ui_wdecor_sysmenu(wdecor, 42);
    326 
    327         /* Sysmenu callback with sysmenu callback not implemented */
     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 */
    328339        ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
    329         ui_wdecor_sysmenu(wdecor, 42);
    330 
    331         /* Sysmenu callback with real callback set */
    332         resp.sysmenu = false;
     340        ui_wdecor_sysmenu_open(wdecor, 42);
     341
     342        /* Sysmenu open callback with real callback set */
     343        resp.sysmenu_open = false;
    333344        resp.idev_id = 0;
    334345        ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
    335         ui_wdecor_sysmenu(wdecor, 42);
    336         PCUT_ASSERT_TRUE(resp.sysmenu);
     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);
    337433        PCUT_ASSERT_INT_EQUALS(42, resp.idev_id);
    338434
     
    649745}
    650746
    651 /** Pressing F9 generates sysmenu event */
    652 PCUT_TEST(kbd_f9_sysmenu)
     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)
    653753{
    654754        errno_t rc;
     
    681781        ui_wdecor_set_cb(wdecor, &test_wdecor_cb, (void *) &resp);
    682782
    683         resp.move = false;
    684         resp.pos.x = 0;
    685         resp.pos.y = 0;
     783        resp.sysmenu_open = false;
    686784
    687785        event.type = KEY_PRESS;
    688786        event.mods = 0;
    689         event.key = KC_F9;
     787        event.key = KC_F10;
    690788        event.kbd_id = 42;
    691789        ui_wdecor_kbd_event(wdecor, &event);
    692790
    693         PCUT_ASSERT_TRUE(resp.sysmenu);
     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);
    6941002        PCUT_ASSERT_INT_EQUALS(event.kbd_id, resp.idev_id);
    6951003
     
    13411649}
    13421650
    1343 static void test_wdecor_sysmenu(ui_wdecor_t *wdecor, void *arg,
     1651static void test_wdecor_sysmenu_open(ui_wdecor_t *wdecor, void *arg,
    13441652    sysarg_t idev_id)
    13451653{
    13461654        test_cb_resp_t *resp = (test_cb_resp_t *) arg;
    13471655
    1348         resp->sysmenu = true;
     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;
    13491685        resp->idev_id = idev_id;
    13501686}
Note: See TracChangeset for help on using the changeset viewer.