mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-05 00:15:32 +00:00
fix(mac): correct memory width mismatch in keyCodeForChar
This commit is contained in:
parent
82a1a0ffc7
commit
5b3aecc1f8
1 changed files with 14 additions and 9 deletions
|
|
@ -470,10 +470,9 @@ CFStringRef createStringForKey(CGKeyCode keyCode)
|
||||||
CGKeyCode keyCodeForChar(const char c)
|
CGKeyCode keyCodeForChar(const char c)
|
||||||
{
|
{
|
||||||
static CFMutableDictionaryRef charToCodeDict = NULL;
|
static CFMutableDictionaryRef charToCodeDict = NULL;
|
||||||
CGKeyCode code;
|
|
||||||
UniChar character = c;
|
UniChar character = c;
|
||||||
CFStringRef charStr = NULL;
|
CFStringRef charStr = NULL;
|
||||||
|
|
||||||
/* Generate table of keycodes and characters. */
|
/* Generate table of keycodes and characters. */
|
||||||
if (charToCodeDict == NULL) {
|
if (charToCodeDict == NULL) {
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
@ -482,7 +481,7 @@ CGKeyCode keyCodeForChar(const char c)
|
||||||
&kCFCopyStringDictionaryKeyCallBacks,
|
&kCFCopyStringDictionaryKeyCallBacks,
|
||||||
NULL);
|
NULL);
|
||||||
if (charToCodeDict == NULL) return UINT16_MAX;
|
if (charToCodeDict == NULL) return UINT16_MAX;
|
||||||
|
|
||||||
/* Loop through every keycode (0 - 127) to find its current mapping. */
|
/* Loop through every keycode (0 - 127) to find its current mapping. */
|
||||||
for (i = 0; i < 128; ++i) {
|
for (i = 0; i < 128; ++i) {
|
||||||
CFStringRef string = createStringForKey((CGKeyCode)i);
|
CFStringRef string = createStringForKey((CGKeyCode)i);
|
||||||
|
|
@ -492,15 +491,21 @@ CGKeyCode keyCodeForChar(const char c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
charStr = CFStringCreateWithCharacters(kCFAllocatorDefault, &character, 1);
|
charStr = CFStringCreateWithCharacters(kCFAllocatorDefault, &character, 1);
|
||||||
|
|
||||||
/* Our values may be NULL (0), so we need to use this function. */
|
/* Our values may be NULL (0), so we need to use this function.
|
||||||
if (!CFDictionaryGetValueIfPresent(charToCodeDict, charStr,
|
* Use a pointer-sized variable to receive the value, since CFDictionary
|
||||||
(const void **)&code)) {
|
* stores values as void pointers (64-bit on modern systems), then cast
|
||||||
|
* to CGKeyCode (uint16_t). */
|
||||||
|
const void *value = NULL;
|
||||||
|
CGKeyCode code;
|
||||||
|
if (CFDictionaryGetValueIfPresent(charToCodeDict, charStr, &value)) {
|
||||||
|
code = (CGKeyCode)(uintptr_t)value;
|
||||||
|
} else {
|
||||||
code = UINT16_MAX;
|
code = UINT16_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
CFRelease(charStr);
|
CFRelease(charStr);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue