mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-05 02:36:19 +02:00
[MouseJump]Long lived background process (#28380)
* [MouseJump] Long lived background exe * [MouseJump] Long lived background exe * [MouseJump] Long lived background exe * [MouseJump] Long lived background exe * [MouseJump] Close long lived background exe when parent runner exits * [MouseJump] Close long lived background exe when parent runner exits * [MouseJump] long lived background exe - fixing build * [MouseJump] - add FileSystemWatcher for config (#26703) * Fix telemetry event
This commit is contained in:
95
src/modules/MouseUtils/MouseJumpUI/Helpers/SettingsHelper.cs
Normal file
95
src/modules/MouseUtils/MouseJumpUI/Helpers/SettingsHelper.cs
Normal file
@@ -0,0 +1,95 @@
|
||||
// Copyright (c) Microsoft Corporation
|
||||
// The Microsoft Corporation licenses this file to you under the MIT license.
|
||||
// See the LICENSE file in the project root for more information.
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.IO.Abstractions;
|
||||
using System.Threading;
|
||||
using ManagedCommon;
|
||||
using Microsoft.PowerToys.Settings.UI.Library;
|
||||
using Microsoft.PowerToys.Settings.UI.Library.Utilities;
|
||||
|
||||
namespace MouseJumpUI.Helpers;
|
||||
|
||||
internal class SettingsHelper
|
||||
{
|
||||
public SettingsHelper()
|
||||
{
|
||||
this.LockObject = new();
|
||||
this.CurrentSettings = this.LoadSettings();
|
||||
|
||||
// delay loading settings on change by some time to avoid file in use exception
|
||||
var throttledActionInvoker = new ThrottledActionInvoker();
|
||||
this.FileSystemWatcher = Helper.GetFileWatcher(
|
||||
moduleName: MouseJumpSettings.ModuleName,
|
||||
fileName: "settings.json",
|
||||
onChangedCallback: () => throttledActionInvoker.ScheduleAction(this.ReloadSettings, 250));
|
||||
}
|
||||
|
||||
private IFileSystemWatcher FileSystemWatcher
|
||||
{
|
||||
get;
|
||||
}
|
||||
|
||||
private object LockObject
|
||||
{
|
||||
get;
|
||||
}
|
||||
|
||||
public MouseJumpSettings CurrentSettings
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
|
||||
private MouseJumpSettings LoadSettings()
|
||||
{
|
||||
lock (this.LockObject)
|
||||
{
|
||||
{
|
||||
var settingsUtils = new SettingsUtils();
|
||||
|
||||
// set this to 1 to disable retries
|
||||
var remainingRetries = 5;
|
||||
|
||||
while (remainingRetries > 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!settingsUtils.SettingsExists(MouseJumpSettings.ModuleName))
|
||||
{
|
||||
Logger.LogInfo("MouseJump settings.json was missing, creating a new one");
|
||||
var defaultSettings = new MouseJumpSettings();
|
||||
defaultSettings.Save(settingsUtils);
|
||||
}
|
||||
|
||||
var settings = settingsUtils.GetSettingsOrDefault<MouseJumpSettings>(MouseJumpSettings.ModuleName);
|
||||
return settings;
|
||||
}
|
||||
catch (IOException ex)
|
||||
{
|
||||
Logger.LogError("Failed to read changed settings", ex);
|
||||
Thread.Sleep(250);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError("Failed to read changed settings", ex);
|
||||
Thread.Sleep(250);
|
||||
}
|
||||
|
||||
remainingRetries--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const string message = "Failed to read changed settings - ran out of retries";
|
||||
Logger.LogError(message);
|
||||
throw new InvalidOperationException(message);
|
||||
}
|
||||
|
||||
public void ReloadSettings()
|
||||
{
|
||||
this.CurrentSettings = this.LoadSettings();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
// Copyright (c) Microsoft Corporation
|
||||
// The Microsoft Corporation licenses this file to you under the MIT license.
|
||||
// See the LICENSE file in the project root for more information.
|
||||
|
||||
using System;
|
||||
using System.Windows.Threading;
|
||||
|
||||
namespace MouseJumpUI.Helpers;
|
||||
|
||||
internal sealed class ThrottledActionInvoker
|
||||
{
|
||||
private readonly object _invokerLock = new();
|
||||
private readonly DispatcherTimer _timer;
|
||||
|
||||
private Action? _actionToRun;
|
||||
|
||||
public ThrottledActionInvoker()
|
||||
{
|
||||
_timer = new DispatcherTimer();
|
||||
_timer.Tick += Timer_Tick;
|
||||
}
|
||||
|
||||
public void ScheduleAction(Action action, int milliseconds)
|
||||
{
|
||||
lock (_invokerLock)
|
||||
{
|
||||
if (_timer.IsEnabled)
|
||||
{
|
||||
_timer.Stop();
|
||||
}
|
||||
|
||||
_actionToRun = action;
|
||||
_timer.Interval = new TimeSpan(0, 0, 0, 0, milliseconds);
|
||||
|
||||
_timer.Start();
|
||||
}
|
||||
}
|
||||
|
||||
private void Timer_Tick(object? sender, EventArgs? e)
|
||||
{
|
||||
lock (_invokerLock)
|
||||
{
|
||||
_timer.Stop();
|
||||
_actionToRun?.Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user