works with both kernel and sdl2 while using bt

This commit is contained in:
Denis 2023-12-23 23:59:33 +01:00
parent 4825ee8e17
commit 458ef9f07d
No known key found for this signature in database
GPG key ID: DD9B63F805CF5C03
4 changed files with 133 additions and 230 deletions

View file

@ -374,13 +374,8 @@ static void handle_incoming_message(
} }
} }
int64_t get_timediff_usec(const struct timeval *const past, const struct timeval *const now) { int64_t get_timediff_usec(const struct timespec *const start, const struct timespec *const end) {
struct timeval tdiff; return (end->tv_sec - start->tv_sec) * 1000000000LL + (end->tv_nsec - start->tv_nsec);
timersub(now, past, &tdiff);
//const int64_t sgn = ((now->tv_sec > past->tv_sec) || ((now->tv_sec == past->tv_sec) && (now->tv_usec > past->tv_usec))) ? -1 : +1;
return (int64_t)(tdiff.tv_sec) * (int64_t)1000000 + (int64_t)(tdiff.tv_usec);
} }
void *dev_out_thread_func(void *ptr) { void *dev_out_thread_func(void *ptr) {
@ -453,12 +448,12 @@ void *dev_out_thread_func(void *ptr) {
} }
} }
struct timeval now = {0}; struct timespec now;
gettimeofday(&now, NULL); clock_gettime(CLOCK_MONOTONIC, &now);
struct timeval gamepad_last_hid_report_sent = now; struct timespec gamepad_last_hid_report_sent = now;
struct timeval mouse_last_hid_report_sent = now; struct timespec mouse_last_hid_report_sent = now;
struct timeval keyboard_last_hid_report_sent = now; struct timespec keyboard_last_hid_report_sent = now;
uint8_t tmp_buf[256]; uint8_t tmp_buf[256];
@ -473,7 +468,7 @@ void *dev_out_thread_func(void *ptr) {
const int64_t mouse_time_diff_usecs = get_timediff_usec(&mouse_last_hid_report_sent, &now); const int64_t mouse_time_diff_usecs = get_timediff_usec(&mouse_last_hid_report_sent, &now);
const int64_t kbd_time_diff_usecs = get_timediff_usec(&keyboard_last_hid_report_sent, &now); const int64_t kbd_time_diff_usecs = get_timediff_usec(&keyboard_last_hid_report_sent, &now);
gettimeofday(&now, NULL); clock_gettime(CLOCK_MONOTONIC, &now);
if ((current_gamepad_fd > 0) && (gamepad_time_diff_usecs >= gamepad_report_timing_us)) { if ((current_gamepad_fd > 0) && (gamepad_time_diff_usecs >= gamepad_report_timing_us)) {
gamepad_last_hid_report_sent = now; gamepad_last_hid_report_sent = now;

View file

@ -1037,7 +1037,7 @@ int virt_dualsense_event(virt_dualsense_t *const gamepad, gamepad_status_t *cons
// first byte is report-id which is 0x01 // first byte is report-id which is 0x01
if ( if (
(!gamepad->bluetooth) && (ev.u.output.data[0] != DS_OUTPUT_REPORT_USB) && (!gamepad->bluetooth) && (ev.u.output.data[0] != DS_OUTPUT_REPORT_USB) &&
(gamepad->bluetooth) && (ev.u.output.data[0] != DS_OUTPUT_REPORT_BT) (gamepad->bluetooth) && ((ev.u.output.data[0] != DS_OUTPUT_REPORT_BT) && (ev.u.output.data[0] < 0x10))
) { ) {
fprintf( fprintf(
stderr, stderr,
@ -1050,7 +1050,16 @@ int virt_dualsense_event(virt_dualsense_t *const gamepad, gamepad_status_t *cons
// When using bluetooth, the first byte after the reportID is uint8_t seq_tag, // When using bluetooth, the first byte after the reportID is uint8_t seq_tag,
// while the next one is uint8_t tag, following bytes are the same. // while the next one is uint8_t tag, following bytes are the same.
const uint8_t *const common_report = (gamepad->bluetooth) ? &ev.u.output.data[3] : &ev.u.output.data[1]; size_t offset = 1;
if ((gamepad->bluetooth) && (ev.u.output.data[0] > 0x10)) {
offset = 2;
} else if ((gamepad->bluetooth) && (ev.u.output.data[0] == 0x02)) {
offset = 3;
} else if ((gamepad->bluetooth) && (ev.u.output.data[0] == 0x01)) {
offset = 1;
}
const uint8_t *const common_report = &ev.u.output.data[offset];
const uint8_t valid_flag0 = common_report[0]; const uint8_t valid_flag0 = common_report[0];
const uint8_t valid_flag1 = common_report[1]; const uint8_t valid_flag1 = common_report[1];

View file

@ -99,376 +99,252 @@ int virt_kbd_get_fd(virt_kbd_t *const kbd) {
int virt_kbd_send(virt_kbd_t *const kbd, keyboard_status_t *const status, struct timeval *const now) { int virt_kbd_send(virt_kbd_t *const kbd, keyboard_status_t *const status, struct timeval *const now) {
int res = 0; int res = 0;
struct timeval syn_time; size_t events_count = 0;
gettimeofday(&syn_time, NULL); struct input_event events[12];
struct input_event tmp_ev; struct input_event tmp_ev;
gettimeofday(&tmp_ev.time, NULL);
if (now != NULL) {
tmp_ev.time = *now;
}
tmp_ev.type = EV_KEY; tmp_ev.type = EV_KEY;
if (status->q != kbd->prev_q) { if (status->q != kbd->prev_q) {
tmp_ev.code = KEY_Q; tmp_ev.code = KEY_Q;
tmp_ev.value = kbd->prev_q = status->q; tmp_ev.value = kbd->prev_q = status->q;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->w != kbd->prev_w) { if (status->w != kbd->prev_w) {
tmp_ev.code = KEY_W; tmp_ev.code = KEY_W;
tmp_ev.value = kbd->prev_w = status->w; tmp_ev.value = kbd->prev_w = status->w;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->e != kbd->prev_e) { if (status->e != kbd->prev_e) {
tmp_ev.code = KEY_E; tmp_ev.code = KEY_E;
tmp_ev.value = kbd->prev_e = status->e; tmp_ev.value = kbd->prev_e = status->e;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->r != kbd->prev_r) { if (status->r != kbd->prev_r) {
tmp_ev.code = KEY_R; tmp_ev.code = KEY_R;
tmp_ev.value = kbd->prev_r = status->r; tmp_ev.value = kbd->prev_r = status->r;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->t != kbd->prev_t) { if (status->t != kbd->prev_t) {
tmp_ev.code = KEY_T; tmp_ev.code = KEY_T;
tmp_ev.value = kbd->prev_t = status->t; tmp_ev.value = kbd->prev_t = status->t;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->y != kbd->prev_y) { if (status->y != kbd->prev_y) {
tmp_ev.code = KEY_Y; tmp_ev.code = KEY_Y;
tmp_ev.value = kbd->prev_y = status->y; tmp_ev.value = kbd->prev_y = status->y;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->u != kbd->prev_u) { if (status->u != kbd->prev_u) {
tmp_ev.code = KEY_U; tmp_ev.code = KEY_U;
tmp_ev.value = kbd->prev_u = status->u; tmp_ev.value = kbd->prev_u = status->u;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->i != kbd->prev_i) { if (status->i != kbd->prev_i) {
tmp_ev.code = KEY_I; tmp_ev.code = KEY_I;
tmp_ev.value = kbd->prev_i = status->i; tmp_ev.value = kbd->prev_i = status->i;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->o != kbd->prev_o) { if (status->o != kbd->prev_o) {
tmp_ev.code = KEY_O; tmp_ev.code = KEY_O;
tmp_ev.value = kbd->prev_o = status->o; tmp_ev.value = kbd->prev_o = status->o;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->p != kbd->prev_p) { if (status->p != kbd->prev_p) {
tmp_ev.code = KEY_P; tmp_ev.code = KEY_P;
tmp_ev.value = kbd->prev_p = status->p; tmp_ev.value = kbd->prev_p = status->p;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->a != kbd->prev_a) { if (status->a != kbd->prev_a) {
tmp_ev.code = KEY_A; tmp_ev.code = KEY_A;
tmp_ev.value = kbd->prev_a = status->a; tmp_ev.value = kbd->prev_a = status->a;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->s != kbd->prev_s) { if (status->s != kbd->prev_s) {
tmp_ev.code = KEY_S; tmp_ev.code = KEY_S;
tmp_ev.value = kbd->prev_s = status->s; tmp_ev.value = kbd->prev_s = status->s;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->d != kbd->prev_d) { if (status->d != kbd->prev_d) {
tmp_ev.code = KEY_D; tmp_ev.code = KEY_D;
tmp_ev.value = kbd->prev_d = status->d; tmp_ev.value = kbd->prev_d = status->d;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->f != kbd->prev_f) { if (status->f != kbd->prev_f) {
tmp_ev.code = KEY_F; tmp_ev.code = KEY_F;
tmp_ev.value = kbd->prev_f = status->f; tmp_ev.value = kbd->prev_f = status->f;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->g != kbd->prev_g) { if (status->g != kbd->prev_g) {
tmp_ev.code = KEY_G; tmp_ev.code = KEY_G;
tmp_ev.value = kbd->prev_g = status->g; tmp_ev.value = kbd->prev_g = status->g;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->h != kbd->prev_h) { if (status->h != kbd->prev_h) {
tmp_ev.code = KEY_H; tmp_ev.code = KEY_H;
tmp_ev.value = kbd->prev_h = status->h; tmp_ev.value = kbd->prev_h = status->h;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->j != kbd->prev_j) { if (status->j != kbd->prev_j) {
tmp_ev.code = KEY_J; tmp_ev.code = KEY_J;
tmp_ev.value = kbd->prev_j = status->j; tmp_ev.value = kbd->prev_j = status->j;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->k != kbd->prev_k) { if (status->k != kbd->prev_k) {
tmp_ev.code = KEY_K; tmp_ev.code = KEY_K;
tmp_ev.value = kbd->prev_k = status->k; tmp_ev.value = kbd->prev_k = status->k;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->l != kbd->prev_l) { if (status->l != kbd->prev_l) {
tmp_ev.code = KEY_L; tmp_ev.code = KEY_L;
tmp_ev.value = kbd->prev_l = status->l; tmp_ev.value = kbd->prev_l = status->l;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->z != kbd->prev_z) { if (status->z != kbd->prev_z) {
tmp_ev.code = KEY_Z; tmp_ev.code = KEY_Z;
tmp_ev.value = kbd->prev_z = status->z; tmp_ev.value = kbd->prev_z = status->z;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->x != kbd->prev_x) { if (status->x != kbd->prev_x) {
tmp_ev.code = KEY_X; tmp_ev.code = KEY_X;
tmp_ev.value = kbd->prev_x = status->x; tmp_ev.value = kbd->prev_x = status->x;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->c != kbd->prev_c) { if (status->c != kbd->prev_c) {
tmp_ev.code = KEY_C; tmp_ev.code = KEY_C;
tmp_ev.value = kbd->prev_c = status->c; tmp_ev.value = kbd->prev_c = status->c;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->v != kbd->prev_v) { if (status->v != kbd->prev_v) {
tmp_ev.code = KEY_V; tmp_ev.code = KEY_V;
tmp_ev.value = kbd->prev_v = status->v; tmp_ev.value = kbd->prev_v = status->v;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->b != kbd->prev_b) { if (status->b != kbd->prev_b) {
tmp_ev.code = KEY_B; tmp_ev.code = KEY_B;
tmp_ev.value = kbd->prev_b = status->b; tmp_ev.value = kbd->prev_b = status->b;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->n != kbd->prev_n) { if (status->n != kbd->prev_n) {
tmp_ev.code = KEY_N; tmp_ev.code = KEY_N;
tmp_ev.value = kbd->prev_n = status->n; tmp_ev.value = kbd->prev_n = status->n;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->m != kbd->prev_m) { if (status->m != kbd->prev_m) {
tmp_ev.code = KEY_M; tmp_ev.code = KEY_M;
tmp_ev.value = kbd->prev_m = status->m; tmp_ev.value = kbd->prev_m = status->m;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->num_0 != kbd->prev_num_0) { if (status->num_0 != kbd->prev_num_0) {
tmp_ev.code = KEY_0; tmp_ev.code = KEY_0;
tmp_ev.value = kbd->prev_num_0 = status->num_0; tmp_ev.value = kbd->prev_num_0 = status->num_0;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->num_1 != kbd->prev_num_1) { if (status->num_1 != kbd->prev_num_1) {
tmp_ev.code = KEY_1; tmp_ev.code = KEY_1;
tmp_ev.value = kbd->prev_num_1 = status->num_1; tmp_ev.value = kbd->prev_num_1 = status->num_1;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->num_2 != kbd->prev_num_2) { if (status->num_2 != kbd->prev_num_2) {
tmp_ev.code = KEY_2; tmp_ev.code = KEY_2;
tmp_ev.value = kbd->prev_num_2 = status->num_2; tmp_ev.value = kbd->prev_num_2 = status->num_2;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->num_3 != kbd->prev_num_3) { if (status->num_3 != kbd->prev_num_3) {
tmp_ev.code = KEY_3; tmp_ev.code = KEY_3;
tmp_ev.value = kbd->prev_num_3 = status->num_3; tmp_ev.value = kbd->prev_num_3 = status->num_3;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->num_4 != kbd->prev_num_4) { if (status->num_4 != kbd->prev_num_4) {
tmp_ev.code = KEY_4; tmp_ev.code = KEY_4;
tmp_ev.value = kbd->prev_num_4 = status->num_4; tmp_ev.value = kbd->prev_num_4 = status->num_4;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->num_5 != kbd->prev_num_5) { if (status->num_5 != kbd->prev_num_5) {
tmp_ev.code = KEY_5; tmp_ev.code = KEY_5;
tmp_ev.value = kbd->prev_num_5 = status->num_5; tmp_ev.value = kbd->prev_num_5 = status->num_5;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->num_6 != kbd->prev_num_6) { if (status->num_6 != kbd->prev_num_6) {
tmp_ev.code = KEY_6; tmp_ev.code = KEY_6;
tmp_ev.value = kbd->prev_num_6 = status->num_6; tmp_ev.value = kbd->prev_num_6 = status->num_6;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->num_7 != kbd->prev_num_7) { if (status->num_7 != kbd->prev_num_7) {
tmp_ev.code = KEY_7; tmp_ev.code = KEY_7;
tmp_ev.value = kbd->prev_num_7 = status->num_7; tmp_ev.value = kbd->prev_num_7 = status->num_7;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->num_8 != kbd->prev_num_8) { if (status->num_8 != kbd->prev_num_8) {
tmp_ev.code = KEY_8; tmp_ev.code = KEY_8;
tmp_ev.value = kbd->prev_num_8 = status->num_8; tmp_ev.value = kbd->prev_num_8 = status->num_8;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->num_9 != kbd->prev_num_9) { if (status->num_9 != kbd->prev_num_9) {
tmp_ev.code = KEY_9; tmp_ev.code = KEY_9;
tmp_ev.value = kbd->prev_num_9 = status->num_9; tmp_ev.value = kbd->prev_num_9 = status->num_9;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->lctrl != kbd->prev_lctrl) { if (status->lctrl != kbd->prev_lctrl) {
tmp_ev.code = KEY_LEFTCTRL; tmp_ev.code = KEY_LEFTCTRL;
tmp_ev.value = kbd->prev_lctrl = status->lctrl; tmp_ev.value = kbd->prev_lctrl = status->lctrl;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->up != kbd->prev_up) { if (status->up != kbd->prev_up) {
tmp_ev.code = KEY_UP; tmp_ev.code = KEY_UP;
tmp_ev.value = kbd->prev_up = status->up; tmp_ev.value = kbd->prev_up = status->up;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->down != kbd->prev_down) { if (status->down != kbd->prev_down) {
tmp_ev.code = KEY_DOWN; tmp_ev.code = KEY_DOWN;
tmp_ev.value = kbd->prev_down = status->down; tmp_ev.value = kbd->prev_down = status->down;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->left != kbd->prev_left) { if (status->left != kbd->prev_left) {
tmp_ev.code = KEY_LEFT; tmp_ev.code = KEY_LEFT;
tmp_ev.value = kbd->prev_left = status->left; tmp_ev.value = kbd->prev_left = status->left;
if (write(kbd->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_kbd_send_err;
}
} }
if (status->right != kbd->prev_right) { if (status->right != kbd->prev_right) {
@ -493,18 +369,39 @@ int virt_kbd_send(virt_kbd_t *const kbd, keyboard_status_t *const status, struct
} }
#endif #endif
syn_time.tv_usec += 1; if (events_count > 0) {
const struct input_event syn_ev = { struct timeval t;
.code = SYN_REPORT, if (now != NULL) {
.type = EV_SYN, t = *now;
.value = 0, } else {
.time = syn_time, gettimeofday(&t, NULL);
}; }
const ssize_t sync_written = write(kbd->fd, (void*)&syn_ev, sizeof(syn_ev));
if (sync_written != sizeof(syn_ev)) { struct input_event syn_ev = {
fprintf(stderr, "Error in sync: written %ld bytes out of %ld\n", sync_written, sizeof(syn_ev)); .code = SYN_REPORT,
} .type = EV_SYN,
.value = 0,
.time = t,
};
syn_ev.time.tv_usec += 1;
events[events_count++] = syn_ev;
for (size_t i = 0; i < events_count; ++i) {
if (i != (events_count - 1)) {
events[i].time = t;
}
const ssize_t sync_written = write(kbd->fd, (void*)&events[i], sizeof(struct input_event));
if (sync_written != sizeof(syn_ev)) {
fprintf(stderr, "Error in sync: written %ld bytes out of %ld\n", sync_written, sizeof(syn_ev));
res = errno;
res = res < 0 ? res : -1*res;
res = res == 0 ? -EIO : res;
goto virt_kbd_send_err;
}
}
}
virt_kbd_send_err: virt_kbd_send_err:
return res; return res;
} }

View file

@ -66,33 +66,22 @@ int virt_mouse_get_fd(virt_mouse_t *const mouse) {
int virt_mouse_send(virt_mouse_t *const mouse, mouse_status_t *const status, struct timeval *const now) { int virt_mouse_send(virt_mouse_t *const mouse, mouse_status_t *const status, struct timeval *const now) {
int res = 0; int res = 0;
struct timeval syn_time; size_t events_count = 0;
gettimeofday(&syn_time, NULL); struct input_event events[12];
struct input_event tmp_ev; struct input_event tmp_ev;
gettimeofday(&tmp_ev.time, NULL);
if (now != NULL) {
tmp_ev.time = *now;
}
tmp_ev.type = EV_REL; tmp_ev.type = EV_REL;
if (status->x != 0) { if (status->x != 0) {
tmp_ev.code = REL_X; tmp_ev.code = REL_X;
tmp_ev.value = status->x; tmp_ev.value = status->x;
if (write(mouse->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_mouse_send_err;
}
} }
if (status->y != 0) { if (status->y != 0) {
tmp_ev.code = REL_Y; tmp_ev.code = REL_Y;
tmp_ev.value = status->y; tmp_ev.value = status->y;
if (write(mouse->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_mouse_send_err;
}
} }
tmp_ev.type = EV_KEY; tmp_ev.type = EV_KEY;
@ -101,30 +90,21 @@ int virt_mouse_send(virt_mouse_t *const mouse, mouse_status_t *const status, str
mouse->prev_btn_left = status->btn_left; mouse->prev_btn_left = status->btn_left;
tmp_ev.code = BTN_LEFT; tmp_ev.code = BTN_LEFT;
tmp_ev.value = status->btn_left; tmp_ev.value = status->btn_left;
if (write(mouse->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_mouse_send_err;
}
} }
if (status->btn_middle != mouse->prev_btn_middle) { if (status->btn_middle != mouse->prev_btn_middle) {
mouse->prev_btn_middle = status->btn_middle; mouse->prev_btn_middle = status->btn_middle;
tmp_ev.code = BTN_MIDDLE; tmp_ev.code = BTN_MIDDLE;
tmp_ev.value = status->btn_middle; tmp_ev.value = status->btn_middle;
if (write(mouse->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_mouse_send_err;
}
} }
if (status->btn_right != mouse->prev_btn_right) { if (status->btn_right != mouse->prev_btn_right) {
mouse->prev_btn_right = status->btn_right; mouse->prev_btn_right = status->btn_right;
tmp_ev.code = BTN_RIGHT; tmp_ev.code = BTN_RIGHT;
tmp_ev.value = status->btn_right; tmp_ev.value = status->btn_right;
if (write(mouse->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) { events[events_count++] = tmp_ev;
res = errno < 0 ? errno : -1 * errno;
goto virt_mouse_send_err;
}
} }
#if 0 #if 0
@ -140,17 +120,39 @@ int virt_mouse_send(virt_mouse_t *const mouse, mouse_status_t *const status, str
} }
#endif #endif
syn_time.tv_usec += 1; if (events_count > 0) {
const struct input_event syn_ev = { struct timeval t;
.code = SYN_REPORT, if (now != NULL) {
.type = EV_SYN, t = *now;
.value = 0, } else {
.time = syn_time, gettimeofday(&t, NULL);
}; }
const ssize_t sync_written = write(mouse->fd, (void*)&syn_ev, sizeof(syn_ev));
if (sync_written != sizeof(syn_ev)) { struct input_event syn_ev = {
fprintf(stderr, "Error in sync: written %ld bytes out of %ld\n", sync_written, sizeof(syn_ev)); .code = SYN_REPORT,
} .type = EV_SYN,
.value = 0,
.time = t,
};
syn_ev.time.tv_usec += 1;
events[events_count++] = syn_ev;
for (size_t i = 0; i < events_count; ++i) {
if (i != (events_count - 1)) {
events[i].time = t;
}
const ssize_t sync_written = write(mouse->fd, (void*)&events[i], sizeof(struct input_event));
if (sync_written != sizeof(syn_ev)) {
fprintf(stderr, "Error in sync: written %ld bytes out of %ld\n", sync_written, sizeof(syn_ev));
res = errno;
res = res < 0 ? res : -1*res;
res = res == 0 ? -EIO : res;
goto virt_mouse_send_err;
}
}
}
virt_mouse_send_err: virt_mouse_send_err:
return res; return res;