forked from Mirror/Ryujinx
Fix "Hide Cursor on Idle" inefficiency (#2058)
* Rewrite cursor hiding code to be efficient * Formatting nits
This commit is contained in:
parent
b530f0e110
commit
3d04d7ef08
1 changed files with 46 additions and 36 deletions
|
@ -5,20 +5,23 @@ using OpenTK;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
using OpenTK.Graphics.OpenGL;
|
using OpenTK.Graphics.OpenGL;
|
||||||
using OpenTK.Input;
|
using OpenTK.Input;
|
||||||
|
using Ryujinx.Common;
|
||||||
using Ryujinx.Common.Configuration;
|
using Ryujinx.Common.Configuration;
|
||||||
using Ryujinx.Common.Configuration.Hid;
|
using Ryujinx.Common.Configuration.Hid;
|
||||||
using Ryujinx.Configuration;
|
using Ryujinx.Configuration;
|
||||||
using Ryujinx.Graphics.OpenGL;
|
using Ryujinx.Graphics.OpenGL;
|
||||||
using Ryujinx.HLE;
|
|
||||||
using Ryujinx.HLE.HOS.Services.Hid;
|
using Ryujinx.HLE.HOS.Services.Hid;
|
||||||
using Ryujinx.Modules.Motion;
|
using Ryujinx.Modules.Motion;
|
||||||
using Ryujinx.Ui.Widgets;
|
using Ryujinx.Ui.Widgets;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
||||||
namespace Ryujinx.Ui
|
namespace Ryujinx.Ui
|
||||||
{
|
{
|
||||||
|
using Switch = HLE.Switch;
|
||||||
|
|
||||||
public class GlRenderer : GLWidget
|
public class GlRenderer : GLWidget
|
||||||
{
|
{
|
||||||
static GlRenderer()
|
static GlRenderer()
|
||||||
|
@ -42,8 +45,6 @@ namespace Ryujinx.Ui
|
||||||
private double _mouseY;
|
private double _mouseY;
|
||||||
private bool _mousePressed;
|
private bool _mousePressed;
|
||||||
|
|
||||||
private DateTime _lastCursorMoveTime = DateTime.Now;
|
|
||||||
|
|
||||||
private bool _toggleFullscreen;
|
private bool _toggleFullscreen;
|
||||||
private bool _toggleDockedMode;
|
private bool _toggleDockedMode;
|
||||||
|
|
||||||
|
@ -51,7 +52,7 @@ namespace Ryujinx.Ui
|
||||||
|
|
||||||
private long _ticks = 0;
|
private long _ticks = 0;
|
||||||
|
|
||||||
private readonly System.Diagnostics.Stopwatch _chrono;
|
private readonly Stopwatch _chrono;
|
||||||
|
|
||||||
private readonly Switch _device;
|
private readonly Switch _device;
|
||||||
|
|
||||||
|
@ -65,7 +66,11 @@ namespace Ryujinx.Ui
|
||||||
|
|
||||||
private readonly ManualResetEvent _exitEvent;
|
private readonly ManualResetEvent _exitEvent;
|
||||||
|
|
||||||
private Gdk.Cursor _invisibleCursor = new Gdk.Cursor (Gdk.Display.Default, Gdk.CursorType.BlankCursor);
|
// Hide Cursor
|
||||||
|
const int CursorHideIdleTime = 8; // seconds
|
||||||
|
private static readonly Cursor _invisibleCursor = new Cursor(Display.Default, CursorType.BlankCursor);
|
||||||
|
private long _lastCursorMoveTime;
|
||||||
|
private bool _hideCursorOnIdle;
|
||||||
|
|
||||||
public GlRenderer(Switch device, GraphicsDebugLevel glLogLevel)
|
public GlRenderer(Switch device, GraphicsDebugLevel glLogLevel)
|
||||||
: base (GetGraphicsMode(),
|
: base (GetGraphicsMode(),
|
||||||
|
@ -84,9 +89,9 @@ namespace Ryujinx.Ui
|
||||||
|
|
||||||
Initialize();
|
Initialize();
|
||||||
|
|
||||||
_chrono = new System.Diagnostics.Stopwatch();
|
_chrono = new Stopwatch();
|
||||||
|
|
||||||
_ticksPerFrame = System.Diagnostics.Stopwatch.Frequency / TargetFps;
|
_ticksPerFrame = Stopwatch.Frequency / TargetFps;
|
||||||
|
|
||||||
AddEvents((int)(EventMask.ButtonPressMask
|
AddEvents((int)(EventMask.ButtonPressMask
|
||||||
| EventMask.ButtonReleaseMask
|
| EventMask.ButtonReleaseMask
|
||||||
|
@ -101,6 +106,28 @@ namespace Ryujinx.Ui
|
||||||
_glLogLevel = glLogLevel;
|
_glLogLevel = glLogLevel;
|
||||||
|
|
||||||
_exitEvent = new ManualResetEvent(false);
|
_exitEvent = new ManualResetEvent(false);
|
||||||
|
|
||||||
|
_hideCursorOnIdle = ConfigurationState.Instance.HideCursorOnIdle;
|
||||||
|
_lastCursorMoveTime = Stopwatch.GetTimestamp();
|
||||||
|
|
||||||
|
ConfigurationState.Instance.HideCursorOnIdle.Event += HideCursorStateChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HideCursorStateChanged(object sender, ReactiveEventArgs<bool> state)
|
||||||
|
{
|
||||||
|
Gtk.Application.Invoke(delegate
|
||||||
|
{
|
||||||
|
_hideCursorOnIdle = state.NewValue;
|
||||||
|
|
||||||
|
if (_hideCursorOnIdle)
|
||||||
|
{
|
||||||
|
_lastCursorMoveTime = Stopwatch.GetTimestamp();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Window.Cursor = null;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static GraphicsMode GetGraphicsMode()
|
private static GraphicsMode GetGraphicsMode()
|
||||||
|
@ -126,6 +153,8 @@ namespace Ryujinx.Ui
|
||||||
|
|
||||||
private void GLRenderer_Destroyed(object sender, EventArgs e)
|
private void GLRenderer_Destroyed(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
ConfigurationState.Instance.HideCursorOnIdle.Event -= HideCursorStateChanged;
|
||||||
|
|
||||||
_dsuClient?.Dispose();
|
_dsuClient?.Dispose();
|
||||||
Dispose();
|
Dispose();
|
||||||
}
|
}
|
||||||
|
@ -186,6 +215,12 @@ namespace Ryujinx.Ui
|
||||||
}
|
}
|
||||||
|
|
||||||
_toggleDockedMode = toggleDockedMode;
|
_toggleDockedMode = toggleDockedMode;
|
||||||
|
|
||||||
|
if (_hideCursorOnIdle)
|
||||||
|
{
|
||||||
|
long cursorMoveDelta = Stopwatch.GetTimestamp() - _lastCursorMoveTime;
|
||||||
|
Window.Cursor = (cursorMoveDelta >= CursorHideIdleTime * Stopwatch.Frequency) ? _invisibleCursor : null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GLRenderer_Initialized(object sender, EventArgs e)
|
private void GLRenderer_Initialized(object sender, EventArgs e)
|
||||||
|
@ -308,37 +343,14 @@ namespace Ryujinx.Ui
|
||||||
_mouseY = evnt.Y;
|
_mouseY = evnt.Y;
|
||||||
}
|
}
|
||||||
|
|
||||||
ResetCursorIdle();
|
if (_hideCursorOnIdle)
|
||||||
|
{
|
||||||
|
_lastCursorMoveTime = Stopwatch.GetTimestamp();
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ResetCursorIdle()
|
|
||||||
{
|
|
||||||
if (ConfigurationState.Instance.HideCursorOnIdle)
|
|
||||||
{
|
|
||||||
_lastCursorMoveTime = DateTime.Now;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Window.Cursor != null)
|
|
||||||
{
|
|
||||||
Window.Cursor = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void HideCursorIdle()
|
|
||||||
{
|
|
||||||
if (ConfigurationState.Instance.HideCursorOnIdle)
|
|
||||||
{
|
|
||||||
TimeSpan elapsedTime = DateTime.Now.Subtract(_lastCursorMoveTime);
|
|
||||||
|
|
||||||
if (elapsedTime.TotalSeconds > 8)
|
|
||||||
{
|
|
||||||
Gtk.Application.Invoke(delegate { Window.Cursor = _invisibleCursor; });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnGetPreferredHeight(out int minimumHeight, out int naturalHeight)
|
protected override void OnGetPreferredHeight(out int minimumHeight, out int naturalHeight)
|
||||||
{
|
{
|
||||||
Gdk.Monitor monitor = Display.GetMonitorAtWindow(Window);
|
Gdk.Monitor monitor = Display.GetMonitorAtWindow(Window);
|
||||||
|
@ -517,8 +529,6 @@ namespace Ryujinx.Ui
|
||||||
|
|
||||||
MotionDevice motionDevice = new MotionDevice(_dsuClient);
|
MotionDevice motionDevice = new MotionDevice(_dsuClient);
|
||||||
|
|
||||||
HideCursorIdle();
|
|
||||||
|
|
||||||
foreach (InputConfig inputConfig in ConfigurationState.Instance.Hid.InputConfig.Value)
|
foreach (InputConfig inputConfig in ConfigurationState.Instance.Hid.InputConfig.Value)
|
||||||
{
|
{
|
||||||
ControllerKeys currentButton = 0;
|
ControllerKeys currentButton = 0;
|
||||||
|
|
Loading…
Reference in a new issue