@@ -309,10 +309,6 @@ process_events() {
309
309
bool changed_properties = false ;
310
310
311
311
while (XCheckIfEvent (_display, &event, check_event, (char *)this )) {
312
- if (XFilterEvent (&event, None)) {
313
- continue ;
314
- }
315
-
316
312
if (got_keyrelease_event) {
317
313
// If a keyrelease event is immediately followed by a matching keypress
318
314
// event, that's just key repeat and we should treat the two events
@@ -323,22 +319,42 @@ process_events() {
323
319
if (event.type == KeyPress &&
324
320
event.xkey .keycode == keyrelease_event.keycode &&
325
321
(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
+ }
333
331
continue ;
334
332
335
333
} else {
336
334
// This keyrelease event is not immediately followed by a matching
337
335
// 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
+
338
341
handle_keyrelease (keyrelease_event);
339
342
}
340
343
}
341
344
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
+
342
358
ButtonHandle button;
343
359
344
360
switch (event.type ) {
@@ -545,6 +561,11 @@ process_events() {
545
561
if (got_keyrelease_event) {
546
562
// This keyrelease event is not immediately followed by a matching
547
563
// 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
+
548
569
handle_keyrelease (keyrelease_event);
549
570
}
550
571
}
@@ -1490,41 +1511,6 @@ handle_keypress(XKeyEvent &event) {
1490
1511
}
1491
1512
_input->button_down (button);
1492
1513
}
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
- }
1528
1514
}
1529
1515
1530
1516
/* *
@@ -1553,13 +1539,6 @@ handle_keyrelease(XKeyEvent &event) {
1553
1539
}
1554
1540
_input->button_up (button);
1555
1541
}
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
- }
1563
1542
}
1564
1543
1565
1544
/* *
@@ -1986,7 +1965,7 @@ map_raw_button(KeyCode key) const {
1986
1965
// In any case, this means we can use the same mapping as our raw
1987
1966
// input code, which uses evdev directly.
1988
1967
int index = key - 8 ;
1989
- if (index >= 0 ) {
1968
+ if (index > 0 && index < 128 ) {
1990
1969
return EvdevInputDevice::map_button (index);
1991
1970
}
1992
1971
#endif
0 commit comments