mirror of
https://github.com/kovidgoyal/kitty.git
synced 2024-11-10 13:04:03 +03:00
4232904055
The ForwardKeyEvent ibus signal is used to maintain ordering between CommitText events and non-IME key events. The ordering is important for Korean IMEs, where it automatically commits text whenever a character is fully composed. This is different from Chinese/Japanese IMEs, where user manually presses a key to commit each word. Without this patch, kitty can't handle non-IME key events when used with ibus-hangul, which utilizes ForwardKeyEvent signal. Without ForwardKeyEvent: ``` key | sequence of events from application's view r | UpdatePreeditText 'ㄱ' k | UpdatePreeditText '가' 1 | (receives the reply to ProcessKeyEvent call: "native_key: 0x31 release: 0 handled: 0") | -> UpdatePreeditText '' | -> CommitText '가' ``` Application receives "1가", which is incorrect. With ForwardKeyEvent: ``` key | sequence of events from application's view r | UpdatePreeditText 'ㄱ' k | UpdatePreeditText '가' 1 | (receives the reply to ProcessKeyEvent call: "native_key: 0x31 release: 0 handled: 1", and kitty discards the event) | -> UpdatePreeditText '' | -> CommitText '가' | -> ForwardKeyEvent keysym=0x31("1") ``` Application receives "가1", which is correct. Relevant ibus-hangul github issue to implement ForwardKeyEvent: https://github.com/libhangul/ibus-hangul/issues/42 Relevant changes in Qt to handle ForwardKeyEvent: https://codereview.qt-project.org/c/qt/qtbase/+/212179, https://codereview.qt-project.org/c/qt/qtbase/+/255587
102 lines
3.9 KiB
C
Vendored
102 lines
3.9 KiB
C
Vendored
//========================================================================
|
|
// GLFW 3.4 XKB - www.glfw.org
|
|
//------------------------------------------------------------------------
|
|
// Copyright (c) 2018 Kovid Goyal <kovid@kovidgoyal.net>
|
|
//
|
|
// This software is provided 'as-is', without any express or implied
|
|
// warranty. In no event will the authors be held liable for any damages
|
|
// arising from the use of this software.
|
|
//
|
|
// Permission is granted to anyone to use this software for any purpose,
|
|
// including commercial applications, and to alter it and redistribute it
|
|
// freely, subject to the following restrictions:
|
|
//
|
|
// 1. The origin of this software must not be misrepresented; you must not
|
|
// claim that you wrote the original software. If you use this software
|
|
// in a product, an acknowledgment in the product documentation would
|
|
// be appreciated but is not required.
|
|
//
|
|
// 2. Altered source versions must be plainly marked as such, and must not
|
|
// be misrepresented as being the original software.
|
|
//
|
|
// 3. This notice may not be removed or altered from any source
|
|
// distribution.
|
|
//
|
|
//========================================================================
|
|
|
|
#pragma once
|
|
|
|
#include <xkbcommon/xkbcommon.h>
|
|
#include <xkbcommon/xkbcommon-compose.h>
|
|
#ifdef _GLFW_X11
|
|
#include <xkbcommon/xkbcommon-x11.h>
|
|
#endif
|
|
|
|
#include "ibus_glfw.h"
|
|
|
|
typedef struct {
|
|
struct xkb_state* state;
|
|
struct xkb_state* clean_state;
|
|
struct xkb_state* default_state;
|
|
struct xkb_compose_state* composeState;
|
|
xkb_mod_mask_t activeUnknownModifiers;
|
|
unsigned int modifiers;
|
|
} XKBStateGroup;
|
|
|
|
|
|
typedef struct {
|
|
struct xkb_context* context;
|
|
struct xkb_keymap* keymap;
|
|
struct xkb_keymap* default_keymap;
|
|
XKBStateGroup states;
|
|
|
|
xkb_mod_index_t controlIdx;
|
|
xkb_mod_index_t altIdx;
|
|
xkb_mod_index_t shiftIdx;
|
|
xkb_mod_index_t superIdx;
|
|
xkb_mod_index_t hyperIdx;
|
|
xkb_mod_index_t metaIdx;
|
|
xkb_mod_index_t capsLockIdx;
|
|
xkb_mod_index_t numLockIdx;
|
|
xkb_mod_mask_t controlMask;
|
|
xkb_mod_mask_t altMask;
|
|
xkb_mod_mask_t shiftMask;
|
|
xkb_mod_mask_t superMask;
|
|
xkb_mod_mask_t hyperMask;
|
|
xkb_mod_mask_t metaMask;
|
|
xkb_mod_mask_t capsLockMask;
|
|
xkb_mod_mask_t numLockMask;
|
|
xkb_mod_index_t unknownModifiers[256];
|
|
_GLFWIBUSData ibus;
|
|
|
|
#ifdef _GLFW_X11
|
|
int32_t keyboard_device_id;
|
|
bool available;
|
|
bool detectable;
|
|
int majorOpcode;
|
|
int eventBase;
|
|
int errorBase;
|
|
int major;
|
|
int minor;
|
|
#endif
|
|
|
|
} _GLFWXKBData;
|
|
|
|
#ifdef _GLFW_X11
|
|
bool glfw_xkb_set_x11_events_mask(void);
|
|
bool glfw_xkb_update_x11_keyboard_id(_GLFWXKBData *xkb);
|
|
#endif
|
|
|
|
void glfw_xkb_release(_GLFWXKBData *xkb);
|
|
bool glfw_xkb_create_context(_GLFWXKBData *xkb);
|
|
bool glfw_xkb_compile_keymap(_GLFWXKBData *xkb, const char *map_str);
|
|
void glfw_xkb_update_modifiers(_GLFWXKBData *xkb, xkb_mod_mask_t depressed, xkb_mod_mask_t latched, xkb_mod_mask_t locked, xkb_layout_index_t base_group, xkb_layout_index_t latched_group, xkb_layout_index_t locked_group);
|
|
bool glfw_xkb_should_repeat(_GLFWXKBData *xkb, xkb_keycode_t keycode);
|
|
const char* glfw_xkb_keysym_name(xkb_keysym_t sym);
|
|
xkb_keysym_t glfw_xkb_sym_for_key(uint32_t key);
|
|
void glfw_xkb_handle_key_event(_GLFWwindow *window, _GLFWXKBData *xkb, xkb_keycode_t keycode, int action);
|
|
int glfw_xkb_keysym_from_name(const char *name, bool case_sensitive);
|
|
void glfw_xkb_update_ime_state(_GLFWwindow *w, _GLFWXKBData *xkb, const GLFWIMEUpdateEvent *ev);
|
|
void glfw_xkb_key_from_ime(_GLFWIBUSKeyEvent *ev, bool handled_by_ime, bool failed);
|
|
void glfw_xkb_forwarded_key_from_ime(xkb_keysym_t keysym, unsigned int glfw_mods);
|