[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:
Michael Clayton
2023-10-11 15:58:19 +01:00
committed by GitHub
parent 602a3ff090
commit 93d80f542c
10 changed files with 359 additions and 73 deletions

View 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();
}
}