From 6e9aecdff3984767eaa8865d21922897be242b43 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 12 Jul 2018 09:25:51 +0530 Subject: [PATCH] Fix Shift key not working with IBUS Fixes #721 --- glfw/ibus_glfw.c | 2 +- glfw/ibus_glfw.h | 4 ++-- glfw/xkb_glfw.c | 6 +++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/glfw/ibus_glfw.c b/glfw/ibus_glfw.c index bde51cb00..474f24aa8 100644 --- a/glfw/ibus_glfw.c +++ b/glfw/ibus_glfw.c @@ -414,7 +414,7 @@ ibus_process_key(const KeyEvent *ev_, _GLFWIBUSData *ibus) { if (!glfw_dbus_call_method_with_reply( ibus->conn, IBUS_SERVICE, ibus->input_ctx_path, IBUS_INPUT_INTERFACE, "ProcessKeyEvent", key_event_processed, ev, - DBUS_TYPE_UINT32, &ev->keysym, DBUS_TYPE_UINT32, &ev->keycode, DBUS_TYPE_UINT32, + DBUS_TYPE_UINT32, &ev->ibus_sym, DBUS_TYPE_UINT32, &ev->ibus_keycode, DBUS_TYPE_UINT32, &state, DBUS_TYPE_INVALID)) { free(ev); return GLFW_FALSE; diff --git a/glfw/ibus_glfw.h b/glfw/ibus_glfw.h index 7557f7bc3..e184e8f0d 100644 --- a/glfw/ibus_glfw.h +++ b/glfw/ibus_glfw.h @@ -38,8 +38,8 @@ typedef struct { } _GLFWIBUSData; typedef struct { - xkb_keycode_t keycode; - xkb_keysym_t keysym; + xkb_keycode_t keycode, ibus_keycode; + xkb_keysym_t keysym, ibus_sym; unsigned int glfw_modifiers; int action; GLFWid window_id; diff --git a/glfw/xkb_glfw.c b/glfw/xkb_glfw.c index 667e55aa9..77624b136 100644 --- a/glfw/xkb_glfw.c +++ b/glfw/xkb_glfw.c @@ -436,8 +436,11 @@ glfw_xkb_handle_key_event(_GLFWwindow *window, _GLFWXKBData *xkb, xkb_keycode_t const xkb_keysym_t *syms, *clean_syms, *default_syms; xkb_keysym_t glfw_sym; xkb_keycode_t code_for_sym = scancode; + key_event.ibus_keycode = scancode; #ifdef _GLFW_WAYLAND code_for_sym += 8; +#else + key_event.ibus_keycode -= 8; #endif debug("scancode: 0x%x release: %d ", scancode, action == GLFW_RELEASE); XKBStateGroup *sg = &xkb->states; @@ -495,8 +498,9 @@ glfw_xkb_handle_key_event(_GLFWwindow *window, _GLFWXKBData *xkb, xkb_keycode_t key_event.action = action; key_event.glfw_modifiers = sg->modifiers; key_event.keycode = scancode; key_event.keysym = glfw_sym; key_event.window_id = window->id; key_event.glfw_keycode = glfw_keycode; + key_event.ibus_sym = syms[0]; if (ibus_process_key(&key_event, &xkb->ibus)) { - debug("↳ to IBUS\n"); + debug("↳ to IBUS: keycode: 0x%x keysym: 0x%x (%s) %s\n", key_event.ibus_keycode, key_event.ibus_sym, glfw_xkb_keysym_name(key_event.ibus_sym), format_mods(key_event.glfw_modifiers)); } else { _glfwInputKeyboard(window, glfw_keycode, glfw_sym, action, sg->modifiers, key_event.text, 0); }