diff options
author | Britney Fransen <brfransen@gmail.com> | 2014-12-18 15:45:15 (GMT) |
---|---|---|
committer | Britney Fransen <brfransen@gmail.com> | 2014-12-18 15:45:15 (GMT) |
commit | 6fa252f6628bb088c7797a77e3744a2040cfee73 (patch) | |
tree | 97908eb145bb9954cf0c07862ef7b4a8a9b2fad7 /abs/core/sdl/SDL-1.2.15-SDL_EnableUNICODE_drops_keyboard_events.patch | |
parent | d450054a0e5f2dfbf9d86948b087edd0d89402c0 (diff) | |
download | linhes_pkgbuild-6fa252f6628bb088c7797a77e3744a2040cfee73.zip linhes_pkgbuild-6fa252f6628bb088c7797a77e3744a2040cfee73.tar.gz linhes_pkgbuild-6fa252f6628bb088c7797a77e3744a2040cfee73.tar.bz2 |
sdl: update to 1.2.15-7
Diffstat (limited to 'abs/core/sdl/SDL-1.2.15-SDL_EnableUNICODE_drops_keyboard_events.patch')
-rw-r--r-- | abs/core/sdl/SDL-1.2.15-SDL_EnableUNICODE_drops_keyboard_events.patch | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/abs/core/sdl/SDL-1.2.15-SDL_EnableUNICODE_drops_keyboard_events.patch b/abs/core/sdl/SDL-1.2.15-SDL_EnableUNICODE_drops_keyboard_events.patch new file mode 100644 index 0000000..fdf910e --- /dev/null +++ b/abs/core/sdl/SDL-1.2.15-SDL_EnableUNICODE_drops_keyboard_events.patch @@ -0,0 +1,73 @@ +# HG changeset patch +# User Sam Lantinga <slouken@libsdl.org> +# Date 1397799374 25200 +# Thu Apr 17 22:36:14 2014 -0700 +# Branch SDL-1.2 +# Node ID 0aade9c0203f717fe4b823a176c3c040f1a709f8 +# Parent 22a7f096bb9d4d596f35a93e33608825693462b0 +Fixed bug 2325 - SDL_EnableUNICODE sometimes drops keyboard events completely + +Rafał Mużyło + +The most annoying part of this bug is that though I've found it in two separate apps, I don't have a trivial testcase for it. + +The problem seems to be a condition race, as it's triggered quite randomly (therefore it will be hard to tell whether it really gets fixed, if a probable fix is found). + +While it's specific to SDL 1.2, it seems quite similar to the problem described and fixed in http://forums.libsdl.org/viewtopic.php?p=40503. + +Now, I should start describing the problem. + +A game uses Escape to open menu (the exact key might not be important). Upon opening, it calls SDL_EnableUNICODE(1). Upon closing it calls SDL_EnableUNICODE(0). + +I have an IME running. + +Game uses SDL_PollEvent to get the events. + +If Escape is pressed repeatedly, menu is opened and closed, till it eventually freezes in open state. +"freezes" in this context means "app itself still runs, but no keyboard events are getting delivered (though - for example - mouse events still are)". "getting delivered" should mean "SDL_PollEvent is not receiving any". +If it matters, the last delivered keyboard event is a keypress, the release never arrives. + +It seems (no guarantees, due to random nature of the freeze) that unsetting XMODIFIERS (which - AFAIU - will disable IME as far as SDL is concerned) prevents the freeze, therefore the reference to that SDL2 thread. + +diff -r 22a7f096bb9d -r 0aade9c0203f src/video/x11/SDL_x11events.c +--- a/src/video/x11/SDL_x11events.c Sun Dec 01 00:00:17 2013 -0500 ++++ b/src/video/x11/SDL_x11events.c Thu Apr 17 22:36:14 2014 -0700 +@@ -395,6 +395,8 @@ + { + int posted; + XEvent xevent; ++ int orig_event_type; ++ KeyCode orig_keycode; + + SDL_memset(&xevent, '\0', sizeof (XEvent)); /* valgrind fix. --ryan. */ + XNextEvent(SDL_Display, &xevent); +@@ -410,9 +412,29 @@ + #ifdef X_HAVE_UTF8_STRING + /* If we are translating with IM, we need to pass all events + to XFilterEvent, and discard those filtered events immediately. */ ++ orig_event_type = xevent.type; ++ if (orig_event_type == KeyPress || orig_event_type == KeyRelease) { ++ orig_keycode = xevent.xkey.keycode; ++ } else { ++ orig_keycode = 0; ++ } + if ( SDL_TranslateUNICODE + && SDL_IM != NULL + && XFilterEvent(&xevent, None) ) { ++ if (orig_keycode) { ++ SDL_keysym keysym; ++ static XComposeStatus state; ++ char keybuf[32]; ++ ++ keysym.scancode = xevent.xkey.keycode; ++ keysym.sym = X11_TranslateKeycode(SDL_Display, xevent.xkey.keycode); ++ keysym.mod = KMOD_NONE; ++ keysym.unicode = 0; ++ if (orig_event_type == KeyPress && XLookupString(&xevent.xkey, keybuf, sizeof(keybuf), NULL, &state)) ++ keysym.unicode = (Uint8)keybuf[0]; ++ ++ SDL_PrivateKeyboard(orig_event_type == KeyPress ? SDL_PRESSED : SDL_RELEASED, &keysym); ++ } + return 0; + } + #endif |