summaryrefslogtreecommitdiffstats
path: root/osdep
diff options
context:
space:
mode:
authorder richter <der.richter@gmx.de>2024-04-21 17:02:36 +0200
committerder richter <der.richter@gmx.de>2024-04-24 20:35:53 +0200
commit2e03e0305caf851e305a7d73af1efe4a4fdf693a (patch)
treed20d93beeb565ed8df364bca281d075c39400b80 /osdep
parentf7a32b5f29c062cf2d3210eb769f9843d5364331 (diff)
downloadmpv-2e03e0305caf851e305a7d73af1efe4a4fdf693a.tar.bz2
mpv-2e03e0305caf851e305a7d73af1efe4a4fdf693a.tar.xz
mac/input: add support for dead key reporting
dead keys like tilde and accents were not reported because they returned an empty string from the NSEvent. try to retrieve dead key with alternative Carbon API when an empty key is reported.
Diffstat (limited to 'osdep')
-rw-r--r--osdep/mac/input_helper.swift21
1 files changed, 20 insertions, 1 deletions
diff --git a/osdep/mac/input_helper.swift b/osdep/mac/input_helper.swift
index 0e4ec1f55c..e5268ade4c 100644
--- a/osdep/mac/input_helper.swift
+++ b/osdep/mac/input_helper.swift
@@ -107,7 +107,9 @@ class InputHelper: NSObject {
}
guard let chars = event.characters, let charsNoMod = event.charactersIgnoringModifiers else { return false }
- let key = (useAltGr() && event.modifierFlags.contains(.optionRight)) ? chars : charsNoMod
+ var key = (useAltGr() && event.modifierFlags.contains(.optionRight)) ? chars : charsNoMod
+ if key.isEmpty { key = mapDeadKey(event) }
+ if key.isEmpty { return false }
key.withCString {
var bstr = bstr0($0)
putKey(bstr_decode_utf8(bstr, &bstr), modifiers: event.modifierFlags, type: event.type)
@@ -230,6 +232,23 @@ class InputHelper: NSObject {
return Int32(buttonMapping[button] ?? SWIFT_MBTN9 + Int32(button - 5));
}
+ func mapDeadKey(_ event: NSEvent) -> String {
+ let keyboard = TISCopyCurrentKeyboardInputSource().takeRetainedValue()
+ let layoutPtr = TISGetInputSourceProperty(keyboard, kTISPropertyUnicodeKeyLayoutData)
+ let layoutData = unsafeBitCast(layoutPtr, to: CFData.self)
+ let layout = unsafeBitCast(CFDataGetBytePtr(layoutData), to: UnsafePointer<UCKeyboardLayout>.self)
+ let maxLength = 2
+ let modifiers: UInt32 = UInt32(event.modifierFlags.rawValue >> 16) & 0xff
+ var deadKeyState: UInt32 = 0
+ var length = 0
+ var chars = [UniChar](repeating: 0, count: maxLength)
+ let err = UCKeyTranslate(layout, event.keyCode, UInt16(kUCKeyActionDisplay), modifiers,
+ UInt32(LMGetKbdType()), 0, &deadKeyState, maxLength, &length, &chars)
+
+ if err != noErr || length < 1 { return "" }
+ return String(utf16CodeUnits: chars, count: length)
+ }
+
@objc func open(files: [String], append: Bool = false) {
lock.withLock {
guard let input = input else { return }