Changeset 5d380b6 in mainline for uspace/lib/ui/src/menubar.c


Ignore:
Timestamp:
2023-01-20T11:50:41Z (15 months 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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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}
Note: See TracChangeset for help on using the changeset viewer.