Changeset dc5c303 in mainline for uspace/lib/ui/src/window.c
- Timestamp:
- 2023-12-28T13:59:23Z (19 months ago)
- Children:
- 6b66de6b
- Parents:
- 42c2e65 (diff), f87ff8e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - git-author:
- boba-buba <120932204+boba-buba@…> (2023-12-28 13:59:23)
- git-committer:
- GitHub <noreply@…> (2023-12-28 13:59:23)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/window.c
r42c2e65 rdc5c303 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> … … 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); 76 83 static void wd_minimize(ui_wdecor_t *, void *); 77 84 static void wd_maximize(ui_wdecor_t *, void *); … … 84 91 85 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, 86 97 .minimize = wd_minimize, 87 98 .maximize = wd_maximize, … … 93 104 }; 94 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 *); 122 95 123 static void ui_window_invalidate(void *, gfx_rect_t *); 96 124 static void ui_window_update(void *); … … 150 178 { 151 179 gfx_coord2_t dims; 180 gfx_coord2_t below_pos; 181 gfx_rect_t below_rect; 152 182 153 183 assert(params->placement != ui_wnd_place_default || … … 183 213 break; 184 214 case ui_wnd_place_popup: 185 /* Place popup window below parent rectangle */ 186 pos->x = params->prect.p0.x; 187 pos->y = params->prect.p1.y; 215 /* Compute rectangle when placed below */ 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); 219 220 /* Does below_rect fit within the display? */ 221 if (gfx_rect_is_inside(&below_rect, drect)) { 222 /* Place popup window below parent rectangle */ 223 pos->x = params->prect.p0.x - params->rect.p0.x; 224 pos->y = params->prect.p1.y - params->rect.p0.y; 225 } else { 226 /* Place popup window above parent rectangle */ 227 pos->x = params->prect.p0.x; 228 pos->y = params->prect.p0.y - 229 (params->rect.p1.y - params->rect.p0.y); 230 } 188 231 break; 189 232 } 233 } 234 235 /** Create window's system menu. 236 * 237 * @param window Window 238 * @return EOK on success or an error code 239 */ 240 static errno_t ui_window_sysmenu_create(ui_window_t *window) 241 { 242 errno_t rc; 243 ui_menu_entry_t *mrestore; 244 ui_menu_entry_t *mmin; 245 ui_menu_entry_t *mmax; 246 ui_menu_entry_t *msep; 247 ui_menu_entry_t *mclose; 248 249 rc = ui_menu_create(window, &window->sysmenu); 250 if (rc != EOK) 251 goto error; 252 253 ui_menu_set_cb(window->sysmenu, &wnd_sysmenu_cb, (void *)window); 254 255 rc = ui_menu_entry_create(window->sysmenu, "~R~estore", 256 "", &mrestore); 257 if (rc != EOK) 258 goto error; 259 260 if (!window->wdecor->maximized) 261 ui_menu_entry_set_disabled(mrestore, true); 262 263 ui_menu_entry_set_cb(mrestore, wnd_sysmenu_erestore, (void *)window); 264 265 rc = ui_menu_entry_create(window->sysmenu, "Mi~n~imize", 266 "", &mmin); 267 if (rc != EOK) 268 goto error; 269 270 if ((window->wdecor->style & ui_wds_minimize_btn) == 0) 271 ui_menu_entry_set_disabled(mmin, true); 272 273 ui_menu_entry_set_cb(mmin, wnd_sysmenu_eminimize, (void *)window); 274 275 rc = ui_menu_entry_create(window->sysmenu, "Ma~x~imize", 276 "", &mmax); 277 if (rc != EOK) 278 goto error; 279 280 if ((window->wdecor->style & ui_wds_maximize_btn) == 0 || 281 window->wdecor->maximized) 282 ui_menu_entry_set_disabled(mmax, true); 283 284 ui_menu_entry_set_cb(mmax, wnd_sysmenu_emaximize, (void *)window); 285 286 rc = ui_menu_entry_sep_create(window->sysmenu, &msep); 287 if (rc != EOK) 288 goto error; 289 290 rc = ui_menu_entry_create(window->sysmenu, "~C~lose", "Alt-F4", 291 &mclose); 292 if (rc != EOK) 293 goto error; 294 295 if ((window->wdecor->style & ui_wds_close_btn) == 0) 296 ui_menu_entry_set_disabled(mclose, true); 297 298 ui_menu_entry_set_cb(mclose, wnd_sysmenu_eclose, (void *)window); 299 300 window->sysmenu_restore = mrestore; 301 window->sysmenu_minimize = mmin; 302 window->sysmenu_maximize = mmax; 303 304 return EOK; 305 error: 306 return rc; 190 307 } 191 308 … … 381 498 window->cursor = ui_curs_arrow; 382 499 window->placement = params->placement; 500 501 rc = ui_window_sysmenu_create(window); 502 if (rc != EOK) 503 goto error; 504 383 505 *rwindow = window; 384 506 … … 417 539 list_remove(&window->lwindows); 418 540 ui_control_destroy(window->control); 541 ui_menu_destroy(window->sysmenu); 419 542 ui_wdecor_destroy(window->wdecor); 420 543 ui_resource_destroy(window->res); … … 929 1052 } 930 1053 1054 /** Window decoration requested opening of system menu. 1055 * 1056 * @param wdecor Window decoration 1057 * @param arg Argument (window) 1058 * @param idev_id Input device ID 1059 */ 1060 static void wd_sysmenu_open(ui_wdecor_t *wdecor, void *arg, sysarg_t idev_id) 1061 { 1062 ui_window_t *window = (ui_window_t *) arg; 1063 1064 ui_window_send_sysmenu(window, idev_id); 1065 } 1066 1067 /** Window decoration requested moving left from system menu handle. 1068 * 1069 * @param wdecor Window decoration 1070 * @param arg Argument (window) 1071 * @param idev_id Input device ID 1072 */ 1073 static void wd_sysmenu_left(ui_wdecor_t *wdecor, void *arg, sysarg_t idev_id) 1074 { 1075 ui_window_t *window = (ui_window_t *) arg; 1076 1077 if (window->mbar != NULL) { 1078 ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false); 1079 ui_menu_close(window->sysmenu); 1080 ui_menu_bar_select_last(window->mbar, false, idev_id); 1081 } 1082 } 1083 1084 /** Window decoration requested moving right from system menu handle. 1085 * 1086 * @param wdecor Window decoration 1087 * @param arg Argument (window) 1088 * @param idev_id Input device ID 1089 */ 1090 static void wd_sysmenu_right(ui_wdecor_t *wdecor, void *arg, sysarg_t idev_id) 1091 { 1092 ui_window_t *window = (ui_window_t *) arg; 1093 1094 if (window->mbar != NULL) { 1095 ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false); 1096 ui_menu_close(window->sysmenu); 1097 ui_menu_bar_select_first(window->mbar, false, idev_id); 1098 } 1099 } 1100 1101 /** Window decoration detected accelerator press from system menu handle. 1102 * 1103 * @param wdecor Window decoration 1104 * @param arg Argument (window) 1105 * @param c Accelerator key 1106 * @param idev_id Input device ID 1107 */ 1108 static void wd_sysmenu_accel(ui_wdecor_t *wdecor, void *arg, char32_t c, 1109 sysarg_t idev_id) 1110 { 1111 ui_window_t *window = (ui_window_t *) arg; 1112 1113 if (window->mbar != NULL) { 1114 ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false); 1115 ui_menu_close(window->sysmenu); 1116 ui_menu_bar_press_accel(window->mbar, c, idev_id); 1117 } 1118 } 1119 931 1120 /** Window decoration requested window minimization. 932 1121 * … … 1007 1196 1008 1197 if (window->dwindow != NULL) { 1009 (void) display_window_resize_req(window->dwindow, rsztype, 1198 (void) display_window_resize_req(window->dwindow, 1199 (display_wnd_rsztype_t) rsztype, // Same constants in the enums 1010 1200 pos, pos_id); 1011 1201 } … … 1070 1260 } 1071 1261 1262 /** Send window sysmenu event. 1263 * 1264 * @param window Window 1265 * @parma idev_id Input device ID 1266 */ 1267 void ui_window_send_sysmenu(ui_window_t *window, sysarg_t idev_id) 1268 { 1269 if (window->cb != NULL && window->cb->sysmenu != NULL) 1270 window->cb->sysmenu(window, window->arg, idev_id); 1271 else 1272 ui_window_def_sysmenu(window, idev_id); 1273 } 1274 1072 1275 /** Send window minimize event. 1073 1276 * … … 1174 1377 else 1175 1378 return ui_window_def_unfocus(window, nfocus); 1379 } 1380 1381 /** Default window sysmenu routine. 1382 * 1383 * @param window Window 1384 * @param idev_id Input device ID 1385 * @return EOK on success or an error code 1386 */ 1387 errno_t ui_window_def_sysmenu(ui_window_t *window, sysarg_t idev_id) 1388 { 1389 errno_t rc; 1390 ui_wdecor_geom_t geom; 1391 1392 if (ui_menu_is_open(window->sysmenu)) { 1393 ui_menu_close(window->sysmenu); 1394 } else { 1395 ui_wdecor_get_geom(window->wdecor, &geom); 1396 1397 rc = ui_menu_open(window->sysmenu, &geom.title_bar_rect, 1398 idev_id); 1399 if (rc != EOK) 1400 goto error; 1401 } 1402 1403 return EOK; 1404 error: 1405 return rc; 1176 1406 } 1177 1407 … … 1218 1448 1219 1449 ui_wdecor_set_maximized(window->wdecor, true); 1450 ui_menu_entry_set_disabled(window->sysmenu_restore, false); 1451 ui_menu_entry_set_disabled(window->sysmenu_maximize, true); 1220 1452 1221 1453 rc = ui_window_size_change(window, &rect, ui_wsc_maximize); … … 1240 1472 1241 1473 ui_wdecor_set_maximized(window->wdecor, false); 1474 ui_menu_entry_set_disabled(window->sysmenu_restore, true); 1475 ui_menu_entry_set_disabled(window->sysmenu_maximize, false); 1242 1476 1243 1477 rc = ui_window_size_change(window, &window->normal_rect, … … 1260 1494 ui_evclaim_t ui_window_def_kbd(ui_window_t *window, kbd_event_t *kbd) 1261 1495 { 1496 ui_evclaim_t claim; 1497 1262 1498 if (window->control != NULL) 1263 return ui_control_kbd_event(window->control, kbd); 1499 claim = ui_control_kbd_event(window->control, kbd); 1500 else 1501 claim = ui_unclaimed; 1502 1503 if (claim == ui_unclaimed) 1504 return ui_wdecor_kbd_event(window->wdecor, kbd); 1264 1505 1265 1506 return ui_unclaimed; … … 1316 1557 if (window->control != NULL) 1317 1558 ui_control_unfocus(window->control, nfocus); 1559 } 1560 1561 /** Handle system menu left event. 1562 * 1563 * @param sysmenu System menu 1564 * @param arg Argument (ui_window_t *) 1565 * @param idev_id Input device ID 1566 */ 1567 static void wnd_sysmenu_left(ui_menu_t *sysmenu, void *arg, sysarg_t idev_id) 1568 { 1569 ui_window_t *window = (ui_window_t *)arg; 1570 1571 if (window->mbar != NULL) { 1572 ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false); 1573 ui_menu_close(sysmenu); 1574 ui_menu_bar_select_last(window->mbar, true, idev_id); 1575 } 1576 } 1577 1578 /** Handle system menu right event. 1579 * 1580 * @param sysmenu System menu 1581 * @param arg Argument (ui_window_t *) 1582 * @param idev_id Input device ID 1583 */ 1584 static void wnd_sysmenu_right(ui_menu_t *sysmenu, void *arg, sysarg_t idev_id) 1585 { 1586 ui_window_t *window = (ui_window_t *)arg; 1587 1588 if (window->mbar != NULL) { 1589 ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false); 1590 ui_menu_close(sysmenu); 1591 ui_menu_bar_select_first(window->mbar, true, idev_id); 1592 } 1593 } 1594 1595 /** Handle system menu close request event. 1596 * 1597 * @param sysmenu System menu 1598 * @param arg Argument (ui_window_t *) 1599 * @param idev_id Input device ID 1600 */ 1601 static void wnd_sysmenu_close_req(ui_menu_t *sysmenu, void *arg) 1602 { 1603 ui_window_t *window = (ui_window_t *)arg; 1604 1605 ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false); 1606 ui_menu_close(sysmenu); 1607 } 1608 1609 /** Handle system menu Restore entry activation. 1610 * 1611 * @param mentry Menu entry 1612 * @param arg Argument (ui_window_t *) 1613 */ 1614 static void wnd_sysmenu_erestore(ui_menu_entry_t *mentry, void *arg) 1615 { 1616 ui_window_t *window = (ui_window_t *)arg; 1617 1618 ui_window_send_unmaximize(window); 1619 } 1620 1621 /** Handle system menu Minimize entry activation. 1622 * 1623 * @param mentry Menu entry 1624 * @param arg Argument (ui_window_t *) 1625 */ 1626 static void wnd_sysmenu_eminimize(ui_menu_entry_t *mentry, void *arg) 1627 { 1628 ui_window_t *window = (ui_window_t *)arg; 1629 1630 ui_window_send_minimize(window); 1631 } 1632 1633 /** Handle system menu Maximize entry activation. 1634 * 1635 * @param mentry Menu entry 1636 * @param arg Argument (ui_window_t *) 1637 */ 1638 static void wnd_sysmenu_emaximize(ui_menu_entry_t *mentry, void *arg) 1639 { 1640 ui_window_t *window = (ui_window_t *)arg; 1641 1642 ui_window_send_maximize(window); 1643 } 1644 1645 /** Handle system menu Close entry activation. 1646 * 1647 * @param mentry Menu entry 1648 * @param arg Argument (ui_window_t *) 1649 */ 1650 static void wnd_sysmenu_eclose(ui_menu_entry_t *mentry, void *arg) 1651 { 1652 ui_window_t *window = (ui_window_t *)arg; 1653 1654 ui_window_send_close(window); 1655 } 1656 1657 /** Handle system menu press accelerator key event. 1658 * 1659 * @param sysmenu System menu 1660 * @param arg Argument (ui_window_t *) 1661 * @param idev_id Input device ID 1662 */ 1663 static void wnd_sysmenu_press_accel(ui_menu_t *sysmenu, void *arg, 1664 char32_t c, sysarg_t idev_id) 1665 { 1666 (void)sysmenu; 1667 (void)arg; 1668 (void)c; 1669 (void)idev_id; 1318 1670 } 1319 1671
Note:
See TracChangeset
for help on using the changeset viewer.