Changes in uspace/lib/ui/src/menu.c [112f70a:5d380b6] in mainline
- File:
-
- 1 edited
-
uspace/lib/ui/src/menu.c (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/menu.c
r112f70a r5d380b6 35 35 36 36 #include <adt/list.h> 37 #include <ctype.h>38 37 #include <errno.h> 39 38 #include <gfx/color.h> … … 45 44 #include <str.h> 46 45 #include <uchar.h> 47 #include <ui/ui.h>48 46 #include <ui/accel.h> 49 47 #include <ui/control.h> … … 51 49 #include <ui/popup.h> 52 50 #include <ui/menu.h> 51 #include <ui/menubar.h> 53 52 #include <ui/menuentry.h> 54 53 #include <ui/resource.h> 55 54 #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 window81 80 * @param mbar Menu bar 81 * @param caption Caption 82 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_window_t *parent, ui_menu_t **rmenu) 85 errno_t ui_menu_create(ui_menu_bar_t *mbar, const char *caption, 86 ui_menu_t **rmenu) 86 87 { 87 88 ui_menu_t *menu; … … 91 92 return ENOMEM; 92 93 93 menu->parent = parent; 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); 94 102 list_initialize(&menu->entries); 95 103 … … 116 124 } 117 125 126 list_remove(&menu->lmenus); 118 127 free(menu->caption); 119 128 free(menu); 120 129 } 121 130 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; 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; 132 203 } 133 204 … … 141 212 ui_menu_geom_t *geom) 142 213 { 214 ui_resource_t *res; 143 215 gfx_coord2_t edim; 144 216 gfx_coord_t frame_w; 145 217 gfx_coord_t frame_h; 146 ui_resource_t *res; 147 148 res = ui_window_get_res(menu->parent); 218 219 res = ui_window_get_res(menu->mbar->window); 149 220 150 221 if (res->textmode) { … … 170 241 } 171 242 243 /** Get menu rectangle. 244 * 245 * @param menu Menu 246 * @param spos Starting position (top-left corner) 247 * @param rect Place to store menu rectangle 248 */ 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 Menu 260 * @return Accelerator character (lowercase) or the null character if 261 * 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 172 268 /** Get UI resource from menu. 173 269 * … … 208 304 params.idev_id = idev_id; 209 305 210 rc = ui_popup_create( ui_window_get_ui(menu->parent), menu->parent,211 &p arams, &popup);306 rc = ui_popup_create(menu->mbar->ui, menu->mbar->window, ¶ms, 307 &popup); 212 308 if (rc != EOK) 213 309 return rc; … … 407 503 /* Press outside menu - close it */ 408 504 if (event->type == POS_PRESS) 409 ui_menu_ close_req(menu);505 ui_menu_bar_deactivate(menu->mbar); 410 506 } 411 507 … … 428 524 if (event->type == KEY_PRESS && (event->mods & KM_ALT) != 0 && 429 525 (event->mods & (KM_CTRL | KM_SHIFT)) == 0 && event->c != '\0') 430 ui_menu_ press_accel(menu, event->c, event->kbd_id);526 ui_menu_bar_press_accel(menu->mbar, event->c, event->kbd_id); 431 527 432 528 return ui_claimed; … … 519 615 switch (event->key) { 520 616 case KC_ESCAPE: 521 ui_menu_ close_req(menu);617 ui_menu_bar_deactivate(menu->mbar); 522 618 break; 523 619 case KC_LEFT: 524 ui_menu_ left(menu, event->kbd_id);620 ui_menu_bar_left(menu->mbar, event->kbd_id); 525 621 break; 526 622 case KC_RIGHT: 527 ui_menu_ right(menu, event->kbd_id);623 ui_menu_bar_right(menu->mbar, event->kbd_id); 528 624 break; 529 625 case KC_UP: … … 534 630 break; 535 631 case KC_ENTER: 536 if (menu->selected != NULL && 537 !ui_menu_entry_is_disabled(menu->selected)) 632 if (menu->selected != NULL) 538 633 ui_menu_entry_activate(menu->selected); 539 634 break; … … 543 638 while (mentry != NULL) { 544 639 c = ui_menu_entry_get_accel(mentry); 545 if (c == (char32_t)tolower(event->c) && 546 !ui_menu_entry_is_disabled(mentry)) { 640 if (c == event->c && menu->selected != NULL) { 547 641 ui_menu_entry_activate(mentry); 548 642 break; … … 564 658 ui_menu_t *menu = (ui_menu_t *)arg; 565 659 566 /* Forward close request to caller*/567 ui_menu_ close_req(menu);660 /* Deactivate menu bar, close menu */ 661 ui_menu_bar_deactivate(menu->mbar); 568 662 } 569 663 … … 597 691 } 598 692 599 /** Send menu left event.600 *601 * @param menu Menu602 * @param idev_id Input device ID603 */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 Menu613 * @param idev_id Input device ID614 */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 Menu624 */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 Menu634 * @param c Character635 * @param kbd_id Keyboard ID636 */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 643 693 /** @} 644 694 */
Note:
See TracChangeset
for help on using the changeset viewer.
