Changeset b3eeae5 in mainline for uspace/srv
- Timestamp:
- 2023-01-15T09:24:50Z (3 years ago)
- Branches:
- master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 46a47c0
- Parents:
- 46b02cb
- Location:
- uspace/srv/hid/display
- Files:
-
- 3 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/display/cfgops.c
r46b02cb rb3eeae5 40 40 #include <dispcfg_srv.h> 41 41 #include "display.h" 42 #include "idevcfg.h" 42 43 #include "seat.h" 43 44 #include "cfgclient.h" … … 47 48 static errno_t dispc_seat_create(void *, const char *, sysarg_t *); 48 49 static errno_t dispc_seat_delete(void *, sysarg_t); 50 static errno_t dispc_dev_assign(void *, sysarg_t, sysarg_t); 51 static errno_t dispc_dev_unassign(void *, sysarg_t); 49 52 static errno_t dispc_get_event(void *, dispcfg_ev_t *); 50 53 … … 54 57 .seat_create = dispc_seat_create, 55 58 .seat_delete = dispc_seat_delete, 59 .dev_assign = dispc_dev_assign, 60 .dev_unassign = dispc_dev_unassign, 56 61 .get_event = dispc_get_event, 57 62 }; … … 207 212 } 208 213 214 /** Assign device to seat. 215 * 216 * @param arg Argument (CFG client) 217 * @param svc_id Device service ID 218 * @param seat_id Seat ID 219 * @return EOK on success or an error code 220 */ 221 static errno_t dispc_dev_assign(void *arg, sysarg_t svc_id, sysarg_t seat_id) 222 { 223 ds_cfgclient_t *cfgclient = (ds_cfgclient_t *)arg; 224 ds_seat_t *seat; 225 ds_idevcfg_t *idevcfg; 226 errno_t rc; 227 228 log_msg(LOG_DEFAULT, LVL_DEBUG, "dispcfg_dev_assign()"); 229 230 ds_display_lock(cfgclient->display); 231 seat = ds_display_find_seat(cfgclient->display, seat_id); 232 if (seat == NULL) { 233 ds_display_unlock(cfgclient->display); 234 return ENOENT; 235 } 236 237 rc = ds_idevcfg_create(cfgclient->display, svc_id, seat, &idevcfg); 238 if (rc != EOK) { 239 assert(rc == ENOMEM); 240 ds_display_unlock(cfgclient->display); 241 return ENOMEM; 242 } 243 244 (void)idevcfg; 245 246 ds_display_unlock(cfgclient->display); 247 return EOK; 248 } 249 250 /** Unassign device from any seat. 251 * 252 * @param arg Argument (CFG client) 253 * @param svc_id Device service ID 254 * @return EOK on success or an error code 255 */ 256 static errno_t dispc_dev_unassign(void *arg, sysarg_t svc_id) 257 { 258 ds_cfgclient_t *cfgclient = (ds_cfgclient_t *)arg; 259 ds_idevcfg_t *idevcfg; 260 261 log_msg(LOG_DEFAULT, LVL_DEBUG, "dispcfg_dev_unassign()"); 262 263 ds_display_lock(cfgclient->display); 264 265 idevcfg = ds_display_first_idevcfg(cfgclient->display); 266 while (idevcfg != NULL) { 267 if (idevcfg->svc_id == svc_id) 268 break; 269 270 idevcfg = ds_display_next_idevcfg(idevcfg); 271 } 272 273 if (idevcfg == NULL) { 274 ds_display_unlock(cfgclient->display); 275 return ENOENT; 276 } 277 278 ds_idevcfg_destroy(idevcfg); 279 ds_display_unlock(cfgclient->display); 280 return EOK; 281 } 282 209 283 /** Get display configuration event. 210 284 * -
uspace/srv/hid/display/display.c
r46b02cb rb3eeae5 101 101 disp->next_wnd_id = 1; 102 102 list_initialize(&disp->ddevs); 103 list_initialize(&disp->idevcfgs); 103 104 list_initialize(&disp->seats); 104 105 list_initialize(&disp->windows); … … 124 125 assert(list_empty(&disp->seats)); 125 126 assert(list_empty(&disp->ddevs)); 127 assert(list_empty(&disp->idevcfgs)); 126 128 assert(list_empty(&disp->seats)); 127 129 assert(list_empty(&disp->windows)); … … 623 625 ds_seat_t *ds_display_seat_by_idev(ds_display_t *disp, ds_idev_id_t idev_id) 624 626 { 625 // TODO Multi-seat 626 (void) idev_id; 627 627 ds_idevcfg_t *idevcfg; 628 629 /* 630 * Find input device configuration entry that maps this input device 631 * to a seat. 632 */ 633 idevcfg = ds_display_first_idevcfg(disp); 634 while (idevcfg != NULL) { 635 if (idevcfg->svc_id == idev_id) 636 return idevcfg->seat; 637 638 idevcfg = ds_display_next_idevcfg(idevcfg); 639 } 640 641 /* If none was found, return the default seat */ 628 642 return ds_display_first_seat(disp); 629 643 } … … 772 786 773 787 return list_get_instance(link, ds_ddev_t, lddevs); 788 } 789 790 /** Add input device configuration entry to display. 791 * 792 * @param disp Display 793 * @param idevcfg Input device configuration 794 */ 795 void ds_display_add_idevcfg(ds_display_t *disp, ds_idevcfg_t *idevcfg) 796 { 797 assert(idevcfg->display == NULL); 798 assert(!link_used(&idevcfg->lidevcfgs)); 799 800 idevcfg->display = disp; 801 list_append(&idevcfg->lidevcfgs, &disp->idevcfgs); 802 } 803 804 /** Remove input device configuration entry from display. 805 * 806 * @param idevcfg Input device configuration entry 807 */ 808 void ds_display_remove_idevcfg(ds_idevcfg_t *idevcfg) 809 { 810 list_remove(&idevcfg->lidevcfgs); 811 idevcfg->display = NULL; 812 } 813 814 /** Get first input device configuration entry in display. 815 * 816 * @param disp Display 817 * @return First input device configuration entry or @c NULL if there is none 818 */ 819 ds_idevcfg_t *ds_display_first_idevcfg(ds_display_t *disp) 820 { 821 link_t *link = list_first(&disp->idevcfgs); 822 823 if (link == NULL) 824 return NULL; 825 826 return list_get_instance(link, ds_idevcfg_t, lidevcfgs); 827 } 828 829 /** Get next input device configuration entry in display. 830 * 831 * @param idevcfg Current input device configuration entry 832 * @return Next input device configuration entry or @c NULL if there is none 833 */ 834 ds_idevcfg_t *ds_display_next_idevcfg(ds_idevcfg_t *idevcfg) 835 { 836 link_t *link = list_next(&idevcfg->lidevcfgs, &idevcfg->display->idevcfgs); 837 838 if (link == NULL) 839 return NULL; 840 841 return list_get_instance(link, ds_idevcfg_t, lidevcfgs); 774 842 } 775 843 -
uspace/srv/hid/display/display.h
r46b02cb rb3eeae5 48 48 #include "types/display/display.h" 49 49 #include "types/display/idev.h" 50 #include "types/display/idevcfg.h" 50 51 #include "types/display/ptd_event.h" 51 52 #include "types/display/seat.h" … … 90 91 extern ds_ddev_t *ds_display_first_ddev(ds_display_t *); 91 92 extern ds_ddev_t *ds_display_next_ddev(ds_ddev_t *); 93 extern void ds_display_add_idevcfg(ds_display_t *, ds_idevcfg_t *); 94 extern void ds_display_remove_idevcfg(ds_idevcfg_t *); 95 extern ds_idevcfg_t *ds_display_first_idevcfg(ds_display_t *); 96 extern ds_idevcfg_t *ds_display_next_idevcfg(ds_idevcfg_t *); 92 97 extern void ds_display_add_cursor(ds_display_t *, ds_cursor_t *); 93 98 extern void ds_display_remove_cursor(ds_cursor_t *); -
uspace/srv/hid/display/meson.build
r46b02cb rb3eeae5 39 39 'display.c', 40 40 'dsops.c', 41 'idevcfg.c', 41 42 'input.c', 42 43 'main.c', … … 56 57 'ddev.c', 57 58 'display.c', 59 'idevcfg.c', 58 60 'seat.c', 59 61 'window.c', -
uspace/srv/hid/display/test/display.c
r46b02cb rb3eeae5 35 35 #include "../client.h" 36 36 #include "../display.h" 37 #include "../idevcfg.h" 37 38 #include "../seat.h" 38 39 #include "../window.h" … … 397 398 } 398 399 400 /** Basic idevcfg operation */ 401 PCUT_TEST(display_idevcfg) 402 { 403 ds_display_t *disp; 404 ds_seat_t *seat; 405 ds_idevcfg_t *idevcfg; 406 errno_t rc; 407 408 rc = ds_display_create(NULL, df_none, &disp); 409 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 410 411 rc = ds_seat_create(disp, "Alice", &seat); 412 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 413 414 rc = ds_idevcfg_create(disp, 42, seat, &idevcfg); 415 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 416 417 ds_idevcfg_destroy(idevcfg); 418 419 ds_seat_destroy(seat); 420 ds_display_destroy(disp); 421 } 422 399 423 /** Basic seat operation. */ 400 424 PCUT_TEST(display_seat) -
uspace/srv/hid/display/types/display/display.h
r46b02cb rb3eeae5 90 90 list_t ddevs; 91 91 92 /** Input device configuration entries (of ds_idevcfg_t) */ 93 list_t idevcfgs; 94 92 95 /** Background color */ 93 96 gfx_color_t *bg_color;
Note:
See TracChangeset
for help on using the changeset viewer.