From cb24f4de94a1789eac8e560fa5a2c1e806576da2 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 28 May 2015 10:44:46 -0700 Subject: [PATCH] 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. --- src/video/x11/SDL_x11events.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index 886dc43f3..5ff1e2140 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -40,6 +40,8 @@ #include +/*#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