Instantly hide cursor for required frames while taking screenshot

This commit is contained in:
smoogipoo
2018-04-13 17:27:10 +09:00
parent d7812ab12e
commit ebe36f0612
3 changed files with 37 additions and 18 deletions

View File

@ -21,16 +21,22 @@ namespace osu.Game.Graphics.Cursor
/// Whether any cursors can be displayed. /// Whether any cursors can be displayed.
/// </summary> /// </summary>
public bool CanShowCursor = true; public bool CanShowCursor = true;
public bool ShowMenuCursor = true;
public CursorContainer Cursor { get; } public bool ShowMenuCursor
{
get => cursor.ShowCursor;
set => cursor.ShowCursor = value;
}
private readonly MenuCursor cursor;
public CursorContainer Cursor => cursor;
public bool ProvidingUserCursor => true; public bool ProvidingUserCursor => true;
public CursorOverrideContainer() public CursorOverrideContainer()
{ {
AddRangeInternal(new Drawable[] AddRangeInternal(new Drawable[]
{ {
Cursor = new MenuCursor { State = Visibility.Hidden }, cursor = new MenuCursor { State = Visibility.Hidden },
content = new Container { RelativeSizeAxes = Axes.Both } content = new Container { RelativeSizeAxes = Axes.Both }
}); });
} }
@ -54,14 +60,6 @@ namespace osu.Game.Graphics.Cursor
return; return;
} }
if (currentTarget?.Cursor is MenuCursor)
{
if (ShowMenuCursor && currentTarget?.Cursor.State == Visibility.Hidden)
currentTarget?.Cursor?.Show();
else if (!ShowMenuCursor && currentTarget?.Cursor.State == Visibility.Visible)
currentTarget?.Cursor?.Hide();
}
var newTarget = inputManager.HoveredDrawables.OfType<IProvideCursor>().FirstOrDefault(t => t.ProvidingUserCursor) ?? this; var newTarget = inputManager.HoveredDrawables.OfType<IProvideCursor>().FirstOrDefault(t => t.ProvidingUserCursor) ?? this;
if (currentTarget == newTarget) if (currentTarget == newTarget)

View File

@ -18,6 +18,9 @@ namespace osu.Game.Graphics.Cursor
{ {
public class MenuCursor : CursorContainer public class MenuCursor : CursorContainer
{ {
public bool ShowCursor = true;
public override bool IsPresent => ShowCursor && base.IsPresent;
protected override Drawable CreateCursor() => new Cursor(); protected override Drawable CreateCursor() => new Cursor();
private Bindable<bool> cursorRotate; private Bindable<bool> cursorRotate;

View File

@ -14,6 +14,7 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Input; using osu.Framework.Input;
using osu.Framework.Input.Bindings; using osu.Framework.Input.Bindings;
using osu.Framework.Platform; using osu.Framework.Platform;
using osu.Framework.Threading;
using osu.Game.Configuration; using osu.Game.Configuration;
using osu.Game.Graphics.Cursor; using osu.Game.Graphics.Cursor;
using osu.Game.Input.Bindings; using osu.Game.Input.Bindings;
@ -63,20 +64,31 @@ namespace osu.Game.Graphics
public bool OnReleased(GlobalAction action) => false; public bool OnReleased(GlobalAction action) => false;
public async void TakeScreenshotAsync() private volatile int screenShotTasks;
public async Task TakeScreenshotAsync() => Task.Run(async () =>
{ {
Interlocked.Increment(ref screenShotTasks);
if (!captureMenuCursor.Value) if (!captureMenuCursor.Value)
{ {
cursorOverrideContainer.ShowMenuCursor = false; cursorOverrideContainer.ShowMenuCursor = false;
await Task.Run(() =>
{ // We need to wait for at most 3 draw nodes to be drawn, following which we can be assured at least one DrawNode has been generated/drawn with the set value
while (cursorOverrideContainer.Cursor.ActiveCursor.Alpha > 0) const int frames_to_wait = 3;
Thread.Sleep(1);
}); int framesWaited = 0;
ScheduledDelegate waitDelegate = host.DrawThread.Scheduler.AddDelayed(() => framesWaited++, 0, true);
while (framesWaited < frames_to_wait)
Thread.Sleep(10);
waitDelegate.Cancel();
} }
using (var bitmap = await host.TakeScreenshotAsync()) using (var bitmap = await host.TakeScreenshotAsync())
{ {
Interlocked.Decrement(ref screenShotTasks);
var fileName = getFileName(); var fileName = getFileName();
if (fileName == null) return; if (fileName == null) return;
@ -104,8 +116,14 @@ namespace osu.Game.Graphics
} }
}); });
} }
});
cursorOverrideContainer.ShowMenuCursor = true; protected override void Update()
{
base.Update();
if (Interlocked.CompareExchange(ref screenShotTasks, 0, 0) == 0)
cursorOverrideContainer.ShowMenuCursor = true;
} }
private string getFileName() private string getFileName()