From c05f8f2f22a9ea7e931ed1a0d5c1b9a3be08e31a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Trzci=C5=84ski?= Date: Thu, 5 Jan 2023 11:47:18 +0100 Subject: [PATCH] SteamController: Start controller with delay after Resume --- SteamController/ContextThread.cs | 32 +++++++++++++++++--- SteamController/Controller.cs | 22 ++++++++++++++ SteamController/Devices/Xbox360Controller.cs | 9 ++++++ 3 files changed, 58 insertions(+), 5 deletions(-) diff --git a/SteamController/ContextThread.cs b/SteamController/ContextThread.cs index e0d06af..39c69c3 100644 --- a/SteamController/ContextThread.cs +++ b/SteamController/ContextThread.cs @@ -12,24 +12,32 @@ public partial class Context : IDisposable public int UpdatesPerSec { get; private set; } - public bool Start() + public bool Start(int? startDelayMs = null) { if (thread is not null) return false; + UpdatesPerSec = 0; threadRunning = true; thread = new Thread(ThreadLoop); - thread.Start(); + thread.Start(startDelayMs); return true; } - private void ThreadLoop(object? obj) + private void ThreadLoop(object? startDelayMs) { + if (startDelayMs is int) + { + ThreadSleep((int)startDelayMs); + } + var stopwatch = new Stopwatch(); stopwatch.Start(); int updates = 0; var nextReset = stopwatch.Elapsed.Add(UpdateResetInterval); + X360.Start(); + while (threadRunning) { if (nextReset < stopwatch.Elapsed) @@ -45,10 +53,11 @@ private void ThreadLoop(object? obj) if (!Enabled || !Steam.Updated) { - try { Thread.Sleep(100); } - catch (ThreadInterruptedException) { } + ThreadSleep(100); } } + + X360.Stop(); } public void Stop() @@ -62,5 +71,18 @@ public void Stop() thread = null; } } + + private bool ThreadSleep(int delayMs) + { + try + { + Thread.Sleep(delayMs); + return true; + } + catch (ThreadInterruptedException) + { + return false; + } + } } } \ No newline at end of file diff --git a/SteamController/Controller.cs b/SteamController/Controller.cs index dcda603..d0aa7b7 100644 --- a/SteamController/Controller.cs +++ b/SteamController/Controller.cs @@ -1,5 +1,6 @@ using CommonHelpers; using ExternalHelpers; +using Microsoft.Win32; using System.ComponentModel; using System.Diagnostics; @@ -10,6 +11,8 @@ internal class Controller : IDisposable public const String Title = "Steam Controller"; public static readonly String TitleWithVersion = Title + " v" + Application.ProductVersion.ToString(); + public const int ControllerDelayAfterResumeMs = 1000; + public static readonly Dictionary PreconfiguredUserProfiles = new Dictionary() { { "*.desktop.cs", new Profiles.Predefined.DesktopProfile() { Name = "Desktop" } }, @@ -177,6 +180,24 @@ public Controller() }; context.Start(); + + Microsoft.Win32.SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; + } + + private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) + { + Log.TraceLine("SystemEvents_PowerModeChanged: {0}", e.Mode); + + switch (e.Mode) + { + case PowerModes.Suspend: + context.Stop(); + break; + + case PowerModes.Resume: + context.Start(ControllerDelayAfterResumeMs); + break; + } } private void ContextStateUpdate_Tick(object? sender, EventArgs e) @@ -231,6 +252,7 @@ private void ContextStateUpdate_Tick(object? sender, EventArgs e) public void Dispose() { + Microsoft.Win32.SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged; notifyIcon.Visible = false; context.Stop(); using (context) { } diff --git a/SteamController/Devices/Xbox360Controller.cs b/SteamController/Devices/Xbox360Controller.cs index 257ec1d..8e1973d 100644 --- a/SteamController/Devices/Xbox360Controller.cs +++ b/SteamController/Devices/Xbox360Controller.cs @@ -28,6 +28,15 @@ public void Dispose() using (client) { } } + public void Start() + { + } + + public void Stop() + { + lock (this) { Fail(); } + } + internal bool Tick() { if (this.device is not null)