|
|
@@ -310,10 +310,6 @@ process_events() {
|
|
|
bool changed_properties = false;
|
|
|
|
|
|
while (XCheckIfEvent(_display, &event, check_event, (char *)this)) {
|
|
|
- if (XFilterEvent(&event, None)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
if (got_keyrelease_event) {
|
|
|
// If a keyrelease event is immediately followed by a matching keypress
|
|
|
// event, that's just key repeat and we should treat the two events
|
|
|
@@ -324,22 +320,42 @@ process_events() {
|
|
|
if (event.type == KeyPress &&
|
|
|
event.xkey.keycode == keyrelease_event.keycode &&
|
|
|
(event.xkey.time - keyrelease_event.time <= 1)) {
|
|
|
- // In particular, we only generate down messages for the repeated
|
|
|
- // keys, not down-and-up messages.
|
|
|
- handle_keystroke(event.xkey);
|
|
|
-
|
|
|
- // We thought about not generating the keypress event, but we need
|
|
|
- // that repeat for backspace. Rethink later.
|
|
|
- handle_keyrepeat(event.xkey);
|
|
|
+ if (!XFilterEvent(&event, None)) {
|
|
|
+ // In particular, we only generate down messages for the repeated
|
|
|
+ // keys, not down-and-up messages.
|
|
|
+ handle_keystroke(event.xkey);
|
|
|
+
|
|
|
+ // We thought about not generating the keypress event, but we need
|
|
|
+ // that repeat for backspace. Rethink later.
|
|
|
+ handle_keypress(event.xkey);
|
|
|
+ }
|
|
|
continue;
|
|
|
|
|
|
} else {
|
|
|
// This keyrelease event is not immediately followed by a matching
|
|
|
// keypress event, so it's a genuine release.
|
|
|
+ ButtonHandle raw_button = map_raw_button(keyrelease_event.keycode);
|
|
|
+ if (raw_button != ButtonHandle::none()) {
|
|
|
+ _input->raw_button_up(raw_button);
|
|
|
+ }
|
|
|
+
|
|
|
handle_keyrelease(keyrelease_event);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // Send out a raw key press event before we do XFilterEvent, which will
|
|
|
+ // filter out dead keys and such.
|
|
|
+ if (event.type == KeyPress) {
|
|
|
+ ButtonHandle raw_button = map_raw_button(event.xkey.keycode);
|
|
|
+ if (raw_button != ButtonHandle::none()) {
|
|
|
+ _input->raw_button_down(raw_button);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (XFilterEvent(&event, None)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
ButtonHandle button;
|
|
|
|
|
|
switch (event.type) {
|
|
|
@@ -576,6 +592,11 @@ process_events() {
|
|
|
if (got_keyrelease_event) {
|
|
|
// This keyrelease event is not immediately followed by a matching
|
|
|
// keypress event, so it's a genuine release.
|
|
|
+ ButtonHandle raw_button = map_raw_button(keyrelease_event.keycode);
|
|
|
+ if (raw_button != ButtonHandle::none()) {
|
|
|
+ _input->raw_button_up(raw_button);
|
|
|
+ }
|
|
|
+
|
|
|
handle_keyrelease(keyrelease_event);
|
|
|
}
|
|
|
}
|
|
|
@@ -1528,41 +1549,6 @@ handle_keypress(XKeyEvent &event) {
|
|
|
}
|
|
|
_input->button_down(button);
|
|
|
}
|
|
|
-
|
|
|
- if (event.keycode >= 9 && event.keycode <= 135) {
|
|
|
- ButtonHandle raw_button = map_raw_button(event.keycode);
|
|
|
- if (raw_button != ButtonHandle::none()) {
|
|
|
- _input->raw_button_down(raw_button);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * Generates a keyrepeat corresponding to the indicated X KeyPress event.
|
|
|
- */
|
|
|
-void x11GraphicsWindow::
|
|
|
-handle_keyrepeat(XKeyEvent &event) {
|
|
|
- if (_properties.get_mouse_mode() != WindowProperties::M_relative) {
|
|
|
- _input->set_pointer_in_window(event.x, event.y);
|
|
|
- }
|
|
|
-
|
|
|
- // Now get the raw unshifted button.
|
|
|
- ButtonHandle button = get_button(event, false);
|
|
|
- if (button != ButtonHandle::none()) {
|
|
|
- if (button == KeyboardButton::lcontrol() || button == KeyboardButton::rcontrol()) {
|
|
|
- _input->button_down(KeyboardButton::control());
|
|
|
- }
|
|
|
- if (button == KeyboardButton::lshift() || button == KeyboardButton::rshift()) {
|
|
|
- _input->button_down(KeyboardButton::shift());
|
|
|
- }
|
|
|
- if (button == KeyboardButton::lalt() || button == KeyboardButton::ralt()) {
|
|
|
- _input->button_down(KeyboardButton::alt());
|
|
|
- }
|
|
|
- if (button == KeyboardButton::lmeta() || button == KeyboardButton::rmeta()) {
|
|
|
- _input->button_down(KeyboardButton::meta());
|
|
|
- }
|
|
|
- _input->button_down(button);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -1591,13 +1577,6 @@ handle_keyrelease(XKeyEvent &event) {
|
|
|
}
|
|
|
_input->button_up(button);
|
|
|
}
|
|
|
-
|
|
|
- if (event.keycode >= 9 && event.keycode <= 135) {
|
|
|
- ButtonHandle raw_button = map_raw_button(event.keycode);
|
|
|
- if (raw_button != ButtonHandle::none()) {
|
|
|
- _input->raw_button_up(raw_button);
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -2024,7 +2003,7 @@ map_raw_button(KeyCode key) const {
|
|
|
// In any case, this means we can use the same mapping as our raw
|
|
|
// input code, which uses evdev directly.
|
|
|
int index = key - 8;
|
|
|
- if (index >= 0) {
|
|
|
+ if (index > 0 && index < 128) {
|
|
|
return EvdevInputDevice::map_button(index);
|
|
|
}
|
|
|
#endif
|