22#include < cstring>
33
44static struct {
5- uint32_t osxKeycode;
5+ uint16_t osxKeycode;
66 fcitx::KeySym sym;
77} sym_mappings[] = {
88 // modifiers
@@ -197,7 +197,7 @@ static struct {
197197};
198198
199199static struct {
200- uint32_t osxKeycode;
200+ uint16_t osxKeycode;
201201 char asciiChar;
202202 char shiftedAsciiChar;
203203} char_mappings[] = {
@@ -255,6 +255,32 @@ static struct {
255255 {OSX_VK_SLASH, ' /' , ' ?' },
256256};
257257
258+ static struct {
259+ fcitx::KeySym sym;
260+ uint16_t osxFunctionKey;
261+ } function_key_mappings[] = {
262+ {FcitxKey_Up, NSUpArrowFunctionKey},
263+ {FcitxKey_Down, NSDownArrowFunctionKey},
264+ {FcitxKey_Left, NSLeftArrowFunctionKey},
265+ {FcitxKey_Right,NSRightArrowFunctionKey},
266+ {FcitxKey_F1, NSF1FunctionKey},
267+ {FcitxKey_F2, NSF2FunctionKey},
268+ {FcitxKey_F3, NSF3FunctionKey},
269+ {FcitxKey_F4, NSF4FunctionKey},
270+ {FcitxKey_F5, NSF5FunctionKey},
271+ {FcitxKey_F6, NSF6FunctionKey},
272+ {FcitxKey_F7, NSF7FunctionKey},
273+ {FcitxKey_F8, NSF8FunctionKey},
274+ {FcitxKey_F9, NSF9FunctionKey},
275+ {FcitxKey_F10, NSF10FunctionKey},
276+ {FcitxKey_F11, NSF11FunctionKey},
277+ {FcitxKey_F12, NSF12FunctionKey},
278+ {FcitxKey_Home, NSHomeFunctionKey},
279+ {FcitxKey_End, NSEndFunctionKey},
280+ {FcitxKey_Page_Up, NSPageUpFunctionKey},
281+ {FcitxKey_Page_Down, NSPageDownFunctionKey},
282+ };
283+
258284static struct {
259285 uint32_t osxModifier;
260286 fcitx::KeyState fcitxModifier;
@@ -328,21 +354,6 @@ std::string fcitx_keysym_to_osx_keysym(fcitx::KeySym keySym) {
328354 if (fcitx::Key{keySym}.isKeyPad ()) {
329355 return " " ;
330356 }
331- // TODO: VSCode Run has many functional key shortcuts, so we can copy
332- // implementation from electron.
333- switch (keySym) {
334- // Hack for arrow
335- case FcitxKey_Left:
336- return " \u{1c}" ;
337- case FcitxKey_Right:
338- return " \u{1d}" ;
339- case FcitxKey_Up:
340- return " \u{1e}" ;
341- case FcitxKey_Down:
342- return " \u{1f}" ;
343- default :
344- break ;
345- }
346357 // keySymToString returns grave for `, which will be used as G by macOS.
347358 auto sym = fcitx::Key::keySymToUTF8 (keySym);
348359 // Normalized fcitx key like Control+D will show and be counted as
@@ -353,6 +364,15 @@ std::string fcitx_keysym_to_osx_keysym(fcitx::KeySym keySym) {
353364 return sym;
354365}
355366
367+ uint16_t fcitx_keysym_to_osx_function_key (fcitx::KeySym keySym) {
368+ for (const auto &pair : function_key_mappings) {
369+ if (pair.sym == keySym) {
370+ return pair.osxFunctionKey ;
371+ }
372+ }
373+ return 0 ;
374+ }
375+
356376uint32_t fcitx_keystates_to_osx_modifiers (fcitx::KeyStates ks) {
357377 uint32_t ret{};
358378 for (const auto &pair : modifier_mappings) {
0 commit comments