mirror of
https://github.com/Ryujinx/Opentk.git
synced 2025-08-04 07:31:12 +00:00
[Platform] Refactored INativeWindow backends
All INativeWindow implementations are now derived from NativeWindowBase. They no longer implement legacy IInputDriver themselves, but rather rely on LegacyInputDriver provided by NativeWindowBase for compatibility. They also implement the new Mouse* events.
This commit is contained in:
parent
674cd54c29
commit
3e33ac9280
|
@ -197,7 +197,7 @@ namespace OpenTK.Input
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
internal void SetKey(Key key, uint scancode, bool state)
|
internal void SetKey(Key key, uint scancode, KeyModifiers mods, bool state)
|
||||||
{
|
{
|
||||||
if (keys[(int)key] != state || KeyRepeat)
|
if (keys[(int)key] != state || KeyRepeat)
|
||||||
{
|
{
|
||||||
|
@ -211,14 +211,14 @@ namespace OpenTK.Input
|
||||||
{
|
{
|
||||||
args.Key = key;
|
args.Key = key;
|
||||||
args.ScanCode = scancode;
|
args.ScanCode = scancode;
|
||||||
args.Modifiers = GetModifiers();
|
args.Modifiers = mods;
|
||||||
KeyDown(this, args);
|
KeyDown(this, args);
|
||||||
}
|
}
|
||||||
else if (!state && KeyUp != null)
|
else if (!state && KeyUp != null)
|
||||||
{
|
{
|
||||||
args.Key = key;
|
args.Key = key;
|
||||||
args.ScanCode = scancode;
|
args.ScanCode = scancode;
|
||||||
args.Modifiers = GetModifiers();
|
args.Modifiers = mods;
|
||||||
KeyUp(this, args);
|
KeyUp(this, args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -379,7 +379,7 @@ namespace OpenTK.Input
|
||||||
#region Fields
|
#region Fields
|
||||||
|
|
||||||
int x, y;
|
int x, y;
|
||||||
float wheel_x, wheel_y;
|
int buttons;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -412,12 +412,35 @@ namespace OpenTK.Input
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
internal MouseEventArgs(float x, float y, float wx, float wy)
|
#endregion
|
||||||
|
|
||||||
|
#region Protected Members
|
||||||
|
|
||||||
|
protected internal void SetButton(MouseButton button, ButtonState state)
|
||||||
{
|
{
|
||||||
X = (int)Math.Round(x);
|
if (button < 0 || button > MouseButton.LastButton)
|
||||||
Y = (int)Math.Round(y);
|
throw new ArgumentOutOfRangeException();
|
||||||
WheelX = wx;
|
|
||||||
WheelY = wy;
|
switch (state)
|
||||||
|
{
|
||||||
|
case ButtonState.Pressed:
|
||||||
|
buttons |= 1 << (int)button;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ButtonState.Released:
|
||||||
|
buttons &= ~(1 << (int)button);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected internal ButtonState GetButton(MouseButton button)
|
||||||
|
{
|
||||||
|
if (button < 0 || button > MouseButton.LastButton)
|
||||||
|
throw new ArgumentOutOfRangeException();
|
||||||
|
|
||||||
|
return
|
||||||
|
(buttons & (1 << (int)button)) != 0 ?
|
||||||
|
ButtonState.Pressed : ButtonState.Released;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -449,37 +472,65 @@ namespace OpenTK.Input
|
||||||
/// This is an alias to <see cref="MouseEventArgs.WheelY"/>
|
/// This is an alias to <see cref="MouseEventArgs.WheelY"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The wheel.</value>
|
/// <value>The wheel.</value>
|
||||||
public float Wheel { get { return WheelY; } }
|
public float Wheel { get { return WheelY; } internal set { WheelY = value; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the <see cref="ButtonState"/> of the left mouse button.
|
/// Gets the <see cref="ButtonState"/> of the left mouse button.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ButtonState LeftButton { get; internal set; }
|
public ButtonState LeftButton
|
||||||
|
{
|
||||||
|
get { return GetButton(MouseButton.Left); }
|
||||||
|
internal set { SetButton(MouseButton.Left, value); }
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the <see cref="ButtonState"/> of the right mouse button.
|
/// Gets the <see cref="ButtonState"/> of the right mouse button.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ButtonState RightButton { get; internal set; }
|
public ButtonState RightButton
|
||||||
|
{
|
||||||
|
get { return GetButton(MouseButton.Right); }
|
||||||
|
internal set { SetButton(MouseButton.Right, value); }
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the <see cref="ButtonState"/> of the middle mouse button.
|
/// Gets the <see cref="ButtonState"/> of the middle mouse button.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ButtonState MiddleButton { get; internal set; }
|
public ButtonState MiddleButton
|
||||||
|
{
|
||||||
|
get { return GetButton(MouseButton.Middle); }
|
||||||
|
internal set { SetButton(MouseButton.Middle, value); }
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the <see cref="ButtonState"/> of the first extra mouse button.
|
/// Gets the <see cref="ButtonState"/> of the first extra mouse button.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ButtonState X1Button { get; internal set; }
|
public ButtonState X1Button
|
||||||
|
{
|
||||||
|
get { return GetButton(MouseButton.Button1); }
|
||||||
|
internal set { SetButton(MouseButton.Button1, value); }
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the <see cref="ButtonState"/> of the second extra mouse button.
|
/// Gets the <see cref="ButtonState"/> of the second extra mouse button.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ButtonState X2Button { get; internal set; }
|
public ButtonState X2Button
|
||||||
|
{
|
||||||
|
get { return GetButton(MouseButton.Button2); }
|
||||||
|
internal set { SetButton(MouseButton.Button2, value); }
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a System.Drawing.Points representing the location of the mouse for the event.
|
/// Gets a <see cref="System.Drawing.Point"/> representing the location of the mouse for the event.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Point Position { get { return new Point(x, y); } }
|
public Point Position
|
||||||
|
{
|
||||||
|
get { return new Point(x, y); }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
X = value.X;
|
||||||
|
Y = value.Y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
@ -603,14 +654,18 @@ namespace OpenTK.Input
|
||||||
#region Public Members
|
#region Public Members
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The mouse button for the event.
|
/// Gets the <see cref="MouseButton"/> that triggered this event.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public MouseButton Button { get { return button; } internal set { button = value; } }
|
public MouseButton Button { get { return button; } internal set { button = value; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a System.Boolean representing the state of the mouse button for the event.
|
/// Gets a System.Boolean representing the state of the mouse button for the event.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsPressed { get { return pressed; } internal set { pressed = value; } }
|
public bool IsPressed
|
||||||
|
{
|
||||||
|
get { return GetButton(Button) == ButtonState.Pressed; }
|
||||||
|
internal set { SetButton(Button, value ? ButtonState.Pressed : ButtonState.Released); }
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
@ -629,7 +684,6 @@ namespace OpenTK.Input
|
||||||
{
|
{
|
||||||
#region Fields
|
#region Fields
|
||||||
|
|
||||||
float value;
|
|
||||||
float delta;
|
float delta;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -651,7 +705,7 @@ namespace OpenTK.Input
|
||||||
public MouseWheelEventArgs(int x, int y, int value, int delta)
|
public MouseWheelEventArgs(int x, int y, int value, int delta)
|
||||||
: base(x, y)
|
: base(x, y)
|
||||||
{
|
{
|
||||||
this.value = value;
|
WheelY = value;
|
||||||
this.delta = delta;
|
this.delta = delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -672,7 +726,7 @@ namespace OpenTK.Input
|
||||||
/// Gets the value of the wheel in integer units.
|
/// Gets the value of the wheel in integer units.
|
||||||
/// To support high-precision mice, it is recommended to use <see cref="ValuePrecise"/> instead.
|
/// To support high-precision mice, it is recommended to use <see cref="ValuePrecise"/> instead.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int Value { get { return (int)Math.Round(value, MidpointRounding.AwayFromZero); } }
|
public int Value { get { return (int)Math.Round(WheelY, MidpointRounding.AwayFromZero); } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the change in value of the wheel for this event in integer units.
|
/// Gets the change in value of the wheel for this event in integer units.
|
||||||
|
@ -683,7 +737,7 @@ namespace OpenTK.Input
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the precise value of the wheel in floating-point units.
|
/// Gets the precise value of the wheel in floating-point units.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public float ValuePrecise { get { return value; } internal set { this.value = value; } }
|
public float ValuePrecise { get { return WheelY; } internal set { WheelY = value; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the precise change in value of the wheel for this event in floating-point units.
|
/// Gets the precise change in value of the wheel for this event in floating-point units.
|
||||||
|
|
|
@ -42,18 +42,63 @@ namespace OpenTK.Platform
|
||||||
|
|
||||||
readonly LegacyJoystickDriver JoystickDriver = new LegacyJoystickDriver();
|
readonly LegacyJoystickDriver JoystickDriver = new LegacyJoystickDriver();
|
||||||
|
|
||||||
internal LegacyInputDriver()
|
internal LegacyInputDriver(INativeWindow window)
|
||||||
{
|
{
|
||||||
dummy_mice_list.Add(new MouseDevice());
|
if (window == null)
|
||||||
Mouse[0].Description = "Standard Mouse";
|
throw new ArgumentNullException();
|
||||||
Mouse[0].NumberOfButtons = 3;
|
|
||||||
Mouse[0].NumberOfWheels = 1;
|
|
||||||
|
|
||||||
dummy_keyboard_list.Add(new KeyboardDevice());
|
var mouse = new MouseDevice();
|
||||||
Keyboard[0].Description = "Standard Keyboard";
|
mouse.Description = "Standard Mouse";
|
||||||
Keyboard[0].NumberOfKeys = 101;
|
mouse.NumberOfButtons = 3;
|
||||||
Keyboard[0].NumberOfLeds = 3;
|
mouse.NumberOfWheels = 1;
|
||||||
Keyboard[0].NumberOfFunctionKeys = 12;
|
dummy_mice_list.Add(mouse);
|
||||||
|
|
||||||
|
var keyboard = new KeyboardDevice();
|
||||||
|
keyboard.Description = "Standard Keyboard";
|
||||||
|
keyboard.NumberOfKeys = 101;
|
||||||
|
keyboard.NumberOfLeds = 3;
|
||||||
|
keyboard.NumberOfFunctionKeys = 12;
|
||||||
|
dummy_keyboard_list.Add(keyboard);
|
||||||
|
|
||||||
|
// Hook mouse events
|
||||||
|
window.MouseDown += (sender, e) =>
|
||||||
|
{
|
||||||
|
mouse[e.Button] = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
window.MouseUp += (sender, e) =>
|
||||||
|
{
|
||||||
|
mouse[e.Button] = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
window.MouseMove += (sender, e) =>
|
||||||
|
{
|
||||||
|
mouse.Position = e.Position;
|
||||||
|
};
|
||||||
|
|
||||||
|
window.MouseWheel += (sender, e) =>
|
||||||
|
{
|
||||||
|
mouse.WheelPrecise = e.WheelY;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Hook keyboard events
|
||||||
|
window.KeyDown += (sender, e) =>
|
||||||
|
{
|
||||||
|
keyboard.SetKey(e.Key, e.ScanCode, e.Modifiers, true);
|
||||||
|
};
|
||||||
|
|
||||||
|
window.KeyUp += (sender, e) =>
|
||||||
|
{
|
||||||
|
keyboard.SetKey(e.Key, e.ScanCode, e.Modifiers, false);
|
||||||
|
};
|
||||||
|
|
||||||
|
window.FocusedChanged += (sender, e) =>
|
||||||
|
{
|
||||||
|
if (!window.Focused)
|
||||||
|
{
|
||||||
|
keyboard.ClearKeys();
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#region IInputDriver Members
|
#region IInputDriver Members
|
||||||
|
|
|
@ -422,7 +422,6 @@ namespace OpenTK.Platform.MacOS
|
||||||
var modifierFlags = (NSEventModifierMask)Cocoa.SendUint(e, selModifierFlags);
|
var modifierFlags = (NSEventModifierMask)Cocoa.SendUint(e, selModifierFlags);
|
||||||
var isARepeat = Cocoa.SendBool(e, selIsARepeat);
|
var isARepeat = Cocoa.SendBool(e, selIsARepeat);
|
||||||
GetKey(keyCode, modifierFlags, keyArgs);
|
GetKey(keyCode, modifierFlags, keyArgs);
|
||||||
InputDriver.Keyboard[0].SetKey(keyArgs.Key, keyArgs.ScanCode, true);
|
|
||||||
|
|
||||||
if (!isARepeat || InputDriver.Keyboard[0].KeyRepeat)
|
if (!isARepeat || InputDriver.Keyboard[0].KeyRepeat)
|
||||||
{
|
{
|
||||||
|
@ -450,8 +449,6 @@ namespace OpenTK.Platform.MacOS
|
||||||
var modifierFlags = (NSEventModifierMask)Cocoa.SendUint(e, selModifierFlags);
|
var modifierFlags = (NSEventModifierMask)Cocoa.SendUint(e, selModifierFlags);
|
||||||
|
|
||||||
GetKey(keyCode, modifierFlags, keyArgs);
|
GetKey(keyCode, modifierFlags, keyArgs);
|
||||||
InputDriver.Keyboard[0].SetKey(keyArgs.Key, keyArgs.ScanCode, false);
|
|
||||||
|
|
||||||
OnKeyUp(keyArgs);
|
OnKeyUp(keyArgs);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -38,8 +38,21 @@ namespace OpenTK.Platform
|
||||||
// Common base class for all INativeWindow implementations
|
// Common base class for all INativeWindow implementations
|
||||||
abstract class NativeWindowBase : INativeWindow
|
abstract class NativeWindowBase : INativeWindow
|
||||||
{
|
{
|
||||||
readonly LegacyInputDriver LegacyInputDriver =
|
readonly LegacyInputDriver LegacyInputDriver;
|
||||||
new LegacyInputDriver();
|
|
||||||
|
readonly protected MouseButtonEventArgs MouseDownArgs = new MouseButtonEventArgs();
|
||||||
|
readonly protected MouseButtonEventArgs MouseUpArgs = new MouseButtonEventArgs();
|
||||||
|
readonly protected MouseMoveEventArgs MouseMoveArgs = new MouseMoveEventArgs();
|
||||||
|
readonly protected MouseWheelEventArgs MouseWheelArgs = new MouseWheelEventArgs();
|
||||||
|
|
||||||
|
readonly protected KeyboardKeyEventArgs KeyDownArgs = new KeyboardKeyEventArgs();
|
||||||
|
readonly protected KeyboardKeyEventArgs KeyUpArgs = new KeyboardKeyEventArgs();
|
||||||
|
readonly protected KeyPressEventArgs KeyPressArgs = new KeyPressEventArgs((char)0);
|
||||||
|
|
||||||
|
internal NativeWindowBase()
|
||||||
|
{
|
||||||
|
LegacyInputDriver = new LegacyInputDriver(this);
|
||||||
|
}
|
||||||
|
|
||||||
#region Protected Members
|
#region Protected Members
|
||||||
|
|
||||||
|
@ -133,7 +146,7 @@ namespace OpenTK.Platform
|
||||||
MouseUp(this, e);
|
MouseUp(this, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void OnMouseDown(MouseMoveEventArgs e)
|
protected void OnMouseMove(MouseMoveEventArgs e)
|
||||||
{
|
{
|
||||||
MouseMove(this, e);
|
MouseMove(this, e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,7 @@ namespace OpenTK.Platform.SDL2
|
||||||
|
|
||||||
public override INativeWindow CreateNativeWindow(int x, int y, int width, int height, string title, GraphicsMode mode, GameWindowFlags options, DisplayDevice device)
|
public override INativeWindow CreateNativeWindow(int x, int y, int width, int height, string title, GraphicsMode mode, GameWindowFlags options, DisplayDevice device)
|
||||||
{
|
{
|
||||||
return new Sdl2NativeWindow(x, y, width, height, title, options, device, InputDriver);
|
return new Sdl2NativeWindow(x, y, width, height, title, options, device);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IDisplayDeviceDriver CreateDisplayDeviceDriver()
|
public override IDisplayDeviceDriver CreateDisplayDeviceDriver()
|
||||||
|
|
|
@ -34,7 +34,7 @@ using OpenTK.Input;
|
||||||
|
|
||||||
namespace OpenTK.Platform.SDL2
|
namespace OpenTK.Platform.SDL2
|
||||||
{
|
{
|
||||||
class Sdl2InputDriver : IInputDriver2, IInputDriver
|
class Sdl2InputDriver : IInputDriver2
|
||||||
{
|
{
|
||||||
readonly static Dictionary<IntPtr, Sdl2InputDriver> DriverHandles =
|
readonly static Dictionary<IntPtr, Sdl2InputDriver> DriverHandles =
|
||||||
new Dictionary<IntPtr, Sdl2InputDriver>();
|
new Dictionary<IntPtr, Sdl2InputDriver>();
|
||||||
|
@ -154,51 +154,6 @@ namespace OpenTK.Platform.SDL2
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region IInputDriver Members
|
|
||||||
|
|
||||||
public void Poll()
|
|
||||||
{
|
|
||||||
joystick_driver.Poll();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IJoystickDriver Members
|
|
||||||
|
|
||||||
public IList<JoystickDevice> Joysticks
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return joystick_driver.Joysticks;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IMouseDriver Members
|
|
||||||
|
|
||||||
public IList<MouseDevice> Mouse
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return mouse_driver.Mouse;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IKeyboardDriver Members
|
|
||||||
|
|
||||||
public IList<KeyboardDevice> Keyboard
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return keyboard_driver.Keyboard;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IInputDriver2 Members
|
#region IInputDriver2 Members
|
||||||
|
|
||||||
public IMouseDriver2 MouseDriver
|
public IMouseDriver2 MouseDriver
|
||||||
|
|
|
@ -298,6 +298,15 @@ namespace OpenTK.Platform.SDL2
|
||||||
return Key.Unknown;
|
return Key.Unknown;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static KeyModifiers GetModifiers(Keymod mod)
|
||||||
|
{
|
||||||
|
KeyModifiers result = 0;
|
||||||
|
result |= (mod & Keymod.ALT) != 0 ? KeyModifiers.Alt : 0;
|
||||||
|
result |= (mod & Keymod.CTRL) != 0 ? KeyModifiers.Control : 0;
|
||||||
|
result |= (mod & Keymod.SHIFT) != 0 ? KeyModifiers.Shift : 0;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ using OpenTK.Input;
|
||||||
|
|
||||||
namespace OpenTK.Platform.SDL2
|
namespace OpenTK.Platform.SDL2
|
||||||
{
|
{
|
||||||
class Sdl2Keyboard : IKeyboardDriver2, IKeyboardDriver
|
class Sdl2Keyboard : IKeyboardDriver2
|
||||||
{
|
{
|
||||||
KeyboardState state;
|
KeyboardState state;
|
||||||
|
|
||||||
|
@ -42,13 +42,6 @@ namespace OpenTK.Platform.SDL2
|
||||||
public Sdl2Keyboard()
|
public Sdl2Keyboard()
|
||||||
{
|
{
|
||||||
state.IsConnected = true;
|
state.IsConnected = true;
|
||||||
|
|
||||||
keyboards.Add(new KeyboardDevice());
|
|
||||||
keyboards[0].Description = "Standard keyboard";
|
|
||||||
keyboards[0].NumberOfFunctionKeys = 12;
|
|
||||||
keyboards[0].NumberOfKeys = 101;
|
|
||||||
keyboards[0].NumberOfLeds = 3;
|
|
||||||
keyboards_readonly = keyboards.AsReadOnly();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Private Members
|
#region Private Members
|
||||||
|
@ -86,22 +79,11 @@ namespace OpenTK.Platform.SDL2
|
||||||
bool pressed = e.State != 0;
|
bool pressed = e.State != 0;
|
||||||
var scancode = e.Keysym.Scancode;
|
var scancode = e.Keysym.Scancode;
|
||||||
Key key = Sdl2KeyMap.GetKey(scancode);
|
Key key = Sdl2KeyMap.GetKey(scancode);
|
||||||
|
KeyModifiers mods = Sdl2KeyMap.GetModifiers(e.Keysym.Mod);
|
||||||
|
|
||||||
if (key != Key.Unknown)
|
if (key != Key.Unknown)
|
||||||
{
|
{
|
||||||
state.SetKeyState(key, (byte)scancode, pressed);
|
state.SetKeyState(key, (byte)scancode, pressed);
|
||||||
keyboards[0].SetKey(key, (byte)scancode, pressed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IKeyboardDriver Members
|
|
||||||
|
|
||||||
public IList<KeyboardDevice> Keyboard
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return keyboards_readonly;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ using System.Text;
|
||||||
|
|
||||||
namespace OpenTK.Platform.SDL2
|
namespace OpenTK.Platform.SDL2
|
||||||
{
|
{
|
||||||
class Sdl2NativeWindow : NativeWindowBase, IInputDriver
|
class Sdl2NativeWindow : NativeWindowBase
|
||||||
{
|
{
|
||||||
readonly object sync = new object();
|
readonly object sync = new object();
|
||||||
|
|
||||||
|
@ -72,19 +72,14 @@ namespace OpenTK.Platform.SDL2
|
||||||
// Argument for KeyDown and KeyUp events (allocated once to avoid runtime allocations)
|
// Argument for KeyDown and KeyUp events (allocated once to avoid runtime allocations)
|
||||||
readonly KeyboardKeyEventArgs key_args = new KeyboardKeyEventArgs();
|
readonly KeyboardKeyEventArgs key_args = new KeyboardKeyEventArgs();
|
||||||
|
|
||||||
readonly IInputDriver input_driver;
|
|
||||||
|
|
||||||
static readonly Dictionary<uint, Sdl2NativeWindow> windows =
|
static readonly Dictionary<uint, Sdl2NativeWindow> windows =
|
||||||
new Dictionary<uint, Sdl2NativeWindow>();
|
new Dictionary<uint, Sdl2NativeWindow>();
|
||||||
|
|
||||||
public Sdl2NativeWindow(int x, int y, int width, int height,
|
public Sdl2NativeWindow(int x, int y, int width, int height,
|
||||||
string title, GameWindowFlags options, DisplayDevice device,
|
string title, GameWindowFlags options, DisplayDevice device)
|
||||||
IInputDriver input_driver)
|
|
||||||
{
|
{
|
||||||
lock (sync)
|
lock (sync)
|
||||||
{
|
{
|
||||||
this.input_driver = input_driver;
|
|
||||||
|
|
||||||
var bounds = device.Bounds;
|
var bounds = device.Bounds;
|
||||||
var flags = TranslateFlags(options);
|
var flags = TranslateFlags(options);
|
||||||
flags |= WindowFlags.OPENGL;
|
flags |= WindowFlags.OPENGL;
|
||||||
|
@ -233,7 +228,7 @@ namespace OpenTK.Platform.SDL2
|
||||||
var key = ev.Key.Keysym;
|
var key = ev.Key.Keysym;
|
||||||
window.key_args.Key = TranslateKey(key.Scancode);
|
window.key_args.Key = TranslateKey(key.Scancode);
|
||||||
window.key_args.ScanCode = (uint)key.Scancode;
|
window.key_args.ScanCode = (uint)key.Scancode;
|
||||||
window.key_args.Modifiers = window.input_driver.Keyboard[0].GetModifiers();
|
window.key_args.Modifiers = Sdl2KeyMap.GetModifiers(key.Mod);
|
||||||
if (key_pressed)
|
if (key_pressed)
|
||||||
{
|
{
|
||||||
window.OnKeyDown(window.key_args);
|
window.OnKeyDown(window.key_args);
|
||||||
|
@ -890,14 +885,6 @@ namespace OpenTK.Platform.SDL2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IInputDriver InputDriver
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return input_driver;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool CursorVisible
|
public override bool CursorVisible
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
@ -919,51 +906,6 @@ namespace OpenTK.Platform.SDL2
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region IInputDriver Members
|
|
||||||
|
|
||||||
public void Poll()
|
|
||||||
{
|
|
||||||
InputDriver.Poll();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IJoystickDriver Members
|
|
||||||
|
|
||||||
public IList<JoystickDevice> Joysticks
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return InputDriver.Joysticks;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IMouseDriver Members
|
|
||||||
|
|
||||||
public IList<MouseDevice> Mouse
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return InputDriver.Mouse;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IKeyboardDriver Members
|
|
||||||
|
|
||||||
public IList<KeyboardDevice> Keyboard
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return InputDriver.Keyboard;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IDisposable implementation
|
#region IDisposable implementation
|
||||||
|
|
||||||
protected override void Dispose(bool manual)
|
protected override void Dispose(bool manual)
|
||||||
|
|
|
@ -44,7 +44,7 @@ namespace OpenTK.Platform.Windows
|
||||||
/// Drives GameWindow on Windows.
|
/// Drives GameWindow on Windows.
|
||||||
/// This class supports OpenTK, and is not intended for use by OpenTK programs.
|
/// This class supports OpenTK, and is not intended for use by OpenTK programs.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal sealed class WinGLNative : NativeWindowBase, IInputDriver
|
internal sealed class WinGLNative : NativeWindowBase
|
||||||
{
|
{
|
||||||
#region Fields
|
#region Fields
|
||||||
|
|
||||||
|
@ -82,12 +82,6 @@ namespace OpenTK.Platform.Windows
|
||||||
|
|
||||||
const ClassStyle DefaultClassStyle = ClassStyle.OwnDC;
|
const ClassStyle DefaultClassStyle = ClassStyle.OwnDC;
|
||||||
|
|
||||||
// Used for IInputDriver implementation
|
|
||||||
IJoystickDriver joystick_driver = Factory.Default.CreateLegacyJoystickDriver();
|
|
||||||
KeyboardDevice keyboard = new KeyboardDevice();
|
|
||||||
MouseDevice mouse = new MouseDevice();
|
|
||||||
IList<KeyboardDevice> keyboards = new List<KeyboardDevice>(1);
|
|
||||||
IList<MouseDevice> mice = new List<MouseDevice>(1);
|
|
||||||
const long ExtendedBit = 1 << 24; // Used to distinguish left and right control, alt and enter keys.
|
const long ExtendedBit = 1 << 24; // Used to distinguish left and right control, alt and enter keys.
|
||||||
|
|
||||||
public static readonly uint ShiftLeftScanCode = Functions.MapVirtualKey(VirtualKeys.LSHIFT, 0);
|
public static readonly uint ShiftLeftScanCode = Functions.MapVirtualKey(VirtualKeys.LSHIFT, 0);
|
||||||
|
@ -97,10 +91,6 @@ namespace OpenTK.Platform.Windows
|
||||||
public static readonly uint AltLeftScanCode = Functions.MapVirtualKey(VirtualKeys.LMENU, 0);
|
public static readonly uint AltLeftScanCode = Functions.MapVirtualKey(VirtualKeys.LMENU, 0);
|
||||||
public static readonly uint AltRightScanCode = Functions.MapVirtualKey(VirtualKeys.RMENU, 0);
|
public static readonly uint AltRightScanCode = Functions.MapVirtualKey(VirtualKeys.RMENU, 0);
|
||||||
|
|
||||||
KeyboardKeyEventArgs key_down = new KeyboardKeyEventArgs();
|
|
||||||
KeyboardKeyEventArgs key_up = new KeyboardKeyEventArgs();
|
|
||||||
KeyPressEventArgs key_press = new KeyPressEventArgs((char)0);
|
|
||||||
|
|
||||||
MouseCursor cursor = MouseCursor.Default;
|
MouseCursor cursor = MouseCursor.Default;
|
||||||
IntPtr cursor_handle = Functions.LoadCursor(CursorName.Arrow);
|
IntPtr cursor_handle = Functions.LoadCursor(CursorName.Arrow);
|
||||||
int cursor_visible_count = 0;
|
int cursor_visible_count = 0;
|
||||||
|
@ -160,18 +150,6 @@ namespace OpenTK.Platform.Windows
|
||||||
window);
|
window);
|
||||||
|
|
||||||
exists = true;
|
exists = true;
|
||||||
|
|
||||||
keyboard.Description = "Standard Windows keyboard";
|
|
||||||
keyboard.NumberOfFunctionKeys = 12;
|
|
||||||
keyboard.NumberOfKeys = 101;
|
|
||||||
keyboard.NumberOfLeds = 3;
|
|
||||||
|
|
||||||
mouse.Description = "Standard Windows mouse";
|
|
||||||
mouse.NumberOfButtons = 3;
|
|
||||||
mouse.NumberOfWheels = 1;
|
|
||||||
|
|
||||||
keyboards.Add(keyboard);
|
|
||||||
mice.Add(mouse);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,7 +232,7 @@ namespace OpenTK.Platform.Windows
|
||||||
focused = (wParam.ToInt64() & 0xFFFF) != 0;
|
focused = (wParam.ToInt64() & 0xFFFF) != 0;
|
||||||
|
|
||||||
if (new_focused_state != Focused)
|
if (new_focused_state != Focused)
|
||||||
FocusedChanged(this, EventArgs.Empty);
|
OnFocusedChanged(EventArgs.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleEnterModalLoop(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
void HandleEnterModalLoop(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
||||||
|
@ -292,7 +270,7 @@ namespace OpenTK.Platform.Windows
|
||||||
if (Location != new_location)
|
if (Location != new_location)
|
||||||
{
|
{
|
||||||
bounds.Location = new_location;
|
bounds.Location = new_location;
|
||||||
Move(this, EventArgs.Empty);
|
OnMove(EventArgs.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
Size new_size = new Size(pos->cx, pos->cy);
|
Size new_size = new Size(pos->cx, pos->cy);
|
||||||
|
@ -310,7 +288,7 @@ namespace OpenTK.Platform.Windows
|
||||||
SetWindowPosFlags.NOACTIVATE | SetWindowPosFlags.NOSENDCHANGING);
|
SetWindowPosFlags.NOACTIVATE | SetWindowPosFlags.NOSENDCHANGING);
|
||||||
|
|
||||||
if (suppress_resize <= 0)
|
if (suppress_resize <= 0)
|
||||||
Resize(this, EventArgs.Empty);
|
OnResize(EventArgs.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_in_modal_loop)
|
if (!is_in_modal_loop)
|
||||||
|
@ -352,7 +330,7 @@ namespace OpenTK.Platform.Windows
|
||||||
GrabCursor();
|
GrabCursor();
|
||||||
|
|
||||||
windowBorder = new_border;
|
windowBorder = new_border;
|
||||||
WindowBorderChanged(this, EventArgs.Empty);
|
OnWindowBorderChanged(EventArgs.Empty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,7 +358,7 @@ namespace OpenTK.Platform.Windows
|
||||||
if (new_state != windowState)
|
if (new_state != windowState)
|
||||||
{
|
{
|
||||||
windowState = new_state;
|
windowState = new_state;
|
||||||
WindowStateChanged(this, EventArgs.Empty);
|
OnWindowStateChanged(EventArgs.Empty);
|
||||||
|
|
||||||
// Ensure cursor remains grabbed
|
// Ensure cursor remains grabbed
|
||||||
if (!CursorVisible)
|
if (!CursorVisible)
|
||||||
|
@ -415,8 +393,8 @@ namespace OpenTK.Platform.Windows
|
||||||
|
|
||||||
if (!Char.IsControl(c))
|
if (!Char.IsControl(c))
|
||||||
{
|
{
|
||||||
key_press.KeyChar = c;
|
KeyPressArgs.KeyChar = c;
|
||||||
KeyPress(this, key_press);
|
OnKeyPress(KeyPressArgs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -459,7 +437,8 @@ namespace OpenTK.Platform.Windows
|
||||||
if (points == 0 || (points == -1 && lastError == Constants.ERROR_POINT_NOT_FOUND))
|
if (points == 0 || (points == -1 && lastError == Constants.ERROR_POINT_NOT_FOUND))
|
||||||
{
|
{
|
||||||
// Just use the mouse move position
|
// Just use the mouse move position
|
||||||
mouse.Position = point;
|
MouseMoveArgs.Position = point;
|
||||||
|
OnMouseMove(MouseMoveArgs);
|
||||||
}
|
}
|
||||||
else if (points == -1)
|
else if (points == -1)
|
||||||
{
|
{
|
||||||
|
@ -468,7 +447,7 @@ namespace OpenTK.Platform.Windows
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Exclude the current position.
|
// Exclude the current position.
|
||||||
Point currentScreenPosition = new Point(mouse.X, mouse.Y);
|
Point currentScreenPosition = new Point(InputDriver.Mouse[0].X, InputDriver.Mouse[0].Y);
|
||||||
Functions.ClientToScreen(handle, ref currentScreenPosition);
|
Functions.ClientToScreen(handle, ref currentScreenPosition);
|
||||||
|
|
||||||
// Find the first move point we've already seen.
|
// Find the first move point we've already seen.
|
||||||
|
@ -497,7 +476,8 @@ namespace OpenTK.Platform.Windows
|
||||||
position.Y -= 65536;
|
position.Y -= 65536;
|
||||||
}
|
}
|
||||||
Functions.ScreenToClient(handle, ref position);
|
Functions.ScreenToClient(handle, ref position);
|
||||||
mouse.Position = position;
|
MouseMoveArgs.Position = position;
|
||||||
|
OnMouseMove(MouseMoveArgs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mouse_last_timestamp = timestamp;
|
mouse_last_timestamp = timestamp;
|
||||||
|
@ -510,7 +490,7 @@ namespace OpenTK.Platform.Windows
|
||||||
mouse_outside_window = false;
|
mouse_outside_window = false;
|
||||||
EnableMouseTracking();
|
EnableMouseTracking();
|
||||||
|
|
||||||
MouseEnter(this, EventArgs.Empty);
|
OnMouseEnter(EventArgs.Empty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -519,64 +499,85 @@ namespace OpenTK.Platform.Windows
|
||||||
mouse_outside_window = true;
|
mouse_outside_window = true;
|
||||||
// Mouse tracking is disabled automatically by the OS
|
// Mouse tracking is disabled automatically by the OS
|
||||||
|
|
||||||
MouseLeave(this, EventArgs.Empty);
|
OnMouseLeave(EventArgs.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleMouseWheel(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
void HandleMouseWheel(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
||||||
{
|
{
|
||||||
// This is due to inconsistent behavior of the WParam value on 64bit arch, whese
|
// This is due to inconsistent behavior of the WParam value on 64bit arch, whese
|
||||||
// wparam = 0xffffffffff880000 or wparam = 0x00000000ff100000
|
// wparam = 0xffffffffff880000 or wparam = 0x00000000ff100000
|
||||||
mouse.WheelPrecise += ((long)wParam << 32 >> 48) / 120.0f;
|
MouseWheelArgs.Wheel += ((long)wParam << 32 >> 48) / 120.0f;
|
||||||
|
OnMouseWheel(MouseWheelArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleLButtonDown(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
void HandleLButtonDown(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
||||||
{
|
{
|
||||||
Functions.SetCapture(window.Handle);
|
Functions.SetCapture(window.Handle);
|
||||||
mouse[MouseButton.Left] = true;
|
MouseDownArgs.Button = MouseButton.Left;
|
||||||
|
MouseDownArgs.IsPressed = true;
|
||||||
|
OnMouseDown(MouseDownArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleMButtonDown(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
void HandleMButtonDown(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
||||||
{
|
{
|
||||||
Functions.SetCapture(window.Handle);
|
Functions.SetCapture(window.Handle);
|
||||||
mouse[MouseButton.Middle] = true;
|
MouseDownArgs.Button = MouseButton.Middle;
|
||||||
|
MouseDownArgs.IsPressed = true;
|
||||||
|
OnMouseDown(MouseDownArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleRButtonDown(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
void HandleRButtonDown(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
||||||
{
|
{
|
||||||
Functions.SetCapture(window.Handle);
|
Functions.SetCapture(window.Handle);
|
||||||
mouse[MouseButton.Right] = true;
|
MouseDownArgs.Button = MouseButton.Right;
|
||||||
|
MouseDownArgs.IsPressed = true;
|
||||||
|
OnMouseDown(MouseDownArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleXButtonDown(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
void HandleXButtonDown(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
||||||
{
|
{
|
||||||
Functions.SetCapture(window.Handle);
|
Functions.SetCapture(window.Handle);
|
||||||
mouse[((wParam.ToInt32() & 0xFFFF0000) >> 16) == 1 ?
|
MouseButton button =
|
||||||
MouseButton.Button1 : MouseButton.Button2] = true;
|
((wParam.ToInt32() & 0xFFFF0000) >> 16) == 1 ?
|
||||||
|
MouseButton.Button1 : MouseButton.Button2;
|
||||||
|
MouseDownArgs.Button = button;
|
||||||
|
MouseDownArgs.IsPressed = true;
|
||||||
|
OnMouseDown(MouseDownArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleLButtonUp(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
void HandleLButtonUp(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
||||||
{
|
{
|
||||||
Functions.ReleaseCapture();
|
Functions.ReleaseCapture();
|
||||||
mouse[MouseButton.Left] = false;
|
MouseDownArgs.Button = MouseButton.Left;
|
||||||
|
MouseDownArgs.IsPressed = false;
|
||||||
|
OnMouseUp(MouseUpArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleMButtonUp(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
void HandleMButtonUp(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
||||||
{
|
{
|
||||||
Functions.ReleaseCapture();
|
Functions.ReleaseCapture();
|
||||||
mouse[MouseButton.Middle] = false;
|
MouseDownArgs.Button = MouseButton.Middle;
|
||||||
|
MouseDownArgs.IsPressed = false;
|
||||||
|
OnMouseUp(MouseUpArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleRButtonUp(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
void HandleRButtonUp(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
||||||
{
|
{
|
||||||
Functions.ReleaseCapture();
|
Functions.ReleaseCapture();
|
||||||
mouse[MouseButton.Right] = false;
|
MouseDownArgs.Button = MouseButton.Right;
|
||||||
|
MouseDownArgs.IsPressed = false;
|
||||||
|
OnMouseUp(MouseUpArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleXButtonUp(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
void HandleXButtonUp(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
||||||
{
|
{
|
||||||
Functions.ReleaseCapture();
|
Functions.ReleaseCapture();
|
||||||
mouse[((wParam.ToInt32() & 0xFFFF0000) >> 16) == 1 ?
|
MouseButton button =
|
||||||
MouseButton.Button1 : MouseButton.Button2] = false;
|
((wParam.ToInt32() & 0xFFFF0000) >> 16) == 1 ?
|
||||||
|
MouseButton.Button1 : MouseButton.Button2;
|
||||||
|
MouseDownArgs.Button = button;
|
||||||
|
MouseDownArgs.IsPressed = false;
|
||||||
|
OnMouseUp(MouseUpArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleKeyboard(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
void HandleKeyboard(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
||||||
|
@ -600,26 +601,23 @@ namespace OpenTK.Platform.Windows
|
||||||
|
|
||||||
if (is_valid)
|
if (is_valid)
|
||||||
{
|
{
|
||||||
keyboard.SetKey(key, (byte)scancode, pressed);
|
|
||||||
|
|
||||||
if (pressed)
|
if (pressed)
|
||||||
{
|
{
|
||||||
key_down.Key = key;
|
KeyDownArgs.Key = key;
|
||||||
key_down.Modifiers = keyboard.GetModifiers();
|
KeyDownArgs.Modifiers = InputDriver.Keyboard[0].GetModifiers();
|
||||||
KeyDown(this, key_down);
|
OnKeyDown(KeyDownArgs);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
key_up.Key = key;
|
KeyUpArgs.Key = key;
|
||||||
key_up.Modifiers = keyboard.GetModifiers();
|
KeyUpArgs.Modifiers = InputDriver.Keyboard[0].GetModifiers();
|
||||||
KeyUp(this, key_up);
|
OnKeyUp(KeyUpArgs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleKillFocus(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
void HandleKillFocus(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
||||||
{
|
{
|
||||||
keyboard.ClearKeys();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleCreate(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
void HandleCreate(IntPtr handle, WindowMessage message, IntPtr wParam, IntPtr lParam)
|
||||||
|
@ -644,7 +642,7 @@ namespace OpenTK.Platform.Windows
|
||||||
{
|
{
|
||||||
System.ComponentModel.CancelEventArgs e = new System.ComponentModel.CancelEventArgs();
|
System.ComponentModel.CancelEventArgs e = new System.ComponentModel.CancelEventArgs();
|
||||||
|
|
||||||
Closing(this, e);
|
OnClosing(e);
|
||||||
|
|
||||||
if (!e.Cancel)
|
if (!e.Cancel)
|
||||||
{
|
{
|
||||||
|
@ -663,7 +661,7 @@ namespace OpenTK.Platform.Windows
|
||||||
window.Dispose();
|
window.Dispose();
|
||||||
child_window.Dispose();
|
child_window.Dispose();
|
||||||
|
|
||||||
Closed(this, EventArgs.Empty);
|
OnClosed(EventArgs.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -1117,7 +1115,7 @@ namespace OpenTK.Platform.Windows
|
||||||
Functions.SendMessage(window.Handle, WindowMessage.SETICON, (IntPtr)0, icon == null ? IntPtr.Zero : value.Handle);
|
Functions.SendMessage(window.Handle, WindowMessage.SETICON, (IntPtr)0, icon == null ? IntPtr.Zero : value.Handle);
|
||||||
Functions.SendMessage(window.Handle, WindowMessage.SETICON, (IntPtr)1, icon == null ? IntPtr.Zero : value.Handle);
|
Functions.SendMessage(window.Handle, WindowMessage.SETICON, (IntPtr)1, icon == null ? IntPtr.Zero : value.Handle);
|
||||||
}
|
}
|
||||||
IconChanged(this, EventArgs.Empty);
|
OnIconChanged(EventArgs.Empty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1151,7 +1149,7 @@ namespace OpenTK.Platform.Windows
|
||||||
{
|
{
|
||||||
if (!Functions.SetWindowText(window.Handle, value))
|
if (!Functions.SetWindowText(window.Handle, value))
|
||||||
Debug.Print("Failed to change window title (window:{0}, new title:{1}, reason:{2}).", window.Handle, value, Marshal.GetLastWin32Error());
|
Debug.Print("Failed to change window title (window:{0}, new title:{1}, reason:{2}).", window.Handle, value, Marshal.GetLastWin32Error());
|
||||||
TitleChanged(this, EventArgs.Empty);
|
OnTitleChanged(EventArgs.Empty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1184,7 +1182,7 @@ namespace OpenTK.Platform.Windows
|
||||||
Functions.ShowWindow(window.Handle, ShowWindowCommand.HIDE);
|
Functions.ShowWindow(window.Handle, ShowWindowCommand.HIDE);
|
||||||
}
|
}
|
||||||
|
|
||||||
VisibleChanged(this, EventArgs.Empty);
|
OnVisibleChanged(EventArgs.Empty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1526,27 +1524,6 @@ namespace OpenTK.Platform.Windows
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Events
|
|
||||||
|
|
||||||
public event EventHandler<EventArgs> Move = delegate { };
|
|
||||||
public event EventHandler<EventArgs> Resize = delegate { };
|
|
||||||
public event EventHandler<System.ComponentModel.CancelEventArgs> Closing = delegate { };
|
|
||||||
public event EventHandler<EventArgs> Closed = delegate { };
|
|
||||||
public event EventHandler<EventArgs> Disposed = delegate { };
|
|
||||||
public event EventHandler<EventArgs> IconChanged = delegate { };
|
|
||||||
public event EventHandler<EventArgs> TitleChanged = delegate { };
|
|
||||||
public event EventHandler<EventArgs> VisibleChanged = delegate { };
|
|
||||||
public event EventHandler<EventArgs> FocusedChanged = delegate { };
|
|
||||||
public event EventHandler<EventArgs> WindowBorderChanged = delegate { };
|
|
||||||
public event EventHandler<EventArgs> WindowStateChanged = delegate { };
|
|
||||||
public event EventHandler<OpenTK.Input.KeyboardKeyEventArgs> KeyDown = delegate { };
|
|
||||||
public event EventHandler<KeyPressEventArgs> KeyPress = delegate { };
|
|
||||||
public event EventHandler<OpenTK.Input.KeyboardKeyEventArgs> KeyUp = delegate { };
|
|
||||||
public event EventHandler<EventArgs> MouseEnter = delegate { };
|
|
||||||
public event EventHandler<EventArgs> MouseLeave = delegate { };
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region INativeGLWindow Members
|
#region INativeGLWindow Members
|
||||||
|
@ -1565,15 +1542,6 @@ namespace OpenTK.Platform.Windows
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region public IInputDriver InputDriver
|
|
||||||
|
|
||||||
public IInputDriver InputDriver
|
|
||||||
{
|
|
||||||
get { return this; }
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region public IWindowInfo WindowInfo
|
#region public IWindowInfo WindowInfo
|
||||||
|
|
||||||
public override IWindowInfo WindowInfo
|
public override IWindowInfo WindowInfo
|
||||||
|
@ -1585,61 +1553,8 @@ namespace OpenTK.Platform.Windows
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region IInputDriver Members
|
|
||||||
|
|
||||||
public void Poll()
|
|
||||||
{
|
|
||||||
if (joystick_driver is WinMMJoystick)
|
|
||||||
(joystick_driver as WinMMJoystick).Poll();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IKeyboardDriver Members
|
|
||||||
|
|
||||||
public IList<KeyboardDevice> Keyboard
|
|
||||||
{
|
|
||||||
get { return keyboards; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public KeyboardState GetState()
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public KeyboardState GetState(int index)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IMouseDriver Members
|
|
||||||
|
|
||||||
public IList<MouseDevice> Mouse
|
|
||||||
{
|
|
||||||
get { return mice; }
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IJoystickDriver Members
|
|
||||||
|
|
||||||
public IList<JoystickDevice> Joysticks
|
|
||||||
{
|
|
||||||
get { return joystick_driver.Joysticks; }
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IDisposable Members
|
#region IDisposable Members
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
this.Dispose(true);
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void Dispose(bool calledManually)
|
protected override void Dispose(bool calledManually)
|
||||||
{
|
{
|
||||||
if (!disposed)
|
if (!disposed)
|
||||||
|
@ -1662,7 +1577,7 @@ namespace OpenTK.Platform.Windows
|
||||||
Debug.Print("[Warning] INativeWindow leaked ({0}). Did you forget to call INativeWindow.Dispose()?", this);
|
Debug.Print("[Warning] INativeWindow leaked ({0}). Did you forget to call INativeWindow.Dispose()?", this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Disposed(this, EventArgs.Empty);
|
OnDisposed(EventArgs.Empty);
|
||||||
disposed = true;
|
disposed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -862,9 +862,6 @@ namespace OpenTK.Platform.X11
|
||||||
Key key;
|
Key key;
|
||||||
if (driver.TranslateKey(ref e.KeyEvent, out key))
|
if (driver.TranslateKey(ref e.KeyEvent, out key))
|
||||||
{
|
{
|
||||||
// Update legacy GameWindow.Keyboard API:
|
|
||||||
keyboard.SetKey(key, (uint)e.KeyEvent.keycode, pressed);
|
|
||||||
|
|
||||||
if (pressed)
|
if (pressed)
|
||||||
{
|
{
|
||||||
// Raise KeyDown event
|
// Raise KeyDown event
|
||||||
|
|
Loading…
Reference in a new issue