Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Enabled key board auto repeat in X11_InitKeyboard.c. Had to add a cou…
Browse files Browse the repository at this point in the history
…ple of new Xlib symbols.
  • Loading branch information
pendletonrc committed Jan 12, 2008
1 parent b2beddf commit a40a5dc
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 42 deletions.
51 changes: 10 additions & 41 deletions src/video/x11/SDL_x11events.c
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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 <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));
}
#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 <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));
}
#endif
}
break;

Expand All @@ -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]);
Expand Down
4 changes: 3 additions & 1 deletion src/video/x11/SDL_x11keyboard.c
Expand Up @@ -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
Expand Down Expand Up @@ -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 <sdl@libsdl.org> or to Christian Walther <cwalther@gmx.ch>.\n");
#endif
data->keyCodeToSDLKTable =
SDL_malloc(KeyCodeTableSize * sizeof(SDLKey));
SDL_malloc(KeyCodeTableSize * sizeof(SDLKey));
if (data->keyCodeToSDLKTable == NULL) {
SDL_OutOfMemory();
return -1;
Expand Down
2 changes: 2 additions & 0 deletions src/video/x11/SDL_x11sym.h
Expand Up @@ -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)
Expand Down

0 comments on commit a40a5dc

Please sign in to comment.