Changes in uspace/lib/ui/src/window.c [29ed06d:1eaead4] in mainline
- File:
-
- 1 edited
-
uspace/lib/ui/src/window.c (modified) (17 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/window.c
r29ed06d r1eaead4 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>52 49 #include <ui/resource.h> 53 50 #include <ui/ui.h> … … 77 74 }; 78 75 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 76 static void wd_minimize(ui_wdecor_t *, void *); 84 77 static void wd_maximize(ui_wdecor_t *, void *); … … 91 84 92 85 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 86 .minimize = wd_minimize, 98 87 .maximize = wd_maximize, … … 104 93 }; 105 94 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_accel116 };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 123 95 static void ui_window_invalidate(void *, gfx_rect_t *); 124 96 static void ui_window_update(void *); … … 178 150 { 179 151 gfx_coord2_t dims; 180 gfx_coord2_t below_pos;181 gfx_rect_t below_rect;182 152 183 153 assert(params->placement != ui_wnd_place_default || … … 213 183 break; 214 184 case ui_wnd_place_popup: 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 } 185 /* Place popup window below parent rectangle */ 186 pos->x = params->prect.p0.x; 187 pos->y = params->prect.p1.y; 231 188 break; 232 189 } 233 }234 235 /** Create window's system menu.236 *237 * @param window Window238 * @return EOK on success or an error code239 */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;307 190 } 308 191 … … 498 381 window->cursor = ui_curs_arrow; 499 382 window->placement = params->placement; 500 501 rc = ui_window_sysmenu_create(window);502 if (rc != EOK)503 goto error;504 505 383 *rwindow = window; 506 384 … … 539 417 list_remove(&window->lwindows); 540 418 ui_control_destroy(window->control); 541 ui_menu_destroy(window->sysmenu);542 419 ui_wdecor_destroy(window->wdecor); 543 420 ui_resource_destroy(window->res); … … 1052 929 } 1053 930 1054 /** Window decoration requested opening of system menu.1055 *1056 * @param wdecor Window decoration1057 * @param arg Argument (window)1058 * @param idev_id Input device ID1059 */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 decoration1070 * @param arg Argument (window)1071 * @param idev_id Input device ID1072 */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 decoration1087 * @param arg Argument (window)1088 * @param idev_id Input device ID1089 */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 decoration1104 * @param arg Argument (window)1105 * @param c Accelerator key1106 * @param idev_id Input device ID1107 */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 1120 931 /** Window decoration requested window minimization. 1121 932 * … … 1196 1007 1197 1008 if (window->dwindow != NULL) { 1198 (void) display_window_resize_req(window->dwindow, 1199 (display_wnd_rsztype_t) rsztype, // Same constants in the enums 1009 (void) display_window_resize_req(window->dwindow, rsztype, 1200 1010 pos, pos_id); 1201 1011 } … … 1260 1070 } 1261 1071 1262 /** Send window sysmenu event.1263 *1264 * @param window Window1265 * @parma idev_id Input device ID1266 */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 else1272 ui_window_def_sysmenu(window, idev_id);1273 }1274 1275 1072 /** Send window minimize event. 1276 1073 * … … 1379 1176 } 1380 1177 1381 /** Default window sysmenu routine. 1382 * 1383 * @param window Window 1384 * @param idev_id Input device ID 1178 /** Default window minimize routine. 1179 * 1180 * @param window Window 1385 1181 * @return EOK on success or an error code 1386 1182 */ 1387 errno_t ui_window_def_ sysmenu(ui_window_t *window, sysarg_t idev_id)1183 errno_t ui_window_def_minimize(ui_window_t *window) 1388 1184 { 1389 1185 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); 1186 1187 if (window->dwindow != NULL) { 1188 rc = display_window_minimize(window->dwindow); 1399 1189 if (rc != EOK) 1400 1190 goto error; … … 1406 1196 } 1407 1197 1408 /** Default window minimize routine.1409 *1410 * @param window Window1411 * @return EOK on success or an error code1412 */1413 errno_t ui_window_def_minimize(ui_window_t *window)1414 {1415 errno_t rc;1416 1417 if (window->dwindow != NULL) {1418 rc = display_window_minimize(window->dwindow);1419 if (rc != EOK)1420 goto error;1421 }1422 1423 return EOK;1424 error:1425 return rc;1426 }1427 1428 1198 /** Default window maximize routine. 1429 1199 * … … 1448 1218 1449 1219 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);1452 1220 1453 1221 rc = ui_window_size_change(window, &rect, ui_wsc_maximize); … … 1472 1240 1473 1241 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);1476 1242 1477 1243 rc = ui_window_size_change(window, &window->normal_rect, … … 1494 1260 ui_evclaim_t ui_window_def_kbd(ui_window_t *window, kbd_event_t *kbd) 1495 1261 { 1496 ui_evclaim_t claim;1497 1498 1262 if (window->control != NULL) 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); 1263 return ui_control_kbd_event(window->control, kbd); 1505 1264 1506 1265 return ui_unclaimed; … … 1557 1316 if (window->control != NULL) 1558 1317 ui_control_unfocus(window->control, nfocus); 1559 }1560 1561 /** Handle system menu left event.1562 *1563 * @param sysmenu System menu1564 * @param arg Argument (ui_window_t *)1565 * @param idev_id Input device ID1566 */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 menu1581 * @param arg Argument (ui_window_t *)1582 * @param idev_id Input device ID1583 */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 menu1598 * @param arg Argument (ui_window_t *)1599 * @param idev_id Input device ID1600 */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 entry1612 * @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 entry1624 * @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 entry1636 * @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 entry1648 * @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 menu1660 * @param arg Argument (ui_window_t *)1661 * @param idev_id Input device ID1662 */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;1670 1318 } 1671 1319
Note:
See TracChangeset
for help on using the changeset viewer.
