Changeset 0680854 in mainline for uspace/lib/display
- Timestamp:
- 2020-03-20T15:42:27Z (5 years ago)
- 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)
- Location:
- uspace/lib/display
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/display/include/disp_srv.h
raeb3037 r0680854 59 59 errno_t (*window_resize_req)(void *, sysarg_t, display_wnd_rsztype_t, 60 60 gfx_coord2_t *); 61 errno_t (*window_move)(void *, sysarg_t, gfx_coord2_t *); 61 62 errno_t (*window_resize)(void *, sysarg_t, gfx_coord2_t *, gfx_rect_t *); 62 63 errno_t (*get_event)(void *, sysarg_t *, display_wnd_ev_t *); -
uspace/lib/display/include/display.h
raeb3037 r0680854 56 56 extern errno_t display_window_resize_req(display_window_t *, 57 57 display_wnd_rsztype_t, gfx_coord2_t *); 58 extern errno_t display_window_move(display_window_t *, gfx_coord2_t *); 58 59 extern errno_t display_window_resize(display_window_t *, 59 60 gfx_coord2_t *, gfx_rect_t *); -
uspace/lib/display/include/ipc/display.h
raeb3037 r0680854 42 42 DISPLAY_WINDOW_CREATE, 43 43 DISPLAY_WINDOW_DESTROY, 44 DISPLAY_WINDOW_MOVE, 44 45 DISPLAY_WINDOW_MOVE_REQ, 45 46 DISPLAY_WINDOW_RESIZE, -
uspace/lib/display/src/disp_srv.c
raeb3037 r0680854 149 149 } 150 150 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; 151 static 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; 157 156 size_t size; 158 157 errno_t rc; 159 158 160 159 wnd_id = ipc_get_arg1(icall); 161 rsztype = (display_wnd_rsztype_t) ipc_get_arg2(icall);162 160 163 161 if (!async_data_write_receive(&call, &size)) { … … 173 171 } 174 172 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 190 static 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 175 214 rc = async_data_write_finalize(&call, &pos, size); 176 215 if (rc != EOK) { … … 339 378 case DISPLAY_WINDOW_MOVE_REQ: 340 379 display_window_move_req_srv(srv, &call); 380 break; 381 case DISPLAY_WINDOW_MOVE: 382 display_window_move_srv(srv, &call); 341 383 break; 342 384 case DISPLAY_WINDOW_RESIZE_REQ: -
uspace/lib/display/src/display.c
raeb3037 r0680854 277 277 } 278 278 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 */ 289 errno_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 279 313 /** Request a window resize. 280 314 * -
uspace/lib/display/test/display.c
raeb3037 r0680854 57 57 static errno_t test_window_destroy(void *, sysarg_t); 58 58 static errno_t test_window_move_req(void *, sysarg_t, gfx_coord2_t *); 59 static errno_t test_window_move(void *, sysarg_t, gfx_coord2_t *); 59 60 static errno_t test_window_resize_req(void *, sysarg_t, display_wnd_rsztype_t, 60 61 gfx_coord2_t *); … … 70 71 .window_destroy = test_window_destroy, 71 72 .window_move_req = test_window_move_req, 73 .window_move = test_window_move, 72 74 .window_resize_req = test_window_resize_req, 73 75 .window_resize = test_window_resize, … … 106 108 sysarg_t move_req_wnd_id; 107 109 gfx_coord2_t move_req_pos; 110 111 bool window_move_called; 112 sysarg_t move_wnd_id; 113 gfx_coord2_t move_dpos; 108 114 109 115 bool window_resize_req_called; … … 422 428 PCUT_ASSERT_INT_EQUALS(pos.x, resp.move_req_pos.x); 423 429 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. */ 438 PCUT_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(¶ms); 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, ¶ms, &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. */ 492 PCUT_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(¶ms); 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, ¶ms, &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); 424 538 425 539 display_window_destroy(wnd); … … 1352 1466 } 1353 1467 1468 static 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 1354 1478 static errno_t test_window_resize_req(void *arg, sysarg_t wnd_id, 1355 1479 display_wnd_rsztype_t rsztype, gfx_coord2_t *pos)
Note:
See TracChangeset
for help on using the changeset viewer.