Changeset 0680854 in mainline for uspace/lib/display


Ignore:
Timestamp:
2020-03-20T15:42:27Z (5 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0b7e394
Parents:
aeb3037
git-author:
Jiri Svoboda <jiri@…> (2020-03-19 19:42:21)
git-committer:
Jiri Svoboda <jiri@…> (2020-03-20 15:42:27)
Message:

Moving window by client request, emulate window placement flags

Location:
uspace/lib/display
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/display/include/disp_srv.h

    raeb3037 r0680854  
    5959        errno_t (*window_resize_req)(void *, sysarg_t, display_wnd_rsztype_t,
    6060            gfx_coord2_t *);
     61        errno_t (*window_move)(void *, sysarg_t, gfx_coord2_t *);
    6162        errno_t (*window_resize)(void *, sysarg_t, gfx_coord2_t *, gfx_rect_t *);
    6263        errno_t (*get_event)(void *, sysarg_t *, display_wnd_ev_t *);
  • uspace/lib/display/include/display.h

    raeb3037 r0680854  
    5656extern errno_t display_window_resize_req(display_window_t *,
    5757    display_wnd_rsztype_t, gfx_coord2_t *);
     58extern errno_t display_window_move(display_window_t *, gfx_coord2_t *);
    5859extern errno_t display_window_resize(display_window_t *,
    5960    gfx_coord2_t *, gfx_rect_t *);
  • uspace/lib/display/include/ipc/display.h

    raeb3037 r0680854  
    4242        DISPLAY_WINDOW_CREATE,
    4343        DISPLAY_WINDOW_DESTROY,
     44        DISPLAY_WINDOW_MOVE,
    4445        DISPLAY_WINDOW_MOVE_REQ,
    4546        DISPLAY_WINDOW_RESIZE,
  • uspace/lib/display/src/disp_srv.c

    raeb3037 r0680854  
    149149}
    150150
    151 static void display_window_resize_req_srv(display_srv_t *srv, ipc_call_t *icall)
    152 {
    153         sysarg_t wnd_id;
    154         ipc_call_t call;
    155         display_wnd_rsztype_t rsztype;
    156         gfx_coord2_t pos;
     151static void display_window_move_srv(display_srv_t *srv, ipc_call_t *icall)
     152{
     153        sysarg_t wnd_id;
     154        ipc_call_t call;
     155        gfx_coord2_t dpos;
    157156        size_t size;
    158157        errno_t rc;
    159158
    160159        wnd_id = ipc_get_arg1(icall);
    161         rsztype = (display_wnd_rsztype_t) ipc_get_arg2(icall);
    162160
    163161        if (!async_data_write_receive(&call, &size)) {
     
    173171        }
    174172
     173        rc = async_data_write_finalize(&call, &dpos, size);
     174        if (rc != EOK) {
     175                async_answer_0(&call, rc);
     176                async_answer_0(icall, rc);
     177                return;
     178        }
     179
     180        if (srv->ops->window_move == NULL) {
     181                async_answer_0(icall, ENOTSUP);
     182                return;
     183        }
     184
     185        rc = srv->ops->window_move(srv->arg, wnd_id, &dpos);
     186        async_answer_0(icall, rc);
     187}
     188
     189
     190static void display_window_resize_req_srv(display_srv_t *srv, ipc_call_t *icall)
     191{
     192        sysarg_t wnd_id;
     193        ipc_call_t call;
     194        display_wnd_rsztype_t rsztype;
     195        gfx_coord2_t pos;
     196        size_t size;
     197        errno_t rc;
     198
     199        wnd_id = ipc_get_arg1(icall);
     200        rsztype = (display_wnd_rsztype_t) ipc_get_arg2(icall);
     201
     202        if (!async_data_write_receive(&call, &size)) {
     203                async_answer_0(&call, EREFUSED);
     204                async_answer_0(icall, EREFUSED);
     205                return;
     206        }
     207
     208        if (size != sizeof(gfx_coord2_t)) {
     209                async_answer_0(&call, EINVAL);
     210                async_answer_0(icall, EINVAL);
     211                return;
     212        }
     213
    175214        rc = async_data_write_finalize(&call, &pos, size);
    176215        if (rc != EOK) {
     
    339378                case DISPLAY_WINDOW_MOVE_REQ:
    340379                        display_window_move_req_srv(srv, &call);
     380                        break;
     381                case DISPLAY_WINDOW_MOVE:
     382                        display_window_move_srv(srv, &call);
    341383                        break;
    342384                case DISPLAY_WINDOW_RESIZE_REQ:
  • uspace/lib/display/src/display.c

    raeb3037 r0680854  
    277277}
    278278
     279/** Move display window.
     280 *
     281 * Set new display position of a window. Display position determines where
     282 * the origin of the window coordinate system lies. Note that the top left
     283 * corner of the window need not coincide with the window's 0,0 point.
     284 *
     285 * @param window Window
     286 * @param dpos New display position
     287 * @return EOK on success or an error code
     288 */
     289errno_t display_window_move(display_window_t *window, gfx_coord2_t *dpos)
     290{
     291        async_exch_t *exch;
     292        aid_t req;
     293        ipc_call_t answer;
     294        errno_t rc;
     295
     296        exch = async_exchange_begin(window->display->sess);
     297        req = async_send_1(exch, DISPLAY_WINDOW_MOVE, window->id, &answer);
     298        rc = async_data_write_start(exch, dpos, sizeof (gfx_coord2_t));
     299        async_exchange_end(exch);
     300        if (rc != EOK) {
     301                async_forget(req);
     302                return rc;
     303        }
     304
     305        async_wait_for(req, &rc);
     306        if (rc != EOK)
     307                return rc;
     308
     309        return EOK;
     310}
     311
     312
    279313/** Request a window resize.
    280314 *
  • uspace/lib/display/test/display.c

    raeb3037 r0680854  
    5757static errno_t test_window_destroy(void *, sysarg_t);
    5858static errno_t test_window_move_req(void *, sysarg_t, gfx_coord2_t *);
     59static errno_t test_window_move(void *, sysarg_t, gfx_coord2_t *);
    5960static errno_t test_window_resize_req(void *, sysarg_t, display_wnd_rsztype_t,
    6061    gfx_coord2_t *);
     
    7071        .window_destroy = test_window_destroy,
    7172        .window_move_req = test_window_move_req,
     73        .window_move = test_window_move,
    7274        .window_resize_req = test_window_resize_req,
    7375        .window_resize = test_window_resize,
     
    106108        sysarg_t move_req_wnd_id;
    107109        gfx_coord2_t move_req_pos;
     110
     111        bool window_move_called;
     112        sysarg_t move_wnd_id;
     113        gfx_coord2_t move_dpos;
    108114
    109115        bool window_resize_req_called;
     
    422428        PCUT_ASSERT_INT_EQUALS(pos.x, resp.move_req_pos.x);
    423429        PCUT_ASSERT_INT_EQUALS(pos.y, resp.move_req_pos.y);
     430
     431        display_window_destroy(wnd);
     432        display_close(disp);
     433        rc = loc_service_unregister(sid);
     434        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     435}
     436
     437/** display_window_move() with server returning error response works. */
     438PCUT_TEST(window_move_failure)
     439{
     440        errno_t rc;
     441        service_id_t sid;
     442        display_t *disp = NULL;
     443        display_wnd_params_t params;
     444        display_window_t *wnd;
     445        gfx_coord2_t dpos;
     446        test_response_t resp;
     447
     448        async_set_fallback_port_handler(test_display_conn, &resp);
     449
     450        // FIXME This causes this test to be non-reentrant!
     451        rc = loc_server_register(test_display_server);
     452        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     453
     454        rc = loc_service_register(test_display_svc, &sid);
     455        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     456
     457        rc = display_open(test_display_svc, &disp);
     458        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     459        PCUT_ASSERT_NOT_NULL(disp);
     460
     461        resp.rc = EOK;
     462        display_wnd_params_init(&params);
     463        params.rect.p0.x = 0;
     464        params.rect.p0.y = 0;
     465        params.rect.p0.x = 100;
     466        params.rect.p0.y = 100;
     467
     468        rc = display_window_create(disp, &params, &test_display_wnd_cb,
     469            (void *) &resp, &wnd);
     470        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     471        PCUT_ASSERT_NOT_NULL(wnd);
     472
     473        resp.rc = EIO;
     474        resp.window_move_called = false;
     475        dpos.x = 11;
     476        dpos.y = 12;
     477
     478        rc = display_window_move(wnd, &dpos);
     479        PCUT_ASSERT_TRUE(resp.window_move_called);
     480        PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
     481        PCUT_ASSERT_INT_EQUALS(wnd->id, resp.move_wnd_id);
     482        PCUT_ASSERT_INT_EQUALS(dpos.x, resp.move_dpos.x);
     483        PCUT_ASSERT_INT_EQUALS(dpos.y, resp.move_dpos.y);
     484
     485        display_window_destroy(wnd);
     486        display_close(disp);
     487        rc = loc_service_unregister(sid);
     488        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     489}
     490
     491/** display_window_move() with server returning success response works. */
     492PCUT_TEST(window_move_success)
     493{
     494        errno_t rc;
     495        service_id_t sid;
     496        display_t *disp = NULL;
     497        display_wnd_params_t params;
     498        display_window_t *wnd;
     499        gfx_coord2_t dpos;
     500        test_response_t resp;
     501
     502        async_set_fallback_port_handler(test_display_conn, &resp);
     503
     504        // FIXME This causes this test to be non-reentrant!
     505        rc = loc_server_register(test_display_server);
     506        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     507
     508        rc = loc_service_register(test_display_svc, &sid);
     509        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     510
     511        rc = display_open(test_display_svc, &disp);
     512        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     513        PCUT_ASSERT_NOT_NULL(disp);
     514
     515        resp.rc = EOK;
     516        display_wnd_params_init(&params);
     517        params.rect.p0.x = 0;
     518        params.rect.p0.y = 0;
     519        params.rect.p0.x = 100;
     520        params.rect.p0.y = 100;
     521
     522        rc = display_window_create(disp, &params, &test_display_wnd_cb,
     523            (void *) &resp, &wnd);
     524        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     525        PCUT_ASSERT_NOT_NULL(wnd);
     526
     527        resp.rc = EOK;
     528        resp.window_move_called = false;
     529        dpos.x = 11;
     530        dpos.y = 12;
     531
     532        rc = display_window_move(wnd, &dpos);
     533        PCUT_ASSERT_TRUE(resp.window_move_called);
     534        PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
     535        PCUT_ASSERT_INT_EQUALS(wnd->id, resp.move_wnd_id);
     536        PCUT_ASSERT_INT_EQUALS(dpos.x, resp.move_dpos.x);
     537        PCUT_ASSERT_INT_EQUALS(dpos.y, resp.move_dpos.y);
    424538
    425539        display_window_destroy(wnd);
     
    13521466}
    13531467
     1468static errno_t test_window_move(void *arg, sysarg_t wnd_id, gfx_coord2_t *dpos)
     1469{
     1470        test_response_t *resp = (test_response_t *) arg;
     1471
     1472        resp->window_move_called = true;
     1473        resp->move_wnd_id = wnd_id;
     1474        resp->move_dpos = *dpos;
     1475        return resp->rc;
     1476}
     1477
    13541478static errno_t test_window_resize_req(void *arg, sysarg_t wnd_id,
    13551479    display_wnd_rsztype_t rsztype, gfx_coord2_t *pos)
Note: See TracChangeset for help on using the changeset viewer.