Changes in uspace/lib/ui/src/window.c [b979ffb:ec50d65e] in mainline
- File:
-
- 1 edited
-
uspace/lib/ui/src/window.c (modified) (31 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/window.c
rb979ffb rec50d65e 1 1 /* 2 * Copyright (c) 202 6Jiri Svoboda2 * Copyright (c) 2024 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 case ui_wnd_place_center: 196 assert(placement != ui_wnd_place_default || 197 ui_is_fullscreen(window->ui)); 191 assert(ui_is_fullscreen(window->ui)); 198 192 /* Center window */ 199 gfx_rect_dims( wrect, &dims);193 gfx_rect_dims(¶ms->rect, &dims); 200 194 pos->x = (drect->p0.x + drect->p1.x) / 2 - dims.x / 2; 201 195 pos->y = (drect->p0.y + drect->p1.y) / 2 - dims.y / 2; … … 203 197 case ui_wnd_place_top_left: 204 198 case ui_wnd_place_full_screen: 205 pos->x = drect->p0.x - wrect->p0.x;206 pos->y = drect->p0.y - wrect->p0.y;199 pos->x = drect->p0.x - params->rect.p0.x; 200 pos->y = drect->p0.y - params->rect.p0.y; 207 201 break; 208 202 case ui_wnd_place_top_right: 209 pos->x = drect->p1.x - wrect->p1.x;210 pos->y = drect->p0.y - wrect->p0.y;203 pos->x = drect->p1.x - params->rect.p1.x; 204 pos->y = drect->p0.y - params->rect.p0.y; 211 205 break; 212 206 case ui_wnd_place_bottom_left: 213 pos->x = drect->p0.x - wrect->p0.x;214 pos->y = drect->p1.y - wrect->p1.y;207 pos->x = drect->p0.x - params->rect.p0.x; 208 pos->y = drect->p1.y - params->rect.p1.y; 215 209 break; 216 210 case ui_wnd_place_bottom_right: 217 pos->x = drect->p1.x - wrect->p1.x;218 pos->y = drect->p1.y - wrect->p1.y;211 pos->x = drect->p1.x - params->rect.p1.x; 212 pos->y = drect->p1.y - params->rect.p1.y; 219 213 break; 220 214 case ui_wnd_place_popup: 221 215 /* 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);216 below_pos.x = params->prect.p0.x; 217 below_pos.y = params->prect.p1.y; 218 gfx_rect_translate(&below_pos, ¶ms->rect, &below_rect); 225 219 226 220 /* Does below_rect fit within the display? */ 227 221 if (gfx_rect_is_inside(&below_rect, drect)) { 228 222 /* 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;223 pos->x = params->prect.p0.x - params->rect.p0.x; 224 pos->y = params->prect.p1.y - params->rect.p0.y; 231 225 } else { 232 226 /* 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);227 pos->x = params->prect.p0.x; 228 pos->y = params->prect.p0.y - 229 (params->rect.p1.y - params->rect.p0.y); 236 230 } 237 231 break; 238 232 } 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 233 } 247 234 … … 345 332 mem_gc_t *memgc = NULL; 346 333 xlate_gc_t *xgc = NULL; 347 gfx_coord2_t dpos;348 334 errno_t rc; 349 335 … … 357 343 dparams.rect = params->rect; 358 344 dparams.caption = params->caption; 359 dparams.min_size = params->min_size; 345 /* Only allow making the window larger */ 346 gfx_rect_dims(¶ms->rect, &dparams.min_size); 360 347 361 348 /* … … 371 358 if ((params->flags & ui_wndf_popup) != 0) 372 359 dparams.flags |= wndf_popup; 373 if ((params->flags & ui_wndf_nofocus) != 0)374 dparams.flags |= wndf_nofocus;375 360 if ((params->flags & ui_wndf_topmost) != 0) 376 361 dparams.flags |= wndf_topmost; … … 396 381 if (params->placement != ui_wnd_place_default) { 397 382 /* Set initial display window position */ 398 ui_window_place(window, &info.rect, ¶ms->rect,399 & params->prect, params->placement, &dparams.pos);383 ui_window_place(window, &info.rect, params, 384 &dparams.pos); 400 385 401 386 dparams.flags |= wndf_setpos; … … 489 474 #endif 490 475 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); 476 ui_window_place(window, &ui->rect, params, &window->dpos); 477 478 if (window->xgc != NULL) 479 xlate_gc_set_off(window->xgc, &window->dpos); 494 480 } 495 481 … … 549 535 } 550 536 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 537 /** Destroy window. 566 538 * … … 597 569 /* Need to repaint if windows are emulated */ 598 570 if (ui_is_fullscreen(ui)) { 599 (void)ui_paint(ui);571 ui_paint(ui); 600 572 /* Send focus event to newly active window */ 601 573 nwindow = ui_window_get_active(ui); … … 640 612 window->control = NULL; 641 613 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 614 } 675 615 … … 710 650 gfx_bitmap_alloc_t app_alloc; 711 651 gfx_bitmap_alloc_t win_alloc; 712 gfx_coord2_t dpos;713 652 errno_t rc; 714 653 … … 786 725 break; 787 726 } 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 727 } 804 728 … … 808 732 /* Window is resized, now we can map the window bitmap again */ 809 733 gfx_bitmap_params_init(&win_params); 810 if (window->ui->display != NULL) 811 win_params.flags |= bmpf_direct_output; 734 win_params.flags |= bmpf_direct_output; 812 735 win_params.rect = nrect; 813 736 … … 838 761 gfx_bitmap_destroy(window->app_bmp); 839 762 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 763 } 852 764 … … 872 784 errno_t ui_window_resize(ui_window_t *window, gfx_rect_t *rect) 873 785 { 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; 786 return ui_window_size_change(window, rect, ui_wsc_resize); 885 787 } 886 788 … … 1073 975 ui_t *ui = window->ui; 1074 976 1075 fibril_mutex_lock(&ui->lock);977 ui_lock(ui); 1076 978 ui_window_send_close(window); 1077 fibril_mutex_unlock(&ui->lock);979 ui_unlock(ui); 1078 980 } 1079 981 … … 1084 986 ui_t *ui = window->ui; 1085 987 1086 fibril_mutex_lock(&ui->lock);988 ui_lock(ui); 1087 989 (void)nfocus; 1088 990 … … 1093 995 1094 996 ui_window_send_focus(window, nfocus); 1095 fibril_mutex_unlock(&ui->lock);997 ui_unlock(ui); 1096 998 } 1097 999 … … 1102 1004 ui_t *ui = window->ui; 1103 1005 1104 fibril_mutex_lock(&ui->lock);1006 ui_lock(ui); 1105 1007 ui_window_send_kbd(window, kbd_event); 1106 fibril_mutex_unlock(&ui->lock);1008 ui_unlock(ui); 1107 1009 } 1108 1010 … … 1118 1020 return; 1119 1021 1120 fibril_mutex_lock(&ui->lock);1022 ui_lock(ui); 1121 1023 1122 1024 claim = ui_wdecor_pos_event(window->wdecor, event); 1123 1025 if (claim == ui_claimed) { 1124 fibril_mutex_unlock(&ui->lock);1026 ui_unlock(ui); 1125 1027 return; 1126 1028 } 1127 1029 1128 1030 ui_window_send_pos(window, event); 1129 fibril_mutex_unlock(&ui->lock);1031 ui_unlock(ui); 1130 1032 } 1131 1033 … … 1143 1045 return; 1144 1046 1145 fibril_mutex_lock(&ui->lock);1047 ui_lock(ui); 1146 1048 (void) ui_window_resize(window, rect); 1147 ui_window_send_resize(window);1148 fibril_mutex_unlock(&ui->lock);1049 (void) ui_window_paint(window); 1050 ui_unlock(ui); 1149 1051 } 1150 1052 … … 1155 1057 ui_t *ui = window->ui; 1156 1058 1157 fibril_mutex_lock(&ui->lock);1059 ui_lock(ui); 1158 1060 1159 1061 if (window->wdecor != NULL && nfocus == 0) { … … 1163 1065 1164 1066 ui_window_send_unfocus(window, nfocus); 1165 fibril_mutex_unlock(&ui->lock);1067 ui_unlock(ui); 1166 1068 } 1167 1069 … … 1393 1295 void ui_window_send_minimize(ui_window_t *window) 1394 1296 { 1395 if (window->cb != NULL && window->cb->m inimize != NULL)1297 if (window->cb != NULL && window->cb->maximize != NULL) 1396 1298 window->cb->minimize(window, window->arg); 1397 1299 else … … 1491 1393 else 1492 1394 return ui_window_def_unfocus(window, nfocus); 1493 }1494 1495 /** Send window resize event.1496 *1497 * @param window Window1498 */1499 void ui_window_send_resize(ui_window_t *window)1500 {1501 if (window->cb != NULL && window->cb->resize != NULL)1502 window->cb->resize(window, window->arg);1503 else1504 return ui_window_def_resize(window);1505 1395 } 1506 1396 … … 1584 1474 1585 1475 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 1476 (void) ui_window_paint(window); 1592 1477 return EOK; 1593 1478 } … … 1614 1499 } 1615 1500 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 1501 (void) ui_window_paint(window); 1622 1502 return EOK; 1623 1503 } … … 1693 1573 if (window->control != NULL) 1694 1574 ui_control_unfocus(window->control, nfocus); 1695 }1696 1697 /** Default window resize routine.1698 *1699 * @param window Window1700 * @return EOK on success or an error code1701 */1702 void ui_window_def_resize(ui_window_t *window)1703 {1704 ui_window_paint(window);1705 1575 } 1706 1576
Note:
See TracChangeset
for help on using the changeset viewer.
