Mercurial > sdl-ios-xcode
diff src/video/dga/SDL_dgaevents.c @ 1327:d12a63a8d95a
Resolved bug #130
Use XFilterEvent() to handle dead-key composition under X11
Cleaned up the code in preparation for 1.3 API changes
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sat, 04 Feb 2006 08:35:11 +0000 |
parents | c9b51268668f |
children | 19418e4422cb |
line wrap: on
line diff
--- a/src/video/dga/SDL_dgaevents.c Fri Feb 03 07:43:42 2006 +0000 +++ b/src/video/dga/SDL_dgaevents.c Sat Feb 04 08:35:11 2006 +0000 @@ -37,8 +37,7 @@ /* Heheh we're using X11 event code */ extern int X11_Pending(Display *display); extern void X11_InitKeymap(void); -extern SDL_keysym *X11_TranslateKey(Display *display, XIC ic, XKeyEvent *xkey, - KeyCode kc, SDL_keysym *keysym); +extern SDLKey X11_TranslateKeycode(Display *display, KeyCode kc); static int DGA_DispatchEvent(_THIS) { @@ -74,20 +73,64 @@ } break; - /* Key press or release? */ - case KeyPress: - case KeyRelease: { + /* Key press? */ + case KeyPress: { SDL_keysym keysym; + KeyCode keycode; XKeyEvent xkey; SDL_NAME(XDGAKeyEventToXKeyEvent)(&xevent.xkey, &xkey); - posted = SDL_PrivateKeyboard((xevent.type == KeyPress), - X11_TranslateKey(DGA_Display, NULL/*no XIC*/, - &xkey, xkey.keycode, - &keysym)); + keycode = xkey.keycode; +#ifdef DEBUG_XEVENTS +printf("KeyPress (X11 keycode = 0x%X)\n", xkey.keycode); +#endif + /* Get the translated SDL virtual keysym */ + keysym.scancode = keycode; + keysym.sym = X11_TranslateKeycode(DGA_Display, keycode); + keysym.mod = KMOD_NONE; + keysym.unicode = 0; + + /* Look up the translated value for the key event */ + if ( SDL_TranslateUNICODE ) { + static XComposeStatus state; + char keybuf[32]; + + if ( pXLookupString(&xkey, keybuf, sizeof(keybuf), NULL, &state) ) { + /* + * FIXME: XLookupString() may yield more than one + * character, so we need a mechanism to allow for + * this (perhaps null keypress events with a + * unicode value) + */ + keysym.unicode = (Uint8)keybuf[0]; + } + } + posted = SDL_PrivateKeyboard(SDL_PRESSED, &keysym); } break; + /* Key release? */ + case KeyRelease: { + SDL_keysym keysym; + KeyCode keycode; + XKeyEvent xkey; + + SDL_NAME(XDGAKeyEventToXKeyEvent)(&xevent.xkey, &xkey); + keycode = xkey.keycode; +#ifdef DEBUG_XEVENTS +printf("KeyRelease (X11 keycode = 0x%X)\n", xkey.keycode); +#endif + /* Get the translated SDL virtual keysym */ + keysym.scancode = keycode; + keysym.sym = X11_TranslateKeycode(DGA_Display, keycode); + keysym.mod = KMOD_NONE; + keysym.unicode = 0; + posted = SDL_PrivateKeyboard(SDL_RELEASED, &keysym); + } + break; + + break; + } return(posted); }