compositor-x11: Suppress keyboard repeat events
authorKristian Høgsberg <krh@bitplanet.net>
Fri, 15 Apr 2011 19:48:07 +0000 (15:48 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Fri, 15 Apr 2011 19:48:07 +0000 (15:48 -0400)
compositor/compositor-x11.c

index 48dd347..108955f 100644 (file)
@@ -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;
        }
 }