Commit d81c4ce1 authored by Tim Clem's avatar Tim Clem Committed by Alexandre Julliard

winemac.drv: Detect active handwriting and panel IMEs.

Allows such IMEs that process keyboard input to do so. For instance, fixes backspace and escape for handwriting methods.
parent 7bd070ae
...@@ -92,7 +92,6 @@ enum { ...@@ -92,7 +92,6 @@ enum {
CGEventSourceKeyboardType keyboardType; CGEventSourceKeyboardType keyboardType;
NSEvent* lastFlagsChanged; NSEvent* lastFlagsChanged;
BOOL inputSourceIsInputMethod; BOOL inputSourceIsInputMethod;
BOOL inputSourceIsInputMethodValid;
uint32_t pressedKeyCodes[128 / 32]; uint32_t pressedKeyCodes[128 / 32];
CGFloat primaryScreenHeight; CGFloat primaryScreenHeight;
......
...@@ -478,8 +478,6 @@ static NSString* WineLocalizedString(unsigned int stringID) ...@@ -478,8 +478,6 @@ static NSString* WineLocalizedString(unsigned int stringID)
CFRelease(lastKeyboardLayoutInputSource); CFRelease(lastKeyboardLayoutInputSource);
lastKeyboardLayoutInputSource = inputSourceLayout; lastKeyboardLayoutInputSource = inputSourceLayout;
inputSourceIsInputMethodValid = FALSE;
if (inputSourceLayout) if (inputSourceLayout)
{ {
CFDataRef uchr; CFDataRef uchr;
...@@ -2064,24 +2062,68 @@ static NSString* WineLocalizedString(unsigned int stringID) ...@@ -2064,24 +2062,68 @@ static NSString* WineLocalizedString(unsigned int stringID)
[NSApp activate]; [NSApp activate];
} }
static BOOL InputSourceShouldBeIgnored(TISInputSourceRef inputSource)
{
/* Certain system utilities are technically input sources, but we
shouldn't consider them as such for our purposes.
Dictation is its own source too (com.apple.inputmethod.ironwood), but
it should receive keypresses; it cancels input on escape. */
static CFStringRef ignoredIDs[] = {
/* The "Emoji & Symbols" palette. */
CFSTR("com.apple.CharacterPaletteIM"),
/* The on-screen keyboard and accessibility panel. */
CFSTR("com.apple.inputmethod.AssistiveControl"),
/* The popup for accented characters when you hold down a key. */
CFSTR("com.apple.PressAndHold"),
};
CFStringRef sourceID = TISGetInputSourceProperty(inputSource, kTISPropertyInputSourceID);
for (int i = 0; i < sizeof(ignoredIDs) / sizeof(CFStringRef); i++)
{
if (CFEqual(sourceID, ignoredIDs[i]))
return YES;
}
return NO;
}
- (BOOL) inputSourceIsInputMethod - (BOOL) inputSourceIsInputMethod
{ {
if (!inputSourceIsInputMethodValid) static dispatch_once_t onceToken;
static CFDictionaryRef filterDict;
CFArrayRef enabledSources;
CFIndex i;
BOOL ret = NO;
/* There may be multiple active ("selected") input sources, but there is
always exactly one selected keyboard input source. For instance,
handwriting methods are active simultaneously with a keyboard source.
As the name implies, TISCopyCurrentKeyboardInputSource only returns
the keyboard source, so it's not sufficient for our needs. We use
TISCreateInputSourceList instead to find all selected sources. */
dispatch_once(&onceToken, ^{
filterDict = CFDictionaryCreate(NULL, (const void **)&kTISPropertyInputSourceIsSelected, (const void **)&kCFBooleanTrue, 1,
&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
});
enabledSources = TISCreateInputSourceList(filterDict, false);
for (i = 0; i < CFArrayGetCount(enabledSources); i++)
{ {
TISInputSourceRef inputSource = TISCopyCurrentKeyboardInputSource(); TISInputSourceRef source = (TISInputSourceRef)CFArrayGetValueAtIndex(enabledSources, i);
if (inputSource) CFStringRef type = TISGetInputSourceProperty(source, kTISPropertyInputSourceType);
/* kTISTypeKeyboardLayout is for physical keyboards. Any type other
than that is an IME. */
if (!CFEqual(type, kTISTypeKeyboardLayout) && !InputSourceShouldBeIgnored(source))
{ {
CFStringRef type = TISGetInputSourceProperty(inputSource, kTISPropertyInputSourceType); ret = YES;
inputSourceIsInputMethod = !CFEqual(type, kTISTypeKeyboardLayout); break;
CFRelease(inputSource);
} }
else
inputSourceIsInputMethod = FALSE;
inputSourceIsInputMethodValid = TRUE;
} }
return inputSourceIsInputMethod; CFRelease(enabledSources);
} return ret;
}
- (void) releaseMouseCapture - (void) releaseMouseCapture
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment