[New Utility]Mouse Without Borders

* Integrate Mouse Without Borders into PowerToys

---------

Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
This commit is contained in:
Andrey Nekrasov
2023-05-15 23:32:26 +01:00
committed by Jaime Bernardo
parent a0b9af039d
commit 29eebe16a4
304 changed files with 37234 additions and 133 deletions

View File

@@ -182,6 +182,22 @@ namespace Microsoft.PowerToys.Settings.UI.Library
}
}
private bool mouseWithoutBorders = true;
[JsonPropertyName("MouseWithoutBorders")]
public bool MouseWithoutBorders
{
get => mouseWithoutBorders;
set
{
if (mouseWithoutBorders != value)
{
LogTelemetryEvent(value);
mouseWithoutBorders = value;
}
}
}
private bool findMyMouse = true;
[JsonPropertyName("FindMyMouse")]

View File

@@ -2,6 +2,7 @@
// 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.Text.Json;
using System.Text.Json.Serialization;
@@ -29,5 +30,15 @@ namespace Microsoft.PowerToys.Settings.UI.Library
{
return JsonSerializer.Serialize(this);
}
public static implicit operator IntProperty(int v)
{
throw new NotImplementedException();
}
public static implicit operator IntProperty(uint v)
{
throw new NotImplementedException();
}
}
}

View File

