Changeset 06176e1 in mainline for uspace/lib/ui/src


Ignore:
Timestamp:
2022-12-20T12:31:44Z (3 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4e7b0ad
Parents:
d46ac73
git-author:
Jiri Svoboda <jiri@…> (2022-12-19 18:31:30)
git-committer:
Jiri Svoboda <jiri@…> (2022-12-20 12:31:44)
Message:

Minimizing windows

Location:
uspace/lib/ui/src
Files:
3 edited

Legend:

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

    rd46ac73 r06176e1  
    529529}
    530530
     531/** Paint minimize icon.
     532 *
     533 * @param resource UI resource
     534 * @param pos Center position
     535 * @param w Icon width
     536 * @param h Icon height
     537 * @return EOK on success or an error code
     538 */
     539errno_t ui_paint_minicon(ui_resource_t *resource, gfx_coord2_t *pos,
     540    gfx_coord_t w, gfx_coord_t h)
     541{
     542        gfx_rect_t rect;
     543        errno_t rc;
     544
     545        rc = gfx_set_color(resource->gc, resource->btn_text_color);
     546        if (rc != EOK)
     547                return rc;
     548
     549        rect.p0.x = pos->x - w / 2;
     550        rect.p0.y = pos->y + h / 2 - 2;
     551        rect.p1.x = rect.p0.x + w;
     552        rect.p1.y = rect.p0.y + 2;
     553        rc = gfx_fill_rect(resource->gc, &rect);
     554        if (rc != EOK)
     555                return rc;
     556
     557        return EOK;
     558}
     559
    531560/** Paint maximize icon.
    532561 *
  • uspace/lib/ui/src/wdecor.c

    rd46ac73 r06176e1  
    4949#include "../private/wdecor.h"
    5050
     51static void ui_wdecor_btn_min_clicked(ui_pbutton_t *, void *);
     52static errno_t ui_wdecor_btn_min_paint(ui_pbutton_t *, void *,
     53    gfx_coord2_t *);
     54
    5155static void ui_wdecor_btn_max_clicked(ui_pbutton_t *, void *);
    5256static errno_t ui_wdecor_btn_max_paint(ui_pbutton_t *, void *,
     
    5660static errno_t ui_wdecor_btn_close_paint(ui_pbutton_t *, void *,
    5761    gfx_coord2_t *);
     62
     63static ui_pbutton_cb_t ui_wdecor_btn_min_cb = {
     64        .clicked = ui_wdecor_btn_min_clicked
     65};
     66
     67static ui_pbutton_decor_ops_t ui_wdecor_btn_min_decor_ops = {
     68        .paint = ui_wdecor_btn_min_paint
     69};
    5870
    5971static ui_pbutton_cb_t ui_wdecor_btn_max_cb = {
     
    98110        /** Close button cross pen height */
    99111        wdecor_close_cross_h = 1,
     112        /** Minimize icon width */
     113        wdecor_min_w = 10,
     114        /** Minimize icon height */
     115        wdecor_min_h = 10,
    100116        /** Maximize icon width */
    101117        wdecor_max_w = 10,
     
    136152        }
    137153
     154        if ((style & ui_wds_minimize_btn) != 0) {
     155                rc = ui_pbutton_create(resource, "_", &wdecor->btn_min);
     156                if (rc != EOK) {
     157                        ui_wdecor_destroy(wdecor);
     158                        return rc;
     159                }
     160
     161                ui_pbutton_set_cb(wdecor->btn_min, &ui_wdecor_btn_min_cb,
     162                    (void *)wdecor);
     163
     164                ui_pbutton_set_decor_ops(wdecor->btn_min,
     165                    &ui_wdecor_btn_min_decor_ops, (void *)wdecor);
     166        }
     167
    138168        if ((style & ui_wds_maximize_btn) != 0) {
    139169                rc = ui_pbutton_create(resource, "^", &wdecor->btn_max);
     
    180210                return;
    181211
     212        ui_pbutton_destroy(wdecor->btn_min);
    182213        ui_pbutton_destroy(wdecor->btn_max);
    183214        ui_pbutton_destroy(wdecor->btn_close);
     
    211242        ui_wdecor_get_geom(wdecor, &geom);
    212243
     244        if (wdecor->btn_min != NULL)
     245                ui_pbutton_set_rect(wdecor->btn_min, &geom.btn_min_rect);
    213246        if (wdecor->btn_max != NULL)
    214247                ui_pbutton_set_rect(wdecor->btn_max, &geom.btn_max_rect);
     
    362395                        return rc;
    363396
     397                if (wdecor->btn_min != NULL) {
     398                        rc = ui_pbutton_paint(wdecor->btn_min);
     399                        if (rc != EOK)
     400                                return rc;
     401                }
     402
    364403                if (wdecor->btn_max != NULL) {
    365404                        rc = ui_pbutton_paint(wdecor->btn_max);
     
    380419
    381420        return EOK;
     421}
     422
     423/** Send decoration minimize event.
     424 *
     425 * @param wdecor Window decoration
     426 */
     427void ui_wdecor_minimize(ui_wdecor_t *wdecor)
     428{
     429        if (wdecor->cb != NULL && wdecor->cb->minimize != NULL)
     430                wdecor->cb->minimize(wdecor, wdecor->arg);
    382431}
    383432
     
    554603        }
    555604
     605        /* Does window have a minimize button? */
     606        if ((wdecor->style & ui_wds_minimize_btn) != 0) {
     607                if (wdecor->res->textmode == false) {
     608                        geom->btn_min_rect.p0.x = btn_x - 20;
     609                        geom->btn_min_rect.p0.y = btn_y;
     610                        geom->btn_min_rect.p1.x = btn_x;
     611                        geom->btn_min_rect.p1.y = btn_y + 20;
     612
     613                        btn_x -= 20;
     614                } else {
     615                        geom->btn_min_rect.p0.x = btn_x - 3;
     616                        geom->btn_min_rect.p0.y = btn_y;
     617                        geom->btn_min_rect.p1.x = btn_x;
     618                        geom->btn_min_rect.p1.y = btn_y + 1;
     619
     620                        btn_x -= 3;
     621                }
     622        } else {
     623                geom->btn_min_rect.p0.x = 0;
     624                geom->btn_min_rect.p0.y = 0;
     625                geom->btn_min_rect.p1.x = 0;
     626                geom->btn_min_rect.p1.y = 0;
     627        }
     628
    556629        if (wdecor->res->textmode == false)
    557630                cap_hmargin = wdecor_cap_hmargin;
     
    773846        ui_wdecor_get_geom(wdecor, &geom);
    774847
     848        if (wdecor->btn_min != NULL) {
     849                claim = ui_pbutton_pos_event(wdecor->btn_min, event);
     850                if (claim == ui_claimed)
     851                        return ui_claimed;
     852        }
     853
    775854        if (wdecor->btn_max != NULL) {
    776855                claim = ui_pbutton_pos_event(wdecor->btn_max, event);
     
    798877}
    799878
     879/** Window decoration minimize button was clicked.
     880 *
     881 * @param pbutton Minimize button
     882 * @param arg Argument (ui_wdecor_t)
     883 */
     884static void ui_wdecor_btn_min_clicked(ui_pbutton_t *pbutton, void *arg)
     885{
     886        ui_wdecor_t *wdecor = (ui_wdecor_t *) arg;
     887
     888        (void) pbutton;
     889
     890        ui_wdecor_minimize(wdecor);
     891}
     892
    800893/** Window decoration (un)maximize button was clicked.
    801894 *
    802  * @param pbutton Close button
     895 * @param pbutton (Un)maximize button
    803896 * @param arg Argument (ui_wdecor_t)
    804897 */
     
    813906        else
    814907                ui_wdecor_maximize(wdecor);
     908}
     909
     910/** Paint minimize button decoration.
     911 *
     912 * @param pbutton Push button
     913 * @param arg Argument (ui_wdecor_t *)
     914 * @param pos Center position
     915 */
     916static errno_t ui_wdecor_btn_min_paint(ui_pbutton_t *pbutton,
     917    void *arg, gfx_coord2_t *pos)
     918{
     919        ui_wdecor_t *wdecor = (ui_wdecor_t *)arg;
     920        errno_t rc;
     921
     922        rc = ui_paint_minicon(wdecor->res, pos, wdecor_min_w,
     923            wdecor_min_h);
     924
     925        return rc;
    815926}
    816927
  • uspace/lib/ui/src/window.c

    rd46ac73 r06176e1  
    7474};
    7575
     76static void wd_minimize(ui_wdecor_t *, void *);
    7677static void wd_maximize(ui_wdecor_t *, void *);
    7778static void wd_unmaximize(ui_wdecor_t *, void *);
     
    8384
    8485static ui_wdecor_cb_t wdecor_cb = {
     86        .minimize = wd_minimize,
    8587        .maximize = wd_maximize,
    8688        .unmaximize = wd_unmaximize,
     
    917919}
    918920
     921/** Window decoration requested window minimization.
     922 *
     923 * @param wdecor Window decoration
     924 * @param arg Argument (window)
     925 */
     926static void wd_minimize(ui_wdecor_t *wdecor, void *arg)
     927{
     928        ui_window_t *window = (ui_window_t *) arg;
     929
     930        ui_window_send_minimize(window);
     931}
     932
    919933/** Window decoration requested window maximization.
    920934 *
     
    10411055}
    10421056
     1057/** Send window minimize event.
     1058 *
     1059 * @param window Window
     1060 */
     1061void ui_window_send_minimize(ui_window_t *window)
     1062{
     1063        if (window->cb != NULL && window->cb->maximize != NULL)
     1064                window->cb->minimize(window, window->arg);
     1065        else
     1066                ui_window_def_minimize(window);
     1067}
     1068
    10431069/** Send window maximize event.
    10441070 *
     
    11311157        else
    11321158                return ui_window_def_unfocus(window);
     1159}
     1160
     1161/** Default window minimize routine.
     1162 *
     1163 * @param window Window
     1164 * @return EOK on success or an error code
     1165 */
     1166errno_t ui_window_def_minimize(ui_window_t *window)
     1167{
     1168        errno_t rc;
     1169
     1170        if (window->dwindow != NULL) {
     1171                rc = display_window_minimize(window->dwindow);
     1172                if (rc != EOK)
     1173                        goto error;
     1174        }
     1175
     1176        return EOK;
     1177error:
     1178        return rc;
    11331179}
    11341180
Note: See TracChangeset for help on using the changeset viewer.