Changes in uspace/lib/ui/src/menubar.c [1543d4c:5d380b6] in mainline
- File:
-
- 1 edited
-
uspace/lib/ui/src/menubar.c (modified) (25 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/menubar.c
r1543d4c r5d380b6 35 35 36 36 #include <adt/list.h> 37 #include <ctype.h>38 37 #include <errno.h> 39 38 #include <gfx/color.h> … … 46 45 #include <ui/control.h> 47 46 #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>51 49 #include <ui/window.h> 52 50 #include "../private/menubar.h" 53 51 #include "../private/resource.h" 54 #include "../private/wdecor.h"55 #include "../private/window.h"56 52 57 53 enum { … … 99 95 mbar->ui = ui; 100 96 mbar->window = window; 101 list_initialize(&mbar->menudds); 102 103 if (window->mbar == NULL) 104 window->mbar = mbar; 105 97 list_initialize(&mbar->menus); 106 98 *rmbar = mbar; 107 99 return EOK; … … 114 106 void ui_menu_bar_destroy(ui_menu_bar_t *mbar) 115 107 { 116 ui_menu_ dd_t *mdd;108 ui_menu_t *menu; 117 109 118 110 if (mbar == NULL) 119 111 return; 120 112 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); 113 /* Destroy menus */ 114 menu = ui_menu_first(mbar); 115 while (menu != NULL) { 116 ui_menu_destroy(menu); 117 menu = ui_menu_first(mbar); 129 118 } 130 119 … … 166 155 gfx_rect_t rect; 167 156 gfx_color_t *bg_color; 168 ui_menu_ dd_t *mdd;157 ui_menu_t *menu; 169 158 const char *caption; 170 159 gfx_coord_t width; … … 200 189 fmt.valign = gfx_valign_top; 201 190 202 m dd = ui_menu_dd_first(mbar);203 while (m dd!= NULL) {204 caption = ui_menu_ dd_caption(mdd);191 menu = ui_menu_first(mbar); 192 while (menu != NULL) { 193 caption = ui_menu_caption(menu); 205 194 width = ui_text_width(res->font, caption) + 2 * hpad; 206 195 tpos.x = pos.x + hpad; … … 211 200 rect.p1.y = mbar->rect.p1.y; 212 201 213 if (m dd== mbar->selected) {202 if (menu == mbar->selected) { 214 203 fmt.color = res->wnd_sel_text_color; 215 204 fmt.hgl_color = res->wnd_sel_text_hgl_color; … … 234 223 235 224 pos.x += width; 236 m dd = ui_menu_dd_next(mdd);225 menu = ui_menu_next(menu); 237 226 } 238 227 … … 252 241 * 253 242 * @param mbar Menu bar 254 * @param m dd Menu drop-downto select (or deselect if selected) or @c NULL243 * @param menu Menu to select (or deselect if selected) or @c NULL 255 244 * @param openup Open menu even if not currently open 256 245 * @param idev_id Input device ID associated with the selecting seat 257 246 */ 258 void ui_menu_bar_select(ui_menu_bar_t *mbar, ui_menu_ dd_t *mdd, bool openup,247 void ui_menu_bar_select(ui_menu_bar_t *mbar, ui_menu_t *menu, bool openup, 259 248 sysarg_t idev_id) 260 249 { 261 ui_menu_ dd_t *old_mdd;250 ui_menu_t *old_menu; 262 251 gfx_rect_t rect; 263 252 bool was_open; 264 253 265 old_m dd= mbar->selected;266 267 mbar->selected = m dd;268 269 /* Close previously open menu drop-down*/270 if (old_m dd != NULL && ui_menu_dd_is_open(old_mdd)) {254 old_menu = mbar->selected; 255 256 mbar->selected = menu; 257 258 /* Close previously open menu */ 259 if (old_menu != NULL && ui_menu_is_open(old_menu)) { 271 260 was_open = true; 272 (void) ui_menu_ dd_close(old_mdd);261 (void) ui_menu_close(old_menu); 273 262 } else { 274 263 was_open = false; … … 281 270 if (openup || was_open) { 282 271 /* 283 * Open the newly selected menu drop-downif either284 * the old menu drop-downwas open or @a openup was272 * Open the newly selected menu if either 273 * the old menu was open or @a openup was 285 274 * specified. 286 275 */ 287 (void) ui_menu_ dd_open(mbar->selected, &rect, idev_id);276 (void) ui_menu_open(mbar->selected, &rect, idev_id); 288 277 } 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); 278 } 339 279 } 340 280 … … 349 289 void ui_menu_bar_left(ui_menu_bar_t *mbar, sysarg_t idev_id) 350 290 { 351 ui_menu_dd_t *nmdd; 352 bool sel_sysmenu = false; 353 bool was_open; 291 ui_menu_t *nmenu; 354 292 355 293 if (mbar->selected == NULL) 356 294 return; 357 295 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); 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); 379 302 } 380 303 … … 389 312 void ui_menu_bar_right(ui_menu_bar_t *mbar, sysarg_t idev_id) 390 313 { 391 ui_menu_dd_t *nmdd; 392 bool sel_sysmenu = false; 393 bool was_open; 314 ui_menu_t *nmenu; 394 315 395 316 if (mbar->selected == NULL) 396 317 return; 397 318 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); 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); 419 325 } 420 326 … … 449 355 450 356 if (event->key == KC_ENTER || event->key == KC_DOWN) { 451 if (mbar->selected != NULL && 452 !ui_menu_dd_is_open(mbar->selected)) { 357 if (mbar->selected != NULL && !ui_menu_is_open(mbar->selected)) { 453 358 ui_menu_bar_entry_rect(mbar, mbar->selected, 454 359 &rect); 455 ui_menu_ dd_open(mbar->selected, &rect, event->kbd_id);360 ui_menu_open(mbar->selected, &rect, event->kbd_id); 456 361 } 457 362 … … 459 364 } 460 365 461 if (event->c != '\0' && !ui_menu_ dd_is_open(mbar->selected)) {366 if (event->c != '\0' && !ui_menu_is_open(mbar->selected)) { 462 367 /* Check if it is an accelerator. */ 463 368 ui_menu_bar_press_accel(mbar, event->c, event->kbd_id); … … 502 407 void ui_menu_bar_press_accel(ui_menu_bar_t *mbar, char32_t c, sysarg_t kbd_id) 503 408 { 504 ui_menu_ dd_t *mdd;409 ui_menu_t *menu; 505 410 char32_t maccel; 506 411 507 m dd = ui_menu_dd_first(mbar);508 while (m dd!= NULL) {509 maccel = ui_menu_ dd_get_accel(mdd);510 if ( (char32_t)tolower(c)== maccel) {511 ui_menu_bar_select(mbar, m dd, true, kbd_id);412 menu = ui_menu_first(mbar); 413 while (menu != NULL) { 414 maccel = ui_menu_get_accel(menu); 415 if (c == maccel) { 416 ui_menu_bar_select(mbar, menu, true, kbd_id); 512 417 return; 513 418 } 514 419 515 m dd = ui_menu_dd_next(mdd);420 menu = ui_menu_next(menu); 516 421 } 517 422 } … … 528 433 gfx_coord2_t pos; 529 434 gfx_rect_t rect; 530 ui_menu_ dd_t *mdd;435 ui_menu_t *menu; 531 436 const char *caption; 532 437 gfx_coord_t width; … … 549 454 pos_id = event->pos_id; 550 455 551 m dd = ui_menu_dd_first(mbar);552 while (m dd!= NULL) {553 caption = ui_menu_ dd_caption(mdd);456 menu = ui_menu_first(mbar); 457 while (menu != NULL) { 458 caption = ui_menu_caption(menu); 554 459 width = ui_text_width(res->font, caption) + 2 * hpad; 555 460 … … 563 468 mbar->active = true; 564 469 565 /* Open the menu, if not already open. */ 566 if (mdd != mbar->selected) 567 ui_menu_bar_select(mbar, mdd, true, pos_id); 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); 568 475 569 476 return ui_claimed; … … 571 478 572 479 pos.x += width; 573 m dd = ui_menu_dd_next(mdd);480 menu = ui_menu_next(menu); 574 481 } 575 482 … … 580 487 * 581 488 * @param mbar Menu bar 582 * @param m dd Menu drop-downwhose entry's rectangle is to be returned489 * @param menu Menu whose entry's rectangle is to be returned 583 490 * @param rrect Place to store entry rectangle 584 491 */ 585 void ui_menu_bar_entry_rect(ui_menu_bar_t *mbar, ui_menu_ dd_t *mdd,492 void ui_menu_bar_entry_rect(ui_menu_bar_t *mbar, ui_menu_t *menu, 586 493 gfx_rect_t *rrect) 587 494 { … … 589 496 gfx_coord2_t pos; 590 497 gfx_rect_t rect; 591 ui_menu_ dd_t *cur;498 ui_menu_t *cur; 592 499 const char *caption; 593 500 gfx_coord_t width; … … 604 511 pos = mbar->rect.p0; 605 512 606 cur = ui_menu_ dd_first(mbar);513 cur = ui_menu_first(mbar); 607 514 while (cur != NULL) { 608 caption = ui_menu_ dd_caption(cur);515 caption = ui_menu_caption(cur); 609 516 width = ui_text_width(res->font, caption) + 2 * hpad; 610 517 … … 613 520 rect.p1.y = mbar->rect.p1.y; 614 521 615 if (cur == m dd) {522 if (cur == menu) { 616 523 *rrect = rect; 617 524 return; … … 619 526 620 527 pos.x += width; 621 cur = ui_menu_ dd_next(cur);528 cur = ui_menu_next(cur); 622 529 } 623 530 … … 637 544 mbar->active = true; 638 545 if (mbar->selected == NULL) 639 mbar->selected = ui_menu_ dd_first(mbar);546 mbar->selected = ui_menu_first(mbar); 640 547 641 548 (void) ui_menu_bar_paint(mbar); 642 549 } 643 550 644 /** Deactivate menu bar.645 *646 * @param mbar Menu bar647 */648 551 void ui_menu_bar_deactivate(ui_menu_bar_t *mbar) 649 552 { 650 553 ui_menu_bar_select(mbar, NULL, false, 0); 554 mbar->active = false; 651 555 } 652 556
Note:
See TracChangeset
for help on using the changeset viewer.