@@ -0,0 +1,164 @@
// 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.Collections.Generic;
using System.Linq;
using System.Text.Json.Serialization;
namespace Microsoft.PowerToys.Settings.UI.Library
{
#pragma warning disable SA1649 // File name should match first type name
public struct ConnectionRequest
#pragma warning restore SA1649 // File name should match first type name
{
public string PCName;
public string SecurityKey;
}
public struct NewKeyGenerationRequest
{
}
public class MouseWithoutBordersProperties : ICloneable
{
public StringProperty SecurityKey { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool UseService { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool ShowOriginalUI { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool WrapMouse { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool ShareClipboard { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool TransferFile { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool HideMouseAtScreenEdge { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool DrawMouseCursor { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool ValidateRemoteMachineIP { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool SameSubnetOnly { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool BlockScreenSaverOnOtherMachines { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool MoveMouseRelatively { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool BlockMouseAtScreenCorners { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool ShowClipboardAndNetworkStatusMessages { get; set; }
public List<string> MachineMatrixString { get; set; }
public StringProperty MachinePool { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool MatrixOneRow { get; set; }
public IntProperty EasyMouse { get; set; }
public IntProperty MachineID { get; set; }
public IntProperty LastX { get; set; }
public IntProperty LastY { get; set; }
public IntProperty PackageID { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool FirstRun { get; set; }
public IntProperty HotKeySwitchMachine { get; set; }
public IntProperty HotKeyToggleEasyMouse { get; set; }
public IntProperty HotKeyLockMachine { get; set; }
public IntProperty HotKeyReconnect { get; set; }
public IntProperty HotKeySwitch2AllPC { get; set; }
public IntProperty TCPPort { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool DrawMouseEx { get; set; }
public StringProperty Name2IP { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool UseVKMap { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool FirstCtrlShiftS { get; set; }
[JsonConverter(typeof(BoolPropertyJsonConverter))]
public bool StealFocusWhenSwitchingMachine { get; set; }
public StringProperty DeviceID { get; set; }
public MouseWithoutBordersProperties()
{
SecurityKey = new StringProperty(string.Empty);
WrapMouse = true;
ShareClipboard = true;
TransferFile = true;
HideMouseAtScreenEdge = true;
DrawMouseCursor = true;
ValidateRemoteMachineIP = false;
SameSubnetOnly = false;
BlockScreenSaverOnOtherMachines = true;
MoveMouseRelatively = false;
BlockMouseAtScreenCorners = false;
ShowClipboardAndNetworkStatusMessages = false;
EasyMouse = new IntProperty(1);
MachineMatrixString = new List<string>();
DeviceID = new StringProperty(string.Empty);
ShowOriginalUI = false;
UseService = false;
HotKeySwitchMachine = new IntProperty(0x70); // VK.F1
HotKeyToggleEasyMouse = new IntProperty(0x45); // VK.E
HotKeyLockMachine = new IntProperty(0x4C); // VK.L
HotKeyReconnect = new IntProperty(0x52); // VK.R
HotKeySwitch2AllPC = new IntProperty(0); // Disabled
// These are internal, i.e. cannot be edited directly from UI
MachinePool = ":,:,:,:";
MatrixOneRow = true;
MachineID = new IntProperty(0);
LastX = new IntProperty(0);
LastY = new IntProperty(0);
PackageID = new IntProperty(0);
FirstRun = false;
TCPPort = new IntProperty(15100);
DrawMouseEx = true;
Name2IP = new StringProperty(string.Empty);
UseVKMap = false;
FirstCtrlShiftS = false;
StealFocusWhenSwitchingMachine = false;
}
public object Clone()
{
var clone = new MouseWithoutBordersProperties();
clone = this;
return clone;
}
}
}

View File

@@ -0,0 +1,55 @@
// 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.Text.Json;
using System.Text.Json.Serialization;
using Microsoft.PowerToys.Settings.UI.Library.Interfaces;
namespace Microsoft.PowerToys.Settings.UI.Library
{
public class MouseWithoutBordersSettings : BasePTModuleSettings, ISettingsConfig
{
public const string ModuleName = "MouseWithoutBorders";
[JsonPropertyName("properties")]
public MouseWithoutBordersProperties Properties { get; set; }
public MouseWithoutBordersSettings()
{
Name = ModuleName;
Properties = new MouseWithoutBordersProperties();
Version = "1.0";
}
public string GetModuleName()
{
return Name;
}
// This can be utilized in the future if the settings.json file is to be modified/deleted.
public bool UpgradeSettingsConfiguration()
{
return false;
}
public virtual void Save(ISettingsUtils settingsUtils)
{
// Save settings to file
var options = new JsonSerializerOptions
{
WriteIndented = true,
MaxDepth = 0,
IncludeFields = true,
};
if (settingsUtils == null)
{
throw new ArgumentNullException(nameof(settingsUtils));
}
settingsUtils.SaveSettings(JsonSerializer.Serialize(this, options), ModuleName);
}
}
}

View File

@@ -4,6 +4,7 @@
using System;
using System.IO.Abstractions;
using Microsoft.PowerToys.Settings.UI.Library.Utilities;
namespace Microsoft.PowerToys.Settings.UI.Library
{
@@ -23,22 +24,17 @@ namespace Microsoft.PowerToys.Settings.UI.Library
public bool SettingsFolderExists(string powertoy)
{
return _directory.Exists(System.IO.Path.Combine(LocalApplicationDataFolder(), $"Microsoft\\PowerToys\\{powertoy}"));
return _directory.Exists(System.IO.Path.Combine(Helper.LocalApplicationDataFolder(), $"Microsoft\\PowerToys\\{powertoy}"));
}
public void CreateSettingsFolder(string powertoy)
{
_directory.CreateDirectory(System.IO.Path.Combine(LocalApplicationDataFolder(), $"Microsoft\\PowerToys\\{powertoy}"));
_directory.CreateDirectory(System.IO.Path.Combine(Helper.LocalApplicationDataFolder(), $"Microsoft\\PowerToys\\{powertoy}"));
}
public void DeleteSettings(string powertoy = "")
{
_directory.Delete(System.IO.Path.Combine(LocalApplicationDataFolder(), $"Microsoft\\PowerToys\\{powertoy}"));
}
private static string LocalApplicationDataFolder()
{
return Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
_directory.Delete(System.IO.Path.Combine(Helper.LocalApplicationDataFolder(), $"Microsoft\\PowerToys\\{powertoy}"));
}
/// <summary>
@@ -50,12 +46,12 @@ namespace Microsoft.PowerToys.Settings.UI.Library
if (string.IsNullOrWhiteSpace(powertoy))
{
return _path.Combine(
LocalApplicationDataFolder(),
Helper.LocalApplicationDataFolder(),
$"Microsoft\\PowerToys\\{fileName}");
}
return _path.Combine(
LocalApplicationDataFolder(),
Helper.LocalApplicationDataFolder(),
$"Microsoft\\PowerToys\\{powertoy}\\{fileName}");
}
}

View File

@@ -150,7 +150,9 @@ namespace Microsoft.PowerToys.Settings.UI.Library
// This, while not totally ideal, does work around the problem by trimming the end.
// The file itself did write the content correctly but something is off with the actual end of the file, hence the 0x00 bug
var jsonSettingsString = _file.ReadAllText(_settingsPath.GetSettingsPath(powertoyFolderName, fileName)).Trim('\0');
return JsonSerializer.Deserialize<T>(jsonSettingsString);
var options = new JsonSerializerOptions { MaxDepth = 0, IncludeFields = true };
return JsonSerializer.Deserialize<T>(jsonSettingsString, options);
}
// Save settings to a json file.

View File

@@ -7,6 +7,8 @@ using System.Diagnostics;
using System.IO;
using System.IO.Abstractions;
using System.Linq;
using System.Net.NetworkInformation;
using System.Security.Principal;
using Microsoft.PowerToys.Settings.UI.Library.CustomAction;
namespace Microsoft.PowerToys.Settings.UI.Library.Utilities
@@ -15,6 +17,8 @@ namespace Microsoft.PowerToys.Settings.UI.Library.Utilities
{
public static readonly IFileSystem FileSystem = new FileSystem();
public static string UserLocalAppDataPath { get; set; } = string.Empty;
public static bool AllowRunnerToForeground()
{
var result = false;
@@ -69,9 +73,20 @@ namespace Microsoft.PowerToys.Settings.UI.Library.Utilities
return watcher;
}
private static string LocalApplicationDataFolder()
public static string LocalApplicationDataFolder()
{
return Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
WindowsIdentity currentUser = WindowsIdentity.GetCurrent();
SecurityIdentifier currentUserSID = currentUser.User;
SecurityIdentifier localSystemSID = new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null);
if (currentUserSID.Equals(localSystemSID) && UserLocalAppDataPath != string.Empty)
{
return UserLocalAppDataPath;
}
else
{
return Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
}
}
public static string GetPowerToysInstallationFolder()