Changeset 1c6c3e1d in mainline for uspace/lib/ui/src/menu.c
- Timestamp:
- 2023-10-22T17:55:33Z (17 months ago)
- Branches:
- ticket/834-toolchain-update
- Children:
- 350ec74
- Parents:
- 315d487 (diff), 133461c (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/menu.c
r315d487 r1c6c3e1d 35 35 36 36 #include <adt/list.h> 37 #include <ctype.h> 37 38 #include <errno.h> 38 39 #include <gfx/color.h> … … 44 45 #include <str.h> 45 46 #include <uchar.h> 47 #include <ui/ui.h> 46 48 #include <ui/accel.h> 47 49 #include <ui/control.h> … … 49 51 #include <ui/popup.h> 50 52 #include <ui/menu.h> 51 #include <ui/menubar.h>52 53 #include <ui/menuentry.h> 53 54 #include <ui/resource.h> 54 55 #include <ui/window.h> 55 #include "../private/menubar.h"56 56 #include "../private/menu.h" 57 57 #include "../private/resource.h" … … 78 78 /** Create new menu. 79 79 * 80 * @param parent Parent window 80 81 * @param mbar Menu bar 81 * @param caption Caption82 82 * @param rmenu Place to store pointer to new menu 83 83 * @return EOK on success, ENOMEM if out of memory 84 84 */ 85 errno_t ui_menu_create(ui_menu_bar_t *mbar, const char *caption, 86 ui_menu_t **rmenu) 85 errno_t ui_menu_create(ui_window_t *parent, ui_menu_t **rmenu) 87 86 { 88 87 ui_menu_t *menu; … … 92 91 return ENOMEM; 93 92 94 menu->caption = str_dup(caption); 95 if (menu->caption == NULL) { 96 free(menu); 97 return ENOMEM; 98 } 99 100 menu->mbar = mbar; 101 list_append(&menu->lmenus, &mbar->menus); 93 menu->parent = parent; 102 94 list_initialize(&menu->entries); 103 95 … … 124 116 } 125 117 126 list_remove(&menu->lmenus);127 118 free(menu->caption); 128 119 free(menu); 129 120 } 130 121 131 /** Get first menu in menu bar. 132 * 133 * @param mbar Menu bar 134 * @return First menu or @c NULL if there is none 135 */ 136 ui_menu_t *ui_menu_first(ui_menu_bar_t *mbar) 137 { 138 link_t *link; 139 140 link = list_first(&mbar->menus); 141 if (link == NULL) 142 return NULL; 143 144 return list_get_instance(link, ui_menu_t, lmenus); 145 } 146 147 /** Get next menu in menu bar. 148 * 149 * @param cur Current menu 150 * @return Next menu or @c NULL if @a cur is the last one 151 */ 152 ui_menu_t *ui_menu_next(ui_menu_t *cur) 153 { 154 link_t *link; 155 156 link = list_next(&cur->lmenus, &cur->mbar->menus); 157 if (link == NULL) 158 return NULL; 159 160 return list_get_instance(link, ui_menu_t, lmenus); 161 } 162 163 /** Get last menu in menu bar. 164 * 165 * @param mbar Menu bar 166 * @return Last menu or @c NULL if there is none 167 */ 168 ui_menu_t *ui_menu_last(ui_menu_bar_t *mbar) 169 { 170 link_t *link; 171 172 link = list_last(&mbar->menus); 173 if (link == NULL) 174 return NULL; 175 176 return list_get_instance(link, ui_menu_t, lmenus); 177 } 178 179 /** Get previous menu in menu bar. 180 * 181 * @param cur Current menu 182 * @return Previous menu or @c NULL if @a cur is the fist one 183 */ 184 ui_menu_t *ui_menu_prev(ui_menu_t *cur) 185 { 186 link_t *link; 187 188 link = list_prev(&cur->lmenus, &cur->mbar->menus); 189 if (link == NULL) 190 return NULL; 191 192 return list_get_instance(link, ui_menu_t, lmenus); 193 } 194 195 /** Get menu caption. 196 * 197 * @param menu Menu 198 * @return Caption (owned by @a menu) 199 */ 200 const char *ui_menu_caption(ui_menu_t *menu) 201 { 202 return menu->caption; 122 /** Set menu callbacks. 123 * 124 * @param menu Menu 125 * @param cb Callbacks 126 * @param arg Callback argument 127 */ 128 void ui_menu_set_cb(ui_menu_t *menu, ui_menu_cb_t *cb, void *arg) 129 { 130 menu->cb = cb; 131 menu->arg = arg; 203 132 } 204 133 … … 212 141 ui_menu_geom_t *geom) 213 142 { 214 ui_resource_t *res;215 143 gfx_coord2_t edim; 216 144 gfx_coord_t frame_w; 217 145 gfx_coord_t frame_h; 218 219 res = ui_window_get_res(menu->mbar->window); 146 ui_resource_t *res; 147 148 res = ui_window_get_res(menu->parent); 220 149 221 150 if (res->textmode) { … … 241 170 } 242 171 243 /** Get menu rectangle.244 *245 * @param menu Menu246 * @param spos Starting position (top-left corner)247 * @param rect Place to store menu rectangle248 */249 void ui_menu_get_rect(ui_menu_t *menu, gfx_coord2_t *spos, gfx_rect_t *rect)250 {251 ui_menu_geom_t geom;252 253 ui_menu_get_geom(menu, spos, &geom);254 *rect = geom.outer_rect;255 }256 257 /** Get menu accelerator character.258 *259 * @param menu Menu260 * @return Accelerator character (lowercase) or the null character if261 * the menu has no accelerator.262 */263 char32_t ui_menu_get_accel(ui_menu_t *menu)264 {265 return ui_accel_get(menu->caption);266 }267 268 172 /** Get UI resource from menu. 269 173 * … … 304 208 params.idev_id = idev_id; 305 209 306 rc = ui_popup_create( menu->mbar->ui, menu->mbar->window, ¶ms,307 &p opup);210 rc = ui_popup_create(ui_window_get_ui(menu->parent), menu->parent, 211 ¶ms, &popup); 308 212 if (rc != EOK) 309 213 return rc; … … 503 407 /* Press outside menu - close it */ 504 408 if (event->type == POS_PRESS) 505 ui_menu_ bar_deactivate(menu->mbar);409 ui_menu_close_req(menu); 506 410 } 507 411 … … 524 428 if (event->type == KEY_PRESS && (event->mods & KM_ALT) != 0 && 525 429 (event->mods & (KM_CTRL | KM_SHIFT)) == 0 && event->c != '\0') 526 ui_menu_ bar_press_accel(menu->mbar, event->c, event->kbd_id);430 ui_menu_press_accel(menu, event->c, event->kbd_id); 527 431 528 432 return ui_claimed; … … 615 519 switch (event->key) { 616 520 case KC_ESCAPE: 617 ui_menu_ bar_deactivate(menu->mbar);521 ui_menu_close_req(menu); 618 522 break; 619 523 case KC_LEFT: 620 ui_menu_ bar_left(menu->mbar, event->kbd_id);524 ui_menu_left(menu, event->kbd_id); 621 525 break; 622 526 case KC_RIGHT: 623 ui_menu_ bar_right(menu->mbar, event->kbd_id);527 ui_menu_right(menu, event->kbd_id); 624 528 break; 625 529 case KC_UP: … … 630 534 break; 631 535 case KC_ENTER: 632 if (menu->selected != NULL) 536 if (menu->selected != NULL && 537 !ui_menu_entry_is_disabled(menu->selected)) 633 538 ui_menu_entry_activate(menu->selected); 634 539 break; … … 638 543 while (mentry != NULL) { 639 544 c = ui_menu_entry_get_accel(mentry); 640 if (c == event->c && menu->selected != NULL) { 545 if (c == (char32_t)tolower(event->c) && 546 !ui_menu_entry_is_disabled(mentry)) { 641 547 ui_menu_entry_activate(mentry); 642 548 break; … … 658 564 ui_menu_t *menu = (ui_menu_t *)arg; 659 565 660 /* Deactivate menu bar, close menu*/661 ui_menu_ bar_deactivate(menu->mbar);566 /* Forward close request to caller */ 567 ui_menu_close_req(menu); 662 568 } 663 569 … … 691 597 } 692 598 599 /** Send menu left event. 600 * 601 * @param menu Menu 602 * @param idev_id Input device ID 603 */ 604 void ui_menu_left(ui_menu_t *menu, sysarg_t idev_id) 605 { 606 if (menu->cb != NULL && menu->cb->left != NULL) 607 menu->cb->left(menu, menu->arg, idev_id); 608 } 609 610 /** Send menu right event. 611 * 612 * @param menu Menu 613 * @param idev_id Input device ID 614 */ 615 void ui_menu_right(ui_menu_t *menu, sysarg_t idev_id) 616 { 617 if (menu->cb != NULL && menu->cb->right != NULL) 618 menu->cb->right(menu, menu->arg, idev_id); 619 } 620 621 /** Send menu close request event. 622 * 623 * @param menu Menu 624 */ 625 void ui_menu_close_req(ui_menu_t *menu) 626 { 627 if (menu->cb != NULL && menu->cb->close_req != NULL) 628 menu->cb->close_req(menu, menu->arg); 629 } 630 631 /** Send menu accelerator key press event. 632 * 633 * @param menu Menu 634 * @param c Character 635 * @param kbd_id Keyboard ID 636 */ 637 void ui_menu_press_accel(ui_menu_t *menu, char32_t c, sysarg_t kbd_id) 638 { 639 if (menu->cb != NULL && menu->cb->press_accel != NULL) 640 menu->cb->press_accel(menu, menu->arg, c, kbd_id); 641 } 642 693 643 /** @} 694 644 */
Note:
See TracChangeset
for help on using the changeset viewer.