mirror of
https://github.com/Ryujinx/Opentk.git
synced 2025-01-11 11:05:28 +00:00
[X11] Removed legacy X11Input driver
Its functionality has been moved directly into X11GLNative and X11KeyMap.
This commit is contained in:
parent
39eb3b1892
commit
ff46455e56
|
@ -366,9 +366,6 @@
|
|||
<Compile Include="Platform\X11\Structs.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Platform\X11\X11Input.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Platform\X11\X11Factory.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
|
|
|
@ -57,11 +57,6 @@ namespace OpenTK.Platform.X11
|
|||
|
||||
X11WindowInfo window = new X11WindowInfo();
|
||||
|
||||
// Legacy input support
|
||||
X11Input driver;
|
||||
KeyboardDevice keyboard;
|
||||
MouseDevice mouse;
|
||||
|
||||
// Window manager hints for fullscreen windows.
|
||||
// Not used right now (the code is written, but is not 64bit-correct), but could be useful for older WMs which
|
||||
// are not ICCM compliant, but may support MOTIF hints.
|
||||
|
@ -124,9 +119,6 @@ namespace OpenTK.Platform.X11
|
|||
// Keyboard input
|
||||
readonly byte[] ascii = new byte[16];
|
||||
readonly char[] chars = new char[16];
|
||||
readonly KeyPressEventArgs KPEventArgs = new KeyPressEventArgs('\0');
|
||||
readonly KeyboardKeyEventArgs KeyDownEventArgs = new KeyboardKeyEventArgs();
|
||||
readonly KeyboardKeyEventArgs KeyUpEventArgs = new KeyboardKeyEventArgs();
|
||||
|
||||
readonly IntPtr EmptyCursor;
|
||||
|
||||
|
@ -224,15 +216,18 @@ namespace OpenTK.Platform.X11
|
|||
e.ConfigureEvent.height = height;
|
||||
RefreshWindowBounds(ref e);
|
||||
|
||||
driver = new X11Input(window);
|
||||
keyboard = driver.Keyboard[0];
|
||||
mouse = driver.Mouse[0];
|
||||
|
||||
EmptyCursor = CreateEmptyCursor(window);
|
||||
|
||||
Debug.WriteLine(String.Format("X11GLNative window created successfully (id: {0}).", Handle));
|
||||
Debug.Unindent();
|
||||
|
||||
// Request that auto-repeat is only set on devices that support it physically.
|
||||
// This typically means that it's turned off for keyboards (which is what we want).
|
||||
// We prefer this method over XAutoRepeatOff/On, because the latter needs to
|
||||
// be reset before the program exits.
|
||||
bool supported;
|
||||
Functions.XkbSetDetectableAutoRepeat(window.Display, true, out supported);
|
||||
|
||||
exists = true;
|
||||
}
|
||||
|
||||
|
@ -768,7 +763,7 @@ namespace OpenTK.Platform.X11
|
|||
return cursor;
|
||||
}
|
||||
|
||||
static void SetMouseClamped(MouseDevice mouse, int x, int y,
|
||||
void SetMouseClamped(int x, int y,
|
||||
int left, int top, int width, int height)
|
||||
{
|
||||
// Clamp mouse to the specified rectangle.
|
||||
|
@ -776,7 +771,8 @@ namespace OpenTK.Platform.X11
|
|||
x = Math.Min(x, width);
|
||||
y = Math.Max(y, top);
|
||||
y = Math.Min(y, height);
|
||||
mouse.Position = new Point(x, y);
|
||||
MouseState.X = x;
|
||||
MouseState.Y = y;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -860,23 +856,23 @@ namespace OpenTK.Platform.X11
|
|||
case XEventName.KeyRelease:
|
||||
bool pressed = e.type == XEventName.KeyPress;
|
||||
Key key;
|
||||
if (driver.TranslateKey(ref e.KeyEvent, out key))
|
||||
if (X11KeyMap.TranslateKey(ref e.KeyEvent, out key))
|
||||
{
|
||||
if (pressed)
|
||||
{
|
||||
// Raise KeyDown event
|
||||
KeyDownEventArgs.Key = key;
|
||||
KeyDownEventArgs.ScanCode = (uint)e.KeyEvent.keycode;
|
||||
KeyDownEventArgs.Modifiers = keyboard.GetModifiers();
|
||||
KeyDown(this, KeyDownEventArgs);
|
||||
KeyDownArgs.Key = key;
|
||||
KeyDownArgs.ScanCode = (uint)e.KeyEvent.keycode;
|
||||
//KeyDownArgs.Modifiers = keyboard.GetModifiers();
|
||||
OnKeyDown(KeyDownArgs);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Raise KeyUp event
|
||||
KeyUpEventArgs.Key = key;
|
||||
KeyUpEventArgs.ScanCode = (uint)e.KeyEvent.keycode;
|
||||
KeyUpEventArgs.Modifiers = keyboard.GetModifiers();
|
||||
KeyUp(this, KeyUpEventArgs);
|
||||
KeyUpArgs.Key = key;
|
||||
KeyUpArgs.ScanCode = (uint)e.KeyEvent.keycode;
|
||||
//KeyUpArgs.Modifiers = keyboard.GetModifiers();
|
||||
OnKeyUp(KeyUpArgs);
|
||||
}
|
||||
|
||||
if (pressed)
|
||||
|
@ -892,8 +888,8 @@ namespace OpenTK.Platform.X11
|
|||
{
|
||||
if (!Char.IsControl(chars[i]))
|
||||
{
|
||||
KPEventArgs.KeyChar = chars[i];
|
||||
KeyPress(this, KPEventArgs);
|
||||
KeyPressArgs.KeyChar = chars[i];
|
||||
OnKeyPress(KeyPressArgs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -907,7 +903,7 @@ namespace OpenTK.Platform.X11
|
|||
// to the dead center of the window. Fortunately, this situation
|
||||
// is very very uncommon. Todo: Can this be remedied?
|
||||
int x = e.MotionEvent.x;
|
||||
int y =e.MotionEvent.y;
|
||||
int y = e.MotionEvent.y;
|
||||
// TODO: Have offset as a stored field, only update it when the window moves
|
||||
// The middle point cannot be the average of the Bounds.left/right/top/bottom,
|
||||
// because these fields take into account window decoration (borders, etc),
|
||||
|
@ -926,9 +922,9 @@ namespace OpenTK.Platform.X11
|
|||
}
|
||||
else if (!CursorVisible)
|
||||
{
|
||||
SetMouseClamped(mouse,
|
||||
mouse.X + x - mouse_rel_x,
|
||||
mouse.Y + y - mouse_rel_y,
|
||||
SetMouseClamped(
|
||||
MouseState.X + x - mouse_rel_x,
|
||||
MouseState.Y + y - mouse_rel_y,
|
||||
0, 0, Width, Height);
|
||||
mouse_rel_x = x;
|
||||
mouse_rel_y = y;
|
||||
|
@ -939,16 +935,53 @@ namespace OpenTK.Platform.X11
|
|||
}
|
||||
else
|
||||
{
|
||||
SetMouseClamped(mouse, x, y, 0, 0, Width, Height);
|
||||
SetMouseClamped(x, y, 0, 0, Width, Height);
|
||||
mouse_rel_x = x;
|
||||
mouse_rel_y = y;
|
||||
}
|
||||
|
||||
OnMouseMove();
|
||||
break;
|
||||
}
|
||||
|
||||
case XEventName.ButtonPress:
|
||||
switch (e.ButtonEvent.button)
|
||||
{
|
||||
case 1: MouseState.EnableBit((int)MouseButton.Left); break;
|
||||
case 2: MouseState.EnableBit((int)MouseButton.Middle); break;
|
||||
case 3: MouseState.EnableBit((int)MouseButton.Right); break;
|
||||
case 4: MouseState.SetScrollRelative(0, 1); break;
|
||||
case 5: MouseState.SetScrollRelative(0, -1); break;
|
||||
case 6: MouseState.EnableBit((int)MouseButton.Button1); break;
|
||||
case 7: MouseState.EnableBit((int)MouseButton.Button2); break;
|
||||
case 8: MouseState.EnableBit((int)MouseButton.Button3); break;
|
||||
case 9: MouseState.EnableBit((int)MouseButton.Button4); break;
|
||||
case 10: MouseState.EnableBit((int)MouseButton.Button5); break;
|
||||
case 11: MouseState.EnableBit((int)MouseButton.Button6); break;
|
||||
case 12: MouseState.EnableBit((int)MouseButton.Button7); break;
|
||||
case 13: MouseState.EnableBit((int)MouseButton.Button8); break;
|
||||
case 14: MouseState.EnableBit((int)MouseButton.Button9); break;
|
||||
}
|
||||
OnMouseDown();
|
||||
break;
|
||||
|
||||
case XEventName.ButtonRelease:
|
||||
driver.ProcessEvent(ref e);
|
||||
switch (e.ButtonEvent.button)
|
||||
{
|
||||
case 1: MouseState.DisableBit((int)MouseButton.Left); break;
|
||||
case 2: MouseState.DisableBit((int)MouseButton.Middle); break;
|
||||
case 3: MouseState.DisableBit((int)MouseButton.Right); break;
|
||||
case 6: MouseState.DisableBit((int)MouseButton.Button1); break;
|
||||
case 7: MouseState.DisableBit((int)MouseButton.Button2); break;
|
||||
case 8: MouseState.DisableBit((int)MouseButton.Button3); break;
|
||||
case 9: MouseState.DisableBit((int)MouseButton.Button4); break;
|
||||
case 10: MouseState.DisableBit((int)MouseButton.Button5); break;
|
||||
case 11: MouseState.DisableBit((int)MouseButton.Button6); break;
|
||||
case 12: MouseState.DisableBit((int)MouseButton.Button7); break;
|
||||
case 13: MouseState.DisableBit((int)MouseButton.Button8); break;
|
||||
case 14: MouseState.DisableBit((int)MouseButton.Button9); break;
|
||||
}
|
||||
OnMouseUp();
|
||||
break;
|
||||
|
||||
case XEventName.FocusIn:
|
||||
|
@ -1532,18 +1565,6 @@ namespace OpenTK.Platform.X11
|
|||
|
||||
#region --- INativeGLWindow Members ---
|
||||
|
||||
#region public IInputDriver InputDriver
|
||||
|
||||
public IInputDriver InputDriver
|
||||
{
|
||||
get
|
||||
{
|
||||
return driver;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region public bool Exists
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -1,235 +0,0 @@
|
|||
#region --- License ---
|
||||
/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos
|
||||
* See license.txt for license info
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
#if !MINIMAL
|
||||
using System.Drawing;
|
||||
#endif
|
||||
using System.Text;
|
||||
using System.Diagnostics;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
using OpenTK.Input;
|
||||
|
||||
namespace OpenTK.Platform.X11
|
||||
{
|
||||
/// \internal
|
||||
/// <summary>
|
||||
/// Drives the InputDriver on X11.
|
||||
/// This class supports OpenTK, and is not intended for users of OpenTK.
|
||||
/// </summary>
|
||||
internal sealed class X11Input : IInputDriver
|
||||
{
|
||||
KeyboardDevice keyboard = new KeyboardDevice();
|
||||
MouseDevice mouse = new MouseDevice();
|
||||
List<KeyboardDevice> dummy_keyboard_list = new List<KeyboardDevice>(1);
|
||||
List<MouseDevice> dummy_mice_list = new List<MouseDevice>(1);
|
||||
|
||||
int firstKeyCode, lastKeyCode; // The smallest and largest KeyCode supported by the X server.
|
||||
int keysyms_per_keycode; // The number of KeySyms for each KeyCode.
|
||||
IntPtr[] keysyms;
|
||||
|
||||
//bool disposed;
|
||||
|
||||
#region --- Constructors ---
|
||||
|
||||
/// <summary>
|
||||
/// Constructs a new X11Input driver. Creates a hidden InputOnly window, child to
|
||||
/// the main application window, which selects input events and routes them to
|
||||
/// the device specific drivers (Keyboard, Mouse, Hid).
|
||||
/// </summary>
|
||||
/// <param name="attach">The window which the InputDriver will attach itself on.</param>
|
||||
public X11Input(IWindowInfo attach)
|
||||
{
|
||||
Debug.WriteLine("Initalizing X11 input driver.");
|
||||
Debug.Indent();
|
||||
|
||||
if (attach == null)
|
||||
throw new ArgumentException("A valid parent window must be defined, in order to create an X11Input driver.");
|
||||
|
||||
//window = new X11WindowInfo(attach);
|
||||
X11WindowInfo window = (X11WindowInfo)attach;
|
||||
|
||||
// Init mouse
|
||||
mouse.Description = "Default X11 mouse";
|
||||
mouse.DeviceID = IntPtr.Zero;
|
||||
mouse.NumberOfButtons = 5;
|
||||
mouse.NumberOfWheels = 1;
|
||||
dummy_mice_list.Add(mouse);
|
||||
|
||||
using (new XLock(window.Display))
|
||||
{
|
||||
// Init keyboard
|
||||
API.DisplayKeycodes(window.Display, ref firstKeyCode, ref lastKeyCode);
|
||||
Debug.Print("First keycode: {0}, last {1}", firstKeyCode, lastKeyCode);
|
||||
|
||||
IntPtr keysym_ptr = API.GetKeyboardMapping(window.Display, (byte)firstKeyCode,
|
||||
lastKeyCode - firstKeyCode + 1, ref keysyms_per_keycode);
|
||||
Debug.Print("{0} keysyms per keycode.", keysyms_per_keycode);
|
||||
|
||||
keysyms = new IntPtr[(lastKeyCode - firstKeyCode + 1) * keysyms_per_keycode];
|
||||
Marshal.PtrToStructure(keysym_ptr, keysyms);
|
||||
API.Free(keysym_ptr);
|
||||
|
||||
keyboard.Description = "Default X11 keyboard";
|
||||
keyboard.NumberOfKeys = lastKeyCode - firstKeyCode + 1;
|
||||
keyboard.DeviceID = IntPtr.Zero;
|
||||
dummy_keyboard_list.Add(keyboard);
|
||||
|
||||
// Request that auto-repeat is only set on devices that support it physically.
|
||||
// This typically means that it's turned off for keyboards (which is what we want).
|
||||
// We prefer this method over XAutoRepeatOff/On, because the latter needs to
|
||||
// be reset before the program exits.
|
||||
bool supported;
|
||||
Functions.XkbSetDetectableAutoRepeat(window.Display, true, out supported);
|
||||
}
|
||||
|
||||
Debug.Unindent();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region TranslateKey
|
||||
|
||||
internal bool TranslateKey(ref XKeyEvent e, out Key key)
|
||||
{
|
||||
XKey keysym = (XKey)API.LookupKeysym(ref e, 0);
|
||||
XKey keysym2 = (XKey)API.LookupKeysym(ref e, 1);
|
||||
key = X11KeyMap.GetKey(keysym);
|
||||
if (key == Key.Unknown)
|
||||
{
|
||||
key = X11KeyMap.GetKey(keysym2);
|
||||
}
|
||||
if (key == Key.Unknown)
|
||||
{
|
||||
Debug.Print("KeyCode {0} (Keysym: {1}, {2}) not mapped.", e.keycode, (XKey)keysym, (XKey)keysym2);
|
||||
}
|
||||
|
||||
return key != Key.Unknown;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region internal void ProcessEvent(ref XEvent e)
|
||||
|
||||
internal void ProcessEvent(ref XEvent e)
|
||||
{
|
||||
switch (e.type)
|
||||
{
|
||||
case XEventName.ButtonPress:
|
||||
if (e.ButtonEvent.button == 1) mouse[OpenTK.Input.MouseButton.Left] = true;
|
||||
else if (e.ButtonEvent.button == 2) mouse[OpenTK.Input.MouseButton.Middle] = true;
|
||||
else if (e.ButtonEvent.button == 3) mouse[OpenTK.Input.MouseButton.Right] = true;
|
||||
else if (e.ButtonEvent.button == 4) mouse.Wheel++;
|
||||
else if (e.ButtonEvent.button == 5) mouse.Wheel--;
|
||||
else if (e.ButtonEvent.button == 6) mouse[OpenTK.Input.MouseButton.Button1] = true;
|
||||
else if (e.ButtonEvent.button == 7) mouse[OpenTK.Input.MouseButton.Button2] = true;
|
||||
else if (e.ButtonEvent.button == 8) mouse[OpenTK.Input.MouseButton.Button3] = true;
|
||||
else if (e.ButtonEvent.button == 9) mouse[OpenTK.Input.MouseButton.Button4] = true;
|
||||
else if (e.ButtonEvent.button == 10) mouse[OpenTK.Input.MouseButton.Button5] = true;
|
||||
else if (e.ButtonEvent.button == 11) mouse[OpenTK.Input.MouseButton.Button6] = true;
|
||||
else if (e.ButtonEvent.button == 12) mouse[OpenTK.Input.MouseButton.Button7] = true;
|
||||
else if (e.ButtonEvent.button == 13) mouse[OpenTK.Input.MouseButton.Button8] = true;
|
||||
else if (e.ButtonEvent.button == 14) mouse[OpenTK.Input.MouseButton.Button9] = true;
|
||||
//if ((e.state & (int)X11.MouseMask.Button4Mask) != 0) m.Wheel++;
|
||||
//if ((e.state & (int)X11.MouseMask.Button5Mask) != 0) m.Wheel--;
|
||||
//Debug.Print("Button pressed: {0}", e.ButtonEvent.button);
|
||||
break;
|
||||
|
||||
case XEventName.ButtonRelease:
|
||||
if (e.ButtonEvent.button == 1) mouse[OpenTK.Input.MouseButton.Left] = false;
|
||||
else if (e.ButtonEvent.button == 2) mouse[OpenTK.Input.MouseButton.Middle] = false;
|
||||
else if (e.ButtonEvent.button == 3) mouse[OpenTK.Input.MouseButton.Right] = false;
|
||||
else if (e.ButtonEvent.button == 6) mouse[OpenTK.Input.MouseButton.Button1] = false;
|
||||
else if (e.ButtonEvent.button == 7) mouse[OpenTK.Input.MouseButton.Button2] = false;
|
||||
else if (e.ButtonEvent.button == 8) mouse[OpenTK.Input.MouseButton.Button3] = false;
|
||||
else if (e.ButtonEvent.button == 9) mouse[OpenTK.Input.MouseButton.Button4] = false;
|
||||
else if (e.ButtonEvent.button == 10) mouse[OpenTK.Input.MouseButton.Button5] = false;
|
||||
else if (e.ButtonEvent.button == 11) mouse[OpenTK.Input.MouseButton.Button6] = false;
|
||||
else if (e.ButtonEvent.button == 12) mouse[OpenTK.Input.MouseButton.Button7] = false;
|
||||
else if (e.ButtonEvent.button == 13) mouse[OpenTK.Input.MouseButton.Button8] = false;
|
||||
else if (e.ButtonEvent.button == 14) mouse[OpenTK.Input.MouseButton.Button9] = false;
|
||||
break;
|
||||
|
||||
case XEventName.MotionNotify:
|
||||
mouse.Position = new Point(e.MotionEvent.x, e.MotionEvent.y);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region --- IInputDriver Members ---
|
||||
|
||||
#region public IList<Keyboard> Keyboard
|
||||
|
||||
public IList<KeyboardDevice> Keyboard
|
||||
{
|
||||
get { return dummy_keyboard_list; }//return keyboardDriver.Keyboard;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region public IList<Mouse> Mouse
|
||||
|
||||
public IList<MouseDevice> Mouse
|
||||
{
|
||||
get { return (IList<MouseDevice>)dummy_mice_list; } //return mouseDriver.Mouse;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public IList<JoystickDevice> Joysticks
|
||||
{
|
||||
get { throw new NotImplementedException(); }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region public void Poll()
|
||||
|
||||
/// <summary>
|
||||
/// Polls and updates state of all keyboard, mouse and joystick devices.
|
||||
/// </summary>
|
||||
public void Poll()
|
||||
{
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region --- IDisposable Members ---
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
//this.Dispose(true);
|
||||
//GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
//private void Dispose(bool manual)
|
||||
//{
|
||||
// if (!disposed)
|
||||
// {
|
||||
// //disposing = true;
|
||||
// if (pollingThread != null && pollingThread.IsAlive)
|
||||
// pollingThread.Abort();
|
||||
|
||||
// if (manual)
|
||||
// {
|
||||
// }
|
||||
|
||||
// disposed = true;
|
||||
// }
|
||||
//}
|
||||
|
||||
//~X11Input()
|
||||
//{
|
||||
// this.Dispose(false);
|
||||
//}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -370,5 +370,22 @@ namespace OpenTK.Platform.X11
|
|||
return Key.Unknown;
|
||||
}
|
||||
}
|
||||
|
||||
internal static bool TranslateKey(ref XKeyEvent e, out Key key)
|
||||
{
|
||||
XKey keysym = (XKey)API.LookupKeysym(ref e, 0);
|
||||
XKey keysym2 = (XKey)API.LookupKeysym(ref e, 1);
|
||||
key = X11KeyMap.GetKey(keysym);
|
||||
if (key == Key.Unknown)
|
||||
{
|
||||
key = X11KeyMap.GetKey(keysym2);
|
||||
}
|
||||
if (key == Key.Unknown)
|
||||
{
|
||||
Debug.Print("KeyCode {0} (Keysym: {1}, {2}) not mapped.", e.keycode, (XKey)keysym, (XKey)keysym2);
|
||||
}
|
||||
|
||||
return key != Key.Unknown;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue