diff --git a/page/Fcitx5.d.ts b/page/Fcitx5.d.ts index 264a21d..475b652 100644 --- a/page/Fcitx5.d.ts +++ b/page/Fcitx5.d.ts @@ -28,6 +28,7 @@ export interface FCITX { updateStatusArea: () => void getConfig: (uri: string) => Config setConfig: (uri: string, json: object) => void + jsKeyToFcitxString: (event: KeyboardEvent) => string } export const fcitxReady: Promise diff --git a/page/index.ts b/page/index.ts index fa15d80..ddc95c4 100644 --- a/page/index.ts +++ b/page/index.ts @@ -1,6 +1,6 @@ import Module from './module' import { blur, clickPanel, focus } from './focus' -import { keyEvent } from './keycode' +import { jsKeyToFcitxString, keyEvent } from './keycode' import { commit, hidePanel, placePanel, setPreedit } from './client' import { currentInputMethod, getAllInputMethods, getInputMethods, setCurrentInputMethod, setInputMethods } from './input-method' import { getConfig, setConfig } from './config' @@ -43,6 +43,7 @@ window.fcitx = { getAllInputMethods, getConfig, setConfig, + jsKeyToFcitxString, enable() { document.addEventListener('focus', focus, true) document.addEventListener('blur', blur, true) diff --git a/page/keycode.ts b/page/keycode.ts index 8b316d7..866529a 100644 --- a/page/keycode.ts +++ b/page/keycode.ts @@ -1,19 +1,35 @@ import Module from './module' import { getInputElement } from './focus' -export function keyEvent(event: KeyboardEvent) { - if (!getInputElement()) { - return - } - const isRelease = event.type === 'keyup' +function extract(event: KeyboardEvent): [string, string, number] | undefined { const { key, code, shiftKey, altKey, ctrlKey, metaKey } = event // Host IME if (key === 'Process') { - return + return undefined } const capsLock = event.getModifierState('CapsLock') const modifiers = Number(shiftKey) | Number(capsLock) << 1 | Number(ctrlKey) << 2 | Number(altKey) << 3 | Number(metaKey) << 6 - if (Module.ccall('process_key', 'bool', ['string', 'string', 'number', 'bool'], [key, code, modifiers, isRelease])) { + return [key, code, modifiers] +} + +export function keyEvent(event: KeyboardEvent) { + if (!getInputElement()) { + return + } + const extracted = extract(event) + if (!extracted) { + return + } + const isRelease = event.type === 'keyup' + if (Module.ccall('process_key', 'bool', ['string', 'string', 'number', 'bool'], [...extracted, isRelease])) { event.preventDefault() } } + +export function jsKeyToFcitxString(event: KeyboardEvent) { + const extracted = extract(event) + if (!extracted) { + return '' + } + return Module.ccall('js_key_to_fcitx_string', 'string', ['string', 'string', 'number'], extracted) +} diff --git a/src/keycode.cpp b/src/keycode.cpp index 3695934..a7f987c 100644 --- a/src/keycode.cpp +++ b/src/keycode.cpp @@ -1,4 +1,5 @@ #include "keycode.h" +#include #include namespace fcitx { @@ -224,4 +225,13 @@ Key js_key_to_fcitx_key(const std::string &key, const std::string &code, return Key{js_key_to_fcitx_keysym(key, code), KeyStates{modifiers}, js_keycode_to_fcitx_keycode(code)}; } + +extern "C" { +EMSCRIPTEN_KEEPALIVE const char * +js_key_to_fcitx_string(const char *key, const char *code, uint32_t modifiers) { + static std::string ret; + ret = js_key_to_fcitx_key(key, code, modifiers).normalize().toString(); + return ret.c_str(); +} +} } // namespace fcitx