Bug 753256 Use [NSEvent modifierFlags] or convert the result of GetCurrentKeyModifiers() to cocoa flags at getting current modifier state r=smichaud

This commit is contained in:
Masayuki Nakano 2012-05-16 09:28:48 +09:00
Родитель f036a5ce86
Коммит 7c56539c8f
3 изменённых файлов: 46 добавлений и 1 удалений

Просмотреть файл

@ -174,6 +174,7 @@ extern "C" long TSMProcessRawKeyEvent(EventRef carbonEvent);
MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6
@interface NSEvent (SnowLeopardEventFeatures)
+ (NSUInteger)pressedMouseButtons;
+ (NSUInteger)modifierFlags;
@end
#endif

Просмотреть файл

@ -220,6 +220,11 @@ class nsCocoaUtils
NSEvent* aNativeEvent);
static void InitInputEvent(nsInputEvent &aInputEvent,
NSUInteger aModifiers);
/**
* GetCurrentModifiers() returns Cocoa modifier flags for current state.
*/
static NSUInteger GetCurrentModifiers();
};
#endif // nsCocoaUtils_h_

Просмотреть файл

@ -426,7 +426,7 @@ nsCocoaUtils::InitInputEvent(nsInputEvent &aInputEvent,
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
NSUInteger modifiers =
aNativeEvent ? [aNativeEvent modifierFlags] : ::GetCurrentKeyModifiers();
aNativeEvent ? [aNativeEvent modifierFlags] : GetCurrentModifiers();
InitInputEvent(aInputEvent, modifiers);
aInputEvent.time = PR_IntervalNow();
@ -477,3 +477,42 @@ nsCocoaUtils::InitInputEvent(nsInputEvent &aInputEvent,
// not by the flag.
}
// static
NSUInteger
nsCocoaUtils::GetCurrentModifiers()
{
// NOTE: [[NSApp currentEvent] modifiers] isn't useful because it sometime 0
// and we cannot check if it's actual state.
if (nsToolkit::OnSnowLeopardOrLater()) {
// XXX [NSEvent modifierFlags] returns "current" modifier state, so,
// it's not event-queue-synchronized. GetCurrentEventKeyModifiers()
// might be better, but it's Carbon API, we shouldn't use it as far as
// possible.
return [NSEvent modifierFlags];
}
// If [NSEvent modifierFlags] isn't available, use carbon API.
// GetCurrentEventKeyModifiers() might be better?
// It's event-queue-synchronized.
UInt32 carbonModifiers = ::GetCurrentKeyModifiers();
NSUInteger cocoaModifiers = 0;
if (carbonModifiers & alphaLock) {
cocoaModifiers |= NSAlphaShiftKeyMask;
}
if (carbonModifiers & (controlKey | rightControlKey)) {
cocoaModifiers |= NSControlKeyMask;
}
if (carbonModifiers & (optionKey | rightOptionKey)) {
cocoaModifiers |= NSAlternateKeyMask;
}
if (carbonModifiers & (shiftKey | rightShiftKey)) {
cocoaModifiers |= NSShiftKeyMask;
}
if (carbonModifiers & cmdKey) {
cocoaModifiers |= NSCommandKeyMask;
}
return cocoaModifiers;
}