Changeset 8d1bcd7 in mainline for uspace/lib/ui/src


Ignore:
Timestamp:
2023-09-26T20:26:55Z (22 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.

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

Legend:

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

    red1a948 r8d1bcd7  
    4848#include <ui/menubar.h>
    4949#include <ui/menudd.h>
     50#include <ui/wdecor.h>
    5051#include <ui/window.h>
    5152#include "../private/menubar.h"
    5253#include "../private/resource.h"
     54#include "../private/wdecor.h"
     55#include "../private/window.h"
    5356
    5457enum {
     
    97100        mbar->window = window;
    98101        list_initialize(&mbar->menudds);
     102
     103        if (window->mbar == NULL)
     104                window->mbar = mbar;
     105
    99106        *rmbar = mbar;
    100107        return EOK;
     
    111118        if (mbar == NULL)
    112119                return;
     120
     121        if (mbar->window->mbar == mbar)
     122                mbar->window->mbar = NULL;
    113123
    114124        /* Destroy menu drop-downs */
     
    277287                        (void) ui_menu_dd_open(mbar->selected, &rect, idev_id);
    278288                }
    279         }
     289
     290                mbar->active = true;
     291        } else {
     292                mbar->active = false;
     293        }
     294}
     295
     296void ui_menu_bar_select_first(ui_menu_bar_t *mbar, bool openup,
     297    sysarg_t idev_id)
     298{
     299        ui_menu_dd_t *mdd;
     300
     301        mdd = ui_menu_dd_first(mbar);
     302        ui_menu_bar_select(mbar, mdd, openup, idev_id);
     303}
     304
     305void ui_menu_bar_select_last(ui_menu_bar_t *mbar, bool openup,
     306    sysarg_t idev_id)
     307{
     308        ui_menu_dd_t *mdd;
     309
     310        mdd = ui_menu_dd_last(mbar);
     311        ui_menu_bar_select(mbar, mdd, openup, idev_id);
     312}
     313
     314void ui_menu_bar_select_sysmenu(ui_menu_bar_t *mbar, sysarg_t idev_id)
     315{
     316        bool was_open;
     317
     318        ui_wdecor_sysmenu_hdl_set_active(mbar->window->wdecor, true);
     319        was_open = mbar->selected != NULL &&
     320            ui_menu_dd_is_open(mbar->selected);
     321
     322        if (was_open)
     323                ui_window_send_sysmenu(mbar->window, idev_id);
    280324}
    281325
     
    296340
    297341        nmdd = ui_menu_dd_prev(mbar->selected);
    298         if (nmdd == NULL)
    299                 nmdd = ui_menu_dd_last(mbar);
     342        if (nmdd == NULL) {
     343                if ((mbar->window->wdecor->style & ui_wds_sysmenu_hdl) != 0) {
     344                        ui_menu_bar_select_sysmenu(mbar, idev_id);
     345                } else {
     346                        nmdd = ui_menu_dd_last(mbar);
     347                }
     348        }
    300349
    301350        if (nmdd != mbar->selected)
     
    319368
    320369        nmdd = ui_menu_dd_next(mbar->selected);
    321         if (nmdd == NULL)
    322                 nmdd = ui_menu_dd_first(mbar);
     370        if (nmdd == NULL) {
     371                if ((mbar->window->wdecor->style & ui_wds_sysmenu_hdl) != 0) {
     372                        ui_menu_bar_select_sysmenu(mbar, idev_id);
     373                } else {
     374                        nmdd = ui_menu_dd_first(mbar);
     375                }
     376        }
    323377
    324378        if (nmdd != mbar->selected)
     
    551605}
    552606
     607/** Deactivate menu bar.
     608 *
     609 * @param mbar Menu bar
     610 */
    553611void ui_menu_bar_deactivate(ui_menu_bar_t *mbar)
    554612{
    555613        ui_menu_bar_select(mbar, NULL, false, 0);
    556         mbar->active = false;
    557614}
    558615
  • uspace/lib/ui/src/wdecor.c

    red1a948 r8d1bcd7  
    406406        ui_wdecor_get_geom(wdecor, &geom);
    407407        (void) ui_wdecor_sysmenu_hdl_paint(wdecor, &geom.sysmenu_hdl_rect);
     408        (void) gfx_update(wdecor->res->gc);
    408409}
    409410
     
    540541}
    541542
    542 /** Send decoration sysmenu event.
     543/** Send decoration sysmenu open event.
    543544 *
    544545 * @param wdecor Window decoration
    545546 * @param idev_id Input device ID
    546547 */
    547 void ui_wdecor_sysmenu(ui_wdecor_t *wdecor, sysarg_t idev_id)
    548 {
    549         if (wdecor->cb != NULL && wdecor->cb->sysmenu != NULL)
    550                 wdecor->cb->sysmenu(wdecor, wdecor->arg, idev_id);
     548void ui_wdecor_sysmenu_open(ui_wdecor_t *wdecor, sysarg_t idev_id)
     549{
     550        if (wdecor->cb != NULL && wdecor->cb->sysmenu_open != NULL)
     551                wdecor->cb->sysmenu_open(wdecor, wdecor->arg, idev_id);
     552}
     553
     554/** Send decoration sysmenu left event.
     555 *
     556 * @param wdecor Window decoration
     557 * @param idev_id Input device ID
     558 */
     559void ui_wdecor_sysmenu_left(ui_wdecor_t *wdecor, sysarg_t idev_id)
     560{
     561        if (wdecor->cb != NULL && wdecor->cb->sysmenu_left != NULL)
     562                wdecor->cb->sysmenu_left(wdecor, wdecor->arg, idev_id);
     563}
     564
     565/** Send decoration sysmenu right event.
     566 *
     567 * @param wdecor Window decoration
     568 * @param idev_id Input device ID
     569 */
     570void ui_wdecor_sysmenu_right(ui_wdecor_t *wdecor, sysarg_t idev_id)
     571{
     572        if (wdecor->cb != NULL && wdecor->cb->sysmenu_right != NULL)
     573                wdecor->cb->sysmenu_right(wdecor, wdecor->arg, idev_id);
     574}
     575
     576/** Send decoration sysmenu accelerator event.
     577 *
     578 * @param wdecor Window decoration
     579 * @param c Accelerator character
     580 * @param idev_id Input device ID
     581 */
     582void ui_wdecor_sysmenu_accel(ui_wdecor_t *wdecor, char32_t c, sysarg_t idev_id)
     583{
     584        if (wdecor->cb != NULL && wdecor->cb->sysmenu_right != NULL)
     585                wdecor->cb->sysmenu_accel(wdecor, wdecor->arg, c, idev_id);
    551586}
    552587
     
    9861021ui_evclaim_t ui_wdecor_kbd_event(ui_wdecor_t *wdecor, kbd_event_t *event)
    9871022{
    988         (void)wdecor;
    989 
    9901023        if (event->type == KEY_PRESS && (event->mods & (KM_CTRL | KM_ALT |
    9911024            KM_SHIFT)) == 0) {
    992                 if (event->key == KC_F9) {
     1025                if (event->key == KC_F10) {
    9931026                        ui_wdecor_sysmenu_hdl_set_active(wdecor, true);
    994                         ui_wdecor_sysmenu(wdecor, event->kbd_id);
     1027                        ui_wdecor_sysmenu_open(wdecor, event->kbd_id);
     1028                        return ui_claimed;
     1029                }
     1030        }
     1031
     1032        /* System menu handle events (if active) */
     1033        if (event->type == KEY_PRESS && (event->mods & (KM_CTRL | KM_ALT |
     1034            KM_SHIFT)) == 0 && wdecor->sysmenu_hdl_active) {
     1035                switch (event->key) {
     1036                case KC_ESCAPE:
     1037                        ui_wdecor_sysmenu_hdl_set_active(wdecor, false);
     1038                        return ui_claimed;
     1039                case KC_LEFT:
     1040                        ui_wdecor_sysmenu_left(wdecor, event->kbd_id);
     1041                        return ui_claimed;
     1042                case KC_RIGHT:
     1043                        ui_wdecor_sysmenu_right(wdecor, event->kbd_id);
     1044                        return ui_claimed;
     1045                case KC_DOWN:
     1046                        ui_wdecor_sysmenu_open(wdecor, event->kbd_id);
     1047                        return ui_claimed;
     1048                default:
     1049                        break;
     1050                }
     1051
     1052                if (event->c != '\0') {
     1053                        /* Could be an accelerator key */
     1054                        ui_wdecor_sysmenu_accel(wdecor, event->c,
     1055                            event->kbd_id);
    9951056                }
    9961057        }
     
    10501111                    gfx_pix_inside_rect(&pos, &geom.sysmenu_hdl_rect)) {
    10511112                        ui_wdecor_sysmenu_hdl_set_active(wdecor, true);
    1052                         ui_wdecor_sysmenu(wdecor, event->pos_id);
     1113                        ui_wdecor_sysmenu_open(wdecor, event->pos_id);
    10531114                        return ui_claimed;
    10541115                }
  • uspace/lib/ui/src/window.c

    red1a948 r8d1bcd7  
    4747#include <stdlib.h>
    4848#include <ui/control.h>
     49#include <ui/menubar.h>
    4950#include <ui/menu.h>
    5051#include <ui/menuentry.h>
     
    7677};
    7778
    78 static void wd_sysmenu(ui_wdecor_t *, void *, sysarg_t);
     79static void wd_sysmenu_open(ui_wdecor_t *, void *, sysarg_t);
     80static void wd_sysmenu_left(ui_wdecor_t *, void *, sysarg_t);
     81static void wd_sysmenu_right(ui_wdecor_t *, void *, sysarg_t);
     82static void wd_sysmenu_accel(ui_wdecor_t *, void *, char32_t, sysarg_t);
    7983static void wd_minimize(ui_wdecor_t *, void *);
    8084static void wd_maximize(ui_wdecor_t *, void *);
     
    8791
    8892static ui_wdecor_cb_t wdecor_cb = {
    89         .sysmenu = wd_sysmenu,
     93        .sysmenu_open = wd_sysmenu_open,
     94        .sysmenu_left = wd_sysmenu_left,
     95        .sysmenu_right = wd_sysmenu_right,
     96        .sysmenu_accel = wd_sysmenu_accel,
    9097        .minimize = wd_minimize,
    9198        .maximize = wd_maximize,
     
    10361043 * @param idev_id Input device ID
    10371044 */
    1038 static void wd_sysmenu(ui_wdecor_t *wdecor, void *arg, sysarg_t idev_id)
     1045static void wd_sysmenu_open(ui_wdecor_t *wdecor, void *arg, sysarg_t idev_id)
    10391046{
    10401047        ui_window_t *window = (ui_window_t *) arg;
    10411048
    10421049        ui_window_send_sysmenu(window, idev_id);
     1050}
     1051
     1052/** Window decoration requested moving left from system menu handle.
     1053 *
     1054 * @param wdecor Window decoration
     1055 * @param arg Argument (window)
     1056 * @param idev_id Input device ID
     1057 */
     1058static void wd_sysmenu_left(ui_wdecor_t *wdecor, void *arg, sysarg_t idev_id)
     1059{
     1060        ui_window_t *window = (ui_window_t *) arg;
     1061
     1062        if (window->mbar != NULL) {
     1063                ui_menu_bar_select_last(window->mbar, false, idev_id);
     1064                ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
     1065        }
     1066}
     1067
     1068/** Window decoration requested moving right from system menu handle.
     1069 *
     1070 * @param wdecor Window decoration
     1071 * @param arg Argument (window)
     1072 * @param idev_id Input device ID
     1073 */
     1074static void wd_sysmenu_right(ui_wdecor_t *wdecor, void *arg, sysarg_t idev_id)
     1075{
     1076        ui_window_t *window = (ui_window_t *) arg;
     1077
     1078        if (window->mbar != NULL) {
     1079                ui_menu_bar_select_first(window->mbar, false, idev_id);
     1080                ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
     1081        }
     1082}
     1083
     1084/** Window decoration detected accelerator press from system menu handle.
     1085 *
     1086 * @param wdecor Window decoration
     1087 * @param arg Argument (window)
     1088 * @param c Accelerator key
     1089 * @param idev_id Input device ID
     1090 */
     1091static void wd_sysmenu_accel(ui_wdecor_t *wdecor, void *arg, char32_t c,
     1092    sysarg_t idev_id)
     1093{
     1094        ui_window_t *window = (ui_window_t *) arg;
     1095
     1096        if (window->mbar != NULL) {
     1097                ui_menu_bar_press_accel(window->mbar, c, idev_id);
     1098                ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
     1099        }
    10431100}
    10441101
     
    14911548static void wnd_sysmenu_left(ui_menu_t *sysmenu, void *arg, sysarg_t idev_id)
    14921549{
     1550        ui_window_t *window = (ui_window_t *)arg;
     1551
    14931552        (void)sysmenu;
    1494         (void)arg;
    1495         (void)idev_id;
     1553
     1554        if (window->mbar != NULL)
     1555                ui_menu_bar_select_last(window->mbar, true, idev_id);
    14961556}
    14971557
     
    15041564static void wnd_sysmenu_right(ui_menu_t *sysmenu, void *arg, sysarg_t idev_id)
    15051565{
     1566        ui_window_t *window = (ui_window_t *)arg;
     1567
    15061568        (void)sysmenu;
    1507         (void)arg;
    1508         (void)idev_id;
     1569
     1570        if (window->mbar != NULL)
     1571                ui_menu_bar_select_first(window->mbar, true, idev_id);
    15091572}
    15101573
Note: See TracChangeset for help on using the changeset viewer.