Fixed key repeat detection on X11, and simplified the code for everyone else.
This commit is contained in:
parent
6f5bba2745
commit
5d2b7ba68b
6 changed files with 58 additions and 47 deletions
|
@ -566,7 +566,7 @@ SDL_ResetKeyboard(void)
|
||||||
|
|
||||||
for (scancode = 0; scancode < SDL_NUM_SCANCODES; ++scancode) {
|
for (scancode = 0; scancode < SDL_NUM_SCANCODES; ++scancode) {
|
||||||
if (keyboard->keystate[scancode] == SDL_PRESSED) {
|
if (keyboard->keystate[scancode] == SDL_PRESSED) {
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, scancode, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_RELEASED, scancode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -627,12 +627,13 @@ SDL_SetKeyboardFocus(SDL_Window * window)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
SDL_SendKeyboardKey(Uint8 state, SDL_scancode scancode, SDL_bool repeat)
|
SDL_SendKeyboardKey(Uint8 state, SDL_scancode scancode)
|
||||||
{
|
{
|
||||||
SDL_Keyboard *keyboard = &SDL_keyboard;
|
SDL_Keyboard *keyboard = &SDL_keyboard;
|
||||||
int posted;
|
int posted;
|
||||||
Uint16 modstate;
|
Uint16 modstate;
|
||||||
Uint32 type;
|
Uint32 type;
|
||||||
|
Uint8 repeat;
|
||||||
|
|
||||||
if (!scancode) {
|
if (!scancode) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -732,6 +733,7 @@ SDL_SendKeyboardKey(Uint8 state, SDL_scancode scancode, SDL_bool repeat)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Drop events that don't change state */
|
/* Drop events that don't change state */
|
||||||
|
repeat = (state && keyboard->keystate[scancode]);
|
||||||
if (keyboard->keystate[scancode] == state && !repeat) {
|
if (keyboard->keystate[scancode] == state && !repeat) {
|
||||||
#if 0
|
#if 0
|
||||||
printf("Keyboard event didn't change state - dropped!\n");
|
printf("Keyboard event didn't change state - dropped!\n");
|
||||||
|
@ -748,7 +750,7 @@ SDL_SendKeyboardKey(Uint8 state, SDL_scancode scancode, SDL_bool repeat)
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
event.key.type = type;
|
event.key.type = type;
|
||||||
event.key.state = state;
|
event.key.state = state;
|
||||||
event.key.repeat = repeat ? 1 : 0;
|
event.key.repeat = repeat;
|
||||||
event.key.keysym.scancode = scancode;
|
event.key.keysym.scancode = scancode;
|
||||||
event.key.keysym.sym = keyboard->keymap[scancode];
|
event.key.keysym.sym = keyboard->keymap[scancode];
|
||||||
event.key.keysym.mod = modstate;
|
event.key.keysym.mod = modstate;
|
||||||
|
|
|
@ -49,7 +49,7 @@ extern void SDL_SetScancodeName(SDL_scancode scancode, const char *name);
|
||||||
extern void SDL_SetKeyboardFocus(SDL_Window * window);
|
extern void SDL_SetKeyboardFocus(SDL_Window * window);
|
||||||
|
|
||||||
/* Send a keyboard key event */
|
/* 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 */
|
/* Send keyboard text input */
|
||||||
extern int SDL_SendKeyboardText(const char *text);
|
extern int SDL_SendKeyboardText(const char *text);
|
||||||
|
|
|
@ -219,14 +219,14 @@ DoUnsidedModifiers(unsigned short scancode,
|
||||||
if (oldMask && oldMask != newMask) { /* modifier up event */
|
if (oldMask && oldMask != newMask) { /* modifier up event */
|
||||||
/* If this was Caps Lock, we need some additional voodoo to make SDL happy */
|
/* If this was Caps Lock, we need some additional voodoo to make SDL happy */
|
||||||
if (bit == NSAlphaShiftKeyMask) {
|
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 */
|
} 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 this was Caps Lock, we need some additional voodoo to make SDL happy */
|
||||||
if (bit == NSAlphaShiftKeyMask) {
|
if (bit == NSAlphaShiftKeyMask) {
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, mapping[i], SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_RELEASED, mapping[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -251,9 +251,9 @@ HandleNonDeviceModifier(unsigned int device_independent_mask,
|
||||||
newMask = newMods & device_independent_mask;
|
newMask = newMods & device_independent_mask;
|
||||||
|
|
||||||
if (oldMask && oldMask != newMask) {
|
if (oldMask && oldMask != newMask) {
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, scancode, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_RELEASED, scancode);
|
||||||
} else if (newMask && oldMask != newMask) {
|
} else if (newMask && oldMask != newMask) {
|
||||||
SDL_SendKeyboardKey(SDL_PRESSED, scancode, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_PRESSED, scancode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -278,9 +278,9 @@ HandleModifierOneSide(unsigned int oldMods, unsigned int newMods,
|
||||||
* find out which it is.
|
* find out which it is.
|
||||||
*/
|
*/
|
||||||
if (new_dep_mask && old_dep_mask != new_dep_mask) {
|
if (new_dep_mask && old_dep_mask != new_dep_mask) {
|
||||||
SDL_SendKeyboardKey(SDL_PRESSED, scancode, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_PRESSED, scancode);
|
||||||
} else {
|
} else {
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, scancode, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_RELEASED, scancode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,7 +351,7 @@ ReleaseModifierSide(unsigned int device_independent_mask,
|
||||||
/* In this case, we can't detect the keyboard, so use the left side
|
/* In this case, we can't detect the keyboard, so use the left side
|
||||||
* to represent both, and release it.
|
* to represent both, and release it.
|
||||||
*/
|
*/
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, left_scancode, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_RELEASED, left_scancode);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -362,10 +362,10 @@ ReleaseModifierSide(unsigned int device_independent_mask,
|
||||||
* so I hope this doesn't cause other problems.
|
* so I hope this doesn't cause other problems.
|
||||||
*/
|
*/
|
||||||
if ( left_device_dependent_mask & oldMods ) {
|
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 ) {
|
if ( right_device_dependent_mask & oldMods ) {
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, right_scancode, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_RELEASED, right_scancode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -382,16 +382,16 @@ HandleCapsLock(unsigned short scancode,
|
||||||
newMask = newMods & NSAlphaShiftKeyMask;
|
newMask = newMods & NSAlphaShiftKeyMask;
|
||||||
|
|
||||||
if (oldMask != newMask) {
|
if (oldMask != newMask) {
|
||||||
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_CAPSLOCK, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_CAPSLOCK);
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_CAPSLOCK, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_CAPSLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
oldMask = oldMods & NSNumericPadKeyMask;
|
oldMask = oldMods & NSNumericPadKeyMask;
|
||||||
newMask = newMods & NSNumericPadKeyMask;
|
newMask = newMods & NSNumericPadKeyMask;
|
||||||
|
|
||||||
if (oldMask != newMask) {
|
if (oldMask != newMask) {
|
||||||
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_NUMLOCKCLEAR, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_NUMLOCKCLEAR);
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_NUMLOCKCLEAR, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_NUMLOCKCLEAR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -670,7 +670,6 @@ Cocoa_HandleKeyEvent(_THIS, NSEvent *event)
|
||||||
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
|
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
|
||||||
unsigned short scancode = [event keyCode];
|
unsigned short scancode = [event keyCode];
|
||||||
SDL_scancode code;
|
SDL_scancode code;
|
||||||
SDL_bool repeat;
|
|
||||||
#if 0
|
#if 0
|
||||||
const char *text;
|
const char *text;
|
||||||
#endif
|
#endif
|
||||||
|
@ -689,13 +688,12 @@ Cocoa_HandleKeyEvent(_THIS, NSEvent *event)
|
||||||
|
|
||||||
switch ([event type]) {
|
switch ([event type]) {
|
||||||
case NSKeyDown:
|
case NSKeyDown:
|
||||||
repeat = [event isARepeat] ? SDL_TRUE : SDL_FALSE;
|
if (![event isARepeat]) {
|
||||||
if (!repeat) {
|
|
||||||
/* See if we need to rebuild the keyboard layout */
|
/* See if we need to rebuild the keyboard layout */
|
||||||
UpdateKeymap(data);
|
UpdateKeymap(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_SendKeyboardKey(SDL_PRESSED, code, repeat);
|
SDL_SendKeyboardKey(SDL_PRESSED, code);
|
||||||
#if 1
|
#if 1
|
||||||
if (code == SDL_SCANCODE_UNKNOWN) {
|
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);
|
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 @@ Cocoa_HandleKeyEvent(_THIS, NSEvent *event)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NSKeyUp:
|
case NSKeyUp:
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, code, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_RELEASED, code);
|
||||||
break;
|
break;
|
||||||
case NSFlagsChanged:
|
case NSFlagsChanged:
|
||||||
/* FIXME CW 2007-08-14: check if this whole mess that takes up half of this file is really necessary */
|
/* FIXME CW 2007-08-14: check if this whole mess that takes up half of this file is really necessary */
|
||||||
|
|
|
@ -245,8 +245,8 @@
|
||||||
|
|
||||||
if ([string length] == 0) {
|
if ([string length] == 0) {
|
||||||
/* it wants to replace text with nothing, ie a delete */
|
/* it wants to replace text with nothing, ie a delete */
|
||||||
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_DELETE, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_DELETE);
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_DELETE, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_DELETE);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* go through all the characters in the string we've been sent
|
/* go through all the characters in the string we've been sent
|
||||||
|
@ -272,14 +272,14 @@
|
||||||
|
|
||||||
if (mod & KMOD_SHIFT) {
|
if (mod & KMOD_SHIFT) {
|
||||||
/* If character uses shift, press shift down */
|
/* 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 */
|
/* send a keydown and keyup even for the character */
|
||||||
SDL_SendKeyboardKey(SDL_PRESSED, code, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_PRESSED, code);
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, code, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_RELEASED, code);
|
||||||
if (mod & KMOD_SHIFT) {
|
if (mod & KMOD_SHIFT) {
|
||||||
/* If character uses shift, press shift back up */
|
/* If character uses shift, press shift back up */
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LSHIFT, SDL_FALSE);
|
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LSHIFT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -205,14 +205,6 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
case WM_SYSKEYDOWN:
|
case WM_SYSKEYDOWN:
|
||||||
case WM_KEYDOWN:
|
case WM_KEYDOWN:
|
||||||
{
|
{
|
||||||
SDL_bool repeat;
|
|
||||||
|
|
||||||
if (lParam & REPEATED_KEYMASK) {
|
|
||||||
repeat = SDL_TRUE;
|
|
||||||
} else {
|
|
||||||
repeat = SDL_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
wParam = RemapVKEY(wParam, lParam);
|
wParam = RemapVKEY(wParam, lParam);
|
||||||
switch (wParam) {
|
switch (wParam) {
|
||||||
case VK_CONTROL:
|
case VK_CONTROL:
|
||||||
|
@ -250,8 +242,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
}
|
}
|
||||||
if (wParam < 256) {
|
if (wParam < 256) {
|
||||||
SDL_SendKeyboardKey(SDL_PRESSED,
|
SDL_SendKeyboardKey(SDL_PRESSED,
|
||||||
data->videodata->key_layout[wParam],
|
data->videodata->key_layout[wParam]);
|
||||||
repeat);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
returnCode = 0;
|
returnCode = 0;
|
||||||
|
@ -301,13 +292,11 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
&& SDL_GetKeyboardState(NULL)[SDL_SCANCODE_PRINTSCREEN] ==
|
&& SDL_GetKeyboardState(NULL)[SDL_SCANCODE_PRINTSCREEN] ==
|
||||||
SDL_RELEASED) {
|
SDL_RELEASED) {
|
||||||
SDL_SendKeyboardKey(SDL_PRESSED,
|
SDL_SendKeyboardKey(SDL_PRESSED,
|
||||||
data->videodata->key_layout[wParam],
|
data->videodata->key_layout[wParam]);
|
||||||
SDL_FALSE);
|
|
||||||
}
|
}
|
||||||
if (wParam < 256) {
|
if (wParam < 256) {
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED,
|
SDL_SendKeyboardKey(SDL_RELEASED,
|
||||||
data->videodata->key_layout[wParam],
|
data->videodata->key_layout[wParam]);
|
||||||
SDL_FALSE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
returnCode = 0;
|
returnCode = 0;
|
||||||
|
|
|
@ -36,6 +36,24 @@
|
||||||
|
|
||||||
/*#define DEBUG_XEVENTS*/
|
/*#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
|
static void
|
||||||
X11_DispatchEvent(_THIS)
|
X11_DispatchEvent(_THIS)
|
||||||
{
|
{
|
||||||
|
@ -176,14 +194,14 @@ X11_DispatchEvent(_THIS)
|
||||||
case KeyPress:{
|
case KeyPress:{
|
||||||
KeyCode keycode = xevent.xkey.keycode;
|
KeyCode keycode = xevent.xkey.keycode;
|
||||||
KeySym keysym = NoSymbol;
|
KeySym keysym = NoSymbol;
|
||||||
|
SDL_scancode scancode;
|
||||||
char text[SDL_TEXTINPUTEVENT_TEXT_SIZE];
|
char text[SDL_TEXTINPUTEVENT_TEXT_SIZE];
|
||||||
Status status = 0;
|
Status status = 0;
|
||||||
|
|
||||||
#ifdef DEBUG_XEVENTS
|
#ifdef DEBUG_XEVENTS
|
||||||
printf("KeyPress (X11 keycode = 0x%X)\n", xevent.xkey.keycode);
|
printf("KeyPress (X11 keycode = 0x%X)\n", xevent.xkey.keycode);
|
||||||
#endif
|
#endif
|
||||||
/* FIXME: How do we tell if this was a key repeat? */
|
SDL_SendKeyboardKey(SDL_PRESSED, videodata->key_layout[keycode]);
|
||||||
SDL_SendKeyboardKey(SDL_PRESSED, videodata->key_layout[keycode], SDL_FALSE);
|
|
||||||
#if 1
|
#if 1
|
||||||
if (videodata->key_layout[keycode] == SDLK_UNKNOWN) {
|
if (videodata->key_layout[keycode] == SDLK_UNKNOWN) {
|
||||||
int min_keycode, max_keycode;
|
int min_keycode, max_keycode;
|
||||||
|
@ -218,7 +236,11 @@ X11_DispatchEvent(_THIS)
|
||||||
#ifdef DEBUG_XEVENTS
|
#ifdef DEBUG_XEVENTS
|
||||||
printf("KeyRelease (X11 keycode = 0x%X)\n", xevent.xkey.keycode);
|
printf("KeyRelease (X11 keycode = 0x%X)\n", xevent.xkey.keycode);
|
||||||
#endif
|
#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;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue