Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset b4b4dafe in mainline


Ignore:
Timestamp:
2021-06-03T14:02:59Z (6 months ago)
Author:
Jiri Svoboda <jiri@…>
Children:
2e6394e
Parents:
6baab83
git-author:
Jiri Svoboda <jiri@…> (2021-06-02 17:00:03)
git-committer:
Jiri Svoboda <jiri@…> (2021-06-03 14:02:59)
Message:

Popup windows event delivery is special

Popup windows don't get focus, yet they still receive events.

Location:
uspace
Files:
16 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/display/include/types/display/wndparams.h

    r6baab83 rb4b4dafe  
    11/*
    2  * Copyright (c) 2019 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3838#include <gfx/coord.h>
    3939
     40/** Window flags */
     41typedef enum {
     42        /** Popup window (capture events, no focus) */
     43        wndf_popup = 0x1
     44} display_wnd_flags_t;
     45
    4046/** Parameters for a new window.
    4147 *
     
    5056        /** Minimum size (when being resized) */
    5157        gfx_coord2_t min_size;
     58        /** Flags */
     59        display_wnd_flags_t flags;
    5260} display_wnd_params_t;
    5361
  • uspace/lib/ui/include/types/ui/window.h

    r6baab83 rb4b4dafe  
    6363} ui_wnd_placement_t;
    6464
     65/** Window flags */
     66typedef enum {
     67        /** Popup window */
     68        ui_wndf_popup = 0x1
     69} ui_wnd_flags_t;
     70
    6571/** Window parameters */
    6672typedef struct {
     
    7379        /** Window placement */
    7480        ui_wnd_placement_t placement;
     81        /** Window flags */
     82        ui_wnd_flags_t flags;
    7583        /** Parent rectangle for popup windows */
    7684        gfx_rect_t prect;
  • uspace/lib/ui/include/ui/window.h

    r6baab83 rb4b4dafe  
    11/*
    2  * Copyright (c) 2020 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
  • uspace/lib/ui/src/popup.c

    r6baab83 rb4b4dafe  
    9494        wparams.style &= ~ui_wds_decorated;
    9595        wparams.placement = ui_wnd_place_popup;
     96        wparams.flags |= ui_wndf_popup;
    9697
    9798        /* Compute position of parent rectangle relative to the screen */
  • uspace/lib/ui/src/window.c

    r6baab83 rb4b4dafe  
    188188        gfx_rect_dims(&params->rect, &dparams.min_size);
    189189
     190        if ((params->flags & ui_wndf_popup) != 0)
     191                dparams.flags |= wndf_popup;
     192
    190193        if (ui->display != NULL) {
    191194                if (params->placement != ui_wnd_place_default) {
  • uspace/srv/hid/display/client.c

    r6baab83 rb4b4dafe  
    11/*
    2  * Copyright (c) 2019 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    115115        seat = ds_display_first_seat(wnd->display);
    116116        while (seat != NULL) {
    117                 ds_seat_evac_focus(seat, wnd);
     117                ds_seat_evac_wnd_refs(seat, wnd);
    118118                seat = ds_display_next_seat(seat);
    119119        }
  • uspace/srv/hid/display/dsops.c

    r6baab83 rb4b4dafe  
    11/*
    2  * Copyright (c) 2019 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    7575        errno_t rc;
    7676        ds_client_t *client = (ds_client_t *) arg;
    77         ds_seat_t *seat;
    7877        ds_window_t *wnd;
    7978
     
    9291            wnd->id);
    9392
    94         /* XXX All the below should probably be part of ds_window_create() */
    95         wnd->dpos.x = ((wnd->id - 1) & 1) * 400;
    96         wnd->dpos.y = ((wnd->id - 1) & 2) / 2 * 300;
    97 
    98         seat = ds_display_first_seat(client->display);
    99         ds_seat_set_focus(seat, wnd);
    100         (void) ds_display_paint(wnd->display, NULL);
    101 
    10293        ds_display_unlock(client->display);
    10394
  • uspace/srv/hid/display/seat.c

    r6baab83 rb4b4dafe  
    11/*
    2  * Copyright (c) 2019 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    106106}
    107107
    108 /** Evacuate focus from window.
     108/** Set seat popup window.
     109 *
     110 * @param seat Seat
     111 * @param wnd Popup window
     112 */
     113void ds_seat_set_popup(ds_seat_t *seat, ds_window_t *wnd)
     114{
     115        seat->popup = wnd;
     116}
     117
     118/** Evacuate seat references to window.
    109119 *
    110120 * If seat's focus is @a wnd, it will be set to a different window.
     121 * If seat's popup window is @a wnd, it will be set to NULL.
    111122 *
    112123 * @param seat Seat
    113124 * @param wnd Window to evacuate focus from
    114125 */
    115 void ds_seat_evac_focus(ds_seat_t *seat, ds_window_t *wnd)
     126void ds_seat_evac_wnd_refs(ds_seat_t *seat, ds_window_t *wnd)
    116127{
    117128        ds_window_t *nwnd;
     
    126137                ds_seat_set_focus(seat, nwnd);
    127138        }
     139
     140        if (seat->popup == wnd)
     141                seat->popup = NULL;
    128142}
    129143
     
    168182        }
    169183
    170         dwindow = seat->focus;
     184        dwindow = seat->popup;
     185        if (dwindow == NULL)
     186                dwindow = seat->focus;
     187
    171188        if (dwindow == NULL)
    172189                return EOK;
     
    328345        /* Focus window on button press */
    329346        if (event->type == PTD_PRESS && event->btn_num == 1) {
    330                 if (wnd != NULL) {
     347                if (wnd != NULL && (wnd->flags & wndf_popup) == 0) {
    331348                        ds_seat_set_focus(seat, wnd);
    332349                }
     
    410427
    411428        wnd = ds_display_window_by_pos(seat->display, &seat->pntpos);
     429        /*
     430         * Deliver event to popup window, unless the pointer is over
     431         * it (in which case it will be delivered to that window
     432         * below, anyway.
     433         */
     434        if (seat->popup != wnd && seat->popup != NULL) {
     435                rc = ds_window_post_pos_event(seat->popup, event);
     436                if (rc != EOK)
     437                        return rc;
     438        }
     439
    412440        if (seat->focus != wnd && seat->focus != NULL) {
    413441                rc = ds_window_post_pos_event(seat->focus, event);
  • uspace/srv/hid/display/seat.h

    r6baab83 rb4b4dafe  
    11/*
    2  * Copyright (c) 2019 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4949extern void ds_seat_destroy(ds_seat_t *);
    5050extern void ds_seat_set_focus(ds_seat_t *, ds_window_t *);
    51 extern void ds_seat_evac_focus(ds_seat_t *, ds_window_t *);
     51extern void ds_seat_set_popup(ds_seat_t *, ds_window_t *);
     52extern void ds_seat_evac_wnd_refs(ds_seat_t *, ds_window_t *);
    5253extern void ds_seat_switch_focus(ds_seat_t *);
    5354extern errno_t ds_seat_post_kbd_event(ds_seat_t *, kbd_event_t *);
  • uspace/srv/hid/display/test/client.c

    r6baab83 rb4b4dafe  
    11/*
    2  * Copyright (c) 2019 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3434#include "../client.h"
    3535#include "../display.h"
     36#include "../seat.h"
    3637#include "../window.h"
    3738
     
    7879        ds_display_t *disp;
    7980        ds_client_t *client;
     81        ds_seat_t *seat;
    8082        ds_window_t *w0;
    8183        ds_window_t *w1;
    8284        ds_window_t *wnd;
    8385        display_wnd_params_t params;
    84         errno_t rc;
    85 
    86         rc = ds_display_create(NULL, df_none, &disp);
    87         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    88 
    89         rc = ds_client_create(disp, &test_ds_client_cb, NULL, &client);
     86        bool called_cb = NULL;
     87        errno_t rc;
     88
     89        rc = ds_display_create(NULL, df_none, &disp);
     90        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     91
     92        rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
     93        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     94
     95        rc = ds_seat_create(disp, &seat);
    9096        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    9197
     
    114120        ds_window_destroy(w0);
    115121        ds_window_destroy(w1);
     122        ds_seat_destroy(seat);
    116123        ds_client_destroy(client);
    117124        ds_display_destroy(disp);
     
    123130        ds_display_t *disp;
    124131        ds_client_t *client;
     132        ds_seat_t *seat;
    125133        ds_window_t *w0;
    126134        ds_window_t *w1;
    127135        ds_window_t *wnd;
    128136        display_wnd_params_t params;
    129         errno_t rc;
    130 
    131         rc = ds_display_create(NULL, df_none, &disp);
    132         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    133 
    134         rc = ds_client_create(disp, &test_ds_client_cb, NULL, &client);
     137        bool called_cb = NULL;
     138        errno_t rc;
     139
     140        rc = ds_display_create(NULL, df_none, &disp);
     141        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     142
     143        rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
     144        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     145
     146        rc = ds_seat_create(disp, &seat);
    135147        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    136148
     
    156168        ds_window_destroy(w0);
    157169        ds_window_destroy(w1);
     170        ds_seat_destroy(seat);
    158171        ds_client_destroy(client);
    159172        ds_display_destroy(disp);
     
    165178        ds_display_t *disp;
    166179        ds_client_t *client;
     180        ds_seat_t *seat;
    167181        ds_window_t *wnd;
    168182        display_wnd_params_t params;
     
    178192        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    179193
    180         display_wnd_params_init(&params);
    181         params.rect.p0.x = params.rect.p0.y = 0;
    182         params.rect.p1.x = params.rect.p1.y = 1;
    183 
    184         rc = ds_window_create(client, &params, &wnd);
    185         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    186 
    187         PCUT_ASSERT_FALSE(called_cb);
     194        rc = ds_seat_create(disp, &seat);
     195        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     196
     197        display_wnd_params_init(&params);
     198        params.rect.p0.x = params.rect.p0.y = 0;
     199        params.rect.p1.x = params.rect.p1.y = 1;
     200
     201        rc = ds_window_create(client, &params, &wnd);
     202        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     203
     204        /* New window gets focused event */
     205        PCUT_ASSERT_TRUE(called_cb);
     206
     207        rc = ds_client_get_event(client, &rwindow, &revent);
     208        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     209
     210        called_cb = false;
    188211
    189212        rc = ds_client_get_event(client, &rwindow, &revent);
     
    203226
    204227        ds_window_destroy(wnd);
     228        ds_seat_destroy(seat);
    205229        ds_client_destroy(client);
    206230        ds_display_destroy(disp);
     
    212236        ds_display_t *disp;
    213237        ds_client_t *client;
     238        ds_seat_t *seat;
    214239        ds_window_t *wnd;
    215240        display_wnd_params_t params;
     
    225250        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    226251
    227         display_wnd_params_init(&params);
    228         params.rect.p0.x = params.rect.p0.y = 0;
    229         params.rect.p1.x = params.rect.p1.y = 1;
    230 
    231         rc = ds_window_create(client, &params, &wnd);
    232         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    233 
    234         PCUT_ASSERT_FALSE(called_cb);
     252        rc = ds_seat_create(disp, &seat);
     253        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     254
     255        display_wnd_params_init(&params);
     256        params.rect.p0.x = params.rect.p0.y = 0;
     257        params.rect.p1.x = params.rect.p1.y = 1;
     258
     259        rc = ds_window_create(client, &params, &wnd);
     260        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     261
     262        /* New window gets focused event */
     263        PCUT_ASSERT_TRUE(called_cb);
     264
     265        rc = ds_client_get_event(client, &rwindow, &revent);
     266        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     267
     268        called_cb = false;
    235269
    236270        rc = ds_client_get_event(client, &rwindow, &revent);
     
    250284
    251285        ds_window_destroy(wnd);
     286        ds_seat_destroy(seat);
    252287        ds_client_destroy(client);
    253288        ds_display_destroy(disp);
     
    259294        ds_display_t *disp;
    260295        ds_client_t *client;
     296        ds_seat_t *seat;
    261297        ds_window_t *wnd;
    262298        display_wnd_params_t params;
     
    273309        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    274310
    275         display_wnd_params_init(&params);
    276         params.rect.p0.x = params.rect.p0.y = 0;
    277         params.rect.p1.x = params.rect.p1.y = 1;
    278 
    279         rc = ds_window_create(client, &params, &wnd);
    280         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     311        rc = ds_seat_create(disp, &seat);
     312        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     313
     314        display_wnd_params_init(&params);
     315        params.rect.p0.x = params.rect.p0.y = 0;
     316        params.rect.p1.x = params.rect.p1.y = 1;
     317
     318        rc = ds_window_create(client, &params, &wnd);
     319        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     320
     321        /* New window gets focused event */
     322        PCUT_ASSERT_TRUE(called_cb);
     323
     324        rc = ds_client_get_event(client, &rwindow, &revent);
     325        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     326
     327        called_cb = false;
     328
     329        rc = ds_client_get_event(client, &rwindow, &revent);
     330        PCUT_ASSERT_ERRNO_VAL(ENOENT, rc);
    281331
    282332        event.type = KEY_PRESS;
     
    284334        event.mods = 0;
    285335        event.c = L'\0';
    286 
    287         PCUT_ASSERT_FALSE(called_cb);
    288 
    289         rc = ds_client_get_event(client, &rwindow, &revent);
    290         PCUT_ASSERT_ERRNO_VAL(ENOENT, rc);
    291336
    292337        rc = ds_client_post_kbd_event(client, wnd, &event);
     
    307352
    308353        ds_window_destroy(wnd);
     354        ds_seat_destroy(seat);
    309355        ds_client_destroy(client);
    310356        ds_display_destroy(disp);
     
    316362        ds_display_t *disp;
    317363        ds_client_t *client;
     364        ds_seat_t *seat;
    318365        ds_window_t *wnd;
    319366        display_wnd_params_t params;
     
    330377        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    331378
    332         display_wnd_params_init(&params);
    333         params.rect.p0.x = params.rect.p0.y = 0;
    334         params.rect.p1.x = params.rect.p1.y = 1;
    335 
    336         rc = ds_window_create(client, &params, &wnd);
    337         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     379        rc = ds_seat_create(disp, &seat);
     380        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     381
     382        display_wnd_params_init(&params);
     383        params.rect.p0.x = params.rect.p0.y = 0;
     384        params.rect.p1.x = params.rect.p1.y = 1;
     385
     386        rc = ds_window_create(client, &params, &wnd);
     387        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     388
     389        /* New window gets focused event */
     390        PCUT_ASSERT_TRUE(called_cb);
     391
     392        rc = ds_client_get_event(client, &rwindow, &revent);
     393        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     394
     395        called_cb = false;
     396
     397        PCUT_ASSERT_FALSE(called_cb);
     398
     399        rc = ds_client_get_event(client, &rwindow, &revent);
     400        PCUT_ASSERT_ERRNO_VAL(ENOENT, rc);
    338401
    339402        event.type = POS_PRESS;
    340403        event.hpos = 1;
    341404        event.vpos = 2;
    342 
    343         PCUT_ASSERT_FALSE(called_cb);
    344 
    345         rc = ds_client_get_event(client, &rwindow, &revent);
    346         PCUT_ASSERT_ERRNO_VAL(ENOENT, rc);
    347405
    348406        rc = ds_client_post_pos_event(client, wnd, &event);
     
    362420
    363421        ds_window_destroy(wnd);
     422        ds_seat_destroy(seat);
    364423        ds_client_destroy(client);
    365424        ds_display_destroy(disp);
     
    371430        ds_display_t *disp;
    372431        ds_client_t *client;
     432        ds_seat_t *seat;
    373433        ds_window_t *wnd;
    374434        display_wnd_params_t params;
     
    385445        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    386446
    387         display_wnd_params_init(&params);
    388         params.rect.p0.x = params.rect.p0.y = 0;
    389         params.rect.p1.x = params.rect.p1.y = 1;
    390 
    391         rc = ds_window_create(client, &params, &wnd);
    392         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     447        rc = ds_seat_create(disp, &seat);
     448        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     449
     450        display_wnd_params_init(&params);
     451        params.rect.p0.x = params.rect.p0.y = 0;
     452        params.rect.p1.x = params.rect.p1.y = 1;
     453
     454        rc = ds_window_create(client, &params, &wnd);
     455        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     456
     457        /* New window gets focused event */
     458        PCUT_ASSERT_TRUE(called_cb);
     459
     460        rc = ds_client_get_event(client, &rwindow, &revent);
     461        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     462
     463        called_cb = false;
     464
     465        PCUT_ASSERT_FALSE(called_cb);
     466
     467        rc = ds_client_get_event(client, &rwindow, &revent);
     468        PCUT_ASSERT_ERRNO_VAL(ENOENT, rc);
    393469
    394470        rect.p0.x = 1;
     
    396472        rect.p1.x = 3;
    397473        rect.p1.y = 4;
    398 
    399         PCUT_ASSERT_FALSE(called_cb);
    400 
    401         rc = ds_client_get_event(client, &rwindow, &revent);
    402         PCUT_ASSERT_ERRNO_VAL(ENOENT, rc);
    403474
    404475        rc = ds_client_post_resize_event(client, wnd, &rect);
     
    419490
    420491        ds_window_destroy(wnd);
     492        ds_seat_destroy(seat);
    421493        ds_client_destroy(client);
    422494        ds_display_destroy(disp);
     
    428500        ds_display_t *disp;
    429501        ds_client_t *client;
     502        ds_seat_t *seat;
    430503        ds_window_t *wnd;
    431504        display_wnd_params_t params;
     
    441514        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    442515
    443         display_wnd_params_init(&params);
    444         params.rect.p0.x = params.rect.p0.y = 0;
    445         params.rect.p1.x = params.rect.p1.y = 1;
    446 
    447         rc = ds_window_create(client, &params, &wnd);
    448         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    449 
    450         PCUT_ASSERT_FALSE(called_cb);
     516        rc = ds_seat_create(disp, &seat);
     517        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     518
     519        display_wnd_params_init(&params);
     520        params.rect.p0.x = params.rect.p0.y = 0;
     521        params.rect.p1.x = params.rect.p1.y = 1;
     522
     523        rc = ds_window_create(client, &params, &wnd);
     524        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     525
     526        /* New window gets focused event */
     527        PCUT_ASSERT_TRUE(called_cb);
     528
     529        rc = ds_client_get_event(client, &rwindow, &revent);
     530        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     531
     532        called_cb = false;
    451533
    452534        rc = ds_client_get_event(client, &rwindow, &revent);
     
    466548
    467549        ds_window_destroy(wnd);
     550        ds_seat_destroy(seat);
    468551        ds_client_destroy(client);
    469552        ds_display_destroy(disp);
     
    479562        ds_display_t *disp;
    480563        ds_client_t *client;
     564        ds_seat_t *seat;
    481565        ds_window_t *wnd;
    482566        display_wnd_params_t params;
     
    489573        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    490574
    491         display_wnd_params_init(&params);
    492         params.rect.p0.x = params.rect.p0.y = 0;
    493         params.rect.p1.x = params.rect.p1.y = 1;
    494 
    495         rc = ds_window_create(client, &params, &wnd);
    496         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    497 
     575        rc = ds_seat_create(disp, &seat);
     576        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     577
     578        display_wnd_params_init(&params);
     579        params.rect.p0.x = params.rect.p0.y = 0;
     580        params.rect.p1.x = params.rect.p1.y = 1;
     581
     582        rc = ds_window_create(client, &params, &wnd);
     583        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     584
     585        ds_seat_destroy(seat);
    498586        ds_client_destroy(client);
    499587        ds_display_destroy(disp);
  • uspace/srv/hid/display/test/display.c

    r6baab83 rb4b4dafe  
    9494        ds_display_t *disp;
    9595        ds_client_t *client;
     96        ds_seat_t *seat;
    9697        ds_window_t *w0;
    9798        ds_window_t *w1;
    9899        ds_window_t *wnd;
    99100        display_wnd_params_t params;
    100         errno_t rc;
    101 
    102         rc = ds_display_create(NULL, df_none, &disp);
    103         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    104 
    105         rc = ds_client_create(disp, &test_ds_client_cb, NULL, &client);
     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);
    106111        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    107112
     
    148153        ds_window_destroy(w0);
    149154        ds_window_destroy(w1);
     155        ds_seat_destroy(seat);
    150156        ds_client_destroy(client);
    151157        ds_display_destroy(disp);
     
    157163        ds_display_t *disp;
    158164        ds_client_t *client;
     165        ds_seat_t *seat;
    159166        ds_window_t *w0;
    160167        ds_window_t *w1;
     
    162169        display_wnd_params_t params;
    163170        gfx_coord2_t pos;
    164         errno_t rc;
    165 
    166         rc = ds_display_create(NULL, df_none, &disp);
    167         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    168 
    169         rc = ds_client_create(disp, &test_ds_client_cb, NULL, &client);
     171        bool called_cb = false;
     172        errno_t rc;
     173
     174        rc = ds_display_create(NULL, df_none, &disp);
     175        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     176
     177        rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
     178        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     179
     180        rc = ds_seat_create(disp, &seat);
    170181        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    171182
     
    198209        ds_window_destroy(w0);
    199210        ds_window_destroy(w1);
     211        ds_seat_destroy(seat);
    200212        ds_client_destroy(client);
    201213        ds_display_destroy(disp);
  • uspace/srv/hid/display/test/seat.c

    r6baab83 rb4b4dafe  
    11/*
    2  * Copyright (c) 2019 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    126126        called_cb = false;
    127127
    128         ds_seat_evac_focus(seat, w1);
     128        ds_seat_evac_wnd_refs(seat, w1);
    129129        PCUT_ASSERT_EQUALS(w0, seat->focus);
    130130        PCUT_ASSERT_TRUE(called_cb);
     
    172172        called_cb = false;
    173173
    174         ds_seat_evac_focus(seat, wnd);
     174        ds_seat_evac_wnd_refs(seat, wnd);
    175175        PCUT_ASSERT_NULL(seat->focus);
    176176        PCUT_ASSERT_TRUE(called_cb);
     177
     178        ds_window_destroy(wnd);
     179        ds_seat_destroy(seat);
     180        ds_client_destroy(client);
     181        ds_display_destroy(disp);
     182}
     183
     184/** Evacuate popup reference from window.
     185 *
     186 * After evacuating no window should be set as the popup
     187 */
     188PCUT_TEST(evac_popup)
     189{
     190        ds_display_t *disp;
     191        ds_client_t *client;
     192        ds_seat_t *seat;
     193        ds_window_t *wnd;
     194        display_wnd_params_t params;
     195        bool called_cb = false;
     196        errno_t rc;
     197
     198        rc = ds_display_create(NULL, df_none, &disp);
     199        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     200
     201        rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
     202        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     203
     204        rc = ds_seat_create(disp, &seat);
     205        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     206
     207        display_wnd_params_init(&params);
     208        params.rect.p0.x = params.rect.p0.y = 0;
     209        params.rect.p1.x = params.rect.p1.y = 1;
     210        params.flags |= wndf_popup;
     211
     212        rc = ds_window_create(client, &params, &wnd);
     213        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     214
     215        PCUT_ASSERT_EQUALS(wnd, seat->popup);
     216
     217        ds_seat_evac_wnd_refs(seat, wnd);
     218        PCUT_ASSERT_NULL(seat->popup);
    177219
    178220        ds_window_destroy(wnd);
     
    436478        w1->dpos.y = 400;
    437479
    438         PCUT_ASSERT_FALSE(called_cb);
     480        /* New window gets focused event */
     481        PCUT_ASSERT_TRUE(called_cb);
     482
     483        called_cb = false;
    439484
    440485        ds_seat_set_focus(seat, w0);
  • uspace/srv/hid/display/test/window.c

    r6baab83 rb4b4dafe  
    104104        ds_display_t *disp;
    105105        ds_client_t *client;
     106        ds_seat_t *seat;
    106107        ds_window_t *wnd;
    107108        display_wnd_params_t params;
     
    113114
    114115        rc = ds_client_create(disp, NULL, NULL, &client);
     116        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     117
     118        rc = ds_seat_create(disp, &seat);
    115119        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    116120
     
    126130
    127131        ds_window_destroy(wnd);
     132        ds_seat_destroy(seat);
    128133        ds_client_destroy(client);
    129134        ds_display_destroy(disp);
     
    136141        ds_display_t *disp;
    137142        ds_client_t *client;
     143        ds_seat_t *seat;
    138144        ds_window_t *wnd;
    139145        ds_window_t *rwindow;
     
    152158        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    153159
     160        rc = ds_seat_create(disp, &seat);
     161        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     162
    154163        display_wnd_params_init(&params);
    155164        params.rect.p0.x = params.rect.p0.y = 0;
     
    157166
    158167        rc = ds_window_create(client, &params, &wnd);
     168        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     169
     170        /* New window gets focused event */
     171        rc = ds_client_get_event(client, &rwindow, &revent);
    159172        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    160173
     
    174187
    175188        ds_window_destroy(wnd);
     189        ds_seat_destroy(seat);
    176190        ds_client_destroy(client);
    177191        ds_display_destroy(disp);
     
    184198        ds_display_t *disp;
    185199        ds_client_t *client;
     200        ds_seat_t *seat;
    186201        ds_window_t *wnd;
    187202        display_wnd_params_t params;
     
    196211
    197212        rc = ds_client_create(disp, NULL, NULL, &client);
     213        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     214
     215        rc = ds_seat_create(disp, &seat);
    198216        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    199217
     
    242260
    243261        ds_window_destroy(wnd);
     262        ds_seat_destroy(seat);
    244263        ds_client_destroy(client);
    245264        ds_display_destroy(disp);
     
    252271        ds_display_t *disp;
    253272        ds_client_t *client;
     273        ds_seat_t *seat;
    254274        ds_window_t *wnd;
    255275        display_wnd_params_t params;
     
    264284
    265285        rc = ds_client_create(disp, NULL, NULL, &client);
     286        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     287
     288        rc = ds_seat_create(disp, &seat);
    266289        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    267290
     
    284307
    285308        ds_window_destroy(wnd);
     309        ds_seat_destroy(seat);
    286310        ds_client_destroy(client);
    287311        ds_display_destroy(disp);
     
    340364        ds_display_t *disp;
    341365        ds_client_t *client;
     366        ds_seat_t *seat;
    342367        ds_window_t *wnd;
    343368        display_wnd_params_t params;
     
    353378
    354379        rc = ds_client_create(disp, NULL, NULL, &client);
     380        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     381
     382        rc = ds_seat_create(disp, &seat);
    355383        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    356384
     
    597625
    598626        ds_window_destroy(wnd);
     627        ds_seat_destroy(seat);
    599628        ds_client_destroy(client);
    600629        ds_display_destroy(disp);
     
    607636        ds_display_t *disp;
    608637        ds_client_t *client;
     638        ds_seat_t *seat;
    609639        ds_window_t *wnd;
    610640        display_wnd_params_t params;
     
    618648
    619649        rc = ds_client_create(disp, NULL, NULL, &client);
     650        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     651
     652        rc = ds_seat_create(disp, &seat);
    620653        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    621654
     
    646679
    647680        ds_window_destroy(wnd);
     681        ds_seat_destroy(seat);
    648682        ds_client_destroy(client);
    649683        ds_display_destroy(disp);
  • uspace/srv/hid/display/types/display/seat.h

    r6baab83 rb4b4dafe  
    11/*
    2  * Copyright (c) 2019 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4848        /** Window this seat is focused on */
    4949        struct ds_window *focus;
     50        /** This seat's popup window */
     51        struct ds_window *popup;
    5052        /** Cursor selected by client */
    5153        struct ds_cursor *client_cursor;
  • uspace/srv/hid/display/types/display/window.h

    r6baab83 rb4b4dafe  
    11/*
    2  * Copyright (c) 2019 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3939#include <adt/list.h>
    4040#include <display/event.h>
     41#include <display/wndparams.h>
    4142#include <display/wndresize.h>
    4243#include <gfx/context.h>
     
    9293        /** Cursor set by client */
    9394        struct ds_cursor *cursor;
    94 
     95        /** Window flags */
     96        display_wnd_flags_t flags;
    9597        /** State */
    9698        ds_window_state_t state;
  • uspace/srv/hid/display/window.c

    r6baab83 rb4b4dafe  
    6767{
    6868        ds_window_t *wnd = NULL;
     69        ds_seat_t *seat;
    6970        gfx_context_t *dgc;
    7071        gfx_coord2_t dims;
     
    116117        wnd->gc = mem_gc_get_ctx(wnd->mgc);
    117118        wnd->cursor = wnd->display->cursor[dcurs_arrow];
     119        wnd->flags = params->flags;
     120
     121        wnd->dpos.x = ((wnd->id - 1) & 1) * 400;
     122        wnd->dpos.y = ((wnd->id - 1) & 2) / 2 * 300;
     123
     124        seat = ds_display_first_seat(client->display);
     125
     126        if ((params->flags & wndf_popup) != 0)
     127                ds_seat_set_popup(seat, wnd);
     128        else
     129                ds_seat_set_focus(seat, wnd);
     130
     131        (void) ds_display_paint(wnd->display, NULL);
     132
    118133        *rgc = wnd;
    119134        return EOK;
Note: See TracChangeset for help on using the changeset viewer.