Changeset 8d1bcd7 in mainline for uspace/lib/ui/src
- Timestamp:
- 2023-09-26T20:26:55Z (22 months ago)
- Branches:
- master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5afc1aa
- Parents:
- ed1a948
- Location:
- uspace/lib/ui/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/menubar.c
red1a948 r8d1bcd7 48 48 #include <ui/menubar.h> 49 49 #include <ui/menudd.h> 50 #include <ui/wdecor.h> 50 51 #include <ui/window.h> 51 52 #include "../private/menubar.h" 52 53 #include "../private/resource.h" 54 #include "../private/wdecor.h" 55 #include "../private/window.h" 53 56 54 57 enum { … … 97 100 mbar->window = window; 98 101 list_initialize(&mbar->menudds); 102 103 if (window->mbar == NULL) 104 window->mbar = mbar; 105 99 106 *rmbar = mbar; 100 107 return EOK; … … 111 118 if (mbar == NULL) 112 119 return; 120 121 if (mbar->window->mbar == mbar) 122 mbar->window->mbar = NULL; 113 123 114 124 /* Destroy menu drop-downs */ … … 277 287 (void) ui_menu_dd_open(mbar->selected, &rect, idev_id); 278 288 } 279 } 289 290 mbar->active = true; 291 } else { 292 mbar->active = false; 293 } 294 } 295 296 void 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 305 void 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 314 void 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); 280 324 } 281 325 … … 296 340 297 341 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 } 300 349 301 350 if (nmdd != mbar->selected) … … 319 368 320 369 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 } 323 377 324 378 if (nmdd != mbar->selected) … … 551 605 } 552 606 607 /** Deactivate menu bar. 608 * 609 * @param mbar Menu bar 610 */ 553 611 void ui_menu_bar_deactivate(ui_menu_bar_t *mbar) 554 612 { 555 613 ui_menu_bar_select(mbar, NULL, false, 0); 556 mbar->active = false;557 614 } 558 615 -
uspace/lib/ui/src/wdecor.c
red1a948 r8d1bcd7 406 406 ui_wdecor_get_geom(wdecor, &geom); 407 407 (void) ui_wdecor_sysmenu_hdl_paint(wdecor, &geom.sysmenu_hdl_rect); 408 (void) gfx_update(wdecor->res->gc); 408 409 } 409 410 … … 540 541 } 541 542 542 /** Send decoration sysmenu event.543 /** Send decoration sysmenu open event. 543 544 * 544 545 * @param wdecor Window decoration 545 546 * @param idev_id Input device ID 546 547 */ 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); 548 void 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 */ 559 void 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 */ 570 void 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 */ 582 void 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); 551 586 } 552 587 … … 986 1021 ui_evclaim_t ui_wdecor_kbd_event(ui_wdecor_t *wdecor, kbd_event_t *event) 987 1022 { 988 (void)wdecor;989 990 1023 if (event->type == KEY_PRESS && (event->mods & (KM_CTRL | KM_ALT | 991 1024 KM_SHIFT)) == 0) { 992 if (event->key == KC_F 9) {1025 if (event->key == KC_F10) { 993 1026 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); 995 1056 } 996 1057 } … … 1050 1111 gfx_pix_inside_rect(&pos, &geom.sysmenu_hdl_rect)) { 1051 1112 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); 1053 1114 return ui_claimed; 1054 1115 } -
uspace/lib/ui/src/window.c
red1a948 r8d1bcd7 47 47 #include <stdlib.h> 48 48 #include <ui/control.h> 49 #include <ui/menubar.h> 49 50 #include <ui/menu.h> 50 51 #include <ui/menuentry.h> … … 76 77 }; 77 78 78 static void wd_sysmenu(ui_wdecor_t *, void *, sysarg_t); 79 static void wd_sysmenu_open(ui_wdecor_t *, void *, sysarg_t); 80 static void wd_sysmenu_left(ui_wdecor_t *, void *, sysarg_t); 81 static void wd_sysmenu_right(ui_wdecor_t *, void *, sysarg_t); 82 static void wd_sysmenu_accel(ui_wdecor_t *, void *, char32_t, sysarg_t); 79 83 static void wd_minimize(ui_wdecor_t *, void *); 80 84 static void wd_maximize(ui_wdecor_t *, void *); … … 87 91 88 92 static 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, 90 97 .minimize = wd_minimize, 91 98 .maximize = wd_maximize, … … 1036 1043 * @param idev_id Input device ID 1037 1044 */ 1038 static void wd_sysmenu (ui_wdecor_t *wdecor, void *arg, sysarg_t idev_id)1045 static void wd_sysmenu_open(ui_wdecor_t *wdecor, void *arg, sysarg_t idev_id) 1039 1046 { 1040 1047 ui_window_t *window = (ui_window_t *) arg; 1041 1048 1042 1049 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 */ 1058 static 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 */ 1074 static 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 */ 1091 static 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 } 1043 1100 } 1044 1101 … … 1491 1548 static void wnd_sysmenu_left(ui_menu_t *sysmenu, void *arg, sysarg_t idev_id) 1492 1549 { 1550 ui_window_t *window = (ui_window_t *)arg; 1551 1493 1552 (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); 1496 1556 } 1497 1557 … … 1504 1564 static void wnd_sysmenu_right(ui_menu_t *sysmenu, void *arg, sysarg_t idev_id) 1505 1565 { 1566 ui_window_t *window = (ui_window_t *)arg; 1567 1506 1568 (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); 1509 1572 } 1510 1573
Note:
See TracChangeset
for help on using the changeset viewer.