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


Ignore:
Timestamp:
2023-12-28T13:59:23Z (19 months ago)
Author:
GitHub <noreply@…>
Children:
6b66de6b
Parents:
42c2e65 (diff), f87ff8e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
git-author:
boba-buba <120932204+boba-buba@…> (2023-12-28 13:59:23)
git-committer:
GitHub <noreply@…> (2023-12-28 13:59:23)
Message:

Merge branch 'master' into topic/packet-capture

File:
1 edited

Legend:

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

    r42c2e65 rdc5c303  
    4747#include <stdlib.h>
    4848#include <ui/control.h>
     49#include <ui/menubar.h>
     50#include <ui/menu.h>
     51#include <ui/menuentry.h>
    4952#include <ui/resource.h>
    5053#include <ui/ui.h>
     
    7477};
    7578
     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);
    7683static void wd_minimize(ui_wdecor_t *, void *);
    7784static void wd_maximize(ui_wdecor_t *, void *);
     
    8491
    8592static ui_wdecor_cb_t wdecor_cb = {
     93        .sysmenu_open = wd_sysmenu_open,
     94        .sysmenu_left = wd_sysmenu_left,
     95        .sysmenu_right = wd_sysmenu_right,
     96        .sysmenu_accel = wd_sysmenu_accel,
    8697        .minimize = wd_minimize,
    8798        .maximize = wd_maximize,
     
    93104};
    94105
     106static void wnd_sysmenu_left(ui_menu_t *, void *, sysarg_t);
     107static void wnd_sysmenu_right(ui_menu_t *, void *, sysarg_t);
     108static void wnd_sysmenu_close_req(ui_menu_t *, void *);
     109static void wnd_sysmenu_press_accel(ui_menu_t *, void *, char32_t, sysarg_t);
     110
     111static ui_menu_cb_t wnd_sysmenu_cb = {
     112        .left = wnd_sysmenu_left,
     113        .right = wnd_sysmenu_right,
     114        .close_req = wnd_sysmenu_close_req,
     115        .press_accel = wnd_sysmenu_press_accel
     116};
     117
     118static void wnd_sysmenu_erestore(ui_menu_entry_t *, void *);
     119static void wnd_sysmenu_eminimize(ui_menu_entry_t *, void *);
     120static void wnd_sysmenu_emaximize(ui_menu_entry_t *, void *);
     121static void wnd_sysmenu_eclose(ui_menu_entry_t *, void *);
     122
    95123static void ui_window_invalidate(void *, gfx_rect_t *);
    96124static void ui_window_update(void *);
     
    150178{
    151179        gfx_coord2_t dims;
     180        gfx_coord2_t below_pos;
     181        gfx_rect_t below_rect;
    152182
    153183        assert(params->placement != ui_wnd_place_default ||
     
    183213                break;
    184214        case ui_wnd_place_popup:
    185                 /* Place popup window below parent rectangle */
    186                 pos->x = params->prect.p0.x;
    187                 pos->y = params->prect.p1.y;
     215                /* Compute rectangle when placed below */
     216                below_pos.x = params->prect.p0.x;
     217                below_pos.y = params->prect.p1.y;
     218                gfx_rect_translate(&below_pos, &params->rect, &below_rect);
     219
     220                /* Does below_rect fit within the display? */
     221                if (gfx_rect_is_inside(&below_rect, drect)) {
     222                        /* Place popup window below parent rectangle */
     223                        pos->x = params->prect.p0.x - params->rect.p0.x;
     224                        pos->y = params->prect.p1.y - params->rect.p0.y;
     225                } else {
     226                        /* Place popup window above parent rectangle */
     227                        pos->x = params->prect.p0.x;
     228                        pos->y = params->prect.p0.y -
     229                            (params->rect.p1.y - params->rect.p0.y);
     230                }
    188231                break;
    189232        }
     233}
     234
     235/** Create window's system menu.
     236 *
     237 * @param window Window
     238 * @return EOK on success or an error code
     239 */
     240static errno_t ui_window_sysmenu_create(ui_window_t *window)
     241{
     242        errno_t rc;
     243        ui_menu_entry_t *mrestore;
     244        ui_menu_entry_t *mmin;
     245        ui_menu_entry_t *mmax;
     246        ui_menu_entry_t *msep;
     247        ui_menu_entry_t *mclose;
     248
     249        rc = ui_menu_create(window, &window->sysmenu);
     250        if (rc != EOK)
     251                goto error;
     252
     253        ui_menu_set_cb(window->sysmenu, &wnd_sysmenu_cb, (void *)window);
     254
     255        rc = ui_menu_entry_create(window->sysmenu, "~R~estore",
     256            "", &mrestore);
     257        if (rc != EOK)
     258                goto error;
     259
     260        if (!window->wdecor->maximized)
     261                ui_menu_entry_set_disabled(mrestore, true);
     262
     263        ui_menu_entry_set_cb(mrestore, wnd_sysmenu_erestore, (void *)window);
     264
     265        rc = ui_menu_entry_create(window->sysmenu, "Mi~n~imize",
     266            "", &mmin);
     267        if (rc != EOK)
     268                goto error;
     269
     270        if ((window->wdecor->style & ui_wds_minimize_btn) == 0)
     271                ui_menu_entry_set_disabled(mmin, true);
     272
     273        ui_menu_entry_set_cb(mmin, wnd_sysmenu_eminimize, (void *)window);
     274
     275        rc = ui_menu_entry_create(window->sysmenu, "Ma~x~imize",
     276            "", &mmax);
     277        if (rc != EOK)
     278                goto error;
     279
     280        if ((window->wdecor->style & ui_wds_maximize_btn) == 0 ||
     281            window->wdecor->maximized)
     282                ui_menu_entry_set_disabled(mmax, true);
     283
     284        ui_menu_entry_set_cb(mmax, wnd_sysmenu_emaximize, (void *)window);
     285
     286        rc = ui_menu_entry_sep_create(window->sysmenu, &msep);
     287        if (rc != EOK)
     288                goto error;
     289
     290        rc = ui_menu_entry_create(window->sysmenu, "~C~lose", "Alt-F4",
     291            &mclose);
     292        if (rc != EOK)
     293                goto error;
     294
     295        if ((window->wdecor->style & ui_wds_close_btn) == 0)
     296                ui_menu_entry_set_disabled(mclose, true);
     297
     298        ui_menu_entry_set_cb(mclose, wnd_sysmenu_eclose, (void *)window);
     299
     300        window->sysmenu_restore = mrestore;
     301        window->sysmenu_minimize = mmin;
     302        window->sysmenu_maximize = mmax;
     303
     304        return EOK;
     305error:
     306        return rc;
    190307}
    191308
     
    381498        window->cursor = ui_curs_arrow;
    382499        window->placement = params->placement;
     500
     501        rc = ui_window_sysmenu_create(window);
     502        if (rc != EOK)
     503                goto error;
     504
    383505        *rwindow = window;
    384506
     
    417539        list_remove(&window->lwindows);
    418540        ui_control_destroy(window->control);
     541        ui_menu_destroy(window->sysmenu);
    419542        ui_wdecor_destroy(window->wdecor);
    420543        ui_resource_destroy(window->res);
     
    9291052}
    9301053
     1054/** Window decoration requested opening of system menu.
     1055 *
     1056 * @param wdecor Window decoration
     1057 * @param arg Argument (window)
     1058 * @param idev_id Input device ID
     1059 */
     1060static void wd_sysmenu_open(ui_wdecor_t *wdecor, void *arg, sysarg_t idev_id)
     1061{
     1062        ui_window_t *window = (ui_window_t *) arg;
     1063
     1064        ui_window_send_sysmenu(window, idev_id);
     1065}
     1066
     1067/** Window decoration requested moving left from system menu handle.
     1068 *
     1069 * @param wdecor Window decoration
     1070 * @param arg Argument (window)
     1071 * @param idev_id Input device ID
     1072 */
     1073static void wd_sysmenu_left(ui_wdecor_t *wdecor, void *arg, sysarg_t idev_id)
     1074{
     1075        ui_window_t *window = (ui_window_t *) arg;
     1076
     1077        if (window->mbar != NULL) {
     1078                ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
     1079                ui_menu_close(window->sysmenu);
     1080                ui_menu_bar_select_last(window->mbar, false, idev_id);
     1081        }
     1082}
     1083
     1084/** Window decoration requested moving right from system menu handle.
     1085 *
     1086 * @param wdecor Window decoration
     1087 * @param arg Argument (window)
     1088 * @param idev_id Input device ID
     1089 */
     1090static void wd_sysmenu_right(ui_wdecor_t *wdecor, void *arg, sysarg_t idev_id)
     1091{
     1092        ui_window_t *window = (ui_window_t *) arg;
     1093
     1094        if (window->mbar != NULL) {
     1095                ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
     1096                ui_menu_close(window->sysmenu);
     1097                ui_menu_bar_select_first(window->mbar, false, idev_id);
     1098        }
     1099}
     1100
     1101/** Window decoration detected accelerator press from system menu handle.
     1102 *
     1103 * @param wdecor Window decoration
     1104 * @param arg Argument (window)
     1105 * @param c Accelerator key
     1106 * @param idev_id Input device ID
     1107 */
     1108static void wd_sysmenu_accel(ui_wdecor_t *wdecor, void *arg, char32_t c,
     1109    sysarg_t idev_id)
     1110{
     1111        ui_window_t *window = (ui_window_t *) arg;
     1112
     1113        if (window->mbar != NULL) {
     1114                ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
     1115                ui_menu_close(window->sysmenu);
     1116                ui_menu_bar_press_accel(window->mbar, c, idev_id);
     1117        }
     1118}
     1119
    9311120/** Window decoration requested window minimization.
    9321121 *
     
    10071196
    10081197        if (window->dwindow != NULL) {
    1009                 (void) display_window_resize_req(window->dwindow, rsztype,
     1198                (void) display_window_resize_req(window->dwindow,
     1199                    (display_wnd_rsztype_t) rsztype, // Same constants in the enums
    10101200                    pos, pos_id);
    10111201        }
     
    10701260}
    10711261
     1262/** Send window sysmenu event.
     1263 *
     1264 * @param window Window
     1265 * @parma idev_id Input device ID
     1266 */
     1267void ui_window_send_sysmenu(ui_window_t *window, sysarg_t idev_id)
     1268{
     1269        if (window->cb != NULL && window->cb->sysmenu != NULL)
     1270                window->cb->sysmenu(window, window->arg, idev_id);
     1271        else
     1272                ui_window_def_sysmenu(window, idev_id);
     1273}
     1274
    10721275/** Send window minimize event.
    10731276 *
     
    11741377        else
    11751378                return ui_window_def_unfocus(window, nfocus);
     1379}
     1380
     1381/** Default window sysmenu routine.
     1382 *
     1383 * @param window Window
     1384 * @param idev_id Input device ID
     1385 * @return EOK on success or an error code
     1386 */
     1387errno_t ui_window_def_sysmenu(ui_window_t *window, sysarg_t idev_id)
     1388{
     1389        errno_t rc;
     1390        ui_wdecor_geom_t geom;
     1391
     1392        if (ui_menu_is_open(window->sysmenu)) {
     1393                ui_menu_close(window->sysmenu);
     1394        } else {
     1395                ui_wdecor_get_geom(window->wdecor, &geom);
     1396
     1397                rc = ui_menu_open(window->sysmenu, &geom.title_bar_rect,
     1398                    idev_id);
     1399                if (rc != EOK)
     1400                        goto error;
     1401        }
     1402
     1403        return EOK;
     1404error:
     1405        return rc;
    11761406}
    11771407
     
    12181448
    12191449        ui_wdecor_set_maximized(window->wdecor, true);
     1450        ui_menu_entry_set_disabled(window->sysmenu_restore, false);
     1451        ui_menu_entry_set_disabled(window->sysmenu_maximize, true);
    12201452
    12211453        rc = ui_window_size_change(window, &rect, ui_wsc_maximize);
     
    12401472
    12411473        ui_wdecor_set_maximized(window->wdecor, false);
     1474        ui_menu_entry_set_disabled(window->sysmenu_restore, true);
     1475        ui_menu_entry_set_disabled(window->sysmenu_maximize, false);
    12421476
    12431477        rc = ui_window_size_change(window, &window->normal_rect,
     
    12601494ui_evclaim_t ui_window_def_kbd(ui_window_t *window, kbd_event_t *kbd)
    12611495{
     1496        ui_evclaim_t claim;
     1497
    12621498        if (window->control != NULL)
    1263                 return ui_control_kbd_event(window->control, kbd);
     1499                claim = ui_control_kbd_event(window->control, kbd);
     1500        else
     1501                claim = ui_unclaimed;
     1502
     1503        if (claim == ui_unclaimed)
     1504                return ui_wdecor_kbd_event(window->wdecor, kbd);
    12641505
    12651506        return ui_unclaimed;
     
    13161557        if (window->control != NULL)
    13171558                ui_control_unfocus(window->control, nfocus);
     1559}
     1560
     1561/** Handle system menu left event.
     1562 *
     1563 * @param sysmenu System menu
     1564 * @param arg Argument (ui_window_t *)
     1565 * @param idev_id Input device ID
     1566 */
     1567static void wnd_sysmenu_left(ui_menu_t *sysmenu, void *arg, sysarg_t idev_id)
     1568{
     1569        ui_window_t *window = (ui_window_t *)arg;
     1570
     1571        if (window->mbar != NULL) {
     1572                ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
     1573                ui_menu_close(sysmenu);
     1574                ui_menu_bar_select_last(window->mbar, true, idev_id);
     1575        }
     1576}
     1577
     1578/** Handle system menu right event.
     1579 *
     1580 * @param sysmenu System menu
     1581 * @param arg Argument (ui_window_t *)
     1582 * @param idev_id Input device ID
     1583 */
     1584static void wnd_sysmenu_right(ui_menu_t *sysmenu, void *arg, sysarg_t idev_id)
     1585{
     1586        ui_window_t *window = (ui_window_t *)arg;
     1587
     1588        if (window->mbar != NULL) {
     1589                ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
     1590                ui_menu_close(sysmenu);
     1591                ui_menu_bar_select_first(window->mbar, true, idev_id);
     1592        }
     1593}
     1594
     1595/** Handle system menu close request event.
     1596 *
     1597 * @param sysmenu System menu
     1598 * @param arg Argument (ui_window_t *)
     1599 * @param idev_id Input device ID
     1600 */
     1601static void wnd_sysmenu_close_req(ui_menu_t *sysmenu, void *arg)
     1602{
     1603        ui_window_t *window = (ui_window_t *)arg;
     1604
     1605        ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
     1606        ui_menu_close(sysmenu);
     1607}
     1608
     1609/** Handle system menu Restore entry activation.
     1610 *
     1611 * @param mentry Menu entry
     1612 * @param arg Argument (ui_window_t *)
     1613 */
     1614static void wnd_sysmenu_erestore(ui_menu_entry_t *mentry, void *arg)
     1615{
     1616        ui_window_t *window = (ui_window_t *)arg;
     1617
     1618        ui_window_send_unmaximize(window);
     1619}
     1620
     1621/** Handle system menu Minimize entry activation.
     1622 *
     1623 * @param mentry Menu entry
     1624 * @param arg Argument (ui_window_t *)
     1625 */
     1626static void wnd_sysmenu_eminimize(ui_menu_entry_t *mentry, void *arg)
     1627{
     1628        ui_window_t *window = (ui_window_t *)arg;
     1629
     1630        ui_window_send_minimize(window);
     1631}
     1632
     1633/** Handle system menu Maximize entry activation.
     1634 *
     1635 * @param mentry Menu entry
     1636 * @param arg Argument (ui_window_t *)
     1637 */
     1638static void wnd_sysmenu_emaximize(ui_menu_entry_t *mentry, void *arg)
     1639{
     1640        ui_window_t *window = (ui_window_t *)arg;
     1641
     1642        ui_window_send_maximize(window);
     1643}
     1644
     1645/** Handle system menu Close entry activation.
     1646 *
     1647 * @param mentry Menu entry
     1648 * @param arg Argument (ui_window_t *)
     1649 */
     1650static void wnd_sysmenu_eclose(ui_menu_entry_t *mentry, void *arg)
     1651{
     1652        ui_window_t *window = (ui_window_t *)arg;
     1653
     1654        ui_window_send_close(window);
     1655}
     1656
     1657/** Handle system menu press accelerator key event.
     1658 *
     1659 * @param sysmenu System menu
     1660 * @param arg Argument (ui_window_t *)
     1661 * @param idev_id Input device ID
     1662 */
     1663static void wnd_sysmenu_press_accel(ui_menu_t *sysmenu, void *arg,
     1664    char32_t c, sysarg_t idev_id)
     1665{
     1666        (void)sysmenu;
     1667        (void)arg;
     1668        (void)c;
     1669        (void)idev_id;
    13181670}
    13191671
Note: See TracChangeset for help on using the changeset viewer.