Mercurial > sdl-ios-xcode
diff src/video/x11/SDL_x11events.c @ 2295:dbc6d1893869
Checking in Christian Walther's patch for x11 keyboard input. Minor code tweaks by Bob.
author | Bob Pendleton <bob@pendleton.com> |
---|---|
date | Tue, 08 Jan 2008 00:10:46 +0000 |
parents | da8332c8f480 |
children | a7cbc25071b6 |
line wrap: on
line diff
--- a/src/video/x11/SDL_x11events.c Thu Jan 03 06:07:30 2008 +0000 +++ b/src/video/x11/SDL_x11events.c Tue Jan 08 00:10:46 2008 +0000 @@ -30,6 +30,28 @@ #include "../../events/SDL_events_c.h" +/* Check to see if this is a repeated key. + (idea shamelessly lifted from GII -- thanks guys! :) + */ +static int +X11_KeyRepeat(Display * display, XEvent * event) +{ + XEvent peekevent; + int repeated; + + repeated = 0; + if (XPending(display)) { + XPeekEvent(display, &peekevent); + if ((peekevent.type == KeyPress) && + (peekevent.xkey.keycode == event->xkey.keycode) && + ((peekevent.xkey.time - event->xkey.time) < 2)) { + repeated = 1; + XNextEvent(display, &peekevent); + } + } + return (repeated); +} + static void X11_DispatchEvent(_THIS) { @@ -167,95 +189,44 @@ /* Key press? */ case KeyPress:{ -#if 0 /* FIXME */ - static SDL_keysym saved_keysym; - SDL_keysym keysym; KeyCode keycode = xevent.xkey.keycode; #ifdef DEBUG_XEVENTS printf("KeyPress (X11 keycode = 0x%X)\n", xevent.xkey.keycode); #endif - /* Get the translated SDL virtual keysym */ - if (keycode) { - keysym.scancode = keycode; - keysym.sym = X11_TranslateKeycode(SDL_Display, keycode); - keysym.mod = KMOD_NONE; - keysym.unicode = 0; - } else { - keysym = saved_keysym; - } - - /* If we're not doing translation, we're done! */ - if (!SDL_TranslateUNICODE) { - posted = SDL_PrivateKeyboard(SDL_PRESSED, &keysym); - break; - } - - if (XFilterEvent(&xevent, None)) { - if (xevent.xkey.keycode) { - posted = SDL_PrivateKeyboard(SDL_PRESSED, &keysym); - } else { - /* Save event to be associated with IM text - In 1.3 we'll have a text event instead.. */ - saved_keysym = keysym; + if (!X11_KeyRepeat(videodata->display, &xevent)) { + SDLKey physicalKey = videodata->keyCodeToSDLKTable[keycode]; + SDL_SendKeyboardKey(videodata->keyboard, SDL_PRESSED, + (Uint8) keycode, physicalKey); +#if 1 + if (physicalKey == SDLK_UNKNOWN) { + fprintf(stderr, + "The key you just pressed is not recognized by SDL. To help get this fixed, report this to the SDL mailing list <sdl@libsdl.org> or to Christian Walther <cwalther@gmx.ch>. X11 KeyCode is %d, X11 KeySym 0x%X.\n", + (int) keycode, + (unsigned int) XKeycodeToKeysym(videodata-> + display, keycode, + 0)); } - break; +#endif } - - /* Look up the translated value for the key event */ -#ifdef X_HAVE_UTF8_STRING - if (data->ic != NULL) { - static Status state; - /* A UTF-8 character can be at most 6 bytes */ - char keybuf[6]; - if (Xutf8LookupString(data->ic, &xevent.xkey, - keybuf, sizeof(keybuf), NULL, &state)) { - keysym.unicode = Utf8ToUcs4((Uint8 *) keybuf); - } - } else -#endif - { - static XComposeStatus state; - char keybuf[32]; - - if (XLookupString(&xevent.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); -#endif // 0 } break; /* Key release? */ case KeyRelease:{ -#if 0 /* FIXME */ - SDL_keysym keysym; KeyCode keycode = xevent.xkey.keycode; #ifdef DEBUG_XEVENTS printf("KeyRelease (X11 keycode = 0x%X)\n", xevent.xkey.keycode); #endif /* Check to see if this is a repeated key */ - if (X11_KeyRepeat(SDL_Display, &xevent)) { + if (X11_KeyRepeat(videodata->display, &xevent)) { break; } - /* Get the translated SDL virtual keysym */ - keysym.scancode = keycode; - keysym.sym = X11_TranslateKeycode(SDL_Display, keycode); - keysym.mod = KMOD_NONE; - keysym.unicode = 0; - - posted = SDL_PrivateKeyboard(SDL_RELEASED, &keysym); -#endif // 0 + SDL_SendKeyboardKey(videodata->keyboard, SDL_RELEASED, + (Uint8) keycode, + videodata->keyCodeToSDLKTable[keycode]); } break;