Merge branch 'macos_fix_keyboard_shortcut_encoding' of https://github.com/Luflosi/kitty

This commit is contained in:
Kovid Goyal 2019-12-28 08:26:03 +05:30
commit 286f3630d7
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
6 changed files with 155 additions and 148 deletions

View File

@ -2179,8 +2179,7 @@ GLFWAPI void glfwCocoaRequestRenderFrame(GLFWwindow *w, GLFWcocoarenderframefun
requestRenderFrame((_GLFWwindow*)w, callback); requestRenderFrame((_GLFWwindow*)w, callback);
} }
GLFWAPI void glfwGetCocoaKeyEquivalent(int glfw_key, int glfw_mods, unsigned short *cocoa_key, int *cocoa_mods) { GLFWAPI void glfwGetCocoaKeyEquivalent(int glfw_key, int glfw_mods, char cocoa_key[32], int *cocoa_mods) {
*cocoa_key = 0;
*cocoa_mods = 0; *cocoa_mods = 0;
if (glfw_mods & GLFW_MOD_SHIFT) if (glfw_mods & GLFW_MOD_SHIFT)
@ -2194,148 +2193,156 @@ GLFWAPI void glfwGetCocoaKeyEquivalent(int glfw_key, int glfw_mods, unsigned sho
if (glfw_mods & GLFW_MOD_CAPS_LOCK) if (glfw_mods & GLFW_MOD_CAPS_LOCK)
*cocoa_mods |= NSEventModifierFlagCapsLock; *cocoa_mods |= NSEventModifierFlagCapsLock;
uint32_t utf_8_key = 0;
unichar utf_16_key = 0;
START_ALLOW_CASE_RANGE START_ALLOW_CASE_RANGE
switch(glfw_key) { switch(glfw_key) {
#define K(ch, name) case GLFW_KEY_##name: *cocoa_key = ch; break; #define K8(ch, name) case GLFW_KEY_##name: utf_8_key = ch; break;
K('!', EXCLAM); #define K16(ch, name) case GLFW_KEY_##name: utf_16_key = ch; break;
K('"', DOUBLE_QUOTE); K8('!', EXCLAM);
K('#', NUMBER_SIGN); K8('"', DOUBLE_QUOTE);
K('$', DOLLAR); K8('#', NUMBER_SIGN);
K('&', AMPERSAND); K8('$', DOLLAR);
K('\'', APOSTROPHE); K8('&', AMPERSAND);
K('(', PARENTHESIS_LEFT); K8('\'', APOSTROPHE);
K(')', PARENTHESIS_RIGHT); K8('(', PARENTHESIS_LEFT);
K('+', PLUS); K8(')', PARENTHESIS_RIGHT);
K(',', COMMA); K8('+', PLUS);
K('-', MINUS); K8(',', COMMA);
K('.', PERIOD); K8('-', MINUS);
K('/', SLASH); K8('.', PERIOD);
K('0', 0); K8('/', SLASH);
K('1', 1); K8('0', 0);
K('2', 2); K8('1', 1);
K('3', 3); K8('2', 2);
K('5', 5); K8('3', 3);
K('6', 6); K8('5', 5);
K('7', 7); K8('6', 6);
K('8', 8); K8('7', 7);
K('9', 9); K8('8', 8);
K(':', COLON); K8('9', 9);
K(';', SEMICOLON); K8(':', COLON);
K('<', LESS); K8(';', SEMICOLON);
K('=', EQUAL); K8('<', LESS);
K('>', GREATER); K8('=', EQUAL);
K('@', AT); K8('>', GREATER);
K('[', LEFT_BRACKET); K8('@', AT);
K('\\', BACKSLASH); K8('[', LEFT_BRACKET);
K(']', RIGHT_BRACKET); K8('\\', BACKSLASH);
K('^', CIRCUMFLEX); K8(']', RIGHT_BRACKET);
K('_', UNDERSCORE); K8('^', CIRCUMFLEX);
K('`', GRAVE_ACCENT); K8('_', UNDERSCORE);
K('a', A); K8('`', GRAVE_ACCENT);
K('b', B); K8('a', A);
K('c', C); K8('b', B);
K('d', D); K8('c', C);
K('e', E); K8('d', D);
K('f', F); K8('e', E);
K('g', G); K8('f', F);
K('h', H); K8('g', G);
K('i', I); K8('h', H);
K('j', J); K8('i', I);
K('k', K); K8('j', J);
K('l', L); K8('k', K);
K('m', M); K8('l', L);
K('n', N); K8('m', M);
K('o', O); K8('n', N);
K('p', P); K8('o', O);
K('q', Q); K8('p', P);
K('r', R); K8('q', Q);
K('s', S); K8('r', R);
K('t', T); K8('s', S);
K('u', U); K8('t', T);
K('v', V); K8('u', U);
K('w', W); K8('v', V);
K('x', X); K8('w', W);
K('y', Y); K8('x', X);
K('z', Z); K8('y', Y);
K(PARAGRAPH_UTF_8, PARAGRAPH); K8('z', Z);
K(MASCULINE_UTF_8, MASCULINE); K8(PARAGRAPH_UTF_8, PARAGRAPH);
K(S_SHARP_UTF_8, S_SHARP); K8(MASCULINE_UTF_8, MASCULINE);
K(A_GRAVE_LOWER_CASE_UTF_8, A_GRAVE); K8(S_SHARP_UTF_8, S_SHARP);
K(A_DIAERESIS_LOWER_CASE_UTF_8, A_DIAERESIS); K8(A_GRAVE_LOWER_CASE_UTF_8, A_GRAVE);
K(A_RING_LOWER_CASE_UTF_8, A_RING); K8(A_DIAERESIS_LOWER_CASE_UTF_8, A_DIAERESIS);
K(AE_LOWER_CASE_UTF_8, AE); K8(A_RING_LOWER_CASE_UTF_8, A_RING);
K(C_CEDILLA_LOWER_CASE_UTF_8, C_CEDILLA); K8(AE_LOWER_CASE_UTF_8, AE);
K(E_GRAVE_LOWER_CASE_UTF_8, E_GRAVE); K8(C_CEDILLA_LOWER_CASE_UTF_8, C_CEDILLA);
K(E_ACUTE_LOWER_CASE_UTF_8, E_ACUTE); K8(E_GRAVE_LOWER_CASE_UTF_8, E_GRAVE);
K(I_GRAVE_LOWER_CASE_UTF_8, I_GRAVE); K8(E_ACUTE_LOWER_CASE_UTF_8, E_ACUTE);
K(N_TILDE_LOWER_CASE_UTF_8, N_TILDE); K8(I_GRAVE_LOWER_CASE_UTF_8, I_GRAVE);
K(O_GRAVE_LOWER_CASE_UTF_8, O_GRAVE); K8(N_TILDE_LOWER_CASE_UTF_8, N_TILDE);
K(O_DIAERESIS_LOWER_CASE_UTF_8, O_DIAERESIS); K8(O_GRAVE_LOWER_CASE_UTF_8, O_GRAVE);
K(O_SLASH_LOWER_CASE_UTF_8, O_SLASH); K8(O_DIAERESIS_LOWER_CASE_UTF_8, O_DIAERESIS);
K(U_GRAVE_LOWER_CASE_UTF_8, U_GRAVE); K8(O_SLASH_LOWER_CASE_UTF_8, O_SLASH);
K(U_DIAERESIS_LOWER_CASE_UTF_8, U_DIAERESIS); K8(U_GRAVE_LOWER_CASE_UTF_8, U_GRAVE);
K(CYRILLIC_A_LOWER_CASE_UTF_8, CYRILLIC_A); K8(U_DIAERESIS_LOWER_CASE_UTF_8, U_DIAERESIS);
K(CYRILLIC_BE_LOWER_CASE_UTF_8, CYRILLIC_BE); K8(CYRILLIC_A_LOWER_CASE_UTF_8, CYRILLIC_A);
K(CYRILLIC_VE_LOWER_CASE_UTF_8, CYRILLIC_VE); K8(CYRILLIC_BE_LOWER_CASE_UTF_8, CYRILLIC_BE);
K(CYRILLIC_GHE_LOWER_CASE_UTF_8, CYRILLIC_GHE); K8(CYRILLIC_VE_LOWER_CASE_UTF_8, CYRILLIC_VE);
K(CYRILLIC_DE_LOWER_CASE_UTF_8, CYRILLIC_DE); K8(CYRILLIC_GHE_LOWER_CASE_UTF_8, CYRILLIC_GHE);
K(CYRILLIC_IE_LOWER_CASE_UTF_8, CYRILLIC_IE); K8(CYRILLIC_DE_LOWER_CASE_UTF_8, CYRILLIC_DE);
K(CYRILLIC_ZHE_LOWER_CASE_UTF_8, CYRILLIC_ZHE); K8(CYRILLIC_IE_LOWER_CASE_UTF_8, CYRILLIC_IE);
K(CYRILLIC_ZE_LOWER_CASE_UTF_8, CYRILLIC_ZE); K8(CYRILLIC_ZHE_LOWER_CASE_UTF_8, CYRILLIC_ZHE);
K(CYRILLIC_I_LOWER_CASE_UTF_8, CYRILLIC_I); K8(CYRILLIC_ZE_LOWER_CASE_UTF_8, CYRILLIC_ZE);
K(CYRILLIC_SHORT_I_LOWER_CASE_UTF_8, CYRILLIC_SHORT_I); K8(CYRILLIC_I_LOWER_CASE_UTF_8, CYRILLIC_I);
K(CYRILLIC_KA_LOWER_CASE_UTF_8, CYRILLIC_KA); K8(CYRILLIC_SHORT_I_LOWER_CASE_UTF_8, CYRILLIC_SHORT_I);
K(CYRILLIC_EL_LOWER_CASE_UTF_8, CYRILLIC_EL); K8(CYRILLIC_KA_LOWER_CASE_UTF_8, CYRILLIC_KA);
K(CYRILLIC_EM_LOWER_CASE_UTF_8, CYRILLIC_EM); K8(CYRILLIC_EL_LOWER_CASE_UTF_8, CYRILLIC_EL);
K(CYRILLIC_EN_LOWER_CASE_UTF_8, CYRILLIC_EN); K8(CYRILLIC_EM_LOWER_CASE_UTF_8, CYRILLIC_EM);
K(CYRILLIC_O_LOWER_CASE_UTF_8, CYRILLIC_O); K8(CYRILLIC_EN_LOWER_CASE_UTF_8, CYRILLIC_EN);
K(CYRILLIC_PE_LOWER_CASE_UTF_8, CYRILLIC_PE); K8(CYRILLIC_O_LOWER_CASE_UTF_8, CYRILLIC_O);
K(CYRILLIC_ER_LOWER_CASE_UTF_8, CYRILLIC_ER); K8(CYRILLIC_PE_LOWER_CASE_UTF_8, CYRILLIC_PE);
K(CYRILLIC_ES_LOWER_CASE_UTF_8, CYRILLIC_ES); K8(CYRILLIC_ER_LOWER_CASE_UTF_8, CYRILLIC_ER);
K(CYRILLIC_TE_LOWER_CASE_UTF_8, CYRILLIC_TE); K8(CYRILLIC_ES_LOWER_CASE_UTF_8, CYRILLIC_ES);
K(CYRILLIC_U_LOWER_CASE_UTF_8, CYRILLIC_U); K8(CYRILLIC_TE_LOWER_CASE_UTF_8, CYRILLIC_TE);
K(CYRILLIC_EF_LOWER_CASE_UTF_8, CYRILLIC_EF); K8(CYRILLIC_U_LOWER_CASE_UTF_8, CYRILLIC_U);
K(CYRILLIC_HA_LOWER_CASE_UTF_8, CYRILLIC_HA); K8(CYRILLIC_EF_LOWER_CASE_UTF_8, CYRILLIC_EF);
K(CYRILLIC_TSE_LOWER_CASE_UTF_8, CYRILLIC_TSE); K8(CYRILLIC_HA_LOWER_CASE_UTF_8, CYRILLIC_HA);
K(CYRILLIC_CHE_LOWER_CASE_UTF_8, CYRILLIC_CHE); K8(CYRILLIC_TSE_LOWER_CASE_UTF_8, CYRILLIC_TSE);
K(CYRILLIC_SHA_LOWER_CASE_UTF_8, CYRILLIC_SHA); K8(CYRILLIC_CHE_LOWER_CASE_UTF_8, CYRILLIC_CHE);
K(CYRILLIC_SHCHA_LOWER_CASE_UTF_8, CYRILLIC_SHCHA); K8(CYRILLIC_SHA_LOWER_CASE_UTF_8, CYRILLIC_SHA);
K(CYRILLIC_HARD_SIGN_LOWER_CASE_UTF_8, CYRILLIC_HARD_SIGN); K8(CYRILLIC_SHCHA_LOWER_CASE_UTF_8, CYRILLIC_SHCHA);
K(CYRILLIC_YERU_LOWER_CASE_UTF_8, CYRILLIC_YERU); K8(CYRILLIC_HARD_SIGN_LOWER_CASE_UTF_8, CYRILLIC_HARD_SIGN);
K(CYRILLIC_SOFT_SIGN_LOWER_CASE_UTF_8, CYRILLIC_SOFT_SIGN); K8(CYRILLIC_YERU_LOWER_CASE_UTF_8, CYRILLIC_YERU);
K(CYRILLIC_E_LOWER_CASE_UTF_8, CYRILLIC_E); K8(CYRILLIC_SOFT_SIGN_LOWER_CASE_UTF_8, CYRILLIC_SOFT_SIGN);
K(CYRILLIC_YU_LOWER_CASE_UTF_8, CYRILLIC_YU); K8(CYRILLIC_E_LOWER_CASE_UTF_8, CYRILLIC_E);
K(CYRILLIC_YA_LOWER_CASE_UTF_8, CYRILLIC_YA); K8(CYRILLIC_YU_LOWER_CASE_UTF_8, CYRILLIC_YU);
K(CYRILLIC_IO_LOWER_CASE_UTF_8, CYRILLIC_IO); K8(CYRILLIC_YA_LOWER_CASE_UTF_8, CYRILLIC_YA);
K8(CYRILLIC_IO_LOWER_CASE_UTF_8, CYRILLIC_IO);
K(0x35, ESCAPE); K8(0x35, ESCAPE);
K('\r', ENTER); K8('\r', ENTER);
K('\t', TAB); K8('\t', TAB);
K(NSBackspaceCharacter, BACKSPACE); K16(NSBackspaceCharacter, BACKSPACE);
K(NSInsertFunctionKey, INSERT); K16(NSInsertFunctionKey, INSERT);
K(NSDeleteCharacter, DELETE); K16(NSDeleteCharacter, DELETE);
K(NSLeftArrowFunctionKey, LEFT); K16(NSLeftArrowFunctionKey, LEFT);
K(NSRightArrowFunctionKey, RIGHT); K16(NSRightArrowFunctionKey, RIGHT);
K(NSUpArrowFunctionKey, UP); K16(NSUpArrowFunctionKey, UP);
K(NSDownArrowFunctionKey, DOWN); K16(NSDownArrowFunctionKey, DOWN);
K(NSPageUpFunctionKey, PAGE_UP); K16(NSPageUpFunctionKey, PAGE_UP);
K(NSPageDownFunctionKey, PAGE_DOWN); K16(NSPageDownFunctionKey, PAGE_DOWN);
K(NSHomeFunctionKey, HOME); K16(NSHomeFunctionKey, HOME);
K(NSEndFunctionKey, END); K16(NSEndFunctionKey, END);
K(NSPrintFunctionKey, PRINT_SCREEN); K16(NSPrintFunctionKey, PRINT_SCREEN);
case GLFW_KEY_F1 ... GLFW_KEY_F24: case GLFW_KEY_F1 ... GLFW_KEY_F24:
*cocoa_key = NSF1FunctionKey + (glfw_key - GLFW_KEY_F1); break; utf_16_key = NSF1FunctionKey + (glfw_key - GLFW_KEY_F1); break;
case GLFW_KEY_KP_0 ... GLFW_KEY_KP_9: #undef K8
*cocoa_key = NSEventModifierFlagNumericPad | (0x52 + (glfw_key - GLFW_KEY_KP_0)); break; #undef K16
K((unichar)(0x41|NSEventModifierFlagNumericPad), KP_DECIMAL);
K((unichar)(0x43|NSEventModifierFlagNumericPad), KP_MULTIPLY);
K((unichar)(0x45|NSEventModifierFlagNumericPad), KP_ADD);
K((unichar)(0x4B|NSEventModifierFlagNumericPad), KP_DIVIDE);
K((unichar)(0x4E|NSEventModifierFlagNumericPad), KP_SUBTRACT);
K((unichar)(0x51|NSEventModifierFlagNumericPad), KP_EQUAL);
#undef K
END_ALLOW_CASE_RANGE END_ALLOW_CASE_RANGE
} }
if (utf_16_key != 0) {
strncpy(cocoa_key, [[NSString stringWithCharacters:&utf_16_key length:1] UTF8String], sizeof(cocoa_key) - 1);
} else {
unsigned str_pos = 0;
for (unsigned i = 0; i < 4 && str_pos < sizeof(cocoa_key) - 1; i++) {
uint8_t byte = (utf_8_key >> 24) & 0xff;
utf_8_key <<= 8;
if (byte != 0) tmp_cocoa_key[str_pos++] = byte;
}
cocoa_key[str_pos] = 0;
}
} }

View File

@ -166,7 +166,7 @@ def generate_wrappers(glfw_header):
GLFWcocoatogglefullscreenfun glfwSetCocoaToggleFullscreenIntercept(GLFWwindow *window, GLFWcocoatogglefullscreenfun callback) GLFWcocoatogglefullscreenfun glfwSetCocoaToggleFullscreenIntercept(GLFWwindow *window, GLFWcocoatogglefullscreenfun callback)
GLFWapplicationshouldhandlereopenfun glfwSetApplicationShouldHandleReopen(GLFWapplicationshouldhandlereopenfun callback) GLFWapplicationshouldhandlereopenfun glfwSetApplicationShouldHandleReopen(GLFWapplicationshouldhandlereopenfun callback)
GLFWapplicationwillfinishlaunchingfun glfwSetApplicationWillFinishLaunching(GLFWapplicationwillfinishlaunchingfun callback) GLFWapplicationwillfinishlaunchingfun glfwSetApplicationWillFinishLaunching(GLFWapplicationwillfinishlaunchingfun callback)
void glfwGetCocoaKeyEquivalent(int glfw_key, int glfw_mods, void* cocoa_key, int* cocoa_mods) void glfwGetCocoaKeyEquivalent(int glfw_key, int glfw_mods, char cocoa_key[32], int* cocoa_mods)
void glfwCocoaRequestRenderFrame(GLFWwindow *w, GLFWcocoarenderframefun callback) void glfwCocoaRequestRenderFrame(GLFWwindow *w, GLFWcocoarenderframefun callback)
void* glfwGetX11Display(void) void* glfwGetX11Display(void)
int32_t glfwGetX11Window(GLFWwindow* window) int32_t glfwGetX11Window(GLFWwindow* window)

View File

@ -97,7 +97,7 @@ find_app_name(void) {
@end @end
static unichar new_window_key = 0; static char new_window_key[32] = {0};
static NSEventModifierFlags new_window_mods = 0; static NSEventModifierFlags new_window_mods = 0;
static PyObject* static PyObject*
@ -105,9 +105,10 @@ cocoa_set_new_window_trigger(PyObject *self UNUSED, PyObject *args) {
int mods, key; int mods, key;
if (!PyArg_ParseTuple(args, "ii", &mods, &key)) return NULL; if (!PyArg_ParseTuple(args, "ii", &mods, &key)) return NULL;
int nwm; int nwm;
get_cocoa_key_equivalent(key, mods, &new_window_key, &nwm); memset(new_window_key, 0, sizeof(new_window_key));
get_cocoa_key_equivalent(key, mods, new_window_key, &nwm);
new_window_mods = nwm; new_window_mods = nwm;
if (new_window_key) Py_RETURN_TRUE; if (new_window_key[0]) Py_RETURN_TRUE;
Py_RETURN_FALSE; Py_RETURN_FALSE;
} }
@ -252,8 +253,8 @@ cocoa_create_global_menu(void) {
NSMenuItem* preferences_menu_item = [[NSMenuItem alloc] initWithTitle:@"Preferences..." action:@selector(show_preferences:) keyEquivalent:@","], *new_os_window_menu_item = NULL; NSMenuItem* preferences_menu_item = [[NSMenuItem alloc] initWithTitle:@"Preferences..." action:@selector(show_preferences:) keyEquivalent:@","], *new_os_window_menu_item = NULL;
[preferences_menu_item setTarget:global_menu_target]; [preferences_menu_item setTarget:global_menu_target];
[appMenu addItem:preferences_menu_item]; [appMenu addItem:preferences_menu_item];
if (new_window_key) { if (new_window_key[0]) {
NSString *s = [NSString stringWithCharacters:&new_window_key length:1]; NSString *s = @(new_window_key);
new_os_window_menu_item = [[NSMenuItem alloc] initWithTitle:@"New OS window" action:@selector(new_os_window:) keyEquivalent:s]; new_os_window_menu_item = [[NSMenuItem alloc] initWithTitle:@"New OS window" action:@selector(new_os_window:) keyEquivalent:s];
[new_os_window_menu_item setKeyEquivalentModifierMask:new_window_mods]; [new_os_window_menu_item setKeyEquivalentModifierMask:new_window_mods];
[new_os_window_menu_item setTarget:global_menu_target]; [new_os_window_menu_item setTarget:global_menu_target];
@ -473,7 +474,6 @@ cleanup() {
dockMenu = nil; dockMenu = nil;
if (notification_activated_callback) Py_DECREF(notification_activated_callback); if (notification_activated_callback) Py_DECREF(notification_activated_callback);
notification_activated_callback = NULL; notification_activated_callback = NULL;
} // autoreleasepool } // autoreleasepool
} }

2
kitty/glfw-wrapper.h generated
View File

@ -2083,7 +2083,7 @@ typedef GLFWapplicationwillfinishlaunchingfun (*glfwSetApplicationWillFinishLaun
glfwSetApplicationWillFinishLaunching_func glfwSetApplicationWillFinishLaunching_impl; glfwSetApplicationWillFinishLaunching_func glfwSetApplicationWillFinishLaunching_impl;
#define glfwSetApplicationWillFinishLaunching glfwSetApplicationWillFinishLaunching_impl #define glfwSetApplicationWillFinishLaunching glfwSetApplicationWillFinishLaunching_impl
typedef void (*glfwGetCocoaKeyEquivalent_func)(int, int, void*, int*); typedef void (*glfwGetCocoaKeyEquivalent_func)(int, int, char, int*);
glfwGetCocoaKeyEquivalent_func glfwGetCocoaKeyEquivalent_impl; glfwGetCocoaKeyEquivalent_func glfwGetCocoaKeyEquivalent_impl;
#define glfwGetCocoaKeyEquivalent glfwGetCocoaKeyEquivalent_impl #define glfwGetCocoaKeyEquivalent glfwGetCocoaKeyEquivalent_impl

View File

@ -1079,7 +1079,7 @@ set_custom_cursor(PyObject *self UNUSED, PyObject *args) {
#ifdef __APPLE__ #ifdef __APPLE__
void void
get_cocoa_key_equivalent(int key, int mods, unsigned short *cocoa_key, int *cocoa_mods) { get_cocoa_key_equivalent(int key, int mods, char cocoa_key[32], int *cocoa_mods) {
glfwGetCocoaKeyEquivalent(key, mods, cocoa_key, cocoa_mods); glfwGetCocoaKeyEquivalent(key, mods, cocoa_key, cocoa_mods);
} }

View File

@ -225,7 +225,7 @@ void set_titlebar_color(OSWindow *w, color_type color);
FONTS_DATA_HANDLE load_fonts_data(double, double, double); FONTS_DATA_HANDLE load_fonts_data(double, double, double);
void send_prerendered_sprites_for_window(OSWindow *w); void send_prerendered_sprites_for_window(OSWindow *w);
#ifdef __APPLE__ #ifdef __APPLE__
void get_cocoa_key_equivalent(int, int, unsigned short*, int*); void get_cocoa_key_equivalent(int, int, char key[32], int*);
typedef enum { typedef enum {
PREFERENCES_WINDOW = 1, PREFERENCES_WINDOW = 1,
NEW_OS_WINDOW = 2, NEW_OS_WINDOW = 2,