Changeset 1af103e in mainline for uspace/lib/ui/src/window.c


Ignore:
Timestamp:
2023-09-13T17:29:07Z (9 months ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
61643c8
Parents:
46bd63c9
Message:

System menu (WIP)

The system menu provides browsable, keyboard-accessible access to window
management functions (such as closing, minimizing, maximizing, resizing,
moving).

File:
1 edited

Legend:

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

    r46bd63c9 r1af103e  
    4747#include <stdlib.h>
    4848#include <ui/control.h>
     49#include <ui/menu.h>
     50#include <ui/menuentry.h>
    4951#include <ui/resource.h>
    5052#include <ui/ui.h>
     
    7476};
    7577
     78static void wd_sysmenu(ui_wdecor_t *, void *, sysarg_t);
    7679static void wd_minimize(ui_wdecor_t *, void *);
    7780static void wd_maximize(ui_wdecor_t *, void *);
     
    8487
    8588static ui_wdecor_cb_t wdecor_cb = {
     89        .sysmenu = wd_sysmenu,
    8690        .minimize = wd_minimize,
    8791        .maximize = wd_maximize,
     
    9296        .set_cursor = wd_set_cursor
    9397};
     98
     99static void wnd_sysmenu_left(ui_menu_t *, void *, sysarg_t);
     100static void wnd_sysmenu_right(ui_menu_t *, void *, sysarg_t);
     101static void wnd_sysmenu_close_req(ui_menu_t *, void *);
     102static void wnd_sysmenu_press_accel(ui_menu_t *, void *, char32_t, sysarg_t);
     103
     104static ui_menu_cb_t wnd_sysmenu_cb = {
     105        .left = wnd_sysmenu_left,
     106        .right = wnd_sysmenu_right,
     107        .close_req = wnd_sysmenu_close_req,
     108        .press_accel = wnd_sysmenu_press_accel
     109};
     110
     111static void wnd_sysmenu_eclose(ui_menu_entry_t *, void *);
    94112
    95113static void ui_window_invalidate(void *, gfx_rect_t *);
     
    417435        list_remove(&window->lwindows);
    418436        ui_control_destroy(window->control);
     437        ui_menu_destroy(window->sysmenu);
    419438        ui_wdecor_destroy(window->wdecor);
    420439        ui_resource_destroy(window->res);
     
    929948}
    930949
     950/** Window decoration requested opening of system menu.
     951 *
     952 * @param wdecor Window decoration
     953 * @param arg Argument (window)
     954 * @param idev_id Input device ID
     955 */
     956static void wd_sysmenu(ui_wdecor_t *wdecor, void *arg, sysarg_t idev_id)
     957{
     958        ui_window_t *window = (ui_window_t *) arg;
     959
     960        ui_window_send_sysmenu(window, idev_id);
     961}
     962
    931963/** Window decoration requested window minimization.
    932964 *
     
    10701102}
    10711103
     1104/** Send window sysmenu event.
     1105 *
     1106 * @param window Window
     1107 * @parma idev_id Input device ID
     1108 */
     1109void ui_window_send_sysmenu(ui_window_t *window, sysarg_t idev_id)
     1110{
     1111        if (window->cb != NULL && window->cb->sysmenu != NULL)
     1112                window->cb->sysmenu(window, window->arg, idev_id);
     1113        else
     1114                ui_window_def_sysmenu(window, idev_id);
     1115}
     1116
    10721117/** Send window minimize event.
    10731118 *
     
    11741219        else
    11751220                return ui_window_def_unfocus(window, nfocus);
     1221}
     1222
     1223/** Default window sysmenu routine.
     1224 *
     1225 * @param window Window
     1226 * @param idev_id Input device ID
     1227 * @return EOK on success or an error code
     1228 */
     1229errno_t ui_window_def_sysmenu(ui_window_t *window, sysarg_t idev_id)
     1230{
     1231        errno_t rc;
     1232        ui_menu_entry_t *mclose;
     1233        ui_wdecor_geom_t geom;
     1234
     1235        if (window->sysmenu == NULL) {
     1236                rc = ui_menu_create(window, &window->sysmenu);
     1237                if (rc != EOK)
     1238                        goto error;
     1239
     1240                ui_menu_set_cb(window->sysmenu, &wnd_sysmenu_cb,
     1241                    (void *)window);
     1242
     1243                rc = ui_menu_entry_create(window->sysmenu, "~C~lose", "Alt-F4",
     1244                    &mclose);
     1245                if (rc != EOK)
     1246                        goto error;
     1247
     1248                ui_menu_entry_set_cb(mclose, wnd_sysmenu_eclose,
     1249                    (void *)window);
     1250        }
     1251
     1252        if (ui_menu_is_open(window->sysmenu)) {
     1253                ui_menu_close(window->sysmenu);
     1254        } else {
     1255                ui_wdecor_get_geom(window->wdecor, &geom);
     1256
     1257                rc = ui_menu_open(window->sysmenu, &geom.title_bar_rect,
     1258                    idev_id);
     1259                if (rc != EOK)
     1260                        goto error;
     1261        }
     1262
     1263        return EOK;
     1264error:
     1265        return rc;
    11761266}
    11771267
     
    12601350ui_evclaim_t ui_window_def_kbd(ui_window_t *window, kbd_event_t *kbd)
    12611351{
     1352        ui_evclaim_t claim;
     1353
    12621354        if (window->control != NULL)
    1263                 return ui_control_kbd_event(window->control, kbd);
     1355                claim = ui_control_kbd_event(window->control, kbd);
     1356        else
     1357                claim = ui_unclaimed;
     1358
     1359        if (claim == ui_unclaimed)
     1360                return ui_wdecor_kbd_event(window->wdecor, kbd);
    12641361
    12651362        return ui_unclaimed;
     
    13161413        if (window->control != NULL)
    13171414                ui_control_unfocus(window->control, nfocus);
     1415}
     1416
     1417/** Handle system menu left event.
     1418 *
     1419 * @param sysmenu System menu
     1420 * @param arg Argument (ui_window_t *)
     1421 * @param idev_id Input device ID
     1422 */
     1423static void wnd_sysmenu_left(ui_menu_t *sysmenu, void *arg, sysarg_t idev_id)
     1424{
     1425        (void)sysmenu;
     1426        (void)arg;
     1427        (void)idev_id;
     1428}
     1429
     1430/** Handle system menu right event.
     1431 *
     1432 * @param sysmenu System menu
     1433 * @param arg Argument (ui_window_t *)
     1434 * @param idev_id Input device ID
     1435 */
     1436static void wnd_sysmenu_right(ui_menu_t *sysmenu, void *arg, sysarg_t idev_id)
     1437{
     1438        (void)sysmenu;
     1439        (void)arg;
     1440        (void)idev_id;
     1441}
     1442
     1443/** Handle system menu close request event.
     1444 *
     1445 * @param sysmenu System menu
     1446 * @param arg Argument (ui_window_t *)
     1447 * @param idev_id Input device ID
     1448 */
     1449static void wnd_sysmenu_close_req(ui_menu_t *sysmenu, void *arg)
     1450{
     1451        (void)arg;
     1452
     1453        ui_menu_close(sysmenu);
     1454}
     1455
     1456/** Handle system menu Close entry activation.
     1457 *
     1458 * @param mentry Menu entry
     1459 * @param arg Argument (ui_window_t *)
     1460 */
     1461static void wnd_sysmenu_eclose(ui_menu_entry_t *mentry, void *arg)
     1462{
     1463        ui_window_t *window = (ui_window_t *)arg;
     1464
     1465        ui_window_send_close(window);
     1466}
     1467
     1468/** Handle system menu press accelerator key event.
     1469 *
     1470 * @param sysmenu System menu
     1471 * @param arg Argument (ui_window_t *)
     1472 * @param idev_id Input device ID
     1473 */
     1474static void wnd_sysmenu_press_accel(ui_menu_t *sysmenu, void *arg,
     1475    char32_t c, sysarg_t idev_id)
     1476{
     1477        (void)sysmenu;
     1478        (void)arg;
     1479        (void)c;
     1480        (void)idev_id;
    13181481}
    13191482
Note: See TracChangeset for help on using the changeset viewer.