Changes in uspace/lib/ui/src/window.c [3d10a2f:39f67f1] in mainline
- File:
-
- 1 edited
-
uspace/lib/ui/src/window.c (modified) (45 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/window.c
r3d10a2f r39f67f1 1 1 /* 2 * Copyright (c) 202 1Jiri Svoboda2 * Copyright (c) 2026 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 47 47 #include <stdlib.h> 48 48 #include <ui/control.h> 49 #include <ui/menubar.h> 50 #include <ui/menu.h> 51 #include <ui/menuentry.h> 49 52 #include <ui/resource.h> 50 53 #include <ui/ui.h> … … 59 62 60 63 static void dwnd_close_event(void *); 61 static void dwnd_focus_event(void * );64 static void dwnd_focus_event(void *, unsigned); 62 65 static void dwnd_kbd_event(void *, kbd_event_t *); 63 66 static void dwnd_pos_event(void *, pos_event_t *); 64 67 static void dwnd_resize_event(void *, gfx_rect_t *); 65 static void dwnd_unfocus_event(void * );68 static void dwnd_unfocus_event(void *, unsigned); 66 69 67 70 static display_wnd_cb_t dwnd_cb = { … … 74 77 }; 75 78 79 static void wd_sysmenu_open(ui_wdecor_t *, void *, sysarg_t); 80 static void wd_sysmenu_left(ui_wdecor_t *, void *, sysarg_t); 81 static void wd_sysmenu_right(ui_wdecor_t *, void *, sysarg_t); 82 static void wd_sysmenu_accel(ui_wdecor_t *, void *, char32_t, sysarg_t); 83 static void wd_minimize(ui_wdecor_t *, void *); 84 static void wd_maximize(ui_wdecor_t *, void *); 85 static void wd_unmaximize(ui_wdecor_t *, void *); 76 86 static void wd_close(ui_wdecor_t *, void *); 77 static void wd_move(ui_wdecor_t *, void *, gfx_coord2_t * );87 static void wd_move(ui_wdecor_t *, void *, gfx_coord2_t *, sysarg_t); 78 88 static void wd_resize(ui_wdecor_t *, void *, ui_wdecor_rsztype_t, 79 gfx_coord2_t * );89 gfx_coord2_t *, sysarg_t); 80 90 static void wd_set_cursor(ui_wdecor_t *, void *, ui_stock_cursor_t); 81 91 82 92 static ui_wdecor_cb_t wdecor_cb = { 93 .sysmenu_open = wd_sysmenu_open, 94 .sysmenu_left = wd_sysmenu_left, 95 .sysmenu_right = wd_sysmenu_right, 96 .sysmenu_accel = wd_sysmenu_accel, 97 .minimize = wd_minimize, 98 .maximize = wd_maximize, 99 .unmaximize = wd_unmaximize, 83 100 .close = wd_close, 84 101 .move = wd_move, … … 86 103 .set_cursor = wd_set_cursor 87 104 }; 105 106 static void wnd_sysmenu_left(ui_menu_t *, void *, sysarg_t); 107 static void wnd_sysmenu_right(ui_menu_t *, void *, sysarg_t); 108 static void wnd_sysmenu_close_req(ui_menu_t *, void *); 109 static void wnd_sysmenu_press_accel(ui_menu_t *, void *, char32_t, sysarg_t); 110 111 static ui_menu_cb_t wnd_sysmenu_cb = { 112 .left = wnd_sysmenu_left, 113 .right = wnd_sysmenu_right, 114 .close_req = wnd_sysmenu_close_req, 115 .press_accel = wnd_sysmenu_press_accel 116 }; 117 118 static void wnd_sysmenu_erestore(ui_menu_entry_t *, void *); 119 static void wnd_sysmenu_eminimize(ui_menu_entry_t *, void *); 120 static void wnd_sysmenu_emaximize(ui_menu_entry_t *, void *); 121 static void wnd_sysmenu_eclose(ui_menu_entry_t *, void *); 88 122 89 123 static void ui_window_invalidate(void *, gfx_rect_t *); … … 137 171 * @param window Window 138 172 * @param drect Display rectangle 173 * @param wrect Window rectangle 174 * @param prect Parent rectangle for popup placement or @c NULL 175 * @param placement Window placement 139 176 * @param params Window parameters 140 177 * @param pos Place to store position of top-left corner 141 178 */ 142 179 static void ui_window_place(ui_window_t *window, gfx_rect_t *drect, 143 ui_wnd_params_t *params, gfx_coord2_t *pos) 180 gfx_rect_t *wrect, gfx_rect_t *prect, ui_wnd_placement_t placement, 181 gfx_coord2_t *pos) 144 182 { 145 183 gfx_coord2_t dims; 146 147 assert(params->placement != ui_wnd_place_default || 184 gfx_coord2_t below_pos; 185 gfx_rect_t below_rect; 186 187 assert(placement != ui_wnd_place_default || 148 188 ui_is_fullscreen(window->ui)); 149 189 … … 151 191 pos->y = 0; 152 192 153 switch (p arams->placement) {193 switch (placement) { 154 194 case ui_wnd_place_default: 155 assert(ui_is_fullscreen(window->ui)); 195 case ui_wnd_place_center: 196 assert(placement != ui_wnd_place_default || 197 ui_is_fullscreen(window->ui)); 156 198 /* Center window */ 157 gfx_rect_dims( ¶ms->rect, &dims);199 gfx_rect_dims(wrect, &dims); 158 200 pos->x = (drect->p0.x + drect->p1.x) / 2 - dims.x / 2; 159 201 pos->y = (drect->p0.y + drect->p1.y) / 2 - dims.y / 2; … … 161 203 case ui_wnd_place_top_left: 162 204 case ui_wnd_place_full_screen: 163 pos->x = drect->p0.x - params->rect.p0.x;164 pos->y = drect->p0.y - params->rect.p0.y;205 pos->x = drect->p0.x - wrect->p0.x; 206 pos->y = drect->p0.y - wrect->p0.y; 165 207 break; 166 208 case ui_wnd_place_top_right: 167 pos->x = drect->p1.x - params->rect.p1.x;168 pos->y = drect->p0.y - params->rect.p0.y;209 pos->x = drect->p1.x - wrect->p1.x; 210 pos->y = drect->p0.y - wrect->p0.y; 169 211 break; 170 212 case ui_wnd_place_bottom_left: 171 pos->x = drect->p0.x - params->rect.p0.x;172 pos->y = drect->p1.y - params->rect.p1.y;213 pos->x = drect->p0.x - wrect->p0.x; 214 pos->y = drect->p1.y - wrect->p1.y; 173 215 break; 174 216 case ui_wnd_place_bottom_right: 175 pos->x = drect->p1.x - params->rect.p1.x;176 pos->y = drect->p1.y - params->rect.p1.y;217 pos->x = drect->p1.x - wrect->p1.x; 218 pos->y = drect->p1.y - wrect->p1.y; 177 219 break; 178 220 case ui_wnd_place_popup: 179 /* Place popup window below parent rectangle */ 180 pos->x = params->prect.p0.x; 181 pos->y = params->prect.p1.y; 221 /* Compute rectangle when placed below */ 222 below_pos.x = prect->p0.x; 223 below_pos.y = prect->p1.y; 224 gfx_rect_translate(&below_pos, wrect, &below_rect); 225 226 /* Does below_rect fit within the display? */ 227 if (gfx_rect_is_inside(&below_rect, drect)) { 228 /* Place popup window below parent rectangle */ 229 pos->x = prect->p0.x - wrect->p0.x; 230 pos->y = prect->p1.y - wrect->p0.y; 231 } else { 232 /* Place popup window above parent rectangle */ 233 pos->x = prect->p0.x; 234 pos->y = prect->p0.y - 235 (wrect->p1.y - wrect->p0.y); 236 } 182 237 break; 183 238 } 239 } 240 241 static void ui_window_set_dpos(ui_window_t *window, gfx_coord2_t *dpos) 242 { 243 window->dpos = *dpos; 244 if (window->xgc != NULL) 245 xlate_gc_set_off(window->xgc, &window->dpos); 246 } 247 248 /** Create window's system menu. 249 * 250 * @param window Window 251 * @return EOK on success or an error code 252 */ 253 static errno_t ui_window_sysmenu_create(ui_window_t *window) 254 { 255 errno_t rc; 256 ui_menu_entry_t *mrestore; 257 ui_menu_entry_t *mmin; 258 ui_menu_entry_t *mmax; 259 ui_menu_entry_t *msep; 260 ui_menu_entry_t *mclose; 261 262 rc = ui_menu_create(window, &window->sysmenu); 263 if (rc != EOK) 264 goto error; 265 266 ui_menu_set_cb(window->sysmenu, &wnd_sysmenu_cb, (void *)window); 267 268 rc = ui_menu_entry_create(window->sysmenu, "~R~estore", 269 "", &mrestore); 270 if (rc != EOK) 271 goto error; 272 273 if (!window->wdecor->maximized) 274 ui_menu_entry_set_disabled(mrestore, true); 275 276 ui_menu_entry_set_cb(mrestore, wnd_sysmenu_erestore, (void *)window); 277 278 rc = ui_menu_entry_create(window->sysmenu, "Mi~n~imize", 279 "", &mmin); 280 if (rc != EOK) 281 goto error; 282 283 if ((window->wdecor->style & ui_wds_minimize_btn) == 0) 284 ui_menu_entry_set_disabled(mmin, true); 285 286 ui_menu_entry_set_cb(mmin, wnd_sysmenu_eminimize, (void *)window); 287 288 rc = ui_menu_entry_create(window->sysmenu, "Ma~x~imize", 289 "", &mmax); 290 if (rc != EOK) 291 goto error; 292 293 if ((window->wdecor->style & ui_wds_maximize_btn) == 0 || 294 window->wdecor->maximized) 295 ui_menu_entry_set_disabled(mmax, true); 296 297 ui_menu_entry_set_cb(mmax, wnd_sysmenu_emaximize, (void *)window); 298 299 rc = ui_menu_entry_sep_create(window->sysmenu, &msep); 300 if (rc != EOK) 301 goto error; 302 303 rc = ui_menu_entry_create(window->sysmenu, "~C~lose", "Alt-F4", 304 &mclose); 305 if (rc != EOK) 306 goto error; 307 308 if ((window->wdecor->style & ui_wds_close_btn) == 0) 309 ui_menu_entry_set_disabled(mclose, true); 310 311 ui_menu_entry_set_cb(mclose, wnd_sysmenu_eclose, (void *)window); 312 313 window->sysmenu_restore = mrestore; 314 window->sysmenu_minimize = mmin; 315 window->sysmenu_maximize = mmax; 316 317 return EOK; 318 error: 319 return rc; 184 320 } 185 321 … … 195 331 { 196 332 ui_window_t *window; 333 ui_window_t *pwindow = NULL; 197 334 display_info_t info; 198 335 gfx_coord2_t scr_dims; … … 208 345 mem_gc_t *memgc = NULL; 209 346 xlate_gc_t *xgc = NULL; 347 gfx_coord2_t dpos; 210 348 errno_t rc; 211 349 … … 218 356 display_wnd_params_init(&dparams); 219 357 dparams.rect = params->rect; 220 /* Only allow making the window larger */ 221 gfx_rect_dims(¶ms->rect, &dparams.min_size); 358 dparams.caption = params->caption; 359 dparams.min_size = params->min_size; 360 361 /* 362 * If idev_id is not specified, use the UI default (probably 363 * obtained from display specification. This creates the 364 * main window in the seat specified on the command line. 365 */ 366 if (params->idev_id != 0) 367 dparams.idev_id = params->idev_id; 368 else 369 dparams.idev_id = ui->idev_id; 222 370 223 371 if ((params->flags & ui_wndf_popup) != 0) 224 372 dparams.flags |= wndf_popup; 373 if ((params->flags & ui_wndf_nofocus) != 0) 374 dparams.flags |= wndf_nofocus; 375 if ((params->flags & ui_wndf_topmost) != 0) 376 dparams.flags |= wndf_topmost; 377 if ((params->flags & ui_wndf_system) != 0) 378 dparams.flags |= wndf_system; 379 if ((params->flags & ui_wndf_avoid) != 0) 380 dparams.flags |= wndf_avoid; 225 381 226 382 if (ui->display != NULL) { … … 240 396 if (params->placement != ui_wnd_place_default) { 241 397 /* Set initial display window position */ 242 ui_window_place(window, &info.rect, params,243 & dparams.pos);398 ui_window_place(window, &info.rect, ¶ms->rect, 399 ¶ms->prect, params->placement, &dparams.pos); 244 400 245 401 dparams.flags |= wndf_setpos; … … 262 418 gfx_coord2_add(&dparams.rect.p0, &scr_dims, 263 419 &dparams.rect.p1); 420 (void) console_set_caption(ui->console, 421 params->caption); 264 422 } 265 423 } else { … … 331 489 #endif 332 490 if (ui->display == NULL) { 333 ui_window_place(window, &ui->rect, params, &window->dpos); 334 335 if (window->xgc != NULL) 336 xlate_gc_set_off(window->xgc, &window->dpos); 491 ui_window_place(window, &ui->rect, ¶ms->rect, ¶ms->prect, 492 params->placement, &dpos); 493 ui_window_set_dpos(window, &dpos); 337 494 } 338 495 … … 355 512 window->wdecor = wdecor; 356 513 window->cursor = ui_curs_arrow; 514 window->placement = params->placement; 515 516 rc = ui_window_sysmenu_create(window); 517 if (rc != EOK) 518 goto error; 519 357 520 *rwindow = window; 358 521 522 if (ui_is_fullscreen(ui)) 523 pwindow = ui_window_get_active(ui); 524 359 525 list_append(&window->lwindows, &ui->windows); 526 527 if (ui_is_fullscreen(ui)) { 528 /* Send unfocus event to previously active window */ 529 if (pwindow != NULL) 530 ui_window_send_unfocus(pwindow, 0); 531 } 532 360 533 return EOK; 361 534 error: … … 376 549 } 377 550 551 /** Update window placement after screen resize (only in fullscreen UI). 552 * 553 * @param window UI window 554 */ 555 void ui_window_update_placement(ui_window_t *window) 556 { 557 gfx_coord2_t dpos; 558 559 if (window->placement != ui_wnd_place_popup) { 560 ui_window_place(window, &window->ui->rect, &window->rect, 561 NULL, window->placement, &window->dpos); 562 ui_window_set_dpos(window, &dpos); 563 } 564 565 if (window->placement == ui_wnd_place_full_screen) { 566 (void)ui_window_resize(window, &window->ui->rect); 567 ui_window_send_resize(window); 568 } 569 } 570 378 571 /** Destroy window. 379 572 * … … 383 576 { 384 577 ui_t *ui; 578 ui_window_t *nwindow; 385 579 386 580 if (window == NULL) … … 391 585 list_remove(&window->lwindows); 392 586 ui_control_destroy(window->control); 587 ui_menu_destroy(window->sysmenu); 393 588 ui_wdecor_destroy(window->wdecor); 394 589 ui_resource_destroy(window->res); 395 if ( 0 &&window->app_mgc != NULL)590 if (window->app_mgc != NULL) 396 591 mem_gc_delete(window->app_mgc); 397 if ( 0 &&window->app_bmp != NULL)592 if (window->app_bmp != NULL) 398 593 gfx_bitmap_destroy(window->app_bmp); 399 594 if (window->mgc != NULL) { … … 406 601 display_window_destroy(window->dwindow); 407 602 408 free(window);409 410 603 /* Need to repaint if windows are emulated */ 411 604 if (ui_is_fullscreen(ui)) { 412 ui_paint(ui); 413 } 605 (void)ui_paint(ui); 606 /* Send focus event to newly active window */ 607 nwindow = ui_window_get_active(ui); 608 if (nwindow != NULL) 609 ui_window_send_focus(nwindow, 0); 610 } 611 612 if (ui->console != NULL && 613 window->placement == ui_wnd_place_full_screen) { 614 (void) console_set_caption(ui->console, ""); 615 } 616 617 free(window); 414 618 } 415 619 … … 421 625 * @param window Window 422 626 * @param control Control 423 * @return EOK on success, ENOMEM if out of memory424 627 */ 425 628 void ui_window_add(ui_window_t *window, ui_control_t *control) … … 443 646 window->control = NULL; 444 647 control->elemp = NULL; 648 } 649 650 /** Get first (lowermost) window (only valid in fullscreen mode). 651 * 652 * @param ui User interface 653 * @return First window 654 */ 655 ui_window_t *ui_window_first(ui_t *ui) 656 { 657 link_t *link; 658 659 link = list_first(&ui->windows); 660 if (link == NULL) 661 return NULL; 662 663 return list_get_instance(link, ui_window_t, lwindows); 664 } 665 666 /** Get next window (only valid in fullscreen mode). 667 * 668 * @param cur Current window 669 * @return First window 670 */ 671 ui_window_t *ui_window_next(ui_window_t *cur) 672 { 673 link_t *link; 674 675 link = list_next(&cur->lwindows, &cur->ui->windows); 676 if (link == NULL) 677 return NULL; 678 679 return list_get_instance(link, ui_window_t, lwindows); 445 680 } 446 681 … … 461 696 } 462 697 463 /** Resize/move window. 464 * 465 * Resize window to the dimensions of @a rect. If @a rect.p0 is not 0,0, 466 * the top-left corner of the window will move on the screen accordingly. 698 /** Resize or (un)maximize window. 467 699 * 468 700 * @param window Window 469 701 * @param rect Rectangle 702 * @param scop Size change operation 470 703 * 471 704 * @return EOK on success or an error code 472 705 */ 473 errno_t ui_window_resize(ui_window_t *window, gfx_rect_t *rect) 706 errno_t ui_window_size_change(ui_window_t *window, gfx_rect_t *rect, 707 ui_wnd_sc_op_t scop) 474 708 { 475 709 gfx_coord2_t offs; … … 482 716 gfx_bitmap_alloc_t app_alloc; 483 717 gfx_bitmap_alloc_t win_alloc; 718 gfx_coord2_t dpos; 484 719 errno_t rc; 485 720 … … 537 772 } 538 773 539 /* dwindow can be NULL in case of unit tests */774 /* dwindow can be NULL in case of unit tests or fullscreen mode */ 540 775 if (window->dwindow != NULL) { 541 rc = display_window_resize(window->dwindow, &offs, &nrect); 542 if (rc != EOK) 543 goto error; 776 switch (scop) { 777 case ui_wsc_resize: 778 rc = display_window_resize(window->dwindow, &offs, 779 &nrect); 780 if (rc != EOK) 781 goto error; 782 break; 783 case ui_wsc_maximize: 784 rc = display_window_maximize(window->dwindow); 785 if (rc != EOK) 786 goto error; 787 break; 788 case ui_wsc_unmaximize: 789 rc = display_window_unmaximize(window->dwindow); 790 if (rc != EOK) 791 goto error; 792 break; 793 } 794 } else { 795 /* fullscreen mode or unit tests */ 796 switch (scop) { 797 case ui_wsc_resize: 798 break; 799 case ui_wsc_maximize: 800 window->normal_dpos = window->dpos; 801 dpos.x = 0; 802 dpos.y = 0; 803 ui_window_set_dpos(window, &dpos); 804 break; 805 case ui_wsc_unmaximize: 806 ui_window_set_dpos(window, &window->normal_dpos); 807 break; 808 } 544 809 } 545 810 … … 549 814 /* Window is resized, now we can map the window bitmap again */ 550 815 gfx_bitmap_params_init(&win_params); 551 win_params.flags |= bmpf_direct_output; 816 if (window->ui->display != NULL) 817 win_params.flags |= bmpf_direct_output; 552 818 win_params.rect = nrect; 553 819 … … 561 827 goto error; 562 828 #endif 563 564 829 mem_gc_retarget(window->mgc, &win_params.rect, &win_alloc); 565 830 … … 568 833 } 569 834 835 window->rect = nrect; 570 836 ui_wdecor_set_rect(window->wdecor, &nrect); 571 837 ui_wdecor_paint(window->wdecor); … … 579 845 window->app_bmp = app_bmp; 580 846 } 847 848 /* Need to repaint UI if windows are emulated */ 849 if (ui_is_fullscreen(window->ui)) 850 (void)ui_paint(window->ui); 581 851 582 852 return EOK; … … 589 859 } 590 860 861 /** Resize/move window. 862 * 863 * Resize window to the dimensions of @a rect. If @a rect.p0 is not 0,0, 864 * the top-left corner of the window will move on the screen accordingly. 865 * 866 * @param window Window 867 * @param rect Rectangle 868 * 869 * @return EOK on success or an error code 870 */ 871 errno_t ui_window_resize(ui_window_t *window, gfx_rect_t *rect) 872 { 873 return ui_window_size_change(window, rect, ui_wsc_resize); 874 } 875 591 876 /** Set window callbacks. 592 877 * … … 599 884 window->cb = cb; 600 885 window->arg = arg; 886 } 887 888 /** Change window caption. 889 * 890 * @param window Window 891 * @param caption New caption 892 * 893 * @return EOK on success or an error code 894 */ 895 errno_t ui_window_set_caption(ui_window_t *window, const char *caption) 896 { 897 errno_t rc; 898 899 /* Set console caption if fullscreen window on console */ 900 if (window->ui->console != NULL && window->placement == 901 ui_wnd_place_full_screen) { 902 rc = console_set_caption(window->ui->console, caption); 903 if (rc != EOK) 904 return rc; 905 } 906 907 /* Set display window caption if running on display service */ 908 if (window->dwindow != NULL) { 909 rc = display_window_set_caption(window->dwindow, caption); 910 if (rc != EOK) 911 return rc; 912 } 913 914 return ui_wdecor_set_caption(window->wdecor, caption); 601 915 } 602 916 … … 746 1060 { 747 1061 ui_window_t *window = (ui_window_t *) arg; 748 1062 ui_t *ui = window->ui; 1063 1064 fibril_mutex_lock(&ui->lock); 749 1065 ui_window_send_close(window); 1066 fibril_mutex_unlock(&ui->lock); 750 1067 } 751 1068 752 1069 /** Handle window focus event. */ 753 static void dwnd_focus_event(void *arg) 754 { 755 ui_window_t *window = (ui_window_t *) arg; 1070 static void dwnd_focus_event(void *arg, unsigned nfocus) 1071 { 1072 ui_window_t *window = (ui_window_t *) arg; 1073 ui_t *ui = window->ui; 1074 1075 fibril_mutex_lock(&ui->lock); 1076 (void)nfocus; 756 1077 757 1078 if (window->wdecor != NULL) { … … 760 1081 } 761 1082 762 ui_window_send_focus(window); 1083 ui_window_send_focus(window, nfocus); 1084 fibril_mutex_unlock(&ui->lock); 763 1085 } 764 1086 … … 767 1089 { 768 1090 ui_window_t *window = (ui_window_t *) arg; 769 770 (void) window; 1091 ui_t *ui = window->ui; 1092 1093 fibril_mutex_lock(&ui->lock); 771 1094 ui_window_send_kbd(window, kbd_event); 1095 fibril_mutex_unlock(&ui->lock); 772 1096 } 773 1097 … … 776 1100 { 777 1101 ui_window_t *window = (ui_window_t *) arg; 1102 ui_t *ui = window->ui; 1103 ui_evclaim_t claim; 778 1104 779 1105 /* Make sure we don't process events until fully initialized */ … … 781 1107 return; 782 1108 783 ui_wdecor_pos_event(window->wdecor, event); 1109 fibril_mutex_lock(&ui->lock); 1110 1111 claim = ui_wdecor_pos_event(window->wdecor, event); 1112 if (claim == ui_claimed) { 1113 fibril_mutex_unlock(&ui->lock); 1114 return; 1115 } 1116 784 1117 ui_window_send_pos(window, event); 1118 fibril_mutex_unlock(&ui->lock); 785 1119 } 786 1120 … … 789 1123 { 790 1124 ui_window_t *window = (ui_window_t *) arg; 1125 ui_t *ui = window->ui; 791 1126 792 1127 /* Make sure we don't process events until fully initialized */ … … 797 1132 return; 798 1133 1134 fibril_mutex_lock(&ui->lock); 799 1135 (void) ui_window_resize(window, rect); 800 (void) ui_window_paint(window); 1136 ui_window_send_resize(window); 1137 fibril_mutex_unlock(&ui->lock); 801 1138 } 802 1139 803 1140 /** Handle window unfocus event. */ 804 static void dwnd_unfocus_event(void *arg) 805 { 806 ui_window_t *window = (ui_window_t *) arg; 807 808 if (window->wdecor != NULL) { 1141 static void dwnd_unfocus_event(void *arg, unsigned nfocus) 1142 { 1143 ui_window_t *window = (ui_window_t *) arg; 1144 ui_t *ui = window->ui; 1145 1146 fibril_mutex_lock(&ui->lock); 1147 1148 if (window->wdecor != NULL && nfocus == 0) { 809 1149 ui_wdecor_set_active(window->wdecor, false); 810 1150 ui_wdecor_paint(window->wdecor); 811 1151 } 812 1152 813 ui_window_send_unfocus(window); 1153 ui_window_send_unfocus(window, nfocus); 1154 fibril_mutex_unlock(&ui->lock); 1155 } 1156 1157 /** Window decoration requested opening of system menu. 1158 * 1159 * @param wdecor Window decoration 1160 * @param arg Argument (window) 1161 * @param idev_id Input device ID 1162 */ 1163 static void wd_sysmenu_open(ui_wdecor_t *wdecor, void *arg, sysarg_t idev_id) 1164 { 1165 ui_window_t *window = (ui_window_t *) arg; 1166 1167 ui_window_send_sysmenu(window, idev_id); 1168 } 1169 1170 /** Window decoration requested moving left from system menu handle. 1171 * 1172 * @param wdecor Window decoration 1173 * @param arg Argument (window) 1174 * @param idev_id Input device ID 1175 */ 1176 static void wd_sysmenu_left(ui_wdecor_t *wdecor, void *arg, sysarg_t idev_id) 1177 { 1178 ui_window_t *window = (ui_window_t *) arg; 1179 1180 if (window->mbar != NULL) { 1181 ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false); 1182 ui_menu_close(window->sysmenu); 1183 ui_menu_bar_select_last(window->mbar, false, idev_id); 1184 } 1185 } 1186 1187 /** Window decoration requested moving right from system menu handle. 1188 * 1189 * @param wdecor Window decoration 1190 * @param arg Argument (window) 1191 * @param idev_id Input device ID 1192 */ 1193 static void wd_sysmenu_right(ui_wdecor_t *wdecor, void *arg, sysarg_t idev_id) 1194 { 1195 ui_window_t *window = (ui_window_t *) arg; 1196 1197 if (window->mbar != NULL) { 1198 ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false); 1199 ui_menu_close(window->sysmenu); 1200 ui_menu_bar_select_first(window->mbar, false, idev_id); 1201 } 1202 } 1203 1204 /** Window decoration detected accelerator press from system menu handle. 1205 * 1206 * @param wdecor Window decoration 1207 * @param arg Argument (window) 1208 * @param c Accelerator key 1209 * @param idev_id Input device ID 1210 */ 1211 static void wd_sysmenu_accel(ui_wdecor_t *wdecor, void *arg, char32_t c, 1212 sysarg_t idev_id) 1213 { 1214 ui_window_t *window = (ui_window_t *) arg; 1215 1216 if (window->mbar != NULL) { 1217 ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false); 1218 ui_menu_close(window->sysmenu); 1219 ui_menu_bar_press_accel(window->mbar, c, idev_id); 1220 } 1221 } 1222 1223 /** Window decoration requested window minimization. 1224 * 1225 * @param wdecor Window decoration 1226 * @param arg Argument (window) 1227 */ 1228 static void wd_minimize(ui_wdecor_t *wdecor, void *arg) 1229 { 1230 ui_window_t *window = (ui_window_t *) arg; 1231 1232 ui_window_send_minimize(window); 1233 } 1234 1235 /** Window decoration requested window maximization. 1236 * 1237 * @param wdecor Window decoration 1238 * @param arg Argument (window) 1239 */ 1240 static void wd_maximize(ui_wdecor_t *wdecor, void *arg) 1241 { 1242 ui_window_t *window = (ui_window_t *) arg; 1243 1244 ui_window_send_maximize(window); 1245 } 1246 1247 /** Window decoration requested window unmaximization. 1248 * 1249 * @param wdecor Window decoration 1250 * @param arg Argument (window) 1251 */ 1252 static void wd_unmaximize(ui_wdecor_t *wdecor, void *arg) 1253 { 1254 ui_window_t *window = (ui_window_t *) arg; 1255 1256 ui_window_send_unmaximize(window); 814 1257 } 815 1258 … … 831 1274 * @param arg Argument (window) 832 1275 * @param pos Position where the title bar was pressed 833 */ 834 static void wd_move(ui_wdecor_t *wdecor, void *arg, gfx_coord2_t *pos) 1276 * @param pos_id Positioning device ID 1277 */ 1278 static void wd_move(ui_wdecor_t *wdecor, void *arg, gfx_coord2_t *pos, 1279 sysarg_t pos_id) 835 1280 { 836 1281 ui_window_t *window = (ui_window_t *) arg; 837 1282 838 1283 if (window->dwindow != NULL) 839 (void) display_window_move_req(window->dwindow, pos );1284 (void) display_window_move_req(window->dwindow, pos, pos_id); 840 1285 } 841 1286 … … 846 1291 * @param rsztype Resize type 847 1292 * @param pos Position where the button was pressed 1293 * @param pos_id Positioning device ID 848 1294 */ 849 1295 static void wd_resize(ui_wdecor_t *wdecor, void *arg, 850 ui_wdecor_rsztype_t rsztype, gfx_coord2_t *pos) 851 { 852 ui_window_t *window = (ui_window_t *) arg; 853 854 if (window->dwindow != NULL) 855 (void) display_window_resize_req(window->dwindow, rsztype, pos); 1296 ui_wdecor_rsztype_t rsztype, gfx_coord2_t *pos, sysarg_t pos_id) 1297 { 1298 ui_window_t *window = (ui_window_t *) arg; 1299 1300 if (window->dwindow != NULL) { 1301 (void) display_window_resize_req(window->dwindow, 1302 (display_wnd_rsztype_t) rsztype, // Same constants in the enums 1303 pos, pos_id); 1304 } 856 1305 } 857 1306 … … 914 1363 } 915 1364 1365 /** Send window sysmenu event. 1366 * 1367 * @param window Window 1368 * @parma idev_id Input device ID 1369 */ 1370 void ui_window_send_sysmenu(ui_window_t *window, sysarg_t idev_id) 1371 { 1372 if (window->cb != NULL && window->cb->sysmenu != NULL) 1373 window->cb->sysmenu(window, window->arg, idev_id); 1374 else 1375 ui_window_def_sysmenu(window, idev_id); 1376 } 1377 1378 /** Send window minimize event. 1379 * 1380 * @param window Window 1381 */ 1382 void ui_window_send_minimize(ui_window_t *window) 1383 { 1384 if (window->cb != NULL && window->cb->minimize != NULL) 1385 window->cb->minimize(window, window->arg); 1386 else 1387 ui_window_def_minimize(window); 1388 } 1389 1390 /** Send window maximize event. 1391 * 1392 * @param window Window 1393 */ 1394 void ui_window_send_maximize(ui_window_t *window) 1395 { 1396 if (window->cb != NULL && window->cb->maximize != NULL) 1397 window->cb->maximize(window, window->arg); 1398 else 1399 ui_window_def_maximize(window); 1400 } 1401 1402 /** Send window unmaximize event. 1403 * 1404 * @param window Window 1405 */ 1406 void ui_window_send_unmaximize(ui_window_t *window) 1407 { 1408 if (window->cb != NULL && window->cb->unmaximize != NULL) 1409 window->cb->unmaximize(window, window->arg); 1410 else 1411 ui_window_def_unmaximize(window); 1412 } 1413 916 1414 /** Send window close event. 917 1415 * … … 927 1425 * 928 1426 * @param window Window 929 */ 930 void ui_window_send_focus(ui_window_t *window) 1427 * @param nfocus New number of foci 1428 */ 1429 void ui_window_send_focus(ui_window_t *window, unsigned nfocus) 931 1430 { 932 1431 if (window->cb != NULL && window->cb->focus != NULL) 933 window->cb->focus(window, window->arg );1432 window->cb->focus(window, window->arg, nfocus); 934 1433 } 935 1434 … … 943 1442 window->cb->kbd(window, window->arg, kbd); 944 1443 else 945 returnui_window_def_kbd(window, kbd);1444 ui_window_def_kbd(window, kbd); 946 1445 } 947 1446 … … 973 1472 * 974 1473 * @param window Window 975 */ 976 void ui_window_send_unfocus(ui_window_t *window) 1474 * @param nfocus Number of remaining foci 1475 */ 1476 void ui_window_send_unfocus(ui_window_t *window, unsigned nfocus) 977 1477 { 978 1478 if (window->cb != NULL && window->cb->unfocus != NULL) 979 window->cb->unfocus(window, window->arg );1479 window->cb->unfocus(window, window->arg, nfocus); 980 1480 else 981 return ui_window_def_unfocus(window); 1481 return ui_window_def_unfocus(window, nfocus); 1482 } 1483 1484 /** Send window resize event. 1485 * 1486 * @param window Window 1487 */ 1488 void ui_window_send_resize(ui_window_t *window) 1489 { 1490 if (window->cb != NULL && window->cb->resize != NULL) 1491 window->cb->resize(window, window->arg); 1492 else 1493 return ui_window_def_resize(window); 1494 } 1495 1496 /** Default window sysmenu routine. 1497 * 1498 * @param window Window 1499 * @param idev_id Input device ID 1500 * @return EOK on success or an error code 1501 */ 1502 errno_t ui_window_def_sysmenu(ui_window_t *window, sysarg_t idev_id) 1503 { 1504 errno_t rc; 1505 ui_wdecor_geom_t geom; 1506 1507 if (ui_menu_is_open(window->sysmenu)) { 1508 ui_menu_close(window->sysmenu); 1509 } else { 1510 ui_wdecor_get_geom(window->wdecor, &geom); 1511 1512 rc = ui_menu_open(window->sysmenu, &geom.title_bar_rect, 1513 idev_id); 1514 if (rc != EOK) 1515 goto error; 1516 } 1517 1518 return EOK; 1519 error: 1520 return rc; 1521 } 1522 1523 /** Default window minimize routine. 1524 * 1525 * @param window Window 1526 * @return EOK on success or an error code 1527 */ 1528 errno_t ui_window_def_minimize(ui_window_t *window) 1529 { 1530 errno_t rc; 1531 1532 if (window->dwindow != NULL) { 1533 rc = display_window_minimize(window->dwindow); 1534 if (rc != EOK) 1535 goto error; 1536 } 1537 1538 return EOK; 1539 error: 1540 return rc; 1541 } 1542 1543 /** Default window maximize routine. 1544 * 1545 * @param window Window 1546 * @return EOK on success or an error code 1547 */ 1548 errno_t ui_window_def_maximize(ui_window_t *window) 1549 { 1550 errno_t rc; 1551 gfx_rect_t old_rect; 1552 gfx_rect_t rect; 1553 1554 old_rect = window->rect; 1555 1556 if (window->dwindow != NULL) { 1557 rc = display_window_get_max_rect(window->dwindow, &rect); 1558 if (rc != EOK) 1559 return rc; 1560 } else { 1561 rect = window->ui->rect; 1562 } 1563 1564 ui_wdecor_set_maximized(window->wdecor, true); 1565 ui_menu_entry_set_disabled(window->sysmenu_restore, false); 1566 ui_menu_entry_set_disabled(window->sysmenu_maximize, true); 1567 1568 rc = ui_window_size_change(window, &rect, ui_wsc_maximize); 1569 if (rc != EOK) { 1570 ui_wdecor_set_maximized(window->wdecor, false); 1571 return rc; 1572 } 1573 1574 window->normal_rect = old_rect; 1575 (void) ui_window_paint(window); 1576 return EOK; 1577 } 1578 1579 /** Default window unmaximize routine. 1580 * 1581 * @param window Window 1582 * @return EOK on success or an error code 1583 */ 1584 errno_t ui_window_def_unmaximize(ui_window_t *window) 1585 { 1586 errno_t rc; 1587 1588 ui_wdecor_set_maximized(window->wdecor, false); 1589 ui_menu_entry_set_disabled(window->sysmenu_restore, true); 1590 ui_menu_entry_set_disabled(window->sysmenu_maximize, false); 1591 1592 rc = ui_window_size_change(window, &window->normal_rect, 1593 ui_wsc_unmaximize); 1594 if (rc != EOK) { 1595 ui_wdecor_set_maximized(window->wdecor, true); 1596 printf("ui_window_size_change->error\n"); 1597 return rc; 1598 } 1599 1600 (void) ui_window_paint(window); 1601 return EOK; 982 1602 } 983 1603 … … 985 1605 * 986 1606 * @param window Window 987 */ 988 void ui_window_def_kbd(ui_window_t *window, kbd_event_t *kbd) 989 { 1607 * @return ui_claimed iff event was claimed 1608 */ 1609 ui_evclaim_t ui_window_def_kbd(ui_window_t *window, kbd_event_t *kbd) 1610 { 1611 ui_evclaim_t claim; 1612 990 1613 if (window->control != NULL) 991 ui_control_kbd_event(window->control, kbd); 1614 claim = ui_control_kbd_event(window->control, kbd); 1615 else 1616 claim = ui_unclaimed; 1617 1618 if (claim == ui_unclaimed) 1619 return ui_wdecor_kbd_event(window->wdecor, kbd); 1620 1621 return ui_unclaimed; 992 1622 } 993 1623 … … 1035 1665 * 1036 1666 * @param window Window 1667 * @param nfocus Number of remaining foci 1037 1668 * @return EOK on success or an error code 1038 1669 */ 1039 void ui_window_def_unfocus(ui_window_t *window )1670 void ui_window_def_unfocus(ui_window_t *window, unsigned nfocus) 1040 1671 { 1041 1672 if (window->control != NULL) 1042 ui_control_unfocus(window->control); 1673 ui_control_unfocus(window->control, nfocus); 1674 } 1675 1676 /** Default window resize routine. 1677 * 1678 * @param window Window 1679 * @return EOK on success or an error code 1680 */ 1681 void ui_window_def_resize(ui_window_t *window) 1682 { 1683 ui_window_paint(window); 1684 } 1685 1686 /** Handle system menu left event. 1687 * 1688 * @param sysmenu System menu 1689 * @param arg Argument (ui_window_t *) 1690 * @param idev_id Input device ID 1691 */ 1692 static void wnd_sysmenu_left(ui_menu_t *sysmenu, void *arg, sysarg_t idev_id) 1693 { 1694 ui_window_t *window = (ui_window_t *)arg; 1695 1696 if (window->mbar != NULL) { 1697 ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false); 1698 ui_menu_close(sysmenu); 1699 ui_menu_bar_select_last(window->mbar, true, idev_id); 1700 } 1701 } 1702 1703 /** Handle system menu right event. 1704 * 1705 * @param sysmenu System menu 1706 * @param arg Argument (ui_window_t *) 1707 * @param idev_id Input device ID 1708 */ 1709 static void wnd_sysmenu_right(ui_menu_t *sysmenu, void *arg, sysarg_t idev_id) 1710 { 1711 ui_window_t *window = (ui_window_t *)arg; 1712 1713 if (window->mbar != NULL) { 1714 ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false); 1715 ui_menu_close(sysmenu); 1716 ui_menu_bar_select_first(window->mbar, true, idev_id); 1717 } 1718 } 1719 1720 /** Handle system menu close request event. 1721 * 1722 * @param sysmenu System menu 1723 * @param arg Argument (ui_window_t *) 1724 * @param idev_id Input device ID 1725 */ 1726 static void wnd_sysmenu_close_req(ui_menu_t *sysmenu, void *arg) 1727 { 1728 ui_window_t *window = (ui_window_t *)arg; 1729 1730 ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false); 1731 ui_menu_close(sysmenu); 1732 } 1733 1734 /** Handle system menu Restore entry activation. 1735 * 1736 * @param mentry Menu entry 1737 * @param arg Argument (ui_window_t *) 1738 */ 1739 static void wnd_sysmenu_erestore(ui_menu_entry_t *mentry, void *arg) 1740 { 1741 ui_window_t *window = (ui_window_t *)arg; 1742 1743 ui_window_send_unmaximize(window); 1744 } 1745 1746 /** Handle system menu Minimize entry activation. 1747 * 1748 * @param mentry Menu entry 1749 * @param arg Argument (ui_window_t *) 1750 */ 1751 static void wnd_sysmenu_eminimize(ui_menu_entry_t *mentry, void *arg) 1752 { 1753 ui_window_t *window = (ui_window_t *)arg; 1754 1755 ui_window_send_minimize(window); 1756 } 1757 1758 /** Handle system menu Maximize entry activation. 1759 * 1760 * @param mentry Menu entry 1761 * @param arg Argument (ui_window_t *) 1762 */ 1763 static void wnd_sysmenu_emaximize(ui_menu_entry_t *mentry, void *arg) 1764 { 1765 ui_window_t *window = (ui_window_t *)arg; 1766 1767 ui_window_send_maximize(window); 1768 } 1769 1770 /** Handle system menu Close entry activation. 1771 * 1772 * @param mentry Menu entry 1773 * @param arg Argument (ui_window_t *) 1774 */ 1775 static void wnd_sysmenu_eclose(ui_menu_entry_t *mentry, void *arg) 1776 { 1777 ui_window_t *window = (ui_window_t *)arg; 1778 1779 ui_window_send_close(window); 1780 } 1781 1782 /** Handle system menu press accelerator key event. 1783 * 1784 * @param sysmenu System menu 1785 * @param arg Argument (ui_window_t *) 1786 * @param idev_id Input device ID 1787 */ 1788 static void wnd_sysmenu_press_accel(ui_menu_t *sysmenu, void *arg, 1789 char32_t c, sysarg_t idev_id) 1790 { 1791 (void)sysmenu; 1792 (void)arg; 1793 (void)c; 1794 (void)idev_id; 1043 1795 } 1044 1796
Note:
See TracChangeset
for help on using the changeset viewer.
