compositor-x11: Suppress keyboard repeat events
This commit is contained in:
@@ -367,7 +367,7 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data)
|
|||||||
xcb_client_message_event_t *client_message;
|
xcb_client_message_event_t *client_message;
|
||||||
xcb_motion_notify_event_t *motion_notify;
|
xcb_motion_notify_event_t *motion_notify;
|
||||||
xcb_enter_notify_event_t *enter_notify;
|
xcb_enter_notify_event_t *enter_notify;
|
||||||
xcb_key_press_event_t *key_press;
|
xcb_key_press_event_t *key_press, *prev_release;
|
||||||
xcb_button_press_event_t *button_press;
|
xcb_button_press_event_t *button_press;
|
||||||
xcb_keymap_notify_event_t *keymap_notify;
|
xcb_keymap_notify_event_t *keymap_notify;
|
||||||
xcb_focus_in_event_t *focus_in;
|
xcb_focus_in_event_t *focus_in;
|
||||||
@@ -375,7 +375,25 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data)
|
|||||||
uint32_t *k;
|
uint32_t *k;
|
||||||
int i, set;
|
int i, set;
|
||||||
|
|
||||||
|
prev_release = NULL;
|
||||||
while (event = xcb_poll_for_event (c->conn), event != NULL) {
|
while (event = xcb_poll_for_event (c->conn), event != NULL) {
|
||||||
|
key_press = (xcb_key_press_event_t *) event;
|
||||||
|
if (prev_release &&
|
||||||
|
(event->response_type & ~0x80) == XCB_KEY_PRESS &&
|
||||||
|
prev_release->time == key_press->time) {
|
||||||
|
free(prev_release);
|
||||||
|
free(event);
|
||||||
|
prev_release = NULL;
|
||||||
|
continue;
|
||||||
|
} else if (prev_release) {
|
||||||
|
notify_key(c->base.input_device,
|
||||||
|
prev_release->time,
|
||||||
|
prev_release->detail - 8, 0);
|
||||||
|
free(prev_release);
|
||||||
|
prev_release = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
switch (event->response_type & ~0x80) {
|
switch (event->response_type & ~0x80) {
|
||||||
|
|
||||||
case XCB_KEY_PRESS:
|
case XCB_KEY_PRESS:
|
||||||
@@ -384,9 +402,7 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data)
|
|||||||
key_press->time, key_press->detail - 8, 1);
|
key_press->time, key_press->detail - 8, 1);
|
||||||
break;
|
break;
|
||||||
case XCB_KEY_RELEASE:
|
case XCB_KEY_RELEASE:
|
||||||
key_press = (xcb_key_press_event_t *) event;
|
prev_release = (xcb_key_press_event_t *) event;
|
||||||
notify_key(c->base.input_device,
|
|
||||||
key_press->time, key_press->detail - 8, 0);
|
|
||||||
break;
|
break;
|
||||||
case XCB_BUTTON_PRESS:
|
case XCB_BUTTON_PRESS:
|
||||||
button_press = (xcb_button_press_event_t *) event;
|
button_press = (xcb_button_press_event_t *) event;
|
||||||
@@ -481,7 +497,16 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
free (event);
|
if ((xcb_generic_event_t *) prev_release != event)
|
||||||
|
free (event);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prev_release) {
|
||||||
|
key_press = (xcb_key_press_event_t *) prev_release;
|
||||||
|
notify_key(c->base.input_device,
|
||||||
|
prev_release->time, prev_release->detail - 8, 0);
|
||||||
|
free(prev_release);
|
||||||
|
prev_release = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user