From 432b789a0ef1b752b22fa0a1c9e638fd88a3016c Mon Sep 17 00:00:00 2001 From: kervala Date: Thu, 27 May 2010 14:32:47 +0200 Subject: [PATCH] Fixed: #941 Dead keys are not working on Linux --- .../src/3d/driver/opengl/driver_opengl.cpp | 2 +- .../3d/driver/opengl/unix_event_emitter.cpp | 41 +++++++++++++------ 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/code/nel/src/3d/driver/opengl/driver_opengl.cpp b/code/nel/src/3d/driver/opengl/driver_opengl.cpp index 063b3c7e6..5dfb25b5f 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl.cpp @@ -1127,7 +1127,7 @@ bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool re } else { - nldebug("3D: XCreateWindow() OK"); + nldebug("3D: XCreateWindow() OK"); } } else diff --git a/code/nel/src/3d/driver/opengl/unix_event_emitter.cpp b/code/nel/src/3d/driver/opengl/unix_event_emitter.cpp index ca3a07b5f..cb1db3e2a 100644 --- a/code/nel/src/3d/driver/opengl/unix_event_emitter.cpp +++ b/code/nel/src/3d/driver/opengl/unix_event_emitter.cpp @@ -382,13 +382,17 @@ void CUnixEventEmitter::processMessage (XEvent &event, CEventServer &server) } Case(KeyPress) { + // save keycode because XFilterEvent could set it to 0 uint keyCode = event.xkey.keycode; - KeySym k = XKeycodeToKeysym(_dpy, keyCode, 0); - char Text[256]; + KeySym k; + static char Text[256]; int c = 0; - // if key event is filtered, we must NOT use XLookupString - if (!XFilterEvent(&event, _win)) + // check if event is filtered + bool filtered = XFilterEvent(&event, _win); + + // if key event is filtered, we shouldn't use XLookupString to retrieve KeySym + if (!filtered) { Status status = XLookupNone; @@ -400,24 +404,37 @@ void CUnixEventEmitter::processMessage (XEvent &event, CEventServer &server) if (status == XLookupNone) c = XLookupString(&event.xkey, Text, sizeof(Text), &k, NULL); } + else + { + k = XKeycodeToKeysym(_dpy, keyCode, 0); + } - TKey key = getKeyFromKeySym(k); - if(key == KeyNOKEY) - key = getKeyFromKeycode(keyCode); + // send CEventKeyDown event only if keyCode is defined + if (keyCode) + { + TKey key = getKeyFromKeySym(k); + if(key == KeyNOKEY) + key = getKeyFromKeycode(keyCode); - server.postEvent (new CEventKeyDown (key, getKeyButton(event.xbutton.state), _PreviousKey != key, this)); - _PreviousKey = key; + server.postEvent (new CEventKeyDown (key, getKeyButton(event.xbutton.state), _PreviousKey != key, this)); + _PreviousKey = key; - // don't send a control character when deleting - if (key == KeyDELETE) - c = 0; + // don't send a control character when deleting + if (key == KeyDELETE) + c = 0; + } Text[c] = '\0'; if(c>0) { +#ifdef X_HAVE_UTF8_STRING ucstring ucstr; ucstr.fromUtf8(Text); server.postEvent (new CEventChar (ucstr[0], noKeyButton, this)); +#else + for (int i = 0; i < c; i++) + server.postEvent (new CEventChar ((ucchar)(unsigned char)Text[i], noKeyButton, this)); +#endif } break; }