Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hid/display/test/seat.c

    r195b7b3 racd7ac2  
    11/*
    2  * Copyright (c) 2019 Jiri Svoboda
     2 * Copyright (c) 2023 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    7070        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    7171
    72         rc = ds_seat_create(disp, &seat);
     72        rc = ds_seat_create(disp, "Alice", &seat);
    7373        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    7474
     
    9090}
    9191
    92 /** Evacuate focus. */
    93 PCUT_TEST(evac_focus)
     92/** Evacuate focus from window.
     93 *
     94 * After evacuating no window should be focused
     95 */
     96PCUT_TEST(evac_focus_one_window)
     97{
     98        ds_display_t *disp;
     99        ds_client_t *client;
     100        ds_seat_t *seat;
     101        ds_window_t *wnd;
     102        display_wnd_params_t params;
     103        bool called_cb = false;
     104        errno_t rc;
     105
     106        rc = ds_display_create(NULL, df_none, &disp);
     107        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     108
     109        rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
     110        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     111
     112        rc = ds_seat_create(disp, "Alice", &seat);
     113        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     114
     115        display_wnd_params_init(&params);
     116        params.rect.p0.x = params.rect.p0.y = 0;
     117        params.rect.p1.x = params.rect.p1.y = 1;
     118
     119        rc = ds_window_create(client, &params, &wnd);
     120        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     121
     122        ds_seat_set_focus(seat, wnd);
     123        PCUT_ASSERT_EQUALS(wnd, seat->focus);
     124        PCUT_ASSERT_TRUE(called_cb);
     125        called_cb = false;
     126
     127        ds_seat_evac_wnd_refs(seat, wnd);
     128        PCUT_ASSERT_NULL(seat->focus);
     129        PCUT_ASSERT_TRUE(called_cb);
     130
     131        ds_window_destroy(wnd);
     132        ds_seat_destroy(seat);
     133        ds_client_destroy(client);
     134        ds_display_destroy(disp);
     135}
     136
     137/** Evacuate popup reference from window.
     138 *
     139 * After evacuating no window should be set as the popup
     140 */
     141PCUT_TEST(evac_popup)
     142{
     143        ds_display_t *disp;
     144        ds_client_t *client;
     145        ds_seat_t *seat;
     146        ds_window_t *wnd;
     147        display_wnd_params_t params;
     148        bool called_cb = false;
     149        errno_t rc;
     150
     151        rc = ds_display_create(NULL, df_none, &disp);
     152        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     153
     154        rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
     155        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     156
     157        rc = ds_seat_create(disp, "Alice", &seat);
     158        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     159
     160        display_wnd_params_init(&params);
     161        params.rect.p0.x = params.rect.p0.y = 0;
     162        params.rect.p1.x = params.rect.p1.y = 1;
     163        params.flags |= wndf_popup;
     164
     165        rc = ds_window_create(client, &params, &wnd);
     166        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     167
     168        PCUT_ASSERT_EQUALS(wnd, seat->popup);
     169
     170        ds_seat_evac_wnd_refs(seat, wnd);
     171        PCUT_ASSERT_NULL(seat->popup);
     172
     173        ds_window_destroy(wnd);
     174        ds_seat_destroy(seat);
     175        ds_client_destroy(client);
     176        ds_display_destroy(disp);
     177}
     178
     179/** Unfocus window when three windows are available */
     180PCUT_TEST(unfocus_wnd_three_windows)
    94181{
    95182        ds_display_t *disp;
     
    98185        ds_window_t *w0;
    99186        ds_window_t *w1;
    100         display_wnd_params_t params;
    101         bool called_cb = false;
    102         errno_t rc;
    103 
    104         rc = ds_display_create(NULL, df_none, &disp);
    105         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    106 
    107         rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
    108         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    109 
    110         rc = ds_seat_create(disp, &seat);
     187        ds_window_t *w2;
     188        display_wnd_params_t params;
     189        bool called_cb = false;
     190        errno_t rc;
     191
     192        rc = ds_display_create(NULL, df_none, &disp);
     193        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     194
     195        rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
     196        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     197
     198        rc = ds_seat_create(disp, "Alice", &seat);
     199        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     200
     201        display_wnd_params_init(&params);
     202        params.rect.p0.x = params.rect.p0.y = 0;
     203        params.rect.p1.x = params.rect.p1.y = 1;
     204
     205        rc = ds_window_create(client, &params, &w2);
     206        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     207
     208        rc = ds_window_create(client, &params, &w1);
     209        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     210
     211        rc = ds_window_create(client, &params, &w0);
     212        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     213
     214        /* w0 is at the top, then w1, then w2 */
     215
     216        PCUT_ASSERT_EQUALS(w0, seat->focus);
     217
     218        ds_window_unfocus(w0);
     219
     220        /* The previous window, w1, should be focused now */
     221        PCUT_ASSERT_EQUALS(w1, seat->focus);
     222
     223        ds_window_destroy(w0);
     224        ds_window_destroy(w1);
     225        ds_seat_destroy(seat);
     226        ds_client_destroy(client);
     227        ds_display_destroy(disp);
     228}
     229
     230/** Unfocus window when two windows and one system window are available */
     231PCUT_TEST(unfocus_wnd_two_windows_one_sys)
     232{
     233        ds_display_t *disp;
     234        ds_client_t *client;
     235        ds_seat_t *seat;
     236        ds_window_t *w0;
     237        ds_window_t *w1;
     238        ds_window_t *w2;
     239        display_wnd_params_t params;
     240        bool called_cb = false;
     241        errno_t rc;
     242
     243        rc = ds_display_create(NULL, df_none, &disp);
     244        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     245
     246        rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
     247        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     248
     249        rc = ds_seat_create(disp, "Alice", &seat);
     250        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     251
     252        display_wnd_params_init(&params);
     253        params.rect.p0.x = params.rect.p0.y = 0;
     254        params.rect.p1.x = params.rect.p1.y = 1;
     255
     256        params.flags |= wndf_system;
     257        rc = ds_window_create(client, &params, &w2);
     258        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     259
     260        params.flags &= ~wndf_system;
     261        rc = ds_window_create(client, &params, &w1);
     262        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     263
     264        rc = ds_window_create(client, &params, &w0);
     265        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     266
     267        PCUT_ASSERT_EQUALS(w0, seat->focus);
     268
     269        ds_window_unfocus(w0);
     270
     271        /* The previous non-system window is w1, w2 should be skipped */
     272        PCUT_ASSERT_EQUALS(w1, seat->focus);
     273
     274        ds_window_destroy(w0);
     275        ds_window_destroy(w1);
     276        ds_seat_destroy(seat);
     277        ds_client_destroy(client);
     278        ds_display_destroy(disp);
     279}
     280
     281/** Unfocus window when one window and one system window is available */
     282PCUT_TEST(unfocus_wnd_one_window_one_sys)
     283{
     284        ds_display_t *disp;
     285        ds_client_t *client;
     286        ds_seat_t *seat;
     287        ds_window_t *w0;
     288        ds_window_t *w1;
     289        display_wnd_params_t params;
     290        bool called_cb = false;
     291        errno_t rc;
     292
     293        rc = ds_display_create(NULL, df_none, &disp);
     294        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     295
     296        rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
     297        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     298
     299        rc = ds_seat_create(disp, "Alice", &seat);
     300        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     301
     302        display_wnd_params_init(&params);
     303        params.rect.p0.x = params.rect.p0.y = 0;
     304        params.rect.p1.x = params.rect.p1.y = 1;
     305
     306        params.flags |= wndf_system;
     307        rc = ds_window_create(client, &params, &w1);
     308        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     309
     310        params.flags &= ~wndf_system;
     311        rc = ds_window_create(client, &params, &w0);
     312        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     313
     314        PCUT_ASSERT_EQUALS(w0, seat->focus);
     315
     316        ds_window_unfocus(w0);
     317
     318        /* Since no non-system window is available, w1 should be focused */
     319        PCUT_ASSERT_EQUALS(w1, seat->focus);
     320
     321        ds_window_destroy(w0);
     322        ds_window_destroy(w1);
     323        ds_seat_destroy(seat);
     324        ds_client_destroy(client);
     325        ds_display_destroy(disp);
     326}
     327
     328/** Unfocus window when one window is available */
     329PCUT_TEST(unfocus_wnd_one_window)
     330{
     331        ds_display_t *disp;
     332        ds_client_t *client;
     333        ds_seat_t *seat;
     334        ds_window_t *w0;
     335        display_wnd_params_t params;
     336        bool called_cb = false;
     337        errno_t rc;
     338
     339        rc = ds_display_create(NULL, df_none, &disp);
     340        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     341
     342        rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
     343        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     344
     345        rc = ds_seat_create(disp, "Alice", &seat);
     346        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     347
     348        display_wnd_params_init(&params);
     349        params.rect.p0.x = params.rect.p0.y = 0;
     350        params.rect.p1.x = params.rect.p1.y = 1;
     351
     352        rc = ds_window_create(client, &params, &w0);
     353        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     354
     355        PCUT_ASSERT_EQUALS(w0, seat->focus);
     356
     357        ds_window_unfocus(w0);
     358
     359        /* Since no other window is availabe, no window should be focused */
     360        PCUT_ASSERT_EQUALS(NULL, seat->focus);
     361
     362        ds_window_destroy(w0);
     363        ds_seat_destroy(seat);
     364        ds_client_destroy(client);
     365        ds_display_destroy(disp);
     366}
     367
     368/** Switch focus when another window is available. */
     369PCUT_TEST(switch_focus_two_windows)
     370{
     371        ds_display_t *disp;
     372        ds_client_t *client;
     373        ds_seat_t *seat;
     374        ds_window_t *w0;
     375        ds_window_t *w1;
     376        display_wnd_params_t params;
     377        bool called_cb = false;
     378        errno_t rc;
     379
     380        rc = ds_display_create(NULL, df_none, &disp);
     381        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     382
     383        rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
     384        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     385
     386        rc = ds_seat_create(disp, "Alice", &seat);
    111387        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    112388
     
    126402        called_cb = false;
    127403
    128         ds_seat_evac_focus(seat, w1);
     404        ds_seat_switch_focus(seat);
    129405        PCUT_ASSERT_EQUALS(w0, seat->focus);
    130406        PCUT_ASSERT_TRUE(called_cb);
     
    137413}
    138414
     415/** Switch focus with just one existing window.
     416 *
     417 * After switching the focus should remain with the same window.
     418 */
     419PCUT_TEST(switch_focus_one_window)
     420{
     421        ds_display_t *disp;
     422        ds_client_t *client;
     423        ds_seat_t *seat;
     424        ds_window_t *wnd;
     425        display_wnd_params_t params;
     426        bool called_cb = false;
     427        errno_t rc;
     428
     429        rc = ds_display_create(NULL, df_none, &disp);
     430        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     431
     432        rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
     433        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     434
     435        rc = ds_seat_create(disp, "Alice", &seat);
     436        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     437
     438        display_wnd_params_init(&params);
     439        params.rect.p0.x = params.rect.p0.y = 0;
     440        params.rect.p1.x = params.rect.p1.y = 1;
     441
     442        rc = ds_window_create(client, &params, &wnd);
     443        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     444
     445        ds_seat_set_focus(seat, wnd);
     446        PCUT_ASSERT_EQUALS(wnd, seat->focus);
     447        PCUT_ASSERT_TRUE(called_cb);
     448        called_cb = false;
     449
     450        ds_seat_switch_focus(seat);
     451        PCUT_ASSERT_EQUALS(wnd, seat->focus);
     452        PCUT_ASSERT_FALSE(called_cb);
     453
     454        ds_window_destroy(wnd);
     455        ds_seat_destroy(seat);
     456        ds_client_destroy(client);
     457        ds_display_destroy(disp);
     458}
     459
    139460/** Test ds_seat_post_kbd_event() with Alt-Tab switches focus */
    140461PCUT_TEST(post_kbd_event_alt_tab)
     
    156477        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    157478
    158         rc = ds_seat_create(disp, &seat);
     479        rc = ds_seat_create(disp, "Alice", &seat);
    159480        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    160481
     
    209530        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    210531
    211         rc = ds_seat_create(disp, &seat);
     532        rc = ds_seat_create(disp, "Alice", &seat);
    212533        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    213534
     
    273594        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    274595
    275         rc = ds_seat_create(disp, &seat);
     596        rc = ds_seat_create(disp, "Alice", &seat);
    276597        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    277598
     
    299620        w1->dpos.y = 400;
    300621
    301         PCUT_ASSERT_FALSE(called_cb);
     622        /* New window gets focused event */
     623        PCUT_ASSERT_TRUE(called_cb);
     624
     625        called_cb = false;
    302626
    303627        ds_seat_set_focus(seat, w0);
     
    366690        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    367691
    368         rc = ds_seat_create(disp, &seat);
     692        rc = ds_seat_create(disp, "Alice", &seat);
    369693        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    370694
Note: See TracChangeset for help on using the changeset viewer.