mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2026-05-04 21:08:05 +02:00
compositor-x11: Suppress keyboard repeat events
This commit is contained in:
parent
d11eadb519
commit
3ddd148fba
1 changed files with 30 additions and 5 deletions
|
|
@ -367,7 +367,7 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data)
|
|||
xcb_client_message_event_t *client_message;
|
||||
xcb_motion_notify_event_t *motion_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_keymap_notify_event_t *keymap_notify;
|
||||
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;
|
||||
int i, set;
|
||||
|
||||
prev_release = 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) {
|
||||
|
||||
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);
|
||||
break;
|
||||
case XCB_KEY_RELEASE:
|
||||
key_press = (xcb_key_press_event_t *) event;
|
||||
notify_key(c->base.input_device,
|
||||
key_press->time, key_press->detail - 8, 0);
|
||||
prev_release = (xcb_key_press_event_t *) event;
|
||||
break;
|
||||
case XCB_BUTTON_PRESS:
|
||||
button_press = (xcb_button_press_event_t *) event;
|
||||
|
|
@ -481,7 +497,16 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data)
|
|||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue