mirror of
https://github.com/Ryujinx/Opentk.git
synced 2024-12-24 18:15:38 +00:00
* Source/OpenTK/NativeWindow.cs:
* Source/OpenTK/INativeWindow.cs: * Source/OpenTK/Platform/X11/API.cs: * Source/OpenTK/Platform/X11/X11GLNative.cs: * Source/OpenTK/Platform/Windows/WinGLNative.cs: * Source/OpenTK/Platform/MacOS/CarbonGLNative.cs: * Source/Examples/OpenTK/Test/GameWindowStates.cs: Initial implementation of CursorVisible API. See issue [#1560].
This commit is contained in:
parent
6f815689e7
commit
1fc5e96a25
|
@ -23,6 +23,7 @@ namespace Examples.Tests
|
||||||
bool mouse_in_window = false;
|
bool mouse_in_window = false;
|
||||||
bool viewport_changed = true;
|
bool viewport_changed = true;
|
||||||
bool refresh_text = true;
|
bool refresh_text = true;
|
||||||
|
bool move_window = false;
|
||||||
|
|
||||||
public GameWindowStates()
|
public GameWindowStates()
|
||||||
: base(800, 600)
|
: base(800, 600)
|
||||||
|
@ -38,7 +39,8 @@ namespace Examples.Tests
|
||||||
Resize += delegate { refresh_text = true; };
|
Resize += delegate { refresh_text = true; };
|
||||||
WindowBorderChanged += delegate { refresh_text = true; };
|
WindowBorderChanged += delegate { refresh_text = true; };
|
||||||
WindowStateChanged += delegate { refresh_text = true; };
|
WindowStateChanged += delegate { refresh_text = true; };
|
||||||
Mouse.Move += delegate { refresh_text = true; };
|
Mouse.Move += MouseMoveHandler;
|
||||||
|
Mouse.ButtonDown += MouseButtonHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KeyDownHandler(object sender, KeyboardKeyEventArgs e)
|
void KeyDownHandler(object sender, KeyboardKeyEventArgs e)
|
||||||
|
@ -68,7 +70,33 @@ namespace Examples.Tests
|
||||||
case Key.Minus: Size -= new Size(16, 16); break;
|
case Key.Minus: Size -= new Size(16, 16); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MouseMoveHandler(object sender, MouseMoveEventArgs e)
|
||||||
|
{
|
||||||
|
refresh_text = true;
|
||||||
|
|
||||||
|
if (move_window)
|
||||||
|
{
|
||||||
|
Location = new Point(X + e.XDelta, Y + e.YDelta);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MouseButtonHandler(object sender, MouseButtonEventArgs e)
|
||||||
|
{
|
||||||
|
refresh_text = true;
|
||||||
|
|
||||||
|
if (e.IsPressed)
|
||||||
|
{
|
||||||
|
CursorVisible = false;
|
||||||
|
move_window = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CursorVisible = true;
|
||||||
|
move_window = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int Clamp(int val, int min, int max)
|
static int Clamp(int val, int min, int max)
|
||||||
{
|
{
|
||||||
return val > max ? max : val < min ? min : val;
|
return val > max ? max : val < min ? min : val;
|
||||||
|
@ -97,6 +125,7 @@ namespace Examples.Tests
|
||||||
DrawString(gfx, String.Format("Focused: {0}.", this.Focused), line++);
|
DrawString(gfx, String.Format("Focused: {0}.", this.Focused), line++);
|
||||||
DrawString(gfx, String.Format("Mouse {0} window.", mouse_in_window ? "inside" : "outside of"), line++);
|
DrawString(gfx, String.Format("Mouse {0} window.", mouse_in_window ? "inside" : "outside of"), line++);
|
||||||
DrawString(gfx, String.Format("Mouse position: {0}", new Vector3(Mouse.X, Mouse.Y, Mouse.Wheel)), line++);
|
DrawString(gfx, String.Format("Mouse position: {0}", new Vector3(Mouse.X, Mouse.Y, Mouse.Wheel)), line++);
|
||||||
|
DrawString(gfx, String.Format("Mouse visible: {0}", CursorVisible), line++);
|
||||||
DrawString(gfx, String.Format("Window.Bounds: {0}", Bounds), line++);
|
DrawString(gfx, String.Format("Window.Bounds: {0}", Bounds), line++);
|
||||||
DrawString(gfx, String.Format("Window.Location: {0}, Size: {1}", Location, Size), line++);
|
DrawString(gfx, String.Format("Window.Location: {0}, Size: {1}", Location, Size), line++);
|
||||||
DrawString(gfx, String.Format("Window.{{X={0}, Y={1}, Width={2}, Height={3}}}", X, Y, Width, Height), line++);
|
DrawString(gfx, String.Format("Window.{{X={0}, Y={1}, Width={2}, Height={3}}}", X, Y, Width, Height), line++);
|
||||||
|
|
|
@ -132,6 +132,16 @@ namespace OpenTK
|
||||||
[Obsolete]
|
[Obsolete]
|
||||||
OpenTK.Input.IInputDriver InputDriver { get; }
|
OpenTK.Input.IInputDriver InputDriver { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value, indicating whether the mouse cursor is visible.
|
||||||
|
/// </summary>
|
||||||
|
bool CursorVisible { get; set; }
|
||||||
|
|
||||||
|
// /// <summary>
|
||||||
|
// /// Gets or sets a value, indicating whether the mouse cursor is confined inside the window size.
|
||||||
|
// /// </summary>
|
||||||
|
// bool CursorGrabbed { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Closes this window.
|
/// Closes this window.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -49,6 +49,7 @@ namespace OpenTK
|
||||||
private readonly INativeWindow implementation;
|
private readonly INativeWindow implementation;
|
||||||
|
|
||||||
private bool disposed, events;
|
private bool disposed, events;
|
||||||
|
private bool cursor_visible = true;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -541,6 +542,23 @@ namespace OpenTK
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region CursorVisible
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value indicating whether the mouse cursor is visible.
|
||||||
|
/// </summary>
|
||||||
|
public bool CursorVisible
|
||||||
|
{
|
||||||
|
get { return cursor_visible; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
cursor_visible = value;
|
||||||
|
implementation.CursorVisible = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Events
|
#region Events
|
||||||
|
|
|
@ -925,6 +925,12 @@ namespace OpenTK.Platform.MacOS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool CursorVisible
|
||||||
|
{
|
||||||
|
get { return true; }
|
||||||
|
set { }
|
||||||
|
}
|
||||||
|
|
||||||
public void Close()
|
public void Close()
|
||||||
{
|
{
|
||||||
CancelEventArgs e = new CancelEventArgs();
|
CancelEventArgs e = new CancelEventArgs();
|
||||||
|
|
|
@ -836,6 +836,16 @@ namespace OpenTK.Platform.Windows
|
||||||
|
|
||||||
public bool Exists { get { return exists; } }
|
public bool Exists { get { return exists; } }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region CursorVisible
|
||||||
|
|
||||||
|
public bool CursorVisible
|
||||||
|
{
|
||||||
|
get { return true; }
|
||||||
|
set { }
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Close
|
#region Close
|
||||||
|
|
|
@ -1562,6 +1562,26 @@ XF86VidModeGetGammaRampSize(
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
public static Pixmap XCreateBitmapFromData(Display display, Window d, byte[,] data)
|
||||||
|
{
|
||||||
|
if (data == null)
|
||||||
|
throw new ArgumentNullException("data");
|
||||||
|
|
||||||
|
unsafe
|
||||||
|
{
|
||||||
|
fixed (byte* pdata = data)
|
||||||
|
{
|
||||||
|
return XCreateBitmapFromData(display, d, pdata, data.GetLength(0), data.GetLength(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[DllImport(X11Library)]
|
||||||
|
unsafe public static extern Pixmap XCreateBitmapFromData(Display display, Window d, byte* data, int width, int height);
|
||||||
|
|
||||||
|
[DllImport("libX11", EntryPoint = "XAllocColor")]
|
||||||
|
public static extern Status XAllocNamedColor(Display display, Colormap colormap, string color_name, out XColor screen_def_return, out XColor exact_def_return);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
|
|
@ -1300,6 +1300,38 @@ namespace OpenTK.Platform.X11
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
public bool CursorVisible
|
||||||
|
{
|
||||||
|
get { return true; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value)
|
||||||
|
{
|
||||||
|
using (new XLock(window.Display))
|
||||||
|
{
|
||||||
|
Functions.XUndefineCursor(window.Display, window.WindowHandle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
using (new XLock(window.Display))
|
||||||
|
{
|
||||||
|
XColor black, dummy;
|
||||||
|
IntPtr cmap = Functions.XDefaultColormap(window.Display, window.Screen);
|
||||||
|
Functions.XAllocNamedColor(window.Display, cmap, "black", out black, out dummy);
|
||||||
|
IntPtr bmp_empty = Functions.XCreateBitmapFromData(window.Display,
|
||||||
|
window.WindowHandle, new byte[,] { { 0 } });
|
||||||
|
IntPtr cursor_empty = Functions.XCreatePixmapCursor(window.Display,
|
||||||
|
bmp_empty, bmp_empty, ref black, ref black, 0, 0);
|
||||||
|
|
||||||
|
Functions.XDefineCursor(window.Display, window.WindowHandle, cursor_empty);
|
||||||
|
|
||||||
|
Functions.XFreeCursor(window.Display, cursor_empty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region --- INativeGLWindow Members ---
|
#region --- INativeGLWindow Members ---
|
||||||
|
|
Loading…
Reference in a new issue