Skip to content

Commit 329abe2

Browse files
committed
x11: fix raw button events for dead keys
1 parent 43fa7ef commit 329abe2

File tree

2 files changed

+33
-55
lines changed

2 files changed

+33
-55
lines changed

panda/src/x11display/x11GraphicsWindow.cxx

Lines changed: 33 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -309,10 +309,6 @@ process_events() {
309309
bool changed_properties = false;
310310

311311
while (XCheckIfEvent(_display, &event, check_event, (char *)this)) {
312-
if (XFilterEvent(&event, None)) {
313-
continue;
314-
}
315-
316312
if (got_keyrelease_event) {
317313
// If a keyrelease event is immediately followed by a matching keypress
318314
// event, that's just key repeat and we should treat the two events
@@ -323,22 +319,42 @@ process_events() {
323319
if (event.type == KeyPress &&
324320
event.xkey.keycode == keyrelease_event.keycode &&
325321
(event.xkey.time - keyrelease_event.time <= 1)) {
326-
// In particular, we only generate down messages for the repeated
327-
// keys, not down-and-up messages.
328-
handle_keystroke(event.xkey);
329-
330-
// We thought about not generating the keypress event, but we need
331-
// that repeat for backspace. Rethink later.
332-
handle_keyrepeat(event.xkey);
322+
if (!XFilterEvent(&event, None)) {
323+
// In particular, we only generate down messages for the repeated
324+
// keys, not down-and-up messages.
325+
handle_keystroke(event.xkey);
326+
327+
// We thought about not generating the keypress event, but we need
328+
// that repeat for backspace. Rethink later.
329+
handle_keypress(event.xkey);
330+
}
333331
continue;
334332

335333
} else {
336334
// This keyrelease event is not immediately followed by a matching
337335
// keypress event, so it's a genuine release.
336+
ButtonHandle raw_button = map_raw_button(keyrelease_event.keycode);
337+
if (raw_button != ButtonHandle::none()) {
338+
_input->raw_button_up(raw_button);
339+
}
340+
338341
handle_keyrelease(keyrelease_event);
339342
}
340343
}
341344

345+
// Send out a raw key press event before we do XFilterEvent, which will
346+
// filter out dead keys and such.
347+
if (event.type == KeyPress) {
348+
ButtonHandle raw_button = map_raw_button(event.xkey.keycode);
349+
if (raw_button != ButtonHandle::none()) {
350+
_input->raw_button_down(raw_button);
351+
}
352+
}
353+
354+
if (XFilterEvent(&event, None)) {
355+
continue;
356+
}
357+
342358
ButtonHandle button;
343359

344360
switch (event.type) {
@@ -545,6 +561,11 @@ process_events() {
545561
if (got_keyrelease_event) {
546562
// This keyrelease event is not immediately followed by a matching
547563
// keypress event, so it's a genuine release.
564+
ButtonHandle raw_button = map_raw_button(keyrelease_event.keycode);
565+
if (raw_button != ButtonHandle::none()) {
566+
_input->raw_button_up(raw_button);
567+
}
568+
548569
handle_keyrelease(keyrelease_event);
549570
}
550571
}
@@ -1490,41 +1511,6 @@ handle_keypress(XKeyEvent &event) {
14901511
}
14911512
_input->button_down(button);
14921513
}
1493-
1494-
if (event.keycode >= 9 && event.keycode <= 135) {
1495-
ButtonHandle raw_button = map_raw_button(event.keycode);
1496-
if (raw_button != ButtonHandle::none()) {
1497-
_input->raw_button_down(raw_button);
1498-
}
1499-
}
1500-
}
1501-
1502-
/**
1503-
* Generates a keyrepeat corresponding to the indicated X KeyPress event.
1504-
*/
1505-
void x11GraphicsWindow::
1506-
handle_keyrepeat(XKeyEvent &event) {
1507-
if (_properties.get_mouse_mode() != WindowProperties::M_relative) {
1508-
_input->set_pointer_in_window(event.x, event.y);
1509-
}
1510-
1511-
// Now get the raw unshifted button.
1512-
ButtonHandle button = get_button(event, false);
1513-
if (button != ButtonHandle::none()) {
1514-
if (button == KeyboardButton::lcontrol() || button == KeyboardButton::rcontrol()) {
1515-
_input->button_down(KeyboardButton::control());
1516-
}
1517-
if (button == KeyboardButton::lshift() || button == KeyboardButton::rshift()) {
1518-
_input->button_down(KeyboardButton::shift());
1519-
}
1520-
if (button == KeyboardButton::lalt() || button == KeyboardButton::ralt()) {
1521-
_input->button_down(KeyboardButton::alt());
1522-
}
1523-
if (button == KeyboardButton::lmeta() || button == KeyboardButton::rmeta()) {
1524-
_input->button_down(KeyboardButton::meta());
1525-
}
1526-
_input->button_down(button);
1527-
}
15281514
}
15291515

15301516
/**
@@ -1553,13 +1539,6 @@ handle_keyrelease(XKeyEvent &event) {
15531539
}
15541540
_input->button_up(button);
15551541
}
1556-
1557-
if (event.keycode >= 9 && event.keycode <= 135) {
1558-
ButtonHandle raw_button = map_raw_button(event.keycode);
1559-
if (raw_button != ButtonHandle::none()) {
1560-
_input->raw_button_up(raw_button);
1561-
}
1562-
}
15631542
}
15641543

15651544
/**
@@ -1986,7 +1965,7 @@ map_raw_button(KeyCode key) const {
19861965
// In any case, this means we can use the same mapping as our raw
19871966
// input code, which uses evdev directly.
19881967
int index = key - 8;
1989-
if (index >= 0) {
1968+
if (index > 0 && index < 128) {
19901969
return EvdevInputDevice::map_button(index);
19911970
}
19921971
#endif

panda/src/x11display/x11GraphicsWindow.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ class x11GraphicsWindow : public GraphicsWindow {
5959
virtual void setup_colormap(XVisualInfo *visual);
6060
void handle_keystroke(XKeyEvent &event);
6161
void handle_keypress(XKeyEvent &event);
62-
void handle_keyrepeat(XKeyEvent &event);
6362
void handle_keyrelease(XKeyEvent &event);
6463

6564
ButtonHandle get_button(XKeyEvent &key_event, bool allow_shift);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy