[Mac] Report KeyDown/Up events for modifier flags

This commit is contained in:
thefiddler 2014-05-05 09:14:14 +02:00
parent 2e9ff4d8b9
commit 41276361fb
2 changed files with 74 additions and 4 deletions

View file

@ -411,9 +411,7 @@ namespace OpenTK.Platform.MacOS
case NSEventType.KeyDown:
{
MacOSKeyCode keyCode = (MacOSKeyCode)Cocoa.SendUshort(e, selKeyCode);
//var modifierFlags = (NSEventModifierMask)Cocoa.SendUint(e, selModifierFlags);
var isARepeat = Cocoa.SendBool(e, selIsARepeat);
//GetKey(keyCode, modifierFlags, keyArgs);
Key key = MacOSKeyMap.GetKey(keyCode);
OnKeyDown(key, isARepeat);
@ -435,13 +433,18 @@ namespace OpenTK.Platform.MacOS
case NSEventType.KeyUp:
{
MacOSKeyCode keyCode = (MacOSKeyCode)Cocoa.SendUshort(e, selKeyCode);
//var modifierFlags = (NSEventModifierMask)Cocoa.SendUint(e, selModifierFlags);
//GetKey(keyCode, modifierFlags, keyArgs);
Key key = MacOSKeyMap.GetKey(keyCode);
OnKeyUp(key);
}
break;
case NSEventType.FlagsChanged:
{
var modifierFlags = (NSEventModifierMask)Cocoa.SendUint(e, selModifierFlags);
UpdateModifierFlags(GetModifiers(modifierFlags));
}
break;
case NSEventType.MouseEntered:
{
var eventTrackingArea = Cocoa.SendIntPtr(e, selTrackingArea);

View file

@ -150,6 +150,73 @@ namespace OpenTK.Platform
KeyUp(this, e);
}
/// \internal
/// <summary>
/// Call this method to simulate KeyDown/KeyUp events
/// on platforms that do not generate key events for
/// modifier flags (e.g. Mac/Cocoa).
/// Note: this method does not distinguish between the
/// left and right variants of modifier keys.
/// </summary>
/// <param name="mods">Mods.</param>
protected void UpdateModifierFlags(KeyModifiers mods)
{
bool alt = (mods & KeyModifiers.Alt) != 0;
bool control = (mods & KeyModifiers.Control) != 0;
bool shift = (mods & KeyModifiers.Shift) != 0;
if (alt)
{
OnKeyDown(Key.AltLeft, KeyboardState[Key.AltLeft]);
OnKeyDown(Key.AltRight, KeyboardState[Key.AltLeft]);
}
else
{
if (KeyboardState[Key.AltLeft])
{
OnKeyUp(Key.AltLeft);
}
if (KeyboardState[Key.AltRight])
{
OnKeyUp(Key.AltRight);
}
}
if (control)
{
OnKeyDown(Key.ControlLeft, KeyboardState[Key.AltLeft]);
OnKeyDown(Key.ControlRight, KeyboardState[Key.AltLeft]);
}
else
{
if (KeyboardState[Key.ControlLeft])
{
OnKeyUp(Key.ControlLeft);
}
if (KeyboardState[Key.ControlRight])
{
OnKeyUp(Key.ControlRight);
}
}
if (shift)
{
OnKeyDown(Key.ShiftLeft, KeyboardState[Key.AltLeft]);
OnKeyDown(Key.ShiftRight, KeyboardState[Key.AltLeft]);
}
else
{
if (KeyboardState[Key.ShiftLeft])
{
OnKeyUp(Key.ShiftLeft);
}
if (KeyboardState[Key.ShiftRight])
{
OnKeyUp(Key.ShiftRight);
}
}
}
protected void OnMouseLeave(EventArgs e)
{
MouseLeave(this, e);