Changes in uspace/lib/ui/src/window.c [8279aab:b979ffb] in mainline
- File:
-
- 1 edited
-
uspace/lib/ui/src/window.c (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/window.c
r8279aab rb979ffb 1 1 /* 2 * Copyright (c) 202 5Jiri Svoboda2 * Copyright (c) 2026 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 171 171 * @param window Window 172 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 173 176 * @param params Window parameters 174 177 * @param pos Place to store position of top-left corner 175 178 */ 176 179 static void ui_window_place(ui_window_t *window, gfx_rect_t *drect, 177 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) 178 182 { 179 183 gfx_coord2_t dims; … … 181 185 gfx_rect_t below_rect; 182 186 183 assert(p arams->placement != ui_wnd_place_default ||187 assert(placement != ui_wnd_place_default || 184 188 ui_is_fullscreen(window->ui)); 185 189 … … 187 191 pos->y = 0; 188 192 189 switch (p arams->placement) {193 switch (placement) { 190 194 case ui_wnd_place_default: 191 195 case ui_wnd_place_center: 192 assert(p arams->placement != ui_wnd_place_default ||196 assert(placement != ui_wnd_place_default || 193 197 ui_is_fullscreen(window->ui)); 194 198 /* Center window */ 195 gfx_rect_dims( ¶ms->rect, &dims);199 gfx_rect_dims(wrect, &dims); 196 200 pos->x = (drect->p0.x + drect->p1.x) / 2 - dims.x / 2; 197 201 pos->y = (drect->p0.y + drect->p1.y) / 2 - dims.y / 2; … … 199 203 case ui_wnd_place_top_left: 200 204 case ui_wnd_place_full_screen: 201 pos->x = drect->p0.x - params->rect.p0.x;202 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; 203 207 break; 204 208 case ui_wnd_place_top_right: 205 pos->x = drect->p1.x - params->rect.p1.x;206 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; 207 211 break; 208 212 case ui_wnd_place_bottom_left: 209 pos->x = drect->p0.x - params->rect.p0.x;210 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; 211 215 break; 212 216 case ui_wnd_place_bottom_right: 213 pos->x = drect->p1.x - params->rect.p1.x;214 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; 215 219 break; 216 220 case ui_wnd_place_popup: 217 221 /* Compute rectangle when placed below */ 218 below_pos.x = p arams->prect.p0.x;219 below_pos.y = p arams->prect.p1.y;220 gfx_rect_translate(&below_pos, ¶ms->rect, &below_rect);222 below_pos.x = prect->p0.x; 223 below_pos.y = prect->p1.y; 224 gfx_rect_translate(&below_pos, wrect, &below_rect); 221 225 222 226 /* Does below_rect fit within the display? */ 223 227 if (gfx_rect_is_inside(&below_rect, drect)) { 224 228 /* Place popup window below parent rectangle */ 225 pos->x = p arams->prect.p0.x - params->rect.p0.x;226 pos->y = p arams->prect.p1.y - params->rect.p0.y;229 pos->x = prect->p0.x - wrect->p0.x; 230 pos->y = prect->p1.y - wrect->p0.y; 227 231 } else { 228 232 /* Place popup window above parent rectangle */ 229 pos->x = p arams->prect.p0.x;230 pos->y = p arams->prect.p0.y -231 ( params->rect.p1.y - params->rect.p0.y);233 pos->x = prect->p0.x; 234 pos->y = prect->p0.y - 235 (wrect->p1.y - wrect->p0.y); 232 236 } 233 237 break; 234 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); 235 246 } 236 247 … … 334 345 mem_gc_t *memgc = NULL; 335 346 xlate_gc_t *xgc = NULL; 347 gfx_coord2_t dpos; 336 348 errno_t rc; 337 349 … … 384 396 if (params->placement != ui_wnd_place_default) { 385 397 /* Set initial display window position */ 386 ui_window_place(window, &info.rect, params,387 & dparams.pos);398 ui_window_place(window, &info.rect, ¶ms->rect, 399 ¶ms->prect, params->placement, &dparams.pos); 388 400 389 401 dparams.flags |= wndf_setpos; … … 477 489 #endif 478 490 if (ui->display == NULL) { 479 ui_window_place(window, &ui->rect, params, &window->dpos); 480 481 if (window->xgc != NULL) 482 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); 483 494 } 484 495 … … 538 549 } 539 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 if (window->placement == ui_wnd_place_full_screen || 558 (window->flags & uiwf_maximized) != 0) { 559 /* Update size of fullscreen or maximized window. */ 560 (void)ui_window_resize(window, &window->ui->rect); 561 ui_window_send_resize(window); 562 } 563 } 564 540 565 /** Destroy window. 541 566 * … … 572 597 /* Need to repaint if windows are emulated */ 573 598 if (ui_is_fullscreen(ui)) { 574 ui_paint(ui);599 (void)ui_paint(ui); 575 600 /* Send focus event to newly active window */ 576 601 nwindow = ui_window_get_active(ui); … … 615 640 window->control = NULL; 616 641 control->elemp = NULL; 642 } 643 644 /** Get first (lowermost) window (only valid in fullscreen mode). 645 * 646 * @param ui User interface 647 * @return First window 648 */ 649 ui_window_t *ui_window_first(ui_t *ui) 650 { 651 link_t *link; 652 653 link = list_first(&ui->windows); 654 if (link == NULL) 655 return NULL; 656 657 return list_get_instance(link, ui_window_t, lwindows); 658 } 659 660 /** Get next window (only valid in fullscreen mode). 661 * 662 * @param cur Current window 663 * @return First window 664 */ 665 ui_window_t *ui_window_next(ui_window_t *cur) 666 { 667 link_t *link; 668 669 link = list_next(&cur->lwindows, &cur->ui->windows); 670 if (link == NULL) 671 return NULL; 672 673 return list_get_instance(link, ui_window_t, lwindows); 617 674 } 618 675 … … 653 710 gfx_bitmap_alloc_t app_alloc; 654 711 gfx_bitmap_alloc_t win_alloc; 712 gfx_coord2_t dpos; 655 713 errno_t rc; 656 714 … … 728 786 break; 729 787 } 788 } else { 789 /* fullscreen mode or unit tests */ 790 switch (scop) { 791 case ui_wsc_resize: 792 break; 793 case ui_wsc_maximize: 794 window->normal_dpos = window->dpos; 795 dpos.x = 0; 796 dpos.y = 0; 797 ui_window_set_dpos(window, &dpos); 798 break; 799 case ui_wsc_unmaximize: 800 ui_window_set_dpos(window, &window->normal_dpos); 801 break; 802 } 730 803 } 731 804 … … 735 808 /* Window is resized, now we can map the window bitmap again */ 736 809 gfx_bitmap_params_init(&win_params); 737 win_params.flags |= bmpf_direct_output; 810 if (window->ui->display != NULL) 811 win_params.flags |= bmpf_direct_output; 738 812 win_params.rect = nrect; 739 813 … … 764 838 gfx_bitmap_destroy(window->app_bmp); 765 839 window->app_bmp = app_bmp; 840 } 841 842 switch (scop) { 843 case ui_wsc_resize: 844 break; 845 case ui_wsc_maximize: 846 window->flags |= uiwf_maximized; 847 break; 848 case ui_wsc_unmaximize: 849 window->flags &= ~uiwf_maximized; 850 break; 766 851 } 767 852 … … 787 872 errno_t ui_window_resize(ui_window_t *window, gfx_rect_t *rect) 788 873 { 789 return ui_window_size_change(window, rect, ui_wsc_resize); 874 errno_t rc; 875 876 rc = ui_window_size_change(window, rect, ui_wsc_resize); 877 if (rc != EOK) 878 return rc; 879 880 /* Need to repaint UI if windows are emulated */ 881 if (ui_is_fullscreen(window->ui)) 882 (void)ui_paint(window->ui); 883 884 return EOK; 790 885 } 791 886 … … 1489 1584 1490 1585 window->normal_rect = old_rect; 1491 (void) ui_window_paint(window); 1586 ui_window_send_resize(window); 1587 1588 /* Need to repaint UI if windows are emulated */ 1589 if (ui_is_fullscreen(window->ui)) 1590 (void)ui_paint(window->ui); 1591 1492 1592 return EOK; 1493 1593 } … … 1514 1614 } 1515 1615 1516 (void) ui_window_paint(window); 1616 ui_window_send_resize(window); 1617 1618 /* Need to repaint UI if windows are emulated */ 1619 if (ui_is_fullscreen(window->ui)) 1620 (void)ui_paint(window->ui); 1621 1517 1622 return EOK; 1518 1623 }
Note:
See TracChangeset
for help on using the changeset viewer.
