mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-30 05:31:39 +00:00
winemac.drv: Use UCCompareText in char_matches_string.
This commit is contained in:
parent
5a97ad97dc
commit
c9d9ff6129
|
@ -398,18 +398,18 @@ static const struct {
|
|||
{ VK_VOLUME_UP | 0x100, "Volume Up" },
|
||||
};
|
||||
|
||||
static BOOL char_matches_string(WCHAR wchar, UniChar *string, BOOL ignore_diacritics)
|
||||
static Boolean char_matches_string(WCHAR wchar, UniChar *string, CollatorRef collatorRef)
|
||||
{
|
||||
BOOL ret;
|
||||
CFStringRef s1 = CFStringCreateWithCharactersNoCopy(NULL, (UniChar*)&wchar, 1, kCFAllocatorNull);
|
||||
CFStringRef s2 = CFStringCreateWithCharactersNoCopy(NULL, string, wcslen(string), kCFAllocatorNull);
|
||||
CFStringCompareFlags flags = kCFCompareCaseInsensitive | kCFCompareNonliteral | kCFCompareWidthInsensitive;
|
||||
if (ignore_diacritics)
|
||||
flags |= kCFCompareDiacriticInsensitive;
|
||||
ret = (CFStringCompare(s1, s2, flags) == kCFCompareEqualTo);
|
||||
CFRelease(s1);
|
||||
CFRelease(s2);
|
||||
return ret;
|
||||
Boolean equivalent;
|
||||
OSStatus status;
|
||||
|
||||
status = UCCompareText(collatorRef, (UniChar*)&wchar, 1, string, wcslen(string), &equivalent, NULL);
|
||||
if (status != noErr)
|
||||
{
|
||||
WARN("Failed to compare %s to %s\n", debugstr_wn(&wchar, 1), debugstr_w(string));
|
||||
return FALSE;
|
||||
}
|
||||
return equivalent;
|
||||
}
|
||||
|
||||
|
||||
|
@ -657,6 +657,9 @@ void macdrv_compute_keyboard_layout(struct macdrv_thread_data *thread_data)
|
|||
int keyc;
|
||||
WCHAR vkey;
|
||||
const UCKeyboardLayout *uchr;
|
||||
LocaleRef localeRef;
|
||||
CollatorRef collatorRef, caseInsensitiveCollatorRef, diacriticInsensitiveCollatorRef;
|
||||
UCCollateOptions collateOptions = 0;
|
||||
const UInt32 modifier_combos[] = {
|
||||
0,
|
||||
shiftKey >> 8,
|
||||
|
@ -778,6 +781,13 @@ void macdrv_compute_keyboard_layout(struct macdrv_thread_data *thread_data)
|
|||
|
||||
uchr = (const UCKeyboardLayout*)CFDataGetBytePtr(thread_data->keyboard_layout_uchr);
|
||||
|
||||
LocaleRefFromLocaleString("POSIX", &localeRef);
|
||||
UCCreateCollator(localeRef, 0, collateOptions, &collatorRef);
|
||||
collateOptions |= kUCCollateComposeInsensitiveMask | kUCCollateWidthInsensitiveMask | kUCCollateCaseInsensitiveMask;
|
||||
UCCreateCollator(localeRef, 0, collateOptions, &caseInsensitiveCollatorRef);
|
||||
collateOptions |= kUCCollateDiacritInsensitiveMask;
|
||||
UCCreateCollator(localeRef, 0, collateOptions, &diacriticInsensitiveCollatorRef);
|
||||
|
||||
/* Using the keyboard layout, build a map of key code + modifiers -> characters. */
|
||||
memset(map, 0, sizeof(map));
|
||||
for (keyc = 0; keyc < ARRAY_SIZE(map); keyc++)
|
||||
|
@ -824,7 +834,7 @@ void macdrv_compute_keyboard_layout(struct macdrv_thread_data *thread_data)
|
|||
if (thread_data->keyc2vkey[keyc] || !map[keyc][combo][0])
|
||||
continue;
|
||||
|
||||
if (char_matches_string(vkey, map[keyc][combo], ignore_diacritics))
|
||||
if (char_matches_string(vkey, map[keyc][combo], ignore_diacritics ? diacriticInsensitiveCollatorRef : caseInsensitiveCollatorRef))
|
||||
{
|
||||
thread_data->keyc2vkey[keyc] = vkey;
|
||||
vkey_used[vkey] = 1;
|
||||
|
@ -850,7 +860,7 @@ void macdrv_compute_keyboard_layout(struct macdrv_thread_data *thread_data)
|
|||
if (thread_data->keyc2vkey[keyc] || !map[keyc][combo][0])
|
||||
continue;
|
||||
|
||||
if (char_matches_string(vkey, map[keyc][combo], FALSE))
|
||||
if (char_matches_string(vkey, map[keyc][combo], collatorRef))
|
||||
{
|
||||
thread_data->keyc2vkey[keyc] = vkey;
|
||||
vkey_used[vkey] = 1;
|
||||
|
@ -879,7 +889,7 @@ void macdrv_compute_keyboard_layout(struct macdrv_thread_data *thread_data)
|
|||
if (thread_data->keyc2vkey[keyc] || !map[keyc][combo][0])
|
||||
continue;
|
||||
|
||||
if (char_matches_string(symbol_vkeys[i].wchar, map[keyc][combo], FALSE))
|
||||
if (char_matches_string(symbol_vkeys[i].wchar, map[keyc][combo], collatorRef))
|
||||
{
|
||||
thread_data->keyc2vkey[keyc] = vkey;
|
||||
vkey_used[vkey] = 1;
|
||||
|
@ -982,6 +992,10 @@ void macdrv_compute_keyboard_layout(struct macdrv_thread_data *thread_data)
|
|||
vkey_used[vkey] = 1;
|
||||
TRACE("keyc 0x%04x -> vkey 0x%04x (spare vkey)\n", keyc, vkey);
|
||||
}
|
||||
|
||||
UCDisposeCollator(&collatorRef);
|
||||
UCDisposeCollator(&caseInsensitiveCollatorRef);
|
||||
UCDisposeCollator(&diacriticInsensitiveCollatorRef);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue