Changeset dc5c303 in mainline for uspace/lib/ui/src/menubar.c
- Timestamp:
- 2023-12-28T13:59:23Z (14 months ago)
- 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)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/menubar.c
r42c2e65 rdc5c303 35 35 36 36 #include <adt/list.h> 37 #include <ctype.h> 37 38 #include <errno.h> 38 39 #include <gfx/color.h> … … 45 46 #include <ui/control.h> 46 47 #include <ui/paint.h> 47 #include <ui/menu.h>48 48 #include <ui/menubar.h> 49 #include <ui/menudd.h> 50 #include <ui/wdecor.h> 49 51 #include <ui/window.h> 50 52 #include "../private/menubar.h" 51 53 #include "../private/resource.h" 54 #include "../private/wdecor.h" 55 #include "../private/window.h" 52 56 53 57 enum { … … 95 99 mbar->ui = ui; 96 100 mbar->window = window; 97 list_initialize(&mbar->menus); 101 list_initialize(&mbar->menudds); 102 103 if (window->mbar == NULL) 104 window->mbar = mbar; 105 98 106 *rmbar = mbar; 99 107 return EOK; … … 106 114 void ui_menu_bar_destroy(ui_menu_bar_t *mbar) 107 115 { 108 ui_menu_ t *menu;116 ui_menu_dd_t *mdd; 109 117 110 118 if (mbar == NULL) 111 119 return; 112 120 113 /* Destroy menus */ 114 menu = ui_menu_first(mbar); 115 while (menu != NULL) { 116 ui_menu_destroy(menu); 117 menu = ui_menu_first(mbar); 121 if (mbar->window->mbar == mbar) 122 mbar->window->mbar = NULL; 123 124 /* Destroy menu drop-downs */ 125 mdd = ui_menu_dd_first(mbar); 126 while (mdd != NULL) { 127 ui_menu_dd_destroy(mdd); 128 mdd = ui_menu_dd_first(mbar); 118 129 } 119 130 … … 155 166 gfx_rect_t rect; 156 167 gfx_color_t *bg_color; 157 ui_menu_ t *menu;168 ui_menu_dd_t *mdd; 158 169 const char *caption; 159 170 gfx_coord_t width; … … 189 200 fmt.valign = gfx_valign_top; 190 201 191 m enu = ui_menu_first(mbar);192 while (m enu!= NULL) {193 caption = ui_menu_ caption(menu);202 mdd = ui_menu_dd_first(mbar); 203 while (mdd != NULL) { 204 caption = ui_menu_dd_caption(mdd); 194 205 width = ui_text_width(res->font, caption) + 2 * hpad; 195 206 tpos.x = pos.x + hpad; … … 200 211 rect.p1.y = mbar->rect.p1.y; 201 212 202 if (m enu== mbar->selected) {213 if (mdd == mbar->selected) { 203 214 fmt.color = res->wnd_sel_text_color; 204 215 fmt.hgl_color = res->wnd_sel_text_hgl_color; … … 223 234 224 235 pos.x += width; 225 m enu = ui_menu_next(menu);236 mdd = ui_menu_dd_next(mdd); 226 237 } 227 238 … … 241 252 * 242 253 * @param mbar Menu bar 243 * @param m enu Menuto select (or deselect if selected) or @c NULL254 * @param mdd Menu drop-down to select (or deselect if selected) or @c NULL 244 255 * @param openup Open menu even if not currently open 245 256 * @param idev_id Input device ID associated with the selecting seat 246 257 */ 247 void ui_menu_bar_select(ui_menu_bar_t *mbar, ui_menu_ t *menu, bool openup,258 void ui_menu_bar_select(ui_menu_bar_t *mbar, ui_menu_dd_t *mdd, bool openup, 248 259 sysarg_t idev_id) 249 260 { 250 ui_menu_ t *old_menu;261 ui_menu_dd_t *old_mdd; 251 262 gfx_rect_t rect; 252 263 bool was_open; 253 264 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)) {265 old_mdd = mbar->selected; 266 267 mbar->selected = mdd; 268 269 /* Close previously open menu drop-down */ 270 if (old_mdd != NULL && ui_menu_dd_is_open(old_mdd)) { 260 271 was_open = true; 261 (void) ui_menu_ close(old_menu);272 (void) ui_menu_dd_close(old_mdd); 262 273 } else { 263 274 was_open = false; … … 270 281 if (openup || was_open) { 271 282 /* 272 * Open the newly selected menu if either273 * the old menu was open or @a openup was283 * Open the newly selected menu drop-down if either 284 * the old menu drop-down was open or @a openup was 274 285 * specified. 275 286 */ 276 (void) ui_menu_ open(mbar->selected, &rect, idev_id);287 (void) ui_menu_dd_open(mbar->selected, &rect, idev_id); 277 288 } 278 } 289 290 mbar->active = true; 291 } else { 292 mbar->active = false; 293 } 294 } 295 296 /** Select first drop-down. 297 * 298 * @param mbar Menu bar 299 * @param openup @c true to open drop-down if it was not open 300 * @param idev_id Input device ID 301 */ 302 void ui_menu_bar_select_first(ui_menu_bar_t *mbar, bool openup, 303 sysarg_t idev_id) 304 { 305 ui_menu_dd_t *mdd; 306 307 mdd = ui_menu_dd_first(mbar); 308 ui_menu_bar_select(mbar, mdd, openup, idev_id); 309 } 310 311 /** Select last drop-down. 312 * 313 * @param mbar Menu bar 314 * @param openup @c true to open drop-down if it was not open 315 * @param idev_id Input device ID 316 */ 317 void ui_menu_bar_select_last(ui_menu_bar_t *mbar, bool openup, 318 sysarg_t idev_id) 319 { 320 ui_menu_dd_t *mdd; 321 322 mdd = ui_menu_dd_last(mbar); 323 ui_menu_bar_select(mbar, mdd, openup, idev_id); 324 } 325 326 /** Select system menu. 327 * 328 * @param mbar Menu bar 329 * @param openup @c true to open drop-down if it was not open 330 * @param idev_id Input device ID 331 */ 332 void ui_menu_bar_select_sysmenu(ui_menu_bar_t *mbar, bool openup, 333 sysarg_t idev_id) 334 { 335 ui_wdecor_sysmenu_hdl_set_active(mbar->window->wdecor, true); 336 337 if (openup) 338 ui_window_send_sysmenu(mbar->window, idev_id); 279 339 } 280 340 … … 289 349 void ui_menu_bar_left(ui_menu_bar_t *mbar, sysarg_t idev_id) 290 350 { 291 ui_menu_t *nmenu; 351 ui_menu_dd_t *nmdd; 352 bool sel_sysmenu = false; 353 bool was_open; 292 354 293 355 if (mbar->selected == NULL) 294 356 return; 295 357 296 nmenu = ui_menu_prev(mbar->selected); 297 if (nmenu == NULL) 298 nmenu = ui_menu_last(mbar); 299 300 if (nmenu != mbar->selected) 301 ui_menu_bar_select(mbar, nmenu, false, idev_id); 358 nmdd = ui_menu_dd_prev(mbar->selected); 359 if (nmdd == NULL) { 360 if ((mbar->window->wdecor->style & ui_wds_sysmenu_hdl) != 0) { 361 sel_sysmenu = true; 362 } else { 363 nmdd = ui_menu_dd_last(mbar); 364 } 365 } 366 367 was_open = mbar->selected != NULL && 368 ui_menu_dd_is_open(mbar->selected); 369 370 if (nmdd != mbar->selected) 371 ui_menu_bar_select(mbar, nmdd, false, idev_id); 372 373 /* 374 * Only open sysmenu *after* closing the previous menu, avoid 375 * having multiple popup windows at the same time. 376 */ 377 if (sel_sysmenu) 378 ui_menu_bar_select_sysmenu(mbar, was_open, idev_id); 302 379 } 303 380 … … 312 389 void ui_menu_bar_right(ui_menu_bar_t *mbar, sysarg_t idev_id) 313 390 { 314 ui_menu_t *nmenu; 391 ui_menu_dd_t *nmdd; 392 bool sel_sysmenu = false; 393 bool was_open; 315 394 316 395 if (mbar->selected == NULL) 317 396 return; 318 397 319 nmenu = ui_menu_next(mbar->selected); 320 if (nmenu == NULL) 321 nmenu = ui_menu_first(mbar); 322 323 if (nmenu != mbar->selected) 324 ui_menu_bar_select(mbar, nmenu, false, idev_id); 398 nmdd = ui_menu_dd_next(mbar->selected); 399 if (nmdd == NULL) { 400 if ((mbar->window->wdecor->style & ui_wds_sysmenu_hdl) != 0) { 401 sel_sysmenu = true; 402 } else { 403 nmdd = ui_menu_dd_first(mbar); 404 } 405 } 406 407 was_open = mbar->selected != NULL && 408 ui_menu_dd_is_open(mbar->selected); 409 410 if (nmdd != mbar->selected) 411 ui_menu_bar_select(mbar, nmdd, false, idev_id); 412 413 /* 414 * Only open sysmenu *after* closing the previous menu, avoid 415 * having multiple popup windows at the same time. 416 */ 417 if (sel_sysmenu) 418 ui_menu_bar_select_sysmenu(mbar, was_open, idev_id); 325 419 } 326 420 … … 355 449 356 450 if (event->key == KC_ENTER || event->key == KC_DOWN) { 357 if (mbar->selected != NULL && !ui_menu_is_open(mbar->selected)) { 451 if (mbar->selected != NULL && 452 !ui_menu_dd_is_open(mbar->selected)) { 358 453 ui_menu_bar_entry_rect(mbar, mbar->selected, 359 454 &rect); 360 ui_menu_ open(mbar->selected, &rect, event->kbd_id);455 ui_menu_dd_open(mbar->selected, &rect, event->kbd_id); 361 456 } 362 457 … … 364 459 } 365 460 366 if (event->c != '\0' && !ui_menu_ is_open(mbar->selected)) {461 if (event->c != '\0' && !ui_menu_dd_is_open(mbar->selected)) { 367 462 /* Check if it is an accelerator. */ 368 463 ui_menu_bar_press_accel(mbar, event->c, event->kbd_id); … … 407 502 void ui_menu_bar_press_accel(ui_menu_bar_t *mbar, char32_t c, sysarg_t kbd_id) 408 503 { 409 ui_menu_ t *menu;504 ui_menu_dd_t *mdd; 410 505 char32_t maccel; 411 506 412 m enu = ui_menu_first(mbar);413 while (m enu!= NULL) {414 maccel = ui_menu_ get_accel(menu);415 if ( c== maccel) {416 ui_menu_bar_select(mbar, m enu, true, kbd_id);507 mdd = ui_menu_dd_first(mbar); 508 while (mdd != NULL) { 509 maccel = ui_menu_dd_get_accel(mdd); 510 if ((char32_t)tolower(c) == maccel) { 511 ui_menu_bar_select(mbar, mdd, true, kbd_id); 417 512 return; 418 513 } 419 514 420 m enu = ui_menu_next(menu);515 mdd = ui_menu_dd_next(mdd); 421 516 } 422 517 } … … 433 528 gfx_coord2_t pos; 434 529 gfx_rect_t rect; 435 ui_menu_ t *menu;530 ui_menu_dd_t *mdd; 436 531 const char *caption; 437 532 gfx_coord_t width; … … 454 549 pos_id = event->pos_id; 455 550 456 m enu = ui_menu_first(mbar);457 while (m enu!= NULL) {458 caption = ui_menu_ caption(menu);551 mdd = ui_menu_dd_first(mbar); 552 while (mdd != NULL) { 553 caption = ui_menu_dd_caption(mdd); 459 554 width = ui_text_width(res->font, caption) + 2 * hpad; 460 555 … … 468 563 mbar->active = true; 469 564 470 /* Open the menu, close if already open. */ 471 if (menu == mbar->selected) 472 ui_menu_bar_select(mbar, NULL, false, pos_id); 473 else 474 ui_menu_bar_select(mbar, menu, true, pos_id); 565 /* Open the menu, if not already open. */ 566 if (mdd != mbar->selected) 567 ui_menu_bar_select(mbar, mdd, true, pos_id); 475 568 476 569 return ui_claimed; … … 478 571 479 572 pos.x += width; 480 m enu = ui_menu_next(menu);573 mdd = ui_menu_dd_next(mdd); 481 574 } 482 575 … … 487 580 * 488 581 * @param mbar Menu bar 489 * @param m enu Menuwhose entry's rectangle is to be returned582 * @param mdd Menu drop-down whose entry's rectangle is to be returned 490 583 * @param rrect Place to store entry rectangle 491 584 */ 492 void ui_menu_bar_entry_rect(ui_menu_bar_t *mbar, ui_menu_ t *menu,585 void ui_menu_bar_entry_rect(ui_menu_bar_t *mbar, ui_menu_dd_t *mdd, 493 586 gfx_rect_t *rrect) 494 587 { … … 496 589 gfx_coord2_t pos; 497 590 gfx_rect_t rect; 498 ui_menu_ t *cur;591 ui_menu_dd_t *cur; 499 592 const char *caption; 500 593 gfx_coord_t width; … … 511 604 pos = mbar->rect.p0; 512 605 513 cur = ui_menu_ first(mbar);606 cur = ui_menu_dd_first(mbar); 514 607 while (cur != NULL) { 515 caption = ui_menu_ caption(cur);608 caption = ui_menu_dd_caption(cur); 516 609 width = ui_text_width(res->font, caption) + 2 * hpad; 517 610 … … 520 613 rect.p1.y = mbar->rect.p1.y; 521 614 522 if (cur == m enu) {615 if (cur == mdd) { 523 616 *rrect = rect; 524 617 return; … … 526 619 527 620 pos.x += width; 528 cur = ui_menu_ next(cur);621 cur = ui_menu_dd_next(cur); 529 622 } 530 623 … … 544 637 mbar->active = true; 545 638 if (mbar->selected == NULL) 546 mbar->selected = ui_menu_ first(mbar);639 mbar->selected = ui_menu_dd_first(mbar); 547 640 548 641 (void) ui_menu_bar_paint(mbar); 549 642 } 550 643 644 /** Deactivate menu bar. 645 * 646 * @param mbar Menu bar 647 */ 551 648 void ui_menu_bar_deactivate(ui_menu_bar_t *mbar) 552 649 { 553 650 ui_menu_bar_select(mbar, NULL, false, 0); 554 mbar->active = false;555 651 } 556 652
Note:
See TracChangeset
for help on using the changeset viewer.