Changeset 46bd63c9 in mainline for uspace/lib/ui/src
- Timestamp:
- 2023-09-08T08:47:30Z (23 months ago)
- Branches:
- master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1af103e
- Parents:
- 0b6fad9
- git-author:
- Jiri Svoboda <jiri@…> (2023-09-07 18:47:09)
- git-committer:
- Jiri Svoboda <jiri@…> (2023-09-08 08:47:30)
- Location:
- uspace/lib/ui/src
- Files:
-
- 1 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/menu.c
r0b6fad9 r46bd63c9 44 44 #include <str.h> 45 45 #include <uchar.h> 46 #include <ui/ui.h> 46 47 #include <ui/accel.h> 47 48 #include <ui/control.h> … … 49 50 #include <ui/popup.h> 50 51 #include <ui/menu.h> 51 #include <ui/menubar.h>52 52 #include <ui/menuentry.h> 53 53 #include <ui/resource.h> 54 54 #include <ui/window.h> 55 #include "../private/menubar.h"56 55 #include "../private/menu.h" 57 56 #include "../private/resource.h" … … 78 77 /** Create new menu. 79 78 * 79 * @param parent Parent window 80 80 * @param mbar Menu bar 81 * @param caption Caption82 81 * @param rmenu Place to store pointer to new menu 83 82 * @return EOK on success, ENOMEM if out of memory 84 83 */ 85 errno_t ui_menu_create(ui_menu_bar_t *mbar, const char *caption, 86 ui_menu_t **rmenu) 84 errno_t ui_menu_create(ui_window_t *parent, ui_menu_t **rmenu) 87 85 { 88 86 ui_menu_t *menu; … … 92 90 return ENOMEM; 93 91 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); 92 menu->parent = parent; 102 93 list_initialize(&menu->entries); 103 94 … … 124 115 } 125 116 126 list_remove(&menu->lmenus);127 117 free(menu->caption); 128 118 free(menu); 129 119 } 130 120 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; 121 /** Set menu callbacks. 122 * 123 * @param menu Menu 124 * @param cb Callbacks 125 * @param arg Callback argument 126 */ 127 void ui_menu_set_cb(ui_menu_t *menu, ui_menu_cb_t *cb, void *arg) 128 { 129 menu->cb = cb; 130 menu->arg = arg; 203 131 } 204 132 … … 212 140 ui_menu_geom_t *geom) 213 141 { 214 ui_resource_t *res;215 142 gfx_coord2_t edim; 216 143 gfx_coord_t frame_w; 217 144 gfx_coord_t frame_h; 218 219 res = ui_window_get_res(menu->mbar->window); 145 ui_resource_t *res; 146 147 res = ui_window_get_res(menu->parent); 220 148 221 149 if (res->textmode) { … … 241 169 } 242 170 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 171 /** Get UI resource from menu. 269 172 * … … 304 207 params.idev_id = idev_id; 305 208 306 rc = ui_popup_create( menu->mbar->ui, menu->mbar->window, ¶ms,307 &p opup);209 rc = ui_popup_create(ui_window_get_ui(menu->parent), menu->parent, 210 ¶ms, &popup); 308 211 if (rc != EOK) 309 212 return rc; … … 503 406 /* Press outside menu - close it */ 504 407 if (event->type == POS_PRESS) 505 ui_menu_ bar_deactivate(menu->mbar);408 ui_menu_close_req(menu); 506 409 } 507 410 … … 524 427 if (event->type == KEY_PRESS && (event->mods & KM_ALT) != 0 && 525 428 (event->mods & (KM_CTRL | KM_SHIFT)) == 0 && event->c != '\0') 526 ui_menu_ bar_press_accel(menu->mbar, event->c, event->kbd_id);429 ui_menu_press_accel(menu, event->c, event->kbd_id); 527 430 528 431 return ui_claimed; … … 615 518 switch (event->key) { 616 519 case KC_ESCAPE: 617 ui_menu_ bar_deactivate(menu->mbar);520 ui_menu_close_req(menu); 618 521 break; 619 522 case KC_LEFT: 620 ui_menu_ bar_left(menu->mbar, event->kbd_id);523 ui_menu_left(menu, event->kbd_id); 621 524 break; 622 525 case KC_RIGHT: 623 ui_menu_ bar_right(menu->mbar, event->kbd_id);526 ui_menu_right(menu, event->kbd_id); 624 527 break; 625 528 case KC_UP: … … 658 561 ui_menu_t *menu = (ui_menu_t *)arg; 659 562 660 /* Deactivate menu bar, close menu*/661 ui_menu_ bar_deactivate(menu->mbar);563 /* Forward close request to caller */ 564 ui_menu_close_req(menu); 662 565 } 663 566 … … 691 594 } 692 595 596 /** Send menu left event. 597 * 598 * @param menu Menu 599 * @param idev_id Input device ID 600 */ 601 void ui_menu_left(ui_menu_t *menu, sysarg_t idev_id) 602 { 603 if (menu->cb != NULL && menu->cb->left != NULL) 604 menu->cb->left(menu, menu->arg, idev_id); 605 } 606 607 /** Send menu right event. 608 * 609 * @param menu Menu 610 * @param idev_id Input device ID 611 */ 612 void ui_menu_right(ui_menu_t *menu, sysarg_t idev_id) 613 { 614 if (menu->cb != NULL && menu->cb->right != NULL) 615 menu->cb->right(menu, menu->arg, idev_id); 616 } 617 618 /** Send menu close request event. 619 * 620 * @param menu Menu 621 */ 622 void ui_menu_close_req(ui_menu_t *menu) 623 { 624 if (menu->cb != NULL && menu->cb->close_req != NULL) 625 menu->cb->close_req(menu, menu->arg); 626 } 627 628 /** Send menu accelerator key press event. 629 * 630 * @param menu Menu 631 * @param c Character 632 * @param kbd_id Keyboard ID 633 */ 634 void ui_menu_press_accel(ui_menu_t *menu, char32_t c, sysarg_t kbd_id) 635 { 636 if (menu->cb != NULL && menu->cb->press_accel != NULL) 637 menu->cb->press_accel(menu, menu->arg, c, kbd_id); 638 } 639 693 640 /** @} 694 641 */ -
uspace/lib/ui/src/menubar.c
r0b6fad9 r46bd63c9 45 45 #include <ui/control.h> 46 46 #include <ui/paint.h> 47 #include <ui/menu.h>48 47 #include <ui/menubar.h> 48 #include <ui/menudd.h> 49 49 #include <ui/window.h> 50 50 #include "../private/menubar.h" … … 95 95 mbar->ui = ui; 96 96 mbar->window = window; 97 list_initialize(&mbar->menu s);97 list_initialize(&mbar->menudds); 98 98 *rmbar = mbar; 99 99 return EOK; … … 106 106 void ui_menu_bar_destroy(ui_menu_bar_t *mbar) 107 107 { 108 ui_menu_ t *menu;108 ui_menu_dd_t *mdd; 109 109 110 110 if (mbar == NULL) 111 111 return; 112 112 113 /* Destroy menu s */114 m enu = ui_menu_first(mbar);115 while (m enu!= NULL) {116 ui_menu_d estroy(menu);117 m enu = ui_menu_first(mbar);113 /* Destroy menu drop-downs */ 114 mdd = ui_menu_dd_first(mbar); 115 while (mdd != NULL) { 116 ui_menu_dd_destroy(mdd); 117 mdd = ui_menu_dd_first(mbar); 118 118 } 119 119 … … 155 155 gfx_rect_t rect; 156 156 gfx_color_t *bg_color; 157 ui_menu_ t *menu;157 ui_menu_dd_t *mdd; 158 158 const char *caption; 159 159 gfx_coord_t width; … … 189 189 fmt.valign = gfx_valign_top; 190 190 191 m enu = ui_menu_first(mbar);192 while (m enu!= NULL) {193 caption = ui_menu_ caption(menu);191 mdd = ui_menu_dd_first(mbar); 192 while (mdd != NULL) { 193 caption = ui_menu_dd_caption(mdd); 194 194 width = ui_text_width(res->font, caption) + 2 * hpad; 195 195 tpos.x = pos.x + hpad; … … 200 200 rect.p1.y = mbar->rect.p1.y; 201 201 202 if (m enu== mbar->selected) {202 if (mdd == mbar->selected) { 203 203 fmt.color = res->wnd_sel_text_color; 204 204 fmt.hgl_color = res->wnd_sel_text_hgl_color; … … 223 223 224 224 pos.x += width; 225 m enu = ui_menu_next(menu);225 mdd = ui_menu_dd_next(mdd); 226 226 } 227 227 … … 241 241 * 242 242 * @param mbar Menu bar 243 * @param m enu Menuto select (or deselect if selected) or @c NULL243 * @param mdd Menu drop-down to select (or deselect if selected) or @c NULL 244 244 * @param openup Open menu even if not currently open 245 245 * @param idev_id Input device ID associated with the selecting seat 246 246 */ 247 void ui_menu_bar_select(ui_menu_bar_t *mbar, ui_menu_ t *menu, bool openup,247 void ui_menu_bar_select(ui_menu_bar_t *mbar, ui_menu_dd_t *mdd, bool openup, 248 248 sysarg_t idev_id) 249 249 { 250 ui_menu_ t *old_menu;250 ui_menu_dd_t *old_mdd; 251 251 gfx_rect_t rect; 252 252 bool was_open; 253 253 254 old_m enu= mbar->selected;255 256 mbar->selected = m enu;257 258 /* Close previously open menu */259 if (old_m enu != NULL && ui_menu_is_open(old_menu)) {254 old_mdd = mbar->selected; 255 256 mbar->selected = mdd; 257 258 /* Close previously open menu drop-down */ 259 if (old_mdd != NULL && ui_menu_dd_is_open(old_mdd)) { 260 260 was_open = true; 261 (void) ui_menu_ close(old_menu);261 (void) ui_menu_dd_close(old_mdd); 262 262 } else { 263 263 was_open = false; … … 270 270 if (openup || was_open) { 271 271 /* 272 * Open the newly selected menu if either273 * the old menu was open or @a openup was272 * Open the newly selected menu drop-down if either 273 * the old menu drop-down was open or @a openup was 274 274 * specified. 275 275 */ 276 (void) ui_menu_ open(mbar->selected, &rect, idev_id);276 (void) ui_menu_dd_open(mbar->selected, &rect, idev_id); 277 277 } 278 278 } … … 289 289 void ui_menu_bar_left(ui_menu_bar_t *mbar, sysarg_t idev_id) 290 290 { 291 ui_menu_ t *nmenu;291 ui_menu_dd_t *nmdd; 292 292 293 293 if (mbar->selected == NULL) 294 294 return; 295 295 296 nm enu = ui_menu_prev(mbar->selected);297 if (nm enu== NULL)298 nm enu = ui_menu_last(mbar);299 300 if (nm enu!= mbar->selected)301 ui_menu_bar_select(mbar, nm enu, false, idev_id);296 nmdd = ui_menu_dd_prev(mbar->selected); 297 if (nmdd == NULL) 298 nmdd = ui_menu_dd_last(mbar); 299 300 if (nmdd != mbar->selected) 301 ui_menu_bar_select(mbar, nmdd, false, idev_id); 302 302 } 303 303 … … 312 312 void ui_menu_bar_right(ui_menu_bar_t *mbar, sysarg_t idev_id) 313 313 { 314 ui_menu_ t *nmenu;314 ui_menu_dd_t *nmdd; 315 315 316 316 if (mbar->selected == NULL) 317 317 return; 318 318 319 nm enu = ui_menu_next(mbar->selected);320 if (nm enu== NULL)321 nm enu = ui_menu_first(mbar);322 323 if (nm enu!= mbar->selected)324 ui_menu_bar_select(mbar, nm enu, false, idev_id);319 nmdd = ui_menu_dd_next(mbar->selected); 320 if (nmdd == NULL) 321 nmdd = ui_menu_dd_first(mbar); 322 323 if (nmdd != mbar->selected) 324 ui_menu_bar_select(mbar, nmdd, false, idev_id); 325 325 } 326 326 … … 355 355 356 356 if (event->key == KC_ENTER || event->key == KC_DOWN) { 357 if (mbar->selected != NULL && !ui_menu_is_open(mbar->selected)) { 357 if (mbar->selected != NULL && 358 !ui_menu_dd_is_open(mbar->selected)) { 358 359 ui_menu_bar_entry_rect(mbar, mbar->selected, 359 360 &rect); 360 ui_menu_ open(mbar->selected, &rect, event->kbd_id);361 ui_menu_dd_open(mbar->selected, &rect, event->kbd_id); 361 362 } 362 363 … … 364 365 } 365 366 366 if (event->c != '\0' && !ui_menu_ is_open(mbar->selected)) {367 if (event->c != '\0' && !ui_menu_dd_is_open(mbar->selected)) { 367 368 /* Check if it is an accelerator. */ 368 369 ui_menu_bar_press_accel(mbar, event->c, event->kbd_id); … … 407 408 void ui_menu_bar_press_accel(ui_menu_bar_t *mbar, char32_t c, sysarg_t kbd_id) 408 409 { 409 ui_menu_ t *menu;410 ui_menu_dd_t *mdd; 410 411 char32_t maccel; 411 412 412 m enu = ui_menu_first(mbar);413 while (m enu!= NULL) {414 maccel = ui_menu_ get_accel(menu);413 mdd = ui_menu_dd_first(mbar); 414 while (mdd != NULL) { 415 maccel = ui_menu_dd_get_accel(mdd); 415 416 if (c == maccel) { 416 ui_menu_bar_select(mbar, m enu, true, kbd_id);417 ui_menu_bar_select(mbar, mdd, true, kbd_id); 417 418 return; 418 419 } 419 420 420 m enu = ui_menu_next(menu);421 mdd = ui_menu_dd_next(mdd); 421 422 } 422 423 } … … 433 434 gfx_coord2_t pos; 434 435 gfx_rect_t rect; 435 ui_menu_ t *menu;436 ui_menu_dd_t *mdd; 436 437 const char *caption; 437 438 gfx_coord_t width; … … 454 455 pos_id = event->pos_id; 455 456 456 m enu = ui_menu_first(mbar);457 while (m enu!= NULL) {458 caption = ui_menu_ caption(menu);457 mdd = ui_menu_dd_first(mbar); 458 while (mdd != NULL) { 459 caption = ui_menu_dd_caption(mdd); 459 460 width = ui_text_width(res->font, caption) + 2 * hpad; 460 461 … … 469 470 470 471 /* Open the menu, close if already open. */ 471 if (m enu== mbar->selected)472 if (mdd == mbar->selected) 472 473 ui_menu_bar_select(mbar, NULL, false, pos_id); 473 474 else 474 ui_menu_bar_select(mbar, m enu, true, pos_id);475 ui_menu_bar_select(mbar, mdd, true, pos_id); 475 476 476 477 return ui_claimed; … … 478 479 479 480 pos.x += width; 480 m enu = ui_menu_next(menu);481 mdd = ui_menu_dd_next(mdd); 481 482 } 482 483 … … 487 488 * 488 489 * @param mbar Menu bar 489 * @param m enu Menuwhose entry's rectangle is to be returned490 * @param mdd Menu drop-down whose entry's rectangle is to be returned 490 491 * @param rrect Place to store entry rectangle 491 492 */ 492 void ui_menu_bar_entry_rect(ui_menu_bar_t *mbar, ui_menu_ t *menu,493 void ui_menu_bar_entry_rect(ui_menu_bar_t *mbar, ui_menu_dd_t *mdd, 493 494 gfx_rect_t *rrect) 494 495 { … … 496 497 gfx_coord2_t pos; 497 498 gfx_rect_t rect; 498 ui_menu_ t *cur;499 ui_menu_dd_t *cur; 499 500 const char *caption; 500 501 gfx_coord_t width; … … 511 512 pos = mbar->rect.p0; 512 513 513 cur = ui_menu_ first(mbar);514 cur = ui_menu_dd_first(mbar); 514 515 while (cur != NULL) { 515 caption = ui_menu_ caption(cur);516 caption = ui_menu_dd_caption(cur); 516 517 width = ui_text_width(res->font, caption) + 2 * hpad; 517 518 … … 520 521 rect.p1.y = mbar->rect.p1.y; 521 522 522 if (cur == m enu) {523 if (cur == mdd) { 523 524 *rrect = rect; 524 525 return; … … 526 527 527 528 pos.x += width; 528 cur = ui_menu_ next(cur);529 cur = ui_menu_dd_next(cur); 529 530 } 530 531 … … 544 545 mbar->active = true; 545 546 if (mbar->selected == NULL) 546 mbar->selected = ui_menu_ first(mbar);547 mbar->selected = ui_menu_dd_first(mbar); 547 548 548 549 (void) ui_menu_bar_paint(mbar); -
uspace/lib/ui/src/menuentry.c
r0b6fad9 r46bd63c9 1 1 /* 2 * Copyright (c) 202 2Jiri Svoboda2 * Copyright (c) 2023 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 241 241 * This needs to work even if the menu is not open, so we cannot 242 242 * use the menu's resource, which is only created after the menu 243 * is open (and its window is created). Use the menu bar's243 * is open (and its window is created). Use the parent window's 244 244 * resource instead. 245 245 */ 246 res = ui_window_get_res(mentry->menu-> mbar->window);246 res = ui_window_get_res(mentry->menu->parent); 247 247 248 248 *caption_w = ui_text_width(res->font, mentry->caption); … … 267 267 * This needs to work even if the menu is not open, so we cannot 268 268 * use the menu's resource, which is only created after the menu 269 * is open (and its window is created). Use the menu bar's269 * is open (and its window is created). Use the parent window's 270 270 * resource instead. 271 271 */ 272 res = ui_window_get_res(menu-> mbar->window);272 res = ui_window_get_res(menu->parent); 273 273 274 274 if (res->textmode) … … 306 306 * This needs to work even if the menu is not open, so we cannot 307 307 * use the menu's resource, which is only created after the menu 308 * is open (and its window is created). Use the menu bar's308 * is open (and its window is created). Use the parent window's 309 309 * resource instead. 310 310 */ 311 res = ui_window_get_res(mentry->menu-> mbar->window);311 res = ui_window_get_res(mentry->menu->parent); 312 312 313 313 if (res->textmode) { … … 474 474 void ui_menu_entry_activate(ui_menu_entry_t *mentry) 475 475 { 476 /* Deactivate menu bar, close menu */477 ui_menu_ bar_deactivate(mentry->menu->mbar);476 /* Close menu */ 477 ui_menu_close_req(mentry->menu); 478 478 479 479 /* Call back */
Note:
See TracChangeset
for help on using the changeset viewer.