Route button presses through the virtual keyboard (#162)

To mitigate potential downstream race conditions when key/mouse events are sent
in quick succession (e.g oneshot clear mouse click), we send all button and key
events through the same virtual device.

All movement is still routed through a dedicated virtual pointer to minimize
display server input issues.
master
Raheman Vaiya 4 years ago
parent 1defe9612c
commit 5b9de6c760
  1. 21
      src/keyboard.c
  2. 1
      src/vkbd.h
  3. 5
      src/vkbd/stdout.c
  4. 69
      src/vkbd/uinput.c
  5. 6
      src/vkbd/usb-gadget.c

@ -88,26 +88,7 @@ static void send_key(struct keyboard *kbd, uint8_t code, uint8_t pressed)
kbd->keystate[code] = pressed;
switch (code) {
case KEYD_LEFT_MOUSE:
vkbd_send_button(vkbd, 1, pressed);
break;
case KEYD_MIDDLE_MOUSE:
vkbd_send_button(vkbd, 2, pressed);
break;
case KEYD_RIGHT_MOUSE:
vkbd_send_button(vkbd, 3, pressed);
break;
case KEYD_MOUSE_1:
vkbd_send_button(vkbd, 4, pressed);
break;
case KEYD_MOUSE_2:
vkbd_send_button(vkbd, 5, pressed);
break;
default:
vkbd_send_key(vkbd, code, pressed);
break;
}
vkbd_send_key(vkbd, code, pressed);
}
static void set_mods(struct keyboard *kbd, uint8_t mods)

@ -17,7 +17,6 @@ void vkbd_mouse_move_abs(const struct vkbd *vkbd, int x, int y);
void vkbd_mouse_scroll(const struct vkbd *vkbd, int x, int y);
void vkbd_send_key(const struct vkbd *vkbd, uint8_t code, int state);
void vkbd_send_button(const struct vkbd *vkbd, uint8_t btn, int state);
void free_vkbd(struct vkbd *vkbd);

@ -37,11 +37,6 @@ void vkbd_mouse_move_abs(const struct vkbd *vkbd, int x, int y)
printf("absolute mouse movement: x: %d, y: %d\n", x, y);
}
void vkbd_send_button(const struct vkbd *vkbd, uint8_t btn, int state)
{
printf("mouse button: %d, state: %d\n", btn, state);
}
void vkbd_send_key(const struct vkbd *vkbd, uint8_t code, int state)
{
printf("key: %s, state: %d\n", keycode_table[code].name, state);

@ -35,12 +35,6 @@ pthread_mutex_t repeater_mtx = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t repeater_cond = PTHREAD_COND_INITIALIZER;
static uint8_t repeat_key = 0;
static int is_mouse_button(size_t code)
{
return (((code) >= BTN_LEFT && (code) <= BTN_TASK) ||
((code) >= BTN_0 && (code) <= BTN_9));
}
static int create_virtual_keyboard(const char *name)
{
int ret;
@ -72,6 +66,12 @@ static int create_virtual_keyboard(const char *name)
}
}
for (code = BTN_LEFT; code <= BTN_TASK; code++)
ioctl(fd, UI_SET_KEYBIT, code);
for (code = BTN_0; code <= BTN_9; code++)
ioctl(fd, UI_SET_KEYBIT, code);
udev.id.bustype = BUS_USB;
udev.id.vendor = 0x0FAC;
udev.id.product = 0x0ADE;
@ -179,8 +179,19 @@ void write_key_event(const struct vkbd *vkbd, uint8_t code, int state)
pthread_mutex_lock(&mtx);
ev.type = EV_KEY;
ev.code = code;
switch (code) {
case KEYD_LEFT_MOUSE: ev.code = BTN_LEFT; break;
case KEYD_MIDDLE_MOUSE: ev.code = BTN_MIDDLE; break;
case KEYD_RIGHT_MOUSE: ev.code = BTN_RIGHT; break;
case KEYD_MOUSE_1: ev.code = BTN_SIDE; break;
case KEYD_MOUSE_2: ev.code = BTN_EXTRA; break;
default: ev.code = code; break;
}
ev.value = state;
ev.time.tv_sec = 0;
@ -348,50 +359,6 @@ void vkbd_mouse_move_abs(const struct vkbd *vkbd, int x, int y)
write(vkbd->pfd, &ev, sizeof(ev));
}
void vkbd_send_button(const struct vkbd *vkbd, uint8_t btn, int state)
{
struct input_event ev;
if (vkbd->pfd == -1) {
((struct vkbd *)vkbd)->pfd = create_virtual_pointer("keyd virtual pointer");
}
switch (btn) {
case 1:
ev.code = BTN_LEFT;
break;
case 2:
ev.code = BTN_MIDDLE;
break;
case 3:
ev.code = BTN_RIGHT;
break;
case 4:
ev.code = BTN_SIDE;
break;
case 5:
ev.code = BTN_EXTRA;
break;
default:
return;
}
ev.type = EV_KEY;
ev.value = state;
ev.time.tv_sec = 0;
ev.time.tv_usec = 0;
write(vkbd->pfd, &ev, sizeof(ev));
ev.type = EV_SYN;
ev.code = 0;
ev.value = 0;
write(vkbd->pfd, &ev, sizeof(ev));
}
void vkbd_send_key(const struct vkbd *vkbd, uint8_t code, int state)
{
if (state) {

@ -134,12 +134,6 @@ struct vkbd *vkbd_init(const char *name)
return vkbd;
}
void vkbd_send_button(const struct vkbd *vkbd, uint8_t btn, int state)
{
fprintf(stderr, "usb-gadget: mouse support is not implemented\n");
}
void vkbd_mouse_move(const struct vkbd *vkbd, int x, int y)
{
fprintf(stderr, "usb-gadget: mouse support is not implemented\n");

Loading…
Cancel
Save