Mercurial > sdl-ios-xcode
changeset 4565:e2d46c5c7483
Fixed key repeat detection on X11, and simplified the code for everyone else.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Wed, 21 Jul 2010 21:47:12 -0700 |
parents | ffd169948438 |
children | 40c833d951a1 |
files | src/events/SDL_keyboard.c src/events/SDL_keyboard_c.h src/video/cocoa/SDL_cocoakeyboard.m src/video/uikit/SDL_uikitview.m src/video/win32/SDL_win32events.c src/video/x11/SDL_x11events.c |
diffstat | 6 files changed, 58 insertions(+), 47 deletions(-) [+] |
line wrap: on
line diff
--- a/src/events/SDL_keyboard.c Wed Jul 21 00:11:56 2010 -0700 +++ b/src/events/SDL_keyboard.c Wed Jul 21 21:47:12 2010 -0700 @@ -566,7 +566,7 @@ for (scancode = 0; scancode < SDL_NUM_SCANCODES; ++scancode) { if (keyboard->keystate[scancode] == SDL_PRESSED) { - SDL_SendKeyboardKey(SDL_RELEASED, scancode, SDL_FALSE); + SDL_SendKeyboardKey(SDL_RELEASED, scancode); } } } @@ -627,12 +627,13 @@ } int -SDL_SendKeyboardKey(Uint8 state, SDL_scancode scancode, SDL_bool repeat) +SDL_SendKeyboardKey(Uint8 state, SDL_scancode scancode) { SDL_Keyboard *keyboard = &SDL_keyboard; int posted; Uint16 modstate; Uint32 type; + Uint8 repeat; if (!scancode) { return 0; @@ -732,6 +733,7 @@ } /* Drop events that don't change state */ + repeat = (state && keyboard->keystate[scancode]); if (keyboard->keystate[scancode] == state && !repeat) { #if 0 printf("Keyboard event didn't change state - dropped!\n"); @@ -748,7 +750,7 @@ SDL_Event event; event.key.type = type; event.key.state = state; - event.key.repeat = repeat ? 1 : 0; + event.key.repeat = repeat; event.key.keysym.scancode = scancode; event.key.keysym.sym = keyboard->keymap[scancode]; event.key.keysym.mod = modstate;
--- a/src/events/SDL_keyboard_c.h Wed Jul 21 00:11:56 2010 -0700 +++ b/src/events/SDL_keyboard_c.h Wed Jul 21 21:47:12 2010 -0700 @@ -49,7 +49,7 @@ extern void SDL_SetKeyboardFocus(SDL_Window * window); /* Send a keyboard key event */ -extern int SDL_SendKeyboardKey(Uint8 state, SDL_scancode scancode, SDL_bool repeat); +extern int SDL_SendKeyboardKey(Uint8 state, SDL_scancode scancode); /* Send keyboard text input */ extern int SDL_SendKeyboardText(const char *text);
--- a/src/video/cocoa/SDL_cocoakeyboard.m Wed Jul 21 00:11:56 2010 -0700 +++ b/src/video/cocoa/SDL_cocoakeyboard.m Wed Jul 21 21:47:12 2010 -0700 @@ -219,14 +219,14 @@ if (oldMask && oldMask != newMask) { /* modifier up event */ /* If this was Caps Lock, we need some additional voodoo to make SDL happy */ if (bit == NSAlphaShiftKeyMask) { - SDL_SendKeyboardKey(SDL_PRESSED, mapping[i], SDL_FALSE); + SDL_SendKeyboardKey(SDL_PRESSED, mapping[i]); } - SDL_SendKeyboardKey(SDL_RELEASED, mapping[i], SDL_FALSE); + SDL_SendKeyboardKey(SDL_RELEASED, mapping[i]); } else if (newMask && oldMask != newMask) { /* modifier down event */ - SDL_SendKeyboardKey(SDL_PRESSED, mapping[i], SDL_FALSE); + SDL_SendKeyboardKey(SDL_PRESSED, mapping[i]); /* If this was Caps Lock, we need some additional voodoo to make SDL happy */ if (bit == NSAlphaShiftKeyMask) { - SDL_SendKeyboardKey(SDL_RELEASED, mapping[i], SDL_FALSE); + SDL_SendKeyboardKey(SDL_RELEASED, mapping[i]); } } } @@ -251,9 +251,9 @@ newMask = newMods & device_independent_mask; if (oldMask && oldMask != newMask) { - SDL_SendKeyboardKey(SDL_RELEASED, scancode, SDL_FALSE); + SDL_SendKeyboardKey(SDL_RELEASED, scancode); } else if (newMask && oldMask != newMask) { - SDL_SendKeyboardKey(SDL_PRESSED, scancode, SDL_FALSE); + SDL_SendKeyboardKey(SDL_PRESSED, scancode); } } @@ -278,9 +278,9 @@ * find out which it is. */ if (new_dep_mask && old_dep_mask != new_dep_mask) { - SDL_SendKeyboardKey(SDL_PRESSED, scancode, SDL_FALSE); + SDL_SendKeyboardKey(SDL_PRESSED, scancode); } else { - SDL_SendKeyboardKey(SDL_RELEASED, scancode, SDL_FALSE); + SDL_SendKeyboardKey(SDL_RELEASED, scancode); } } @@ -351,7 +351,7 @@ /* In this case, we can't detect the keyboard, so use the left side * to represent both, and release it. */ - SDL_SendKeyboardKey(SDL_RELEASED, left_scancode, SDL_FALSE); + SDL_SendKeyboardKey(SDL_RELEASED, left_scancode); return; } @@ -362,10 +362,10 @@ * so I hope this doesn't cause other problems. */ if ( left_device_dependent_mask & oldMods ) { - SDL_SendKeyboardKey(SDL_RELEASED, left_scancode, SDL_FALSE); + SDL_SendKeyboardKey(SDL_RELEASED, left_scancode); } if ( right_device_dependent_mask & oldMods ) { - SDL_SendKeyboardKey(SDL_RELEASED, right_scancode, SDL_FALSE); + SDL_SendKeyboardKey(SDL_RELEASED, right_scancode); } } @@ -382,16 +382,16 @@ newMask = newMods & NSAlphaShiftKeyMask; if (oldMask != newMask) { - SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_CAPSLOCK, SDL_FALSE); - SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_CAPSLOCK, SDL_FALSE); + SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_CAPSLOCK); + SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_CAPSLOCK); } oldMask = oldMods & NSNumericPadKeyMask; newMask = newMods & NSNumericPadKeyMask; if (oldMask != newMask) { - SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_NUMLOCKCLEAR, SDL_FALSE); - SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_NUMLOCKCLEAR, SDL_FALSE); + SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_NUMLOCKCLEAR); + SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_NUMLOCKCLEAR); } } @@ -670,7 +670,6 @@ SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; unsigned short scancode = [event keyCode]; SDL_scancode code; - SDL_bool repeat; #if 0 const char *text; #endif @@ -689,13 +688,12 @@ switch ([event type]) { case NSKeyDown: - repeat = [event isARepeat] ? SDL_TRUE : SDL_FALSE; - if (!repeat) { + if (![event isARepeat]) { /* See if we need to rebuild the keyboard layout */ UpdateKeymap(data); } - SDL_SendKeyboardKey(SDL_PRESSED, code, repeat); + SDL_SendKeyboardKey(SDL_PRESSED, code); #if 1 if (code == SDL_SCANCODE_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>. Mac virtual key code is %d.\n", scancode); @@ -714,7 +712,7 @@ } break; case NSKeyUp: - SDL_SendKeyboardKey(SDL_RELEASED, code, SDL_FALSE); + SDL_SendKeyboardKey(SDL_RELEASED, code); break; case NSFlagsChanged: /* FIXME CW 2007-08-14: check if this whole mess that takes up half of this file is really necessary */
--- a/src/video/uikit/SDL_uikitview.m Wed Jul 21 00:11:56 2010 -0700 +++ b/src/video/uikit/SDL_uikitview.m Wed Jul 21 21:47:12 2010 -0700 @@ -245,8 +245,8 @@ if ([string length] == 0) { /* it wants to replace text with nothing, ie a delete */ - SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_DELETE, SDL_FALSE); - SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_DELETE, SDL_FALSE); + SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_DELETE); + SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_DELETE); } else { /* go through all the characters in the string we've been sent @@ -272,14 +272,14 @@ if (mod & KMOD_SHIFT) { /* If character uses shift, press shift down */ - SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_LSHIFT, SDL_FALSE); + SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_LSHIFT); } /* send a keydown and keyup even for the character */ - SDL_SendKeyboardKey(SDL_PRESSED, code, SDL_FALSE); - SDL_SendKeyboardKey(SDL_RELEASED, code, SDL_FALSE); + SDL_SendKeyboardKey(SDL_PRESSED, code); + SDL_SendKeyboardKey(SDL_RELEASED, code); if (mod & KMOD_SHIFT) { /* If character uses shift, press shift back up */ - SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LSHIFT, SDL_FALSE); + SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LSHIFT); } } }
--- a/src/video/win32/SDL_win32events.c Wed Jul 21 00:11:56 2010 -0700 +++ b/src/video/win32/SDL_win32events.c Wed Jul 21 21:47:12 2010 -0700 @@ -205,14 +205,6 @@ case WM_SYSKEYDOWN: case WM_KEYDOWN: { - SDL_bool repeat; - - if (lParam & REPEATED_KEYMASK) { - repeat = SDL_TRUE; - } else { - repeat = SDL_FALSE; - } - wParam = RemapVKEY(wParam, lParam); switch (wParam) { case VK_CONTROL: @@ -250,8 +242,7 @@ } if (wParam < 256) { SDL_SendKeyboardKey(SDL_PRESSED, - data->videodata->key_layout[wParam], - repeat); + data->videodata->key_layout[wParam]); } } returnCode = 0; @@ -301,13 +292,11 @@ && SDL_GetKeyboardState(NULL)[SDL_SCANCODE_PRINTSCREEN] == SDL_RELEASED) { SDL_SendKeyboardKey(SDL_PRESSED, - data->videodata->key_layout[wParam], - SDL_FALSE); + data->videodata->key_layout[wParam]); } if (wParam < 256) { SDL_SendKeyboardKey(SDL_RELEASED, - data->videodata->key_layout[wParam], - SDL_FALSE); + data->videodata->key_layout[wParam]); } } returnCode = 0;
--- a/src/video/x11/SDL_x11events.c Wed Jul 21 00:11:56 2010 -0700 +++ b/src/video/x11/SDL_x11events.c Wed Jul 21 21:47:12 2010 -0700 @@ -36,6 +36,24 @@ /*#define DEBUG_XEVENTS*/ +/* Check to see if this is a repeated key. + (idea shamelessly lifted from GII -- thanks guys! :) + */ +static SDL_bool X11_KeyRepeat(Display *display, XEvent *event) +{ + XEvent peekevent; + + if (XPending(display)) { + XPeekEvent(display, &peekevent); + if ((peekevent.type == KeyPress) && + (peekevent.xkey.keycode == event->xkey.keycode) && + ((peekevent.xkey.time-event->xkey.time) < 2)) { + return SDL_TRUE; + } + } + return SDL_FALSE; +} + static void X11_DispatchEvent(_THIS) { @@ -176,14 +194,14 @@ case KeyPress:{ KeyCode keycode = xevent.xkey.keycode; KeySym keysym = NoSymbol; + SDL_scancode scancode; char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]; Status status = 0; #ifdef DEBUG_XEVENTS printf("KeyPress (X11 keycode = 0x%X)\n", xevent.xkey.keycode); #endif - /* FIXME: How do we tell if this was a key repeat? */ - SDL_SendKeyboardKey(SDL_PRESSED, videodata->key_layout[keycode], SDL_FALSE); + SDL_SendKeyboardKey(SDL_PRESSED, videodata->key_layout[keycode]); #if 1 if (videodata->key_layout[keycode] == SDLK_UNKNOWN) { int min_keycode, max_keycode; @@ -218,7 +236,11 @@ #ifdef DEBUG_XEVENTS printf("KeyRelease (X11 keycode = 0x%X)\n", xevent.xkey.keycode); #endif - SDL_SendKeyboardKey(SDL_RELEASED, videodata->key_layout[keycode], SDL_FALSE); + if (X11_KeyRepeat(display, &xevent)) { + /* We're about to get a repeated key down, ignore the key up */ + break; + } + SDL_SendKeyboardKey(SDL_RELEASED, videodata->key_layout[keycode]); } break;