Changeset 35cffea in mainline for uspace/lib/ui/src/window.c


Ignore:
Timestamp:
2022-05-19T08:02:31Z (2 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ad698f4
Parents:
fd05ea6
git-author:
Jiri Svoboda <jiri@…> (2022-05-18 17:02:12)
git-committer:
Jiri Svoboda <jiri@…> (2022-05-19 08:02:31)
Message:

Maximizing/unmaximizing a window

File:
1 edited

Legend:

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

    rfd05ea6 r35cffea  
    7474};
    7575
     76static void wd_maximize(ui_wdecor_t *, void *);
     77static void wd_unmaximize(ui_wdecor_t *, void *);
    7678static void wd_close(ui_wdecor_t *, void *);
    7779static void wd_move(ui_wdecor_t *, void *, gfx_coord2_t *);
     
    8183
    8284static ui_wdecor_cb_t wdecor_cb = {
     85        .maximize = wd_maximize,
     86        .unmaximize = wd_unmaximize,
    8387        .close = wd_close,
    8488        .move = wd_move,
     
    469473}
    470474
    471 /** Resize/move window.
    472  *
    473  * Resize window to the dimensions of @a rect. If @a rect.p0 is not 0,0,
    474  * the top-left corner of the window will move on the screen accordingly.
     475/** Resize or (un)maximize window.
    475476 *
    476477 * @param window Window
    477478 * @param rect Rectangle
     479 * @param scop Size change operation
    478480 *
    479481 * @return EOK on success or an error code
    480482 */
    481 errno_t ui_window_resize(ui_window_t *window, gfx_rect_t *rect)
     483errno_t ui_window_size_change(ui_window_t *window, gfx_rect_t *rect,
     484    ui_wnd_sc_op_t scop)
    482485{
    483486        gfx_coord2_t offs;
     
    545548        }
    546549
    547         /* dwindow can be NULL in case of unit tests */
     550        /* dwindow can be NULL in case of unit tests or fullscreen mode */
    548551        if (window->dwindow != NULL) {
    549                 rc = display_window_resize(window->dwindow, &offs, &nrect);
    550                 if (rc != EOK)
    551                         goto error;
     552                switch (scop) {
     553                case ui_wsc_resize:
     554                        rc = display_window_resize(window->dwindow, &offs,
     555                            &nrect);
     556                        if (rc != EOK)
     557                                goto error;
     558                        break;
     559                case ui_wsc_maximize:
     560                        rc = display_window_maximize(window->dwindow);
     561                        if (rc != EOK)
     562                                goto error;
     563                        break;
     564                case ui_wsc_unmaximize:
     565                        rc = display_window_unmaximize(window->dwindow);
     566                        if (rc != EOK)
     567                                goto error;
     568                        break;
     569                }
    552570        }
    553571
     
    597615}
    598616
     617/** Resize/move window.
     618 *
     619 * Resize window to the dimensions of @a rect. If @a rect.p0 is not 0,0,
     620 * the top-left corner of the window will move on the screen accordingly.
     621 *
     622 * @param window Window
     623 * @param rect Rectangle
     624 *
     625 * @return EOK on success or an error code
     626 */
     627errno_t ui_window_resize(ui_window_t *window, gfx_rect_t *rect)
     628{
     629        return ui_window_size_change(window, rect, ui_wsc_resize);
     630}
     631
    599632/** Set window callbacks.
    600633 *
     
    846879        ui_window_send_unfocus(window);
    847880        ui_unlock(window->ui);
     881}
     882
     883/** Window decoration requested window maximization.
     884 *
     885 * @param wdecor Window decoration
     886 * @param arg Argument (window)
     887 */
     888static void wd_maximize(ui_wdecor_t *wdecor, void *arg)
     889{
     890        ui_window_t *window = (ui_window_t *) arg;
     891
     892        ui_window_send_maximize(window);
     893}
     894
     895/** Window decoration requested window unmaximization.
     896 *
     897 * @param wdecor Window decoration
     898 * @param arg Argument (window)
     899 */
     900static void wd_unmaximize(ui_wdecor_t *wdecor, void *arg)
     901{
     902        ui_window_t *window = (ui_window_t *) arg;
     903
     904        ui_window_send_unmaximize(window);
    848905}
    849906
     
    9481005}
    9491006
     1007/** Send window maximize event.
     1008 *
     1009 * @param window Window
     1010 */
     1011void ui_window_send_maximize(ui_window_t *window)
     1012{
     1013        if (window->cb != NULL && window->cb->maximize != NULL)
     1014                window->cb->maximize(window, window->arg);
     1015        else
     1016                ui_window_def_maximize(window);
     1017}
     1018
     1019/** Send window unmaximize event.
     1020 *
     1021 * @param window Window
     1022 */
     1023void ui_window_send_unmaximize(ui_window_t *window)
     1024{
     1025        if (window->cb != NULL && window->cb->unmaximize != NULL)
     1026                window->cb->unmaximize(window, window->arg);
     1027        else
     1028                ui_window_def_unmaximize(window);
     1029}
     1030
    9501031/** Send window close event.
    9511032 *
     
    10141095        else
    10151096                return ui_window_def_unfocus(window);
     1097}
     1098
     1099/** Default window maximize routine.
     1100 *
     1101 * @param window Window
     1102 * @return EOK on success or an error code
     1103 */
     1104errno_t ui_window_def_maximize(ui_window_t *window)
     1105{
     1106        errno_t rc;
     1107        gfx_rect_t old_rect;
     1108        gfx_rect_t rect;
     1109
     1110        old_rect = window->rect;
     1111
     1112        if (window->dwindow != NULL) {
     1113                rc = display_window_get_max_rect(window->dwindow, &rect);
     1114                if (rc != EOK)
     1115                        return rc;
     1116        } else {
     1117                rect = window->ui->rect;
     1118        }
     1119
     1120        ui_wdecor_set_maximized(window->wdecor, true);
     1121
     1122        rc = ui_window_size_change(window, &rect, ui_wsc_maximize);
     1123        if (rc != EOK) {
     1124                ui_wdecor_set_maximized(window->wdecor, false);
     1125                return rc;
     1126        }
     1127
     1128        window->normal_rect = old_rect;
     1129        (void) ui_window_paint(window);
     1130        return EOK;
     1131}
     1132
     1133/** Default window unmaximize routine.
     1134 *
     1135 * @param window Window
     1136 * @return EOK on success or an error code
     1137 */
     1138errno_t ui_window_def_unmaximize(ui_window_t *window)
     1139{
     1140        errno_t rc;
     1141
     1142        ui_wdecor_set_maximized(window->wdecor, false);
     1143
     1144        rc = ui_window_size_change(window, &window->normal_rect,
     1145            ui_wsc_unmaximize);
     1146        if (rc != EOK) {
     1147                ui_wdecor_set_maximized(window->wdecor, true);
     1148                printf("ui_window_size_change->error\n");
     1149                return rc;
     1150        }
     1151
     1152        (void) ui_window_paint(window);
     1153        return EOK;
    10161154}
    10171155
Note: See TracChangeset for help on using the changeset viewer.