Changeset c9927c66 in mainline for uspace/lib/display/test/display.c


Ignore:
Timestamp:
2021-06-10T13:22:33Z (3 years ago)
Author:
jxsvoboda <5887334+jxsvoboda@…>
Branches:
master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9e84d2c
Parents:
c68c18b9
git-author:
Jiri Svoboda <jiri@…> (2021-05-27 17:00:30)
git-committer:
jxsvoboda <5887334+jxsvoboda@…> (2021-06-10 13:22:33)
Message:

Set menu popup position based on parent window position

Added a method for getting the position of a display window.
This is then combined with the menu bar entry rectangle (which is
relative to the parent window) to compute a screen-relative
rectangle close to which the popup should be placed.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/display/test/display.c

    rc68c18b9 rc9927c66  
    11/*
    2  * Copyright (c) 2019 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    5959static errno_t test_window_move_req(void *, sysarg_t, gfx_coord2_t *);
    6060static errno_t test_window_move(void *, sysarg_t, gfx_coord2_t *);
     61static errno_t test_window_get_pos(void *, sysarg_t, gfx_coord2_t *);
    6162static errno_t test_window_resize_req(void *, sysarg_t, display_wnd_rsztype_t,
    6263    gfx_coord2_t *);
     
    7475        .window_move_req = test_window_move_req,
    7576        .window_move = test_window_move,
     77        .window_get_pos = test_window_get_pos,
    7678        .window_resize_req = test_window_resize_req,
    7779        .window_resize = test_window_resize,
     
    115117        sysarg_t move_wnd_id;
    116118        gfx_coord2_t move_dpos;
     119
     120        bool window_get_pos_called;
     121        sysarg_t get_pos_wnd_id;
     122        gfx_coord2_t get_pos_rpos;
    117123
    118124        bool window_resize_req_called;
     
    556562}
    557563
     564/** display_window_get_pos() with server returning error response works. */
     565PCUT_TEST(window_get_pos_failure)
     566{
     567        errno_t rc;
     568        service_id_t sid;
     569        display_t *disp = NULL;
     570        display_wnd_params_t params;
     571        display_window_t *wnd;
     572        gfx_coord2_t dpos;
     573        test_response_t resp;
     574
     575        async_set_fallback_port_handler(test_display_conn, &resp);
     576
     577        // FIXME This causes this test to be non-reentrant!
     578        rc = loc_server_register(test_display_server);
     579        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     580
     581        rc = loc_service_register(test_display_svc, &sid);
     582        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     583
     584        rc = display_open(test_display_svc, &disp);
     585        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     586        PCUT_ASSERT_NOT_NULL(disp);
     587
     588        resp.rc = EOK;
     589        display_wnd_params_init(&params);
     590        params.rect.p0.x = 0;
     591        params.rect.p0.y = 0;
     592        params.rect.p0.x = 100;
     593        params.rect.p0.y = 100;
     594
     595        rc = display_window_create(disp, &params, &test_display_wnd_cb,
     596            (void *) &resp, &wnd);
     597        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     598        PCUT_ASSERT_NOT_NULL(wnd);
     599
     600        resp.rc = EIO;
     601        resp.window_get_pos_called = false;
     602
     603        dpos.x = 0;
     604        dpos.y = 0;
     605
     606        rc = display_window_get_pos(wnd, &dpos);
     607        PCUT_ASSERT_TRUE(resp.window_get_pos_called);
     608        PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
     609        PCUT_ASSERT_INT_EQUALS(wnd->id, resp.get_pos_wnd_id);
     610        PCUT_ASSERT_INT_EQUALS(0, dpos.x);
     611        PCUT_ASSERT_INT_EQUALS(0, dpos.y);
     612
     613        display_window_destroy(wnd);
     614        display_close(disp);
     615        rc = loc_service_unregister(sid);
     616        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     617}
     618
     619/** display_window_get_pos() with server returning success response works. */
     620PCUT_TEST(window_get_pos_success)
     621{
     622        errno_t rc;
     623        service_id_t sid;
     624        display_t *disp = NULL;
     625        display_wnd_params_t params;
     626        display_window_t *wnd;
     627        gfx_coord2_t dpos;
     628        test_response_t resp;
     629
     630        async_set_fallback_port_handler(test_display_conn, &resp);
     631
     632        // FIXME This causes this test to be non-reentrant!
     633        rc = loc_server_register(test_display_server);
     634        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     635
     636        rc = loc_service_register(test_display_svc, &sid);
     637        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     638
     639        rc = display_open(test_display_svc, &disp);
     640        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     641        PCUT_ASSERT_NOT_NULL(disp);
     642
     643        resp.rc = EOK;
     644        display_wnd_params_init(&params);
     645        params.rect.p0.x = 0;
     646        params.rect.p0.y = 0;
     647        params.rect.p0.x = 100;
     648        params.rect.p0.y = 100;
     649
     650        rc = display_window_create(disp, &params, &test_display_wnd_cb,
     651            (void *) &resp, &wnd);
     652        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     653        PCUT_ASSERT_NOT_NULL(wnd);
     654
     655        resp.rc = EOK;
     656        resp.window_get_pos_called = false;
     657        resp.get_pos_rpos.x = 11;
     658        resp.get_pos_rpos.y = 12;
     659
     660        dpos.x = 0;
     661        dpos.y = 0;
     662
     663        rc = display_window_get_pos(wnd, &dpos);
     664        PCUT_ASSERT_TRUE(resp.window_get_pos_called);
     665        PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
     666        PCUT_ASSERT_INT_EQUALS(wnd->id, resp.get_pos_wnd_id);
     667        PCUT_ASSERT_INT_EQUALS(resp.get_pos_rpos.x, dpos.x);
     668        PCUT_ASSERT_INT_EQUALS(resp.get_pos_rpos.y, dpos.y);
     669
     670        display_window_destroy(wnd);
     671        display_close(disp);
     672        rc = loc_service_unregister(sid);
     673        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     674}
     675
    558676/** display_window_resize_req() with server returning error response works. */
    559677PCUT_TEST(window_resize_req_failure)
     
    9371055        resp.rc = ENOMEM;
    9381056        rc = display_window_get_gc(wnd, &gc);
    939         /* async_connect_me_to() does not return specific error */
    940         PCUT_ASSERT_ERRNO_VAL(EIO, rc);
     1057        PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
    9411058        PCUT_ASSERT_NULL(gc);
    9421059
     
    15891706}
    15901707
     1708static errno_t test_window_get_pos(void *arg, sysarg_t wnd_id, gfx_coord2_t *dpos)
     1709{
     1710        test_response_t *resp = (test_response_t *) arg;
     1711
     1712        resp->window_get_pos_called = true;
     1713        resp->get_pos_wnd_id = wnd_id;
     1714
     1715        if (resp->rc == EOK)
     1716                *dpos = resp->get_pos_rpos;
     1717
     1718        return resp->rc;
     1719}
     1720
    15911721static errno_t test_window_resize_req(void *arg, sysarg_t wnd_id,
    15921722    display_wnd_rsztype_t rsztype, gfx_coord2_t *pos)
Note: See TracChangeset for help on using the changeset viewer.