Changeset 35cffea in mainline for uspace/lib/ui/src/wdecor.c
- Timestamp:
- 2022-05-19T08:02:31Z (3 years ago)
- Branches:
- master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- ad698f4
- Parents:
- fd05ea6
- git-author:
- Jiri Svoboda <jiri@…> (2022-05-18 17:02:12)
- git-committer:
- Jiri Svoboda <jiri@…> (2022-05-19 08:02:31)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/wdecor.c
rfd05ea6 r35cffea 49 49 #include "../private/wdecor.h" 50 50 51 static void ui_wdecor_btn_clicked(ui_pbutton_t *, void *); 51 static void ui_wdecor_btn_max_clicked(ui_pbutton_t *, void *); 52 static errno_t ui_wdecor_btn_max_paint(ui_pbutton_t *, void *, 53 gfx_coord2_t *); 54 55 static void ui_wdecor_btn_close_clicked(ui_pbutton_t *, void *); 52 56 static errno_t ui_wdecor_btn_close_paint(ui_pbutton_t *, void *, 53 57 gfx_coord2_t *); 54 58 59 static ui_pbutton_cb_t ui_wdecor_btn_max_cb = { 60 .clicked = ui_wdecor_btn_max_clicked 61 }; 62 63 static ui_pbutton_decor_ops_t ui_wdecor_btn_max_decor_ops = { 64 .paint = ui_wdecor_btn_max_paint 65 }; 66 55 67 static ui_pbutton_cb_t ui_wdecor_btn_close_cb = { 56 .clicked = ui_wdecor_btn_cl icked68 .clicked = ui_wdecor_btn_close_clicked 57 69 }; 58 70 … … 62 74 63 75 enum { 76 /** Width of corner drag area */ 64 77 wdecor_corner_w = 24, 78 /** Height of corner drag area */ 65 79 wdecor_corner_h = 24, 80 /** Window resizing edge witdth */ 66 81 wdecor_edge_w = 4, 82 /** Window resizing edge height */ 67 83 wdecor_edge_h = 4, 84 /** Title bar height */ 68 85 wdecor_tbar_h = 22, 86 /** Window width */ 69 87 wdecor_frame_w = 4, 88 /** Window frame width in text mode */ 70 89 wdecor_frame_w_text = 1, 90 /** Close button cross leg length */ 71 91 wdecor_close_cross_n = 5, 92 /** Close button cross pen width */ 72 93 wdecor_close_cross_w = 2, 73 wdecor_close_cross_h = 1 94 /** Close button cross pen height */ 95 wdecor_close_cross_h = 1, 96 /** Maximize icon width */ 97 wdecor_max_w = 10, 98 /** Maximize icon height */ 99 wdecor_max_h = 10, 100 /** Unmaximize icon window width */ 101 wdecor_unmax_w = 8, 102 /** Unmaximize icon window height */ 103 wdecor_unmax_h = 8, 104 /** Unmaximize icon window horizontal distance */ 105 wdecor_unmax_dw = 4, 106 /** Unmaximize icon window vertical distance */ 107 wdecor_unmax_dh = 4 74 108 }; 75 109 … … 98 132 } 99 133 100 rc = ui_pbutton_create(resource, "X", &wdecor->btn_close); 101 if (rc != EOK) { 102 free(wdecor->caption); 103 free(wdecor); 104 return rc; 105 } 106 107 ui_pbutton_set_cb(wdecor->btn_close, &ui_wdecor_btn_close_cb, 108 (void *)wdecor); 109 110 ui_pbutton_set_decor_ops(wdecor->btn_close, 111 &ui_wdecor_btn_close_decor_ops, (void *)wdecor); 134 if ((style & ui_wds_maximize_btn) != 0) { 135 rc = ui_pbutton_create(resource, "^", &wdecor->btn_max); 136 if (rc != EOK) { 137 ui_wdecor_destroy(wdecor); 138 return rc; 139 } 140 141 ui_pbutton_set_cb(wdecor->btn_max, &ui_wdecor_btn_max_cb, 142 (void *)wdecor); 143 144 ui_pbutton_set_decor_ops(wdecor->btn_max, 145 &ui_wdecor_btn_max_decor_ops, (void *)wdecor); 146 } 147 148 if ((style & ui_wds_close_btn) != 0) { 149 rc = ui_pbutton_create(resource, "X", &wdecor->btn_close); 150 if (rc != EOK) { 151 ui_wdecor_destroy(wdecor); 152 return rc; 153 } 154 155 ui_pbutton_set_cb(wdecor->btn_close, &ui_wdecor_btn_close_cb, 156 (void *)wdecor); 157 158 ui_pbutton_set_decor_ops(wdecor->btn_close, 159 &ui_wdecor_btn_close_decor_ops, (void *)wdecor); 160 } 112 161 113 162 wdecor->res = resource; … … 127 176 return; 128 177 178 ui_pbutton_destroy(wdecor->btn_max); 129 179 ui_pbutton_destroy(wdecor->btn_close); 130 180 free(wdecor->caption); … … 156 206 157 207 ui_wdecor_get_geom(wdecor, &geom); 158 ui_pbutton_set_rect(wdecor->btn_close, &geom.btn_close_rect); 208 209 if (wdecor->btn_max != NULL) 210 ui_pbutton_set_rect(wdecor->btn_max, &geom.btn_max_rect); 211 if (wdecor->btn_close != NULL) 212 ui_pbutton_set_rect(wdecor->btn_close, &geom.btn_close_rect); 159 213 } 160 214 … … 169 223 { 170 224 wdecor->active = active; 225 } 226 227 /** Set maximized flag. 228 * 229 * Active window is the one receiving keyboard events. 230 * 231 * @param wdecor Window decoration 232 * @param maximized @c true iff window is maximized 233 */ 234 void ui_wdecor_set_maximized(ui_wdecor_t *wdecor, bool maximized) 235 { 236 wdecor->maximized = maximized; 171 237 } 172 238 … … 289 355 return rc; 290 356 291 if ((wdecor->style & ui_wds_close_btn) != 0) { 357 if (wdecor->btn_max != NULL) { 358 rc = ui_pbutton_paint(wdecor->btn_max); 359 if (rc != EOK) 360 return rc; 361 } 362 363 if (wdecor->btn_close != NULL) { 292 364 rc = ui_pbutton_paint(wdecor->btn_close); 293 365 if (rc != EOK) … … 303 375 } 304 376 377 /** Send decoration maximize event. 378 * 379 * @param wdecor Window decoration 380 */ 381 void ui_wdecor_maximize(ui_wdecor_t *wdecor) 382 { 383 if (wdecor->cb != NULL && wdecor->cb->maximize != NULL) 384 wdecor->cb->maximize(wdecor, wdecor->arg); 385 } 386 387 /** Send decoration unmaximize event. 388 * 389 * @param wdecor Window decoration 390 */ 391 void ui_wdecor_unmaximize(ui_wdecor_t *wdecor) 392 { 393 if (wdecor->cb != NULL && wdecor->cb->unmaximize != NULL) 394 wdecor->cb->unmaximize(wdecor, wdecor->arg); 395 } 396 305 397 /** Send decoration close event. 306 398 * … … 356 448 { 357 449 gfx_coord_t frame_w; 450 gfx_coord_t btn_x; 451 gfx_coord_t btn_y; 358 452 359 453 /* Does window have a frame? */ … … 376 470 geom->title_bar_rect.p1.x = wdecor->rect.p1.x; 377 471 geom->title_bar_rect.p1.y = wdecor->rect.p0.y + 1; 472 473 btn_x = geom->title_bar_rect.p1.x - 1; 474 btn_y = geom->title_bar_rect.p0.y; 378 475 } else { 379 476 geom->title_bar_rect.p0 = geom->interior_rect.p0; … … 381 478 geom->title_bar_rect.p1.y = geom->interior_rect.p0.y + 382 479 wdecor_tbar_h; 480 481 btn_x = geom->title_bar_rect.p1.x - 1; 482 btn_y = geom->title_bar_rect.p0.y + 1; 383 483 } 384 484 … … 386 486 geom->app_area_rect.p0.y = geom->title_bar_rect.p1.y; 387 487 geom->app_area_rect.p1 = geom->interior_rect.p1; 488 388 489 } else { 389 490 geom->title_bar_rect.p0.x = 0; … … 393 494 394 495 geom->app_area_rect = geom->interior_rect; 496 btn_x = 0; 497 btn_y = 0; 395 498 } 396 499 … … 398 501 if ((wdecor->style & ui_wds_close_btn) != 0) { 399 502 if (wdecor->res->textmode == false) { 400 geom->btn_close_rect.p0.x = 401 geom->title_bar_rect.p1.x - 1 - 20; 402 geom->btn_close_rect.p0.y = 403 geom->title_bar_rect.p0.y + 1; 404 geom->btn_close_rect.p1.x = 405 geom->title_bar_rect.p1.x - 1; 406 geom->btn_close_rect.p1.y = 407 geom->title_bar_rect.p0.y + 1 + 20; 503 geom->btn_close_rect.p0.x = btn_x - 20; 504 geom->btn_close_rect.p0.y = btn_y; 505 geom->btn_close_rect.p1.x = btn_x; 506 geom->btn_close_rect.p1.y = btn_y + 20; 507 508 btn_x -= 20; 408 509 } else { 409 geom->btn_close_rect.p0.x = 410 geom->title_bar_rect.p1.x - 1 - 3; 411 geom->btn_close_rect.p0.y = 412 geom->title_bar_rect.p0.y; 413 geom->btn_close_rect.p1.x = 414 geom->title_bar_rect.p1.x - 1; 415 geom->btn_close_rect.p1.y = 416 geom->title_bar_rect.p0.y + 1; 510 geom->btn_close_rect.p0.x = btn_x - 3; 511 geom->btn_close_rect.p0.y = btn_y; 512 geom->btn_close_rect.p1.x = btn_x; 513 geom->btn_close_rect.p1.y = btn_y + 1; 514 515 btn_x -= 3; 417 516 } 418 517 } else { … … 422 521 geom->btn_close_rect.p1.y = 0; 423 522 } 523 524 /* Does window have a (un)maximize button? */ 525 if ((wdecor->style & ui_wds_maximize_btn) != 0) { 526 if (wdecor->res->textmode == false) { 527 geom->btn_max_rect.p0.x = btn_x - 20; 528 geom->btn_max_rect.p0.y = btn_y; 529 geom->btn_max_rect.p1.x = btn_x; 530 geom->btn_max_rect.p1.y = btn_y + 20; 531 } else { 532 geom->btn_max_rect.p0.x = btn_x - 3; 533 geom->btn_max_rect.p0.y = btn_y; 534 geom->btn_max_rect.p1.x = btn_x; 535 geom->btn_max_rect.p1.y = btn_y + 1; 536 } 537 } else { 538 geom->btn_max_rect.p0.x = 0; 539 geom->btn_max_rect.p0.y = 0; 540 geom->btn_max_rect.p1.x = 0; 541 geom->btn_max_rect.p1.y = 0; 542 } 424 543 } 425 544 … … 495 614 return ui_wr_none; 496 615 616 /* Window is maximized? */ 617 if (wdecor->maximized) 618 return ui_wr_none; 619 497 620 /* Position not inside window? */ 498 621 if (!gfx_pix_inside_rect(pos, &wdecor->rect)) … … 627 750 ui_wdecor_get_geom(wdecor, &geom); 628 751 629 if ((wdecor->style & ui_wds_close_btn) != 0) { 752 if (wdecor->btn_max != NULL) { 753 claim = ui_pbutton_pos_event(wdecor->btn_max, event); 754 if (claim == ui_claimed) 755 return ui_claimed; 756 } 757 758 if (wdecor->btn_close != NULL) { 630 759 claim = ui_pbutton_pos_event(wdecor->btn_close, event); 631 760 if (claim == ui_claimed) … … 635 764 ui_wdecor_frame_pos_event(wdecor, event); 636 765 637 if ((wdecor->style & ui_wds_titlebar) != 0 ) {766 if ((wdecor->style & ui_wds_titlebar) != 0 && !wdecor->maximized) { 638 767 if (event->type == POS_PRESS && 639 768 gfx_pix_inside_rect(&pos, &geom.title_bar_rect)) { … … 646 775 } 647 776 648 /** Window decoration close button was clicked.777 /** Window decoration (un)maximize button was clicked. 649 778 * 650 779 * @param pbutton Close button 651 780 * @param arg Argument (ui_wdecor_t) 652 781 */ 653 static void ui_wdecor_btn_clicked(ui_pbutton_t *pbutton, void *arg) 782 static void ui_wdecor_btn_max_clicked(ui_pbutton_t *pbutton, void *arg) 783 { 784 ui_wdecor_t *wdecor = (ui_wdecor_t *) arg; 785 786 (void) pbutton; 787 788 if (wdecor->maximized) 789 ui_wdecor_unmaximize(wdecor); 790 else 791 ui_wdecor_maximize(wdecor); 792 } 793 794 /** Paint (un)maximize button decoration. 795 * 796 * @param pbutton Push button 797 * @param arg Argument (ui_wdecor_t *) 798 * @param pos Center position 799 */ 800 static errno_t ui_wdecor_btn_max_paint(ui_pbutton_t *pbutton, 801 void *arg, gfx_coord2_t *pos) 802 { 803 ui_wdecor_t *wdecor = (ui_wdecor_t *)arg; 804 errno_t rc; 805 806 if (wdecor->maximized) { 807 rc = ui_paint_unmaxicon(wdecor->res, pos, wdecor_unmax_w, 808 wdecor_unmax_h, wdecor_unmax_dw, wdecor_unmax_dh); 809 } else { 810 rc = ui_paint_maxicon(wdecor->res, pos, wdecor_max_w, 811 wdecor_max_h); 812 } 813 814 return rc; 815 } 816 817 /** Window decoration close button was clicked. 818 * 819 * @param pbutton Close button 820 * @param arg Argument (ui_wdecor_t) 821 */ 822 static void ui_wdecor_btn_close_clicked(ui_pbutton_t *pbutton, void *arg) 654 823 { 655 824 ui_wdecor_t *wdecor = (ui_wdecor_t *) arg;
Note:
See TracChangeset
for help on using the changeset viewer.