From a40a5dc25d52163fb06e90b31db7aec8ba95a5b7 Mon Sep 17 00:00:00 2001 From: Bob Pendleton Date: Sat, 12 Jan 2008 18:07:06 +0000 Subject: [PATCH] Enabled key board auto repeat in X11_InitKeyboard.c. Had to add a couple of new Xlib symbols. --- src/video/x11/SDL_x11events.c | 51 +++++++-------------------------- src/video/x11/SDL_x11keyboard.c | 4 ++- src/video/x11/SDL_x11sym.h | 2 ++ 3 files changed, 15 insertions(+), 42 deletions(-) diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index c10ee880b..5dbd97a8e 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -29,29 +29,6 @@ #include "SDL_x11video.h" #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) { @@ -194,21 +171,18 @@ X11_DispatchEvent(_THIS) #ifdef DEBUG_XEVENTS printf("KeyPress (X11 keycode = 0x%X)\n", xevent.xkey.keycode); #endif - if (!X11_KeyRepeat(videodata->display, &xevent)) { - SDLKey physicalKey = videodata->keyCodeToSDLKTable[keycode]; - SDL_SendKeyboardKey(videodata->keyboard, SDL_PRESSED, - (Uint8) keycode, physicalKey); + 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 or to Christian Walther . X11 KeyCode is %d, X11 KeySym 0x%X.\n", - (int) keycode, - (unsigned int) XKeycodeToKeysym(videodata-> - display, keycode, - 0)); - } -#endif + 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 or to Christian Walther . X11 KeyCode is %d, X11 KeySym 0x%X.\n", + (int) keycode, + (unsigned int) XKeycodeToKeysym(videodata->display, + keycode, 0)); } +#endif } break; @@ -219,11 +193,6 @@ X11_DispatchEvent(_THIS) #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(videodata->display, &xevent)) { - break; - } - SDL_SendKeyboardKey(videodata->keyboard, SDL_RELEASED, (Uint8) keycode, videodata->keyCodeToSDLKTable[keycode]); diff --git a/src/video/x11/SDL_x11keyboard.c b/src/video/x11/SDL_x11keyboard.c index 9c4cf6eeb..d5bcd7118 100644 --- a/src/video/x11/SDL_x11keyboard.c +++ b/src/video/x11/SDL_x11keyboard.c @@ -851,6 +851,8 @@ X11_InitKeyboard(_THIS) int code; SDLKey sdlkey; + XAutoRepeatOn(data->display); + /* A random collection of KeySym/SDLKey pairs that should be valid in any keyboard layout (if this isn't the case on yours, please adjust). Using XKeysymToKeycode on these KeySyms @@ -904,7 +906,7 @@ X11_InitKeyboard(_THIS) "The key codes of your X server are unknown to SDL. Keys may not be recognized properly. To help get this fixed, report this to the SDL mailing list or to Christian Walther .\n"); #endif data->keyCodeToSDLKTable = - SDL_malloc(KeyCodeTableSize * sizeof(SDLKey)); + SDL_malloc(KeyCodeTableSize * sizeof(SDLKey)); if (data->keyCodeToSDLKTable == NULL) { SDL_OutOfMemory(); return -1; diff --git a/src/video/x11/SDL_x11sym.h b/src/video/x11/SDL_x11sym.h index d48e0b35a..5f6a49250 100644 --- a/src/video/x11/SDL_x11sym.h +++ b/src/video/x11/SDL_x11sym.h @@ -29,6 +29,8 @@ SDL_X11_SYM(Status,XAllocColorCells,(Display *a,Colormap b,Bool c,unsigned long SDL_X11_SYM(XSizeHints*,XAllocSizeHints,(void),(),return) SDL_X11_SYM(XStandardColormap *,XAllocStandardColormap,(void),(),return) SDL_X11_SYM(XWMHints*,XAllocWMHints,(void),(),return) +SDL_X11_SYM(int,XAutoRepeatOn,(Display* a),(a),return) +SDL_X11_SYM(int,XAutoRepeatOff,(Display* a),(a),return) SDL_X11_SYM(int,XChangePointerControl,(Display* a,Bool b,Bool c,int d,int e,int f),(a,b,c,d,e,f),return) SDL_X11_SYM(int,XChangeProperty,(Display* a,Window b,Atom c,Atom d,int e,int f,_Xconst unsigned char* g,int h),(a,b,c,d,e,f,g,h),return) SDL_X11_SYM(int,XChangeWindowAttributes,(Display* a,Window b,unsigned long c,XSetWindowAttributes* d),(a,b,c,d),return)