diff --git a/src/native/linux/org_lwjgl_input_Keyboard.c b/src/native/linux/org_lwjgl_input_Keyboard.c index 3de7fc1d..c4fa66af 100644 --- a/src/native/linux/org_lwjgl_input_Keyboard.c +++ b/src/native/linux/org_lwjgl_input_Keyboard.c @@ -107,6 +107,16 @@ static void closeUnicodeStructs() { } } +static void setupIMEventMask() { + long im_event_mask; + XWindowAttributes win_attributes; + + XGetWindowAttributes(getDisplay(), getCurrentWindow(), &win_attributes); + XGetICValues(xic, XNFilterEvents, &im_event_mask, NULL); + XSelectInput(getDisplay(), getCurrentWindow(), win_attributes.your_event_mask | im_event_mask); + XSetICFocus(xic); +} + JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nCreate (JNIEnv * env, jclass clazz) { @@ -149,7 +159,9 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nCreate xim = XOpenIM(getDisplay(), NULL, NULL, NULL); if (xim != NULL) { xic = XCreateIC(xim, XNClientWindow, getCurrentWindow(), XNFocusWindow, getCurrentWindow(), XNInputStyle, XIMPreeditNothing | XIMStatusNothing, NULL); - if (xic == NULL) { + if (xic != NULL) { + setupIMEventMask(); + } else { closeUnicodeStructs(); } } else @@ -190,6 +202,7 @@ static int lookupStringISO88591(XKeyEvent *event, jint *translation_buffer) { static int lookupStringUnicode(XKeyEvent *event, jint *translation_buffer) { char utf8_translation_buffer[KEYBOARD_BUFFER_SIZE]; + jchar ucs2_translation_buffer[KEYBOARD_BUFFER_SIZE]; char *utf8_buf = utf8_translation_buffer; jchar *ucs2_buf = ucs2_translation_buffer; @@ -197,11 +210,9 @@ static int lookupStringUnicode(XKeyEvent *event, jint *translation_buffer) { Status status; int i; - XSetICFocus(xic); size_t utf8_bytes = Xutf8LookupString(xic, event, utf8_translation_buffer, KEYBOARD_BUFFER_SIZE*sizeof(char), NULL, &status); if (status != XLookupChars && status != XLookupBoth) return 0; - XUnsetICFocus(xic); // reset converter iconv(iconv_descriptor, NULL, NULL, NULL, NULL); // convert from UTF-8 to UCS-2 diff --git a/src/native/linux/org_lwjgl_opengl_Display.c b/src/native/linux/org_lwjgl_opengl_Display.c index 6745c2cc..18597bd7 100644 --- a/src/native/linux/org_lwjgl_opengl_Display.c +++ b/src/native/linux/org_lwjgl_opengl_Display.c @@ -254,6 +254,8 @@ void handleMessages(void) { int revert_mode; while (XPending(getDisplay()) > 0) { XNextEvent(getDisplay(), &event); + if (XFilterEvent(&event, None) == True) + continue; switch (event.type) { case ClientMessage: if (event.xclient.message_type == warp_atom) { @@ -367,7 +369,7 @@ static bool createWindow(JNIEnv* env, int x, int y, int width, int height) { root_win = RootWindow(getDisplay(), getCurrentScreen()); cmap = XCreateColormap(getDisplay(), root_win, vis_info->visual, AllocNone); attribs.colormap = cmap; - attribs.event_mask = ExposureMask | FocusChangeMask | VisibilityChangeMask| StructureNotifyMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask; + attribs.event_mask = ExposureMask | FocusChangeMask | VisibilityChangeMask | StructureNotifyMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask; attribs.background_pixel = 0xFF000000; attribs.win_gravity = NorthWestGravity; attribmask = CWColormap | CWBackPixel | CWEventMask | CWWinGravity;