Changes in uspace/srv/hid/compositor/compositor.c [d17a4a9:6d5e378] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/compositor/compositor.c
rd17a4a9 r6d5e378 49 49 #include <adt/prodcons.h> 50 50 #include <adt/list.h> 51 #include <io/input.h>52 51 #include <ipc/graph.h> 52 #include <ipc/input.h> 53 53 #include <ipc/window.h> 54 54 … … 92 92 sysarg_t id; 93 93 uint8_t state; 94 desktop_point_t pos; 94 sysarg_t hpos; 95 sysarg_t vpos; 95 96 sysarg_t btn_num; 96 desktop_point_t btn_pos; 97 desktop_vector_t accum; 97 sysarg_t btn_hpos; 98 sysarg_t btn_vpos; 99 int accum_dx; 100 int accum_dy; 98 101 sysarg_t grab_flags; 99 102 bool pressed; … … 132 135 vslmode_t mode; 133 136 async_sess_t *sess; 134 desktop_point_t pos; 137 sysarg_t hpos; 138 sysarg_t vpos; 135 139 surface_t *surface; 136 140 } viewport_t; … … 139 143 static LIST_INITIALIZE(viewport_list); 140 144 141 /** Input server proxy */ 142 static input_t *input; 143 144 static int comp_key_press(input_t *, kbd_event_type_t, keycode_t, keymod_t, wchar_t); 145 static int comp_mouse_move(input_t *, int, int); 146 static int comp_abs_move(input_t *, unsigned, unsigned, unsigned, unsigned); 147 static int comp_mouse_button(input_t *, int, int); 148 149 static input_ev_ops_t input_ev_ops = { 150 .key = comp_key_press, 151 .move = comp_mouse_move, 152 .abs_move = comp_abs_move, 153 .button = comp_mouse_button 154 }; 155 156 static void input_disconnect(void); 157 158 159 static pointer_t *input_pointer(input_t *input) 160 { 161 return input->user; 162 } 145 static async_sess_t *input_sess; 163 146 164 147 static pointer_t *pointer_create() … … 170 153 171 154 link_initialize(&p->link); 172 p-> pos.x= coord_origin;173 p-> pos.y= coord_origin;155 p->hpos = coord_origin; 156 p->vpos = coord_origin; 174 157 p->btn_num = 1; 175 p->btn_pos = p->pos; 176 p->accum.x = 0; 177 p->accum.y = 0; 158 p->btn_hpos = p->hpos; 159 p->btn_vpos = p->vpos; 160 p->accum_dx = 0; 161 p->accum_dy = 0; 178 162 p->grab_flags = GF_EMPTY; 179 163 p->pressed = false; … … 302 286 bool isec_vp = rectangle_intersect( 303 287 x_dmg_glob, y_dmg_glob, w_dmg_glob, h_dmg_glob, 304 vp-> pos.x, vp->pos.y, w_dmg_vp, h_dmg_vp,288 vp->hpos, vp->vpos, w_dmg_vp, h_dmg_vp, 305 289 &x_dmg_vp, &y_dmg_vp, &w_dmg_vp, &h_dmg_vp); 306 290 … … 308 292 309 293 /* Paint background color. */ 310 for (sysarg_t y = y_dmg_vp - vp-> pos.y; y < y_dmg_vp - vp->pos.y+ h_dmg_vp; ++y) {311 for (sysarg_t x = x_dmg_vp - vp-> pos.x; x < x_dmg_vp - vp->pos.x+ w_dmg_vp; ++x) {294 for (sysarg_t y = y_dmg_vp - vp->vpos; y < y_dmg_vp - vp->vpos + h_dmg_vp; ++y) { 295 for (sysarg_t x = x_dmg_vp - vp->hpos; x < x_dmg_vp - vp->hpos + w_dmg_vp; ++x) { 312 296 surface_put_pixel(vp->surface, x, y, bg_color); 313 297 } … … 347 331 * coordinates. */ 348 332 transform = win->transform; 349 double_point_t pos; 350 pos.x = vp->pos.x; 351 pos.y = vp->pos.y; 352 transform_translate(&transform, -pos.x, -pos.y); 333 double hpos = vp->hpos; 334 double vpos = vp->vpos; 335 transform_translate(&transform, -hpos, -vpos); 353 336 354 337 source_set_transform(&source, transform); … … 357 340 358 341 drawctx_transfer(&context, 359 x_dmg_win - vp-> pos.x, y_dmg_win - vp->pos.y, w_dmg_win, h_dmg_win);342 x_dmg_win - vp->hpos, y_dmg_win - vp->vpos, w_dmg_win, h_dmg_win); 360 343 } 361 344 } … … 371 354 bool isec_ptr = rectangle_intersect( 372 355 x_dmg_vp, y_dmg_vp, w_dmg_vp, h_dmg_vp, 373 ptr-> pos.x, ptr->pos.y, w_dmg_ptr, h_dmg_ptr,356 ptr->hpos, ptr->vpos, w_dmg_ptr, h_dmg_ptr, 374 357 &x_dmg_ptr, &y_dmg_ptr, &w_dmg_ptr, &h_dmg_ptr); 375 358 … … 382 365 383 366 pixel_t pix = 0; 384 sysarg_t x_vp = x_dmg_ptr - vp-> pos.x;385 sysarg_t y_vp = y_dmg_ptr - vp-> pos.y;386 sysarg_t x_ptr = x_dmg_ptr - ptr-> pos.x;387 sysarg_t y_ptr = y_dmg_ptr - ptr-> pos.y;367 sysarg_t x_vp = x_dmg_ptr - vp->hpos; 368 sysarg_t y_vp = y_dmg_ptr - vp->vpos; 369 sysarg_t x_ptr = x_dmg_ptr - ptr->hpos; 370 sysarg_t y_ptr = y_dmg_ptr - ptr->vpos; 388 371 389 372 for (sysarg_t y = 0; y < h_dmg_ptr; ++y) { … … 776 759 fibril_mutex_unlock(&viewport_list_mtx); 777 760 loc_service_unregister(winreg_id); 778 input_disconnect();761 async_hangup(input_sess); 779 762 780 763 /* Close all clients and their windows. */ … … 897 880 898 881 link_initialize(&vp->link); 899 vp-> pos.x= coord_origin;900 vp-> pos.y= coord_origin;882 vp->hpos = coord_origin; 883 vp->vpos = coord_origin; 901 884 902 885 /* Establish output bidirectional connection. */ … … 998 981 /* window_list_mtx locked by caller */ 999 982 1000 int dx = pointer->accum .x;1001 int dy = pointer->accum .y;1002 pointer->accum .x = 0;1003 pointer->accum .y = 0;983 int dx = pointer->accum_dx; 984 int dy = pointer->accum_dy; 985 pointer->accum_dx = 0; 986 pointer->accum_dy = 0; 1004 987 1005 988 bool move = (pointer->grab_flags & GF_MOVE_X) || (pointer->grab_flags & GF_MOVE_Y); … … 1072 1055 } 1073 1056 1074 static int comp_abs_move(input_t *input, unsigned x , unsigned y, 1075 unsigned max_x, unsigned max_y) 1076 { 1077 /* XXX TODO Use absolute coordinates directly */ 1078 1079 pointer_t *pointer = input_pointer(input); 1080 1081 sysarg_t width, height; 1082 1083 fibril_mutex_lock(&viewport_list_mtx); 1084 if (list_empty(&viewport_list)) { 1085 printf("No viewport found\n"); 1086 fibril_mutex_unlock(&viewport_list_mtx); 1087 return EOK; /* XXX */ 1088 } 1089 link_t *link = list_first(&viewport_list); 1090 viewport_t *vp = list_get_instance(link, viewport_t, link); 1091 surface_get_resolution(vp->surface, &width, &height); 1092 desktop_point_t vp_pos = vp->pos; 1093 fibril_mutex_unlock(&viewport_list_mtx); 1094 1095 desktop_point_t pos_in_viewport; 1096 pos_in_viewport.x = x * width / max_x; 1097 pos_in_viewport.y = y * height / max_y; 1098 1099 /* Calculate offset from pointer */ 1100 fibril_mutex_lock(&pointer_list_mtx); 1101 desktop_vector_t delta; 1102 delta.x = (vp_pos.x + pos_in_viewport.x) - pointer->pos.x; 1103 delta.y = (vp_pos.y + pos_in_viewport.y) - pointer->pos.y; 1104 fibril_mutex_unlock(&pointer_list_mtx); 1105 1106 return comp_mouse_move(input, delta.x, delta.y); 1107 } 1108 1109 static int comp_mouse_move(input_t *input, int dx, int dy) 1110 { 1111 pointer_t *pointer = input_pointer(input); 1057 static void comp_mouse_move(pointer_t *pointer, ipc_callid_t iid, ipc_call_t *icall) 1058 { 1059 int dx = (int) IPC_GET_ARG1(*icall); 1060 int dy = (int) IPC_GET_ARG2(*icall); 1112 1061 1113 1062 /* Update pointer position. */ 1114 1063 fibril_mutex_lock(&pointer_list_mtx); 1115 desktop_point_t old_pos = pointer->pos; 1064 sysarg_t old_hpos = pointer->hpos; 1065 sysarg_t old_vpos = pointer->vpos; 1116 1066 sysarg_t cursor_width; 1117 1067 sysarg_t cursor_height; 1118 1068 surface_get_resolution(pointer->cursor.states[pointer->state], 1119 1069 &cursor_width, &cursor_height); 1120 pointer-> pos.x+= dx;1121 pointer-> pos.y+= dy;1070 pointer->hpos += dx; 1071 pointer->vpos += dy; 1122 1072 fibril_mutex_unlock(&pointer_list_mtx); 1123 comp_damage(old_ pos.x, old_pos.y, cursor_width, cursor_height);1124 comp_damage(old_ pos.x + dx, old_pos.y+ dy, cursor_width, cursor_height);1073 comp_damage(old_hpos, old_vpos, cursor_width, cursor_height); 1074 comp_damage(old_hpos + dx, old_vpos + dy, cursor_width, cursor_height); 1125 1075 1126 1076 fibril_mutex_lock(&window_list_mtx); … … 1134 1084 sysarg_t width, height; 1135 1085 surface_get_resolution(top->surface, &width, &height); 1136 within_client = comp_coord_to_client(pointer-> pos.x, pointer->pos.y,1086 within_client = comp_coord_to_client(pointer->hpos, pointer->vpos, 1137 1087 top->transform, width, height, &point_x, &point_y); 1138 1088 fibril_mutex_unlock(&window_list_mtx); … … 1153 1103 } else { 1154 1104 /* Pointer is grabbed by top-level window action. */ 1155 pointer->accum .x += dx;1156 pointer->accum .y += dy;1105 pointer->accum_dx += dx; 1106 pointer->accum_dy += dy; 1157 1107 #if ANIMATE_WINDOW_TRANSFORMS == 1 1158 1108 sysarg_t x, y, width, height; … … 1168 1118 } 1169 1119 1170 return EOK; 1171 } 1172 1173 static int comp_mouse_button(input_t *input, int bnum, int bpress) 1174 { 1175 pointer_t *pointer = input_pointer(input); 1176 1177 if (bpress) { 1178 pointer->btn_pos = pointer->pos; 1179 pointer->btn_num = bnum; 1120 async_answer_0(iid, EOK); 1121 } 1122 1123 static void comp_mouse_button(pointer_t *pointer, ipc_callid_t iid, ipc_call_t *icall) 1124 { 1125 sysarg_t btn_num = IPC_GET_ARG1(*icall); 1126 bool pressed = (bool) IPC_GET_ARG2(*icall); 1127 1128 if (pressed) { 1129 pointer->btn_hpos = pointer->hpos; 1130 pointer->btn_vpos = pointer->vpos; 1131 pointer->btn_num = btn_num; 1180 1132 pointer->pressed = true; 1181 1133 … … 1185 1137 if (!win || !win->surface) { 1186 1138 fibril_mutex_unlock(&window_list_mtx); 1187 return EOK; 1139 async_answer_0(iid, EOK); 1140 return; 1188 1141 } 1189 1142 sysarg_t x, y, width, height; 1190 1143 surface_get_resolution(win->surface, &width, &height); 1191 bool within_client = comp_coord_to_client(pointer-> pos.x, pointer->pos.y,1144 bool within_client = comp_coord_to_client(pointer->hpos, pointer->vpos, 1192 1145 win->transform, width, height, &x, &y); 1193 1146 fibril_mutex_unlock(&window_list_mtx); … … 1201 1154 event->data.pos.pos_id = pointer->id; 1202 1155 event->data.pos.type = POS_PRESS; 1203 event->data.pos.btn_num = b num;1156 event->data.pos.btn_num = btn_num; 1204 1157 event->data.pos.hpos = x; 1205 1158 event->data.pos.vpos = y; 1206 1159 comp_post_event(event); 1207 1160 } else { 1208 return ENOMEM; 1209 } 1210 } 1211 } else if (pointer->pressed && pointer->btn_num == (unsigned)bnum) { 1161 async_answer_0(iid, ENOMEM); 1162 return; 1163 } 1164 } 1165 } else if (pointer->pressed && pointer->btn_num == btn_num) { 1212 1166 pointer->pressed = false; 1213 1167 … … 1224 1178 if (win->surface) { 1225 1179 surface_get_resolution(win->surface, &width, &height); 1226 within_client = comp_coord_to_client(pointer-> pos.x, pointer->pos.y,1180 within_client = comp_coord_to_client(pointer->hpos, pointer->vpos, 1227 1181 win->transform, width, height, &point_x, &point_y); 1228 1182 } … … 1237 1191 pointer->grab_flags = GF_EMPTY; 1238 1192 fibril_mutex_unlock(&window_list_mtx); 1239 return EOK; 1193 async_answer_0(iid, EOK); 1194 return; 1240 1195 } 1241 1196 … … 1302 1257 event->data.pos.pos_id = pointer->id; 1303 1258 event->data.pos.type = POS_RELEASE; 1304 event->data.pos.btn_num = b num;1259 event->data.pos.btn_num = btn_num; 1305 1260 event->data.pos.hpos = point_x; 1306 1261 event->data.pos.vpos = point_y; … … 1308 1263 pointer->grab_flags = GF_EMPTY; 1309 1264 1310 } else if (within_client && (pointer->grab_flags == GF_EMPTY) && (b num == 1)) {1265 } else if (within_client && (pointer->grab_flags == GF_EMPTY) && (btn_num == 1)) { 1311 1266 1312 1267 /* Bring the window to the foreground. */ … … 1331 1286 } 1332 1287 1333 return EOK; 1334 } 1335 1336 static int comp_key_press(input_t *input, kbd_event_type_t type, keycode_t key, 1337 keymod_t mods, wchar_t c) 1338 { 1288 async_answer_0(iid, EOK); 1289 } 1290 1291 static void comp_key_press(ipc_callid_t iid, ipc_call_t *icall) 1292 { 1293 kbd_event_type_t type = IPC_GET_ARG1(*icall); 1294 keycode_t key = IPC_GET_ARG2(*icall); 1295 keymod_t mods = IPC_GET_ARG3(*icall); 1296 wchar_t c = IPC_GET_ARG4(*icall); 1297 1339 1298 bool win_transform = (mods & KM_ALT) && ( 1340 1299 key == KC_W || key == KC_S || key == KC_A || key == KC_D || … … 1419 1378 if (event == NULL) { 1420 1379 fibril_mutex_unlock(&window_list_mtx); 1421 return ENOMEM; 1380 async_answer_0(iid, ENOMEM); 1381 return; 1422 1382 } 1423 1383 … … 1488 1448 } else if (win_close) { 1489 1449 window_event_t *event = (window_event_t *) malloc(sizeof(window_event_t)); 1490 if (event == NULL) 1491 return ENOMEM; 1450 if (event == NULL) { 1451 async_answer_0(iid, ENOMEM); 1452 return; 1453 } 1492 1454 1493 1455 link_initialize(&event->link); … … 1540 1502 switch (key) { 1541 1503 case KC_I: 1542 vp-> pos.x+= 0;1543 vp-> pos.y+= -20;1504 vp->hpos += 0; 1505 vp->vpos += -20; 1544 1506 break; 1545 1507 case KC_K: 1546 vp-> pos.x+= 0;1547 vp-> pos.y+= 20;1508 vp->hpos += 0; 1509 vp->vpos += 20; 1548 1510 break; 1549 1511 case KC_J: 1550 vp-> pos.x+= -20;1551 vp-> pos.y+= 0;1512 vp->hpos += -20; 1513 vp->vpos += 0; 1552 1514 break; 1553 1515 case KC_L: 1554 vp-> pos.x+= 20;1555 vp-> pos.y+= 0;1516 vp->hpos += 20; 1517 vp->vpos += 0; 1556 1518 break; 1557 1519 default: 1558 vp-> pos.x+= 0;1559 vp-> pos.y+= 0;1520 vp->hpos += 0; 1521 vp->vpos += 0; 1560 1522 break; 1561 1523 } 1562 1524 1563 sysarg_t x = vp-> pos.x;1564 sysarg_t y = vp-> pos.y;1525 sysarg_t x = vp->hpos; 1526 sysarg_t y = vp->vpos; 1565 1527 sysarg_t width, height; 1566 1528 surface_get_resolution(vp->surface, &width, &height); … … 1632 1594 } else { 1633 1595 window_event_t *event = (window_event_t *) malloc(sizeof(window_event_t)); 1634 if (event == NULL) 1635 return ENOMEM; 1596 if (event == NULL) { 1597 async_answer_0(iid, ENOMEM); 1598 return; 1599 } 1636 1600 1637 1601 link_initialize(&event->link); … … 1645 1609 } 1646 1610 1647 return EOK; 1648 } 1649 1650 static int input_connect(const char *svc) 1651 { 1652 async_sess_t *sess; 1653 service_id_t dsid; 1654 1655 int rc = loc_service_get_id(svc, &dsid, 0); 1656 if (rc != EOK) { 1657 printf("%s: Input service %s not found\n", NAME, svc); 1658 return rc; 1659 } 1660 1661 sess = loc_service_connect(EXCHANGE_ATOMIC, dsid, 0); 1662 if (sess == NULL) { 1663 printf("%s: Unable to connect to input service %s\n", NAME, 1664 svc); 1665 return EIO; 1666 } 1667 1611 async_answer_0(iid, EOK); 1612 } 1613 1614 static void input_events(ipc_callid_t iid, ipc_call_t *icall, void *arg) 1615 { 1668 1616 fibril_mutex_lock(&pointer_list_mtx); 1669 1617 pointer_t *pointer = pointer_create(); … … 1674 1622 fibril_mutex_unlock(&pointer_list_mtx); 1675 1623 1676 if (pointer == NULL) { 1677 printf("%s: Cannot create pointer.\n", NAME); 1678 async_hangup(sess); 1679 return ENOMEM; 1680 } 1681 1682 rc = input_open(sess, &input_ev_ops, pointer, &input); 1624 /* Ignore parameters, the connection is already opened. */ 1625 while (true) { 1626 ipc_call_t call; 1627 ipc_callid_t callid = async_get_call(&call); 1628 1629 if (!IPC_GET_IMETHOD(call)) { 1630 fibril_mutex_lock(&pointer_list_mtx); 1631 if (pointer != NULL) { 1632 list_remove(&pointer->link); 1633 pointer_destroy(pointer); 1634 } 1635 fibril_mutex_unlock(&pointer_list_mtx); 1636 async_hangup(input_sess); 1637 return; 1638 } 1639 1640 switch (IPC_GET_IMETHOD(call)) { 1641 case INPUT_EVENT_KEY: 1642 comp_key_press(callid, &call); 1643 break; 1644 case INPUT_EVENT_MOVE: 1645 comp_mouse_move(pointer, callid, &call); 1646 break; 1647 case INPUT_EVENT_BUTTON: 1648 comp_mouse_button(pointer, callid, &call); 1649 break; 1650 default: 1651 async_answer_0(callid, EINVAL); 1652 } 1653 } 1654 } 1655 1656 static async_sess_t *input_connect(const char *svc) 1657 { 1658 async_sess_t *sess; 1659 service_id_t dsid; 1660 1661 int rc = loc_service_get_id(svc, &dsid, 0); 1662 if (rc == EOK) { 1663 sess = loc_service_connect(EXCHANGE_ATOMIC, dsid, 0); 1664 if (sess == NULL) { 1665 printf("%s: Unable to connect to input service %s\n", NAME, svc); 1666 return NULL; 1667 } 1668 } else 1669 return NULL; 1670 1671 async_exch_t *exch = async_exchange_begin(sess); 1672 rc = async_connect_to_me(exch, 0, 0, 0, input_events, NULL); 1673 async_exchange_end(exch); 1674 1683 1675 if (rc != EOK) { 1684 1676 async_hangup(sess); 1685 printf("%s: Unable to c ommunicate withservice %s (%s)\n",1677 printf("%s: Unable to create callback connection to service %s (%s)\n", 1686 1678 NAME, svc, str_error(rc)); 1687 return rc; 1688 } 1689 1690 return EOK; 1691 } 1692 1693 static void input_disconnect(void) 1694 { 1695 pointer_t *pointer = input->user; 1696 input_close(input); 1697 pointer_destroy(pointer); 1679 return NULL; 1680 } 1681 1682 return sess; 1698 1683 } 1699 1684 … … 1748 1733 1749 1734 /* Establish input bidirectional connection. */ 1750 rc = input_connect(input_svc); 1751 if (rc != EOK) 1752 return rc; 1735 input_sess = input_connect(input_svc); 1736 if (input_sess == NULL) { 1737 return -1; 1738 } 1753 1739 1754 1740 /* Create viewports and connect them to visualizers. */ … … 1756 1742 rc = loc_category_get_id("visualizer", &cat_id, IPC_FLAG_BLOCKING); 1757 1743 if (rc != EOK) { 1758 input_disconnect();1744 async_hangup(input_sess); 1759 1745 return -1; 1760 1746 } … … 1764 1750 rc = loc_category_get_svcs(cat_id, &svcs, &svcs_cnt); 1765 1751 if (rc != EOK || svcs_cnt == 0) { 1766 input_disconnect();1752 async_hangup(input_sess); 1767 1753 return -1; 1768 1754 } … … 1780 1766 1781 1767 if (list_empty(&viewport_list)) { 1782 input_disconnect();1768 async_hangup(input_sess); 1783 1769 return -1; 1784 1770 }
Note:
See TracChangeset
for help on using the changeset viewer.