aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2023-01-14 20:28:06 +0100
committerSven Gothel <[email protected]>2023-01-14 20:28:06 +0100
commit8a2938cd36fd695dec0804997319f799ba4e4929 (patch)
tree33c417feaa4384618ddce888b6d23f5ad862cca4
parent4b944d5ae8cd0040ee43fcdefa92bfe06c56518b (diff)
MacOS: NEWT: Remove keySymbol mapping using 'HIToolbox' TSMGetInputSourceProperty(), crashing on MacOS >= 13
Perhaps we want a replacement? Fallback code uses keyCode, i.e. dropping the current keyboard layout (-> US).
-rw-r--r--src/newt/native/MacNewtNSWindow.m61
1 files changed, 53 insertions, 8 deletions
diff --git a/src/newt/native/MacNewtNSWindow.m b/src/newt/native/MacNewtNSWindow.m
index eef3278b9..6ae36af9c 100644
--- a/src/newt/native/MacNewtNSWindow.m
+++ b/src/newt/native/MacNewtNSWindow.m
@@ -110,6 +110,12 @@ static jint mods2JavaMods(NSUInteger mods)
return javaMods;
}
+#if 0
+
+//
+// Disabled due to crash on MacOS >= 13, see CKCH_CreateDictionaries() below
+//
+
static CFStringRef CKCH_CreateStringForKey(CGKeyCode keyCode, const UCKeyboardLayout *keyboardLayout) {
UInt32 keysDown = 0;
UniChar chars[4];
@@ -123,12 +129,14 @@ static CFStringRef CKCH_CreateStringForKey(CGKeyCode keyCode, const UCKeyboardLa
return CFStringCreateWithCharacters(kCFAllocatorDefault, chars, 1);
}
-static CFMutableDictionaryRef CKCH_CreateCodeToCharDict(TISInputSourceRef keyboard) {
- CFDataRef layoutData = (CFDataRef) TISGetInputSourceProperty(keyboard, kTISPropertyUnicodeKeyLayoutData);
+static CFMutableDictionaryRef CKCH_CreateCodeToCharDict(CFDataRef layoutData) {
if( NULL == layoutData ) {
return NULL;
}
const UCKeyboardLayout *keyboardLayout = (const UCKeyboardLayout *)CFDataGetBytePtr(layoutData);
+ if( NULL == keyboardLayout ) {
+ return NULL;
+ }
CFMutableDictionaryRef codeToCharDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 128, NULL, NULL);
if ( NULL != codeToCharDict ) {
@@ -152,10 +160,41 @@ static CFMutableDictionaryRef CKCH_CreateCodeToCharDict(TISInputSourceRef keyboa
static CFMutableDictionaryRef CKCH_USCodeToNNChar = NULL;
static void CKCH_CreateDictionaries() {
- TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource();
- if( NULL != currentKeyboard ) {
- CKCH_USCodeToNNChar = CKCH_CreateCodeToCharDict(currentKeyboard);
- CFRelease(currentKeyboard);
+ bool done = false;
+ TISInputSourceRef inputSource;
+ inputSource = TISCopyCurrentKeyboardInputSource();
+ if( NULL != inputSource ) {
+ /**
+ * Crash on MacOS >= 13
+ *
+ * thread #3, stop reason = ESR_EC_BRK_AARCH64 (fault address: 0x1f287d300)
+ * frame #0: 0x0000000196e7c924 libdispatch.dylib`_dispatch_assert_queue_fail + 120
+ * frame #1: 0x0000000196e7c8ac libdispatch.dylib`dispatch_assert_queue + 196
+ * frame #2: 0x00000001a07b66a4 HIToolbox`islGetInputSourceListWithAdditions + 160
+ * frame #3: 0x00000001a07b8ccc HIToolbox`isValidateInputSourceRef + 92
+ * frame #4: 0x00000001a07b8b8c HIToolbox`TSMGetInputSourceProperty + 44
+ * frame #5: 0x000000012c961890 libnewt_head.dylib`CKCH_CreateDictionaries at MacNewtNSWindow.m:166:48
+ * frame #6: 0x000000012c95f68c libnewt_head.dylib`+[NewtNSWindow initNatives:forClass:](self=0x000000012c96d600, _cmd="initNatives:forClass:", env=0x000000014b80e2a8
+ */
+ CFDataRef layoutData = (CFDataRef) TISGetInputSourceProperty(inputSource, kTISPropertyUnicodeKeyLayoutData);
+ if( NULL != layoutData ) {
+ CKCH_USCodeToNNChar = CKCH_CreateCodeToCharDict(layoutData);
+ done = true;
+ }
+ CFRelease(inputSource);
+ }
+ if( !done ) {
+ // TISGetInputSourceProperty returns null with Japanese keyboard layout.
+ // Using TISCopyCurrentKeyboardLayoutInputSource to fix NULL return.
+ inputSource = TISCopyCurrentKeyboardLayoutInputSource();
+ if( NULL != inputSource ) {
+ CFDataRef layoutData = (CFDataRef) TISGetInputSourceProperty(inputSource, kTISPropertyUnicodeKeyLayoutData);
+ if( NULL != layoutData ) {
+ CKCH_USCodeToNNChar = CKCH_CreateCodeToCharDict(layoutData);
+ done = true;
+ }
+ CFRelease(inputSource);
+ }
}
}
@@ -174,6 +213,8 @@ static UniChar CKCH_CharForKeyCode(jshort keyCode) {
return rChar;
}
+#endif
+
static jmethodID enqueueMouseEventID = NULL;
static jmethodID enqueueKeyEventID = NULL;
static jmethodID requestFocusID = NULL;
@@ -761,7 +802,9 @@ static jmethodID windowRepaintID = NULL;
for (i = 0; i < len; i++) {
// Note: the key code in the NSEvent does not map to anything we can use
UniChar keyChar = (UniChar) [chars characterAtIndex: i];
- UniChar keySymChar = CKCH_CharForKeyCode(keyCode);
+ // Disabled due to crash on MacOS >= 13, see CKCH_CreateDictionaries() below
+ // UniChar keySymChar = CKCH_CharForKeyCode(keyCode);
+ UniChar keySymChar = 0;
DBG_PRINT("sendKeyEvent: %d/%d code 0x%X, char 0x%X, mods 0x%X/0x%X -> keySymChar 0x%X\n", i, len, (int)keyCode, (int)keyChar,
(int)mods, (int)javaMods, (int)keySymChar);
@@ -848,7 +891,9 @@ NS_ENDHANDLER
insetsChangedID && sizeScreenPosInsetsChangedID &&
screenPositionChangedID && focusChangedID && windowDestroyNotifyID && requestFocusID && windowRepaintID)
{
- CKCH_CreateDictionaries();
+ //
+ // Disabled due to crash on MacOS >= 13, see CKCH_CreateDictionaries() below
+ // CKCH_CreateDictionaries();
return YES;
}
return NO;