Changeset b0ae23f in mainline for uspace/lib/ui


Ignore:
Timestamp:
2023-01-17T15:21:13Z (3 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a0d4afe
Parents:
46a47c0
git-author:
Jiri Svoboda <jiri@…> (2023-01-17 18:21:02)
git-committer:
Jiri Svoboda <jiri@…> (2023-01-17 15:21:13)
Message:

Change the correct pointer's shape when resizing window

The request to resize a window originates from the client. The display
server forces the cursor to a double-arrow shape regardless of whether
it is over the window or not, until the resize is done. This is to
make sure the cursor keeps that shape even if it moves outside of
the current boundaries of the window. With multiple pointers we need
to know which one to change. This is done by passing the pos_id from
button press event that starts the resize all the way to
ds_window_start_resize(). Then it needs to be stored in the window
structure for use when it is time to restore the cursor.

Location:
uspace/lib/ui
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ui/include/types/ui/wdecor.h

    r46a47c0 rb0ae23f  
    11/*
    2  * Copyright (c) 2022 Jiri Svoboda
     2 * Copyright (c) 2023 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    8787        void (*move)(ui_wdecor_t *, void *, gfx_coord2_t *);
    8888        void (*resize)(ui_wdecor_t *, void *, ui_wdecor_rsztype_t,
    89             gfx_coord2_t *);
     89            gfx_coord2_t *, sysarg_t);
    9090        void (*set_cursor)(ui_wdecor_t *, void *, ui_stock_cursor_t);
    9191} ui_wdecor_cb_t;
  • uspace/lib/ui/private/wdecor.h

    r46a47c0 rb0ae23f  
    11/*
    2  * Copyright (c) 2022 Jiri Svoboda
     2 * Copyright (c) 2023 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    100100extern void ui_wdecor_move(ui_wdecor_t *, gfx_coord2_t *);
    101101extern void ui_wdecor_resize(ui_wdecor_t *, ui_wdecor_rsztype_t,
    102     gfx_coord2_t *);
     102    gfx_coord2_t *, sysarg_t);
    103103extern void ui_wdecor_set_cursor(ui_wdecor_t *, ui_stock_cursor_t);
    104104extern void ui_wdecor_get_geom(ui_wdecor_t *, ui_wdecor_geom_t *);
  • uspace/lib/ui/src/wdecor.c

    r46a47c0 rb0ae23f  
    11/*
    2  * Copyright (c) 2022 Jiri Svoboda
     2 * Copyright (c) 2023 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    477477 * @param rsztype Resize type
    478478 * @param pos Position where the button was pressed
     479 * @param pos_id Positioning device ID
    479480 */
    480481void ui_wdecor_resize(ui_wdecor_t *wdecor, ui_wdecor_rsztype_t rsztype,
    481     gfx_coord2_t *pos)
     482    gfx_coord2_t *pos, sysarg_t pos_id)
    482483{
    483484        if (wdecor->cb != NULL && wdecor->cb->resize != NULL)
    484                 wdecor->cb->resize(wdecor, wdecor->arg, rsztype, pos);
     485                wdecor->cb->resize(wdecor, wdecor->arg, rsztype, pos, pos_id);
    485486}
    486487
     
    826827        /* Press on window border? */
    827828        if (rsztype != ui_wr_none && event->type == POS_PRESS)
    828                 ui_wdecor_resize(wdecor, rsztype, &pos);
     829                ui_wdecor_resize(wdecor, rsztype, &pos, event->pos_id);
    829830}
    830831
  • uspace/lib/ui/src/window.c

    r46a47c0 rb0ae23f  
    8080static void wd_move(ui_wdecor_t *, void *, gfx_coord2_t *);
    8181static void wd_resize(ui_wdecor_t *, void *, ui_wdecor_rsztype_t,
    82     gfx_coord2_t *);
     82    gfx_coord2_t *, sysarg_t);
    8383static void wd_set_cursor(ui_wdecor_t *, void *, ui_stock_cursor_t);
    8484
     
    988988 * @param rsztype Resize type
    989989 * @param pos Position where the button was pressed
     990 * @param pos_id Positioning device ID
    990991 */
    991992static void wd_resize(ui_wdecor_t *wdecor, void *arg,
    992     ui_wdecor_rsztype_t rsztype, gfx_coord2_t *pos)
    993 {
    994         ui_window_t *window = (ui_window_t *) arg;
    995 
    996         if (window->dwindow != NULL)
    997                 (void) display_window_resize_req(window->dwindow, rsztype, pos);
     993    ui_wdecor_rsztype_t rsztype, gfx_coord2_t *pos, sysarg_t pos_id)
     994{
     995        ui_window_t *window = (ui_window_t *) arg;
     996
     997        if (window->dwindow != NULL) {
     998                (void) display_window_resize_req(window->dwindow, rsztype,
     999                    pos, pos_id);
     1000        }
    9981001}
    9991002
  • uspace/lib/ui/test/wdecor.c

    r46a47c0 rb0ae23f  
    11/*
    2  * Copyright (c) 2022 Jiri Svoboda
     2 * Copyright (c) 2023 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    6868static void test_wdecor_move(ui_wdecor_t *, void *, gfx_coord2_t *);
    6969static void test_wdecor_resize(ui_wdecor_t *, void *, ui_wdecor_rsztype_t,
    70     gfx_coord2_t *);
     70    gfx_coord2_t *, sysarg_t);
    7171static void test_wdecor_set_cursor(ui_wdecor_t *, void *, ui_stock_cursor_t);
    7272
     
    108108        bool move;
    109109        gfx_coord2_t pos;
     110        sysarg_t pos_id;
    110111        bool resize;
    111112        ui_wdecor_rsztype_t rsztype;
     
    373374        ui_wdecor_rsztype_t rsztype;
    374375        gfx_coord2_t pos;
     376        sysarg_t pos_id;
    375377
    376378        rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
     
    380382        pos.x = 3;
    381383        pos.y = 4;
     384        pos_id = 5;
    382385
    383386        /* Resize callback with no callbacks set */
    384         ui_wdecor_resize(wdecor, rsztype, &pos);
     387        ui_wdecor_resize(wdecor, rsztype, &pos, pos_id);
    385388
    386389        /* Resize callback with move callback not implemented */
    387390        ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
    388         ui_wdecor_resize(wdecor, rsztype, &pos);
     391        ui_wdecor_resize(wdecor, rsztype, &pos, pos_id);
    389392
    390393        /* Resize callback with real callback set */
     
    394397        resp.pos.y = 0;
    395398        ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
    396         ui_wdecor_resize(wdecor, rsztype, &pos);
     399        ui_wdecor_resize(wdecor, rsztype, &pos, pos_id);
    397400        PCUT_ASSERT_TRUE(resp.resize);
    398401        PCUT_ASSERT_INT_EQUALS(rsztype, resp.rsztype);
    399402        PCUT_ASSERT_INT_EQUALS(pos.x, resp.pos.x);
    400403        PCUT_ASSERT_INT_EQUALS(pos.y, resp.pos.y);
     404        PCUT_ASSERT_INT_EQUALS(pos_id, resp.pos_id);
    401405
    402406        ui_wdecor_destroy(wdecor);
     
    10801084
    10811085static void test_wdecor_resize(ui_wdecor_t *wdecor, void *arg,
    1082     ui_wdecor_rsztype_t rsztype, gfx_coord2_t *pos)
     1086    ui_wdecor_rsztype_t rsztype, gfx_coord2_t *pos, sysarg_t pos_id)
    10831087{
    10841088        test_cb_resp_t *resp = (test_cb_resp_t *) arg;
     
    10871091        resp->rsztype = rsztype;
    10881092        resp->pos = *pos;
     1093        resp->pos_id = pos_id;
    10891094}
    10901095
Note: See TracChangeset for help on using the changeset viewer.