Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ui/src/window.c

    r29ed06d r1eaead4  
    4747#include <stdlib.h>
    4848#include <ui/control.h>
    49 #include <ui/menubar.h>
    50 #include <ui/menu.h>
    51 #include <ui/menuentry.h>
    5249#include <ui/resource.h>
    5350#include <ui/ui.h>
     
    7774};
    7875
    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);
    8376static void wd_minimize(ui_wdecor_t *, void *);
    8477static void wd_maximize(ui_wdecor_t *, void *);
     
    9184
    9285static 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,
    9786        .minimize = wd_minimize,
    9887        .maximize = wd_maximize,
     
    10493};
    10594
    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 
    12395static void ui_window_invalidate(void *, gfx_rect_t *);
    12496static void ui_window_update(void *);
     
    178150{
    179151        gfx_coord2_t dims;
    180         gfx_coord2_t below_pos;
    181         gfx_rect_t below_rect;
    182152
    183153        assert(params->placement != ui_wnd_place_default ||
     
    213183                break;
    214184        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, &params->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;
    231188                break;
    232189        }
    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;
    307190}
    308191
     
    498381        window->cursor = ui_curs_arrow;
    499382        window->placement = params->placement;
    500 
    501         rc = ui_window_sysmenu_create(window);
    502         if (rc != EOK)
    503                 goto error;
    504 
    505383        *rwindow = window;
    506384
     
    539417        list_remove(&window->lwindows);
    540418        ui_control_destroy(window->control);
    541         ui_menu_destroy(window->sysmenu);
    542419        ui_wdecor_destroy(window->wdecor);
    543420        ui_resource_destroy(window->res);
     
    1052929}
    1053930
    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 
    1120931/** Window decoration requested window minimization.
    1121932 *
     
    11961007
    11971008        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,
    12001010                    pos, pos_id);
    12011011        }
     
    12601070}
    12611071
    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 
    12751072/** Send window minimize event.
    12761073 *
     
    13791176}
    13801177
    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
    13851181 * @return EOK on success or an error code
    13861182 */
    1387 errno_t ui_window_def_sysmenu(ui_window_t *window, sysarg_t idev_id)
     1183errno_t ui_window_def_minimize(ui_window_t *window)
    13881184{
    13891185        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);
    13991189                if (rc != EOK)
    14001190                        goto error;
     
    14061196}
    14071197
    1408 /** Default window minimize routine.
    1409  *
    1410  * @param window Window
    1411  * @return EOK on success or an error code
    1412  */
    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 
    14281198/** Default window maximize routine.
    14291199 *
     
    14481218
    14491219        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);
    14521220
    14531221        rc = ui_window_size_change(window, &rect, ui_wsc_maximize);
     
    14721240
    14731241        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);
    14761242
    14771243        rc = ui_window_size_change(window, &window->normal_rect,
     
    14941260ui_evclaim_t ui_window_def_kbd(ui_window_t *window, kbd_event_t *kbd)
    14951261{
    1496         ui_evclaim_t claim;
    1497 
    14981262        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);
    15051264
    15061265        return ui_unclaimed;
     
    15571316        if (window->control != NULL)
    15581317                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;
    16701318}
    16711319
Note: See TracChangeset for help on using the changeset viewer.