Fixed bug 2772 - SDL2 doesn't handle X KeymapNotify events Jason Wyatt Currently the keymapnotify event handling is commented out as FIXME in SDL_x11events.c (It looks like this may have functioned SDL1.2). Not handling this event means that if a window manager shortcut such as ALT+SPACE is used, SDL will send an ALT key down signal, but not an up signal. Also querying SDL about the key state, it believes the ALT key remains pressed. X passes the events keypress (alt), ?focusout?, ?focusin?, keymapnotify.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c
index 886dc43..5ff1e21 100644
--- a/src/video/x11/SDL_x11events.c
+++ b/src/video/x11/SDL_x11events.c
@@ -40,6 +40,8 @@
#include <stdio.h>
+/*#define DEBUG_XEVENTS*/
+
#ifndef _NET_WM_MOVERESIZE_SIZE_TOPLEFT
#define _NET_WM_MOVERESIZE_SIZE_TOPLEFT 0
#endif
@@ -132,7 +134,6 @@ static Atom X11_PickTargetFromAtoms(Display *disp, Atom a0, Atom a1, Atom a2)
if (a2 != None) atom[count++] = a2;
return X11_PickTarget(disp, atom, count);
}
-/* #define DEBUG_XEVENTS */
struct KeyRepeatCheckData
{
@@ -361,7 +362,7 @@ X11_GetNumLockModifierMask(_THIS)
}
static void
-X11_ReconcileKeyboardState(_THIS, const SDL_WindowData *data)
+X11_ReconcileKeyboardState(_THIS)
{
SDL_VideoData *viddata = (SDL_VideoData *) _this->driverdata;
Display *display = viddata->display;
@@ -413,7 +414,7 @@ X11_DispatchFocusIn(_THIS, SDL_WindowData *data)
printf("window %p: Dispatching FocusIn\n", data);
#endif
SDL_SetKeyboardFocus(data->window);
- X11_ReconcileKeyboardState(_this, data);
+ X11_ReconcileKeyboardState(_this);
#ifdef X_HAVE_UTF8_STRING
if (data->ic) {
X11_XSetICFocus(data->ic);
@@ -633,6 +634,12 @@ X11_DispatchEvent(_THIS)
}
}
if (!data) {
+ /* The window for KeymapNotify events is 0 */
+ if (xevent.type == KeymapNotify) {
+ if (SDL_GetKeyboardFocus() != NULL) {
+ X11_ReconcileKeyboardState(_this);
+ }
+ }
return;
}
@@ -747,17 +754,6 @@ X11_DispatchEvent(_THIS)
}
break;
- /* Generated upon EnterWindow and FocusIn */
- case KeymapNotify:{
-#ifdef DEBUG_XEVENTS
- printf("window %p: KeymapNotify!\n", data);
-#endif
- /* FIXME:
- X11_SetKeyboardState(SDL_Display, xevent.xkeymap.key_vector);
- */
- }
- break;
-
/* Has the keyboard layout changed? */
case MappingNotify:{
#ifdef DEBUG_XEVENTS