Skip to content
Permalink
Browse files

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.
  • Loading branch information
slouken committed May 28, 2015
1 parent a6df21c commit cb24f4de94a1789eac8e560fa5a2c1e806576da2
Showing with 10 additions and 14 deletions.
  1. +10 −14 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

0 comments on commit cb24f4d

Please sign in to comment.