Changeset 5d380b6 in mainline for uspace/lib/ui/src


Ignore:
Timestamp:
2023-01-20T11:50:41Z (3 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b1f0a14
Parents:
6828a56
git-author:
Jiri Svoboda <jiri@…> (2023-01-20 19:50:21)
git-committer:
Jiri Svoboda <jiri@…> (2023-01-20 11:50:41)
Message:

Create menu windows in the correct seat

Add a mechanism to set the seat of a new display window, UI window,
UI popup - input device ID. This is set to the ID of the device which
activated the menu (mouse, keyboard). The display server determines
the correct seat from there.

This makes sure clicking outside closes the correct pop-up window.

Location:
uspace/lib/ui/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ui/src/menu.c

    r6828a56 r5d380b6  
    11/*
    2  * Copyright (c) 2022 Jiri Svoboda
     2 * Copyright (c) 2023 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    280280 * @param menu Menu
    281281 * @param prect Parent rectangle around which the menu should be placed
    282  */
    283 errno_t ui_menu_open(ui_menu_t *menu, gfx_rect_t *prect)
     282 * @param idev_id Input device associated with the menu's seat
     283 */
     284errno_t ui_menu_open(ui_menu_t *menu, gfx_rect_t *prect, sysarg_t idev_id)
    284285{
    285286        ui_popup_t *popup = NULL;
     
    301302        params.rect = geom.outer_rect;
    302303        params.place = *prect;
     304        params.idev_id = idev_id;
    303305
    304306        rc = ui_popup_create(menu->mbar->ui, menu->mbar->window, &params,
     
    522524        if (event->type == KEY_PRESS && (event->mods & KM_ALT) != 0 &&
    523525            (event->mods & (KM_CTRL | KM_SHIFT)) == 0 && event->c != '\0')
    524                 ui_menu_bar_press_accel(menu->mbar, event->c);
     526                ui_menu_bar_press_accel(menu->mbar, event->c, event->kbd_id);
    525527
    526528        return ui_claimed;
     
    616618                break;
    617619        case KC_LEFT:
    618                 ui_menu_bar_left(menu->mbar);
     620                ui_menu_bar_left(menu->mbar, event->kbd_id);
    619621                break;
    620622        case KC_RIGHT:
    621                 ui_menu_bar_right(menu->mbar);
     623                ui_menu_bar_right(menu->mbar, event->kbd_id);
    622624                break;
    623625        case KC_UP:
  • uspace/lib/ui/src/menubar.c

    r6828a56 r5d380b6  
    11/*
    2  * Copyright (c) 2022 Jiri Svoboda
     2 * Copyright (c) 2023 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    243243 * @param menu Menu to select (or deselect if selected) or @c NULL
    244244 * @param openup Open menu even if not currently open
    245  */
    246 void ui_menu_bar_select(ui_menu_bar_t *mbar, ui_menu_t *menu, bool openup)
     245 * @param idev_id Input device ID associated with the selecting seat
     246 */
     247void ui_menu_bar_select(ui_menu_bar_t *mbar, ui_menu_t *menu, bool openup,
     248    sysarg_t idev_id)
    247249{
    248250        ui_menu_t *old_menu;
     
    272274                         * specified.
    273275                         */
    274                         (void) ui_menu_open(mbar->selected, &rect);
     276                        (void) ui_menu_open(mbar->selected, &rect, idev_id);
    275277                }
    276278        }
     
    283285 *
    284286 * @param mbar Menu bar
    285  */
    286 void ui_menu_bar_left(ui_menu_bar_t *mbar)
     287 * @param idev_id Input device ID
     288 */
     289void ui_menu_bar_left(ui_menu_bar_t *mbar, sysarg_t idev_id)
    287290{
    288291        ui_menu_t *nmenu;
     
    296299
    297300        if (nmenu != mbar->selected)
    298                 ui_menu_bar_select(mbar, nmenu, false);
     301                ui_menu_bar_select(mbar, nmenu, false, idev_id);
    299302}
    300303
     
    305308 *
    306309 * @param mbar Menu bar
    307  */
    308 void ui_menu_bar_right(ui_menu_bar_t *mbar)
     310 * @param idev_id Input device ID
     311 */
     312void ui_menu_bar_right(ui_menu_bar_t *mbar, sysarg_t idev_id)
    309313{
    310314        ui_menu_t *nmenu;
     
    318322
    319323        if (nmenu != mbar->selected)
    320                 ui_menu_bar_select(mbar, nmenu, false);
     324                ui_menu_bar_select(mbar, nmenu, false, idev_id);
    321325}
    322326
     
    345349
    346350        if (event->key == KC_LEFT)
    347                 ui_menu_bar_left(mbar);
     351                ui_menu_bar_left(mbar, event->kbd_id);
    348352
    349353        if (event->key == KC_RIGHT)
    350                 ui_menu_bar_right(mbar);
     354                ui_menu_bar_right(mbar, event->kbd_id);
    351355
    352356        if (event->key == KC_ENTER || event->key == KC_DOWN) {
     
    354358                        ui_menu_bar_entry_rect(mbar, mbar->selected,
    355359                            &rect);
    356                         ui_menu_open(mbar->selected, &rect);
     360                        ui_menu_open(mbar->selected, &rect, event->kbd_id);
    357361                }
    358362
     
    362366        if (event->c != '\0' && !ui_menu_is_open(mbar->selected)) {
    363367                /* Check if it is an accelerator. */
    364                 ui_menu_bar_press_accel(mbar, event->c);
     368                ui_menu_bar_press_accel(mbar, event->c, event->kbd_id);
    365369        }
    366370
     
    379383            (event->mods & (KM_CTRL | KM_SHIFT)) == 0 && event->c != '\0') {
    380384                /* Check if it is an accelerator. */
    381                 ui_menu_bar_press_accel(mbar, event->c);
     385                ui_menu_bar_press_accel(mbar, event->c, event->kbd_id);
    382386        }
    383387
     
    399403 * @param mbar Menu bar
    400404 * @param c Character
    401  */
    402 void ui_menu_bar_press_accel(ui_menu_bar_t *mbar, char32_t c)
     405 * @param kbd_id Keyboard ID
     406 */
     407void ui_menu_bar_press_accel(ui_menu_bar_t *mbar, char32_t c, sysarg_t kbd_id)
    403408{
    404409        ui_menu_t *menu;
     
    409414                maccel = ui_menu_get_accel(menu);
    410415                if (c == maccel) {
    411                         ui_menu_bar_select(mbar, menu, true);
     416                        ui_menu_bar_select(mbar, menu, true, kbd_id);
    412417                        return;
    413418                }
     
    433438        gfx_coord_t hpad;
    434439        gfx_coord2_t ppos;
     440        sysarg_t pos_id;
    435441
    436442        res = ui_window_get_res(mbar->window);
     
    446452
    447453        pos = mbar->rect.p0;
     454        pos_id = event->pos_id;
    448455
    449456        menu = ui_menu_first(mbar);
     
    463470                        /* Open the menu, close if already open. */
    464471                        if (menu == mbar->selected)
    465                                 ui_menu_bar_select(mbar, NULL, false);
     472                                ui_menu_bar_select(mbar, NULL, false, pos_id);
    466473                        else
    467                                 ui_menu_bar_select(mbar, menu, true);
     474                                ui_menu_bar_select(mbar, menu, true, pos_id);
    468475
    469476                        return ui_claimed;
     
    544551void ui_menu_bar_deactivate(ui_menu_bar_t *mbar)
    545552{
    546         ui_menu_bar_select(mbar, NULL, false);
     553        ui_menu_bar_select(mbar, NULL, false, 0);
    547554        mbar->active = false;
    548555}
  • uspace/lib/ui/src/popup.c

    r6828a56 r5d380b6  
    11/*
    2  * Copyright (c) 2022 Jiri Svoboda
     2 * Copyright (c) 2023 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    9999        wparams.placement = ui_wnd_place_popup;
    100100        wparams.flags |= ui_wndf_popup;
     101        wparams.idev_id = params->idev_id;
    101102
    102103        /* Compute position of parent rectangle relative to the screen */
  • uspace/lib/ui/src/window.c

    r6828a56 r5d380b6  
    227227        /* Only allow making the window larger */
    228228        gfx_rect_dims(&params->rect, &dparams.min_size);
     229        dparams.idev_id = params->idev_id;
    229230
    230231        if ((params->flags & ui_wndf_popup) != 0)
Note: See TracChangeset for help on using the changeset viewer.