Changes in uspace/lib/ui/src/window.c [b979ffb:8279aab] in mainline
- File:
-
- 1 edited
-
uspace/lib/ui/src/window.c (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/window.c
rb979ffb r8279aab 1 1 /* 2 * Copyright (c) 202 6Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 171 171 * @param window Window 172 172 * @param drect Display rectangle 173 * @param wrect Window rectangle174 * @param prect Parent rectangle for popup placement or @c NULL175 * @param placement Window placement176 173 * @param params Window parameters 177 174 * @param pos Place to store position of top-left corner 178 175 */ 179 176 static void ui_window_place(ui_window_t *window, gfx_rect_t *drect, 180 gfx_rect_t *wrect, gfx_rect_t *prect, ui_wnd_placement_t placement, 181 gfx_coord2_t *pos) 177 ui_wnd_params_t *params, gfx_coord2_t *pos) 182 178 { 183 179 gfx_coord2_t dims; … … 185 181 gfx_rect_t below_rect; 186 182 187 assert(p lacement != ui_wnd_place_default ||183 assert(params->placement != ui_wnd_place_default || 188 184 ui_is_fullscreen(window->ui)); 189 185 … … 191 187 pos->y = 0; 192 188 193 switch (p lacement) {189 switch (params->placement) { 194 190 case ui_wnd_place_default: 195 191 case ui_wnd_place_center: 196 assert(p lacement != ui_wnd_place_default ||192 assert(params->placement != ui_wnd_place_default || 197 193 ui_is_fullscreen(window->ui)); 198 194 /* Center window */ 199 gfx_rect_dims( wrect, &dims);195 gfx_rect_dims(¶ms->rect, &dims); 200 196 pos->x = (drect->p0.x + drect->p1.x) / 2 - dims.x / 2; 201 197 pos->y = (drect->p0.y + drect->p1.y) / 2 - dims.y / 2; … … 203 199 case ui_wnd_place_top_left: 204 200 case ui_wnd_place_full_screen: 205 pos->x = drect->p0.x - wrect->p0.x;206 pos->y = drect->p0.y - wrect->p0.y;201 pos->x = drect->p0.x - params->rect.p0.x; 202 pos->y = drect->p0.y - params->rect.p0.y; 207 203 break; 208 204 case ui_wnd_place_top_right: 209 pos->x = drect->p1.x - wrect->p1.x;210 pos->y = drect->p0.y - wrect->p0.y;205 pos->x = drect->p1.x - params->rect.p1.x; 206 pos->y = drect->p0.y - params->rect.p0.y; 211 207 break; 212 208 case ui_wnd_place_bottom_left: 213 pos->x = drect->p0.x - wrect->p0.x;214 pos->y = drect->p1.y - wrect->p1.y;209 pos->x = drect->p0.x - params->rect.p0.x; 210 pos->y = drect->p1.y - params->rect.p1.y; 215 211 break; 216 212 case ui_wnd_place_bottom_right: 217 pos->x = drect->p1.x - wrect->p1.x;218 pos->y = drect->p1.y - wrect->p1.y;213 pos->x = drect->p1.x - params->rect.p1.x; 214 pos->y = drect->p1.y - params->rect.p1.y; 219 215 break; 220 216 case ui_wnd_place_popup: 221 217 /* Compute rectangle when placed below */ 222 below_pos.x = p rect->p0.x;223 below_pos.y = p rect->p1.y;224 gfx_rect_translate(&below_pos, wrect, &below_rect);218 below_pos.x = params->prect.p0.x; 219 below_pos.y = params->prect.p1.y; 220 gfx_rect_translate(&below_pos, ¶ms->rect, &below_rect); 225 221 226 222 /* Does below_rect fit within the display? */ 227 223 if (gfx_rect_is_inside(&below_rect, drect)) { 228 224 /* Place popup window below parent rectangle */ 229 pos->x = p rect->p0.x - wrect->p0.x;230 pos->y = p rect->p1.y - wrect->p0.y;225 pos->x = params->prect.p0.x - params->rect.p0.x; 226 pos->y = params->prect.p1.y - params->rect.p0.y; 231 227 } else { 232 228 /* Place popup window above parent rectangle */ 233 pos->x = p rect->p0.x;234 pos->y = p rect->p0.y -235 ( wrect->p1.y - wrect->p0.y);229 pos->x = params->prect.p0.x; 230 pos->y = params->prect.p0.y - 231 (params->rect.p1.y - params->rect.p0.y); 236 232 } 237 233 break; 238 234 } 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 235 } 247 236 … … 345 334 mem_gc_t *memgc = NULL; 346 335 xlate_gc_t *xgc = NULL; 347 gfx_coord2_t dpos;348 336 errno_t rc; 349 337 … … 396 384 if (params->placement != ui_wnd_place_default) { 397 385 /* Set initial display window position */ 398 ui_window_place(window, &info.rect, ¶ms->rect,399 & params->prect, params->placement, &dparams.pos);386 ui_window_place(window, &info.rect, params, 387 &dparams.pos); 400 388 401 389 dparams.flags |= wndf_setpos; … … 489 477 #endif 490 478 if (ui->display == NULL) { 491 ui_window_place(window, &ui->rect, ¶ms->rect, ¶ms->prect, 492 params->placement, &dpos); 493 ui_window_set_dpos(window, &dpos); 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); 494 483 } 495 484 … … 549 538 } 550 539 551 /** Update window placement after screen resize (only in fullscreen UI).552 *553 * @param window UI window554 */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 565 540 /** Destroy window. 566 541 * … … 597 572 /* Need to repaint if windows are emulated */ 598 573 if (ui_is_fullscreen(ui)) { 599 (void)ui_paint(ui);574 ui_paint(ui); 600 575 /* Send focus event to newly active window */ 601 576 nwindow = ui_window_get_active(ui); … … 640 615 window->control = NULL; 641 616 control->elemp = NULL; 642 }643 644 /** Get first (lowermost) window (only valid in fullscreen mode).645 *646 * @param ui User interface647 * @return First window648 */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 window663 * @return First window664 */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);674 617 } 675 618 … … 710 653 gfx_bitmap_alloc_t app_alloc; 711 654 gfx_bitmap_alloc_t win_alloc; 712 gfx_coord2_t dpos;713 655 errno_t rc; 714 656 … … 786 728 break; 787 729 } 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 }803 730 } 804 731 … … 808 735 /* Window is resized, now we can map the window bitmap again */ 809 736 gfx_bitmap_params_init(&win_params); 810 if (window->ui->display != NULL) 811 win_params.flags |= bmpf_direct_output; 737 win_params.flags |= bmpf_direct_output; 812 738 win_params.rect = nrect; 813 739 … … 838 764 gfx_bitmap_destroy(window->app_bmp); 839 765 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;851 766 } 852 767 … … 872 787 errno_t ui_window_resize(ui_window_t *window, gfx_rect_t *rect) 873 788 { 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; 789 return ui_window_size_change(window, rect, ui_wsc_resize); 885 790 } 886 791 … … 1584 1489 1585 1490 window->normal_rect = old_rect; 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 1491 (void) ui_window_paint(window); 1592 1492 return EOK; 1593 1493 } … … 1614 1514 } 1615 1515 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 1516 (void) ui_window_paint(window); 1622 1517 return EOK; 1623 1518 }
Note:
See TracChangeset
for help on using the changeset viewer.
