Automatically detect Xkb at run-time.

Uses XGetKeyboardMapping as a fallback.  Fixes #282.
This commit is contained in:
Andrew Corrigan 2014-04-24 01:10:58 -04:00 committed by Camilla Berglund
parent e02b278db1
commit b889aa7841
3 changed files with 139 additions and 120 deletions

View File

@ -78,6 +78,7 @@ The following dependencies are needed by the examples and test programs:
the error callback the error callback
- [Win32] Bugfix: Some keys were reported based on the current layout instead - [Win32] Bugfix: Some keys were reported based on the current layout instead
of their physical location of their physical location
- [X11] Added run-time support for systems lacking the XKB extension
- [X11] Made GLX 1.3 the minimum supported version - [X11] Made GLX 1.3 the minimum supported version
- [X11] Bugfix: The case of finding no usable CRTCs was not detected - [X11] Bugfix: The case of finding no usable CRTCs was not detected
- [X11] Bugfix: Detection of broken Nvidia RandR gamma support did not verify - [X11] Bugfix: Detection of broken Nvidia RandR gamma support did not verify

View File

@ -40,11 +40,15 @@
static int translateKey(int keyCode) static int translateKey(int keyCode)
{ {
int keySym; int keySym;
int keysyms_per_keycode_return;
KeySym *keysyms;
// Valid key code range is [8,255], according to the XLib manual // Valid key code range is [8,255], according to the XLib manual
if (keyCode < 8 || keyCode > 255) if (keyCode < 8 || keyCode > 255)
return GLFW_KEY_UNKNOWN; return GLFW_KEY_UNKNOWN;
if(_glfw.x11.xkb.available)
{
// Try secondary keysym, for numeric keypad keys // Try secondary keysym, for numeric keypad keys
// Note: This way we always force "NumLock = ON", which is intentional // Note: This way we always force "NumLock = ON", which is intentional
// since the returned key code should correspond to a physical // since the returned key code should correspond to a physical
@ -73,6 +77,18 @@ static int translateKey(int keyCode)
// should not be layout dependent (i.e. US layout and international // should not be layout dependent (i.e. US layout and international
// layouts should give the same result). // layouts should give the same result).
keySym = XkbKeycodeToKeysym(_glfw.x11.display, keyCode, 0, 0); keySym = XkbKeycodeToKeysym(_glfw.x11.display, keyCode, 0, 0);
}
else
{
keysyms =
XGetKeyboardMapping(_glfw.x11.display,
keyCode,
1,
&keysyms_per_keycode_return);
keySym = keysyms[0];
XFree(keysyms);
}
switch (keySym) switch (keySym)
{ {
case XK_Escape: return GLFW_KEY_ESCAPE; case XK_Escape: return GLFW_KEY_ESCAPE;
@ -217,7 +233,8 @@ static int translateKey(int keyCode)
// //
static void updateKeyCodeLUT(void) static void updateKeyCodeLUT(void)
{ {
int i, keyCode, keyCodeGLFW; int keyCode;
int keyCodeGLFW, i;
char name[XkbKeyNameLength + 1]; char name[XkbKeyNameLength + 1];
XkbDescPtr descr; XkbDescPtr descr;
@ -225,6 +242,8 @@ static void updateKeyCodeLUT(void)
for (keyCode = 0; keyCode < 256; keyCode++) for (keyCode = 0; keyCode < 256; keyCode++)
_glfw.x11.keyCodeLUT[keyCode] = GLFW_KEY_UNKNOWN; _glfw.x11.keyCodeLUT[keyCode] = GLFW_KEY_UNKNOWN;
if(_glfw.x11.xkb.available)
{
// Use XKB to determine physical key locations independently of the current // Use XKB to determine physical key locations independently of the current
// keyboard layout // keyboard layout
@ -303,6 +322,7 @@ static void updateKeyCodeLUT(void)
// Free the keyboard description // Free the keyboard description
XkbFreeKeyboard(descr, 0, True); XkbFreeKeyboard(descr, 0, True);
}
// Translate the un-translated key codes using traditional X11 KeySym // Translate the un-translated key codes using traditional X11 KeySym
// lookups // lookups
@ -496,30 +516,27 @@ static GLboolean initExtensions(void)
// Check if Xkb is supported on this display // Check if Xkb is supported on this display
_glfw.x11.xkb.versionMajor = 1; _glfw.x11.xkb.versionMajor = 1;
_glfw.x11.xkb.versionMinor = 0; _glfw.x11.xkb.versionMinor = 0;
if (!XkbQueryExtension(_glfw.x11.display, _glfw.x11.xkb.available =
XkbQueryExtension(_glfw.x11.display,
&_glfw.x11.xkb.majorOpcode, &_glfw.x11.xkb.majorOpcode,
&_glfw.x11.xkb.eventBase, &_glfw.x11.xkb.eventBase,
&_glfw.x11.xkb.errorBase, &_glfw.x11.xkb.errorBase,
&_glfw.x11.xkb.versionMajor, &_glfw.x11.xkb.versionMajor,
&_glfw.x11.xkb.versionMinor)) &_glfw.x11.xkb.versionMinor);
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"X11: The keyboard extension is not available");
return GL_FALSE;
}
if(_glfw.x11.xkb.available)
{
if (!XkbSetDetectableAutoRepeat(_glfw.x11.display, True, &supported)) if (!XkbSetDetectableAutoRepeat(_glfw.x11.display, True, &supported))
{ {
_glfwInputError(GLFW_PLATFORM_ERROR, // X11: Failed to set detectable key repeat
"X11: Failed to set detectable key repeat"); _glfw.x11.xkb.available = GL_FALSE;
return GL_FALSE;
} }
if (!supported) if (!supported)
{ {
_glfwInputError(GLFW_PLATFORM_ERROR, // X11: Detectable key repeat is not supported
"X11: Detectable key repeat is not supported"); _glfw.x11.xkb.available = GL_FALSE;
return GL_FALSE; }
} }
// Update the key code LUT // Update the key code LUT

View File

@ -175,6 +175,7 @@ typedef struct _GLFWlibraryX11
} randr; } randr;
struct { struct {
GLboolean available;
int majorOpcode; int majorOpcode;
int eventBase; int eventBase;
int errorBase; int errorBase;