From 8b57ca502cfa08aed8875eefdf2b0d2d5dd92a96 Mon Sep 17 00:00:00 2001 From: FaithBeam <32502411+FaithBeam@users.noreply.github.com> Date: Fri, 19 Apr 2024 05:45:26 -0400 Subject: [PATCH] Linux: Create linux specific project and services --- .../BackgroundTasksRunner.cs | 28 ++++++++++++ .../CurrentWindowService.cs | 9 ++++ .../ProcessMonitorService.cs | 14 ++++++ .../SkipProfileService.cs | 45 +++++++++++++++++++ .../YMouseButtonControl.Services.Linux.csproj | 13 ++++++ YMouseButtonControl.sln | 6 +++ .../KeyboardAndMouseBootstrapper.cs | 10 +++-- .../ServicesBootstrapper.cs | 19 +++++--- .../YMouseButtonControl.csproj | 1 + 9 files changed, 136 insertions(+), 9 deletions(-) create mode 100644 YMouseButtonControl.Services.Linux/BackgroundTasksRunner.cs create mode 100644 YMouseButtonControl.Services.Linux/CurrentWindowService.cs create mode 100644 YMouseButtonControl.Services.Linux/ProcessMonitorService.cs create mode 100644 YMouseButtonControl.Services.Linux/SkipProfileService.cs create mode 100644 YMouseButtonControl.Services.Linux/YMouseButtonControl.Services.Linux.csproj diff --git a/YMouseButtonControl.Services.Linux/BackgroundTasksRunner.cs b/YMouseButtonControl.Services.Linux/BackgroundTasksRunner.cs new file mode 100644 index 0000000..826744a --- /dev/null +++ b/YMouseButtonControl.Services.Linux/BackgroundTasksRunner.cs @@ -0,0 +1,28 @@ +using YMouseButtonControl.Core.KeyboardAndMouse; +using YMouseButtonControl.Core.KeyboardAndMouse.Interfaces; +using YMouseButtonControl.Core.Services.BackgroundTasks; + +namespace YMouseButtonControl.Services.Linux; + +public class BackgroundTasksRunner : IBackgroundTasksRunner +{ + private readonly IMouseListener _mouseListener; + private readonly KeyboardSimulatorWorker _keyboardSimulatorWorker; + + public BackgroundTasksRunner( + IMouseListener mouseListener, + KeyboardSimulatorWorker keyboardSimulatorWorker + ) + { + _mouseListener = mouseListener; + _keyboardSimulatorWorker = keyboardSimulatorWorker; + _mouseListener.Run(); + _keyboardSimulatorWorker.Run(); + } + + public void Dispose() + { + _mouseListener.Dispose(); + _keyboardSimulatorWorker.Dispose(); + } +} diff --git a/YMouseButtonControl.Services.Linux/CurrentWindowService.cs b/YMouseButtonControl.Services.Linux/CurrentWindowService.cs new file mode 100644 index 0000000..91bc739 --- /dev/null +++ b/YMouseButtonControl.Services.Linux/CurrentWindowService.cs @@ -0,0 +1,9 @@ +using YMouseButtonControl.Core.Processes; + +namespace YMouseButtonControl.Services.Linux; + +public class CurrentWindowService : ICurrentWindowService +{ + // Match every window. If someone figures out how to get the current window in X11 and/or wayland, make a PR please + public string ForegroundWindow { get; } = "*"; +} diff --git a/YMouseButtonControl.Services.Linux/ProcessMonitorService.cs b/YMouseButtonControl.Services.Linux/ProcessMonitorService.cs new file mode 100644 index 0000000..1b593ff --- /dev/null +++ b/YMouseButtonControl.Services.Linux/ProcessMonitorService.cs @@ -0,0 +1,14 @@ +using System.Diagnostics; +using YMouseButtonControl.Core.Processes; +using YMouseButtonControl.Core.Services.Abstractions.Models; + +namespace YMouseButtonControl.Services.Linux; + +public class ProcessMonitorService : IProcessMonitorService +{ + public IEnumerable GetProcesses() => + Process + .GetProcesses() + .Select(x => new ProcessModel(x)) + .Where(x => !string.IsNullOrWhiteSpace(x.Process.ProcessName)); +} diff --git a/YMouseButtonControl.Services.Linux/SkipProfileService.cs b/YMouseButtonControl.Services.Linux/SkipProfileService.cs new file mode 100644 index 0000000..531d886 --- /dev/null +++ b/YMouseButtonControl.Services.Linux/SkipProfileService.cs @@ -0,0 +1,45 @@ +using Serilog; +using YMouseButtonControl.Core.DataAccess.Models.Implementations; +using YMouseButtonControl.Core.KeyboardAndMouse.Interfaces; +using YMouseButtonControl.Core.Processes; +using YMouseButtonControl.Core.Services.Abstractions.Models.EventArgs; + +namespace YMouseButtonControl.Services.Linux; + +public class SkipProfileService(ICurrentWindowService currentWindowService) : ISkipProfileService +{ + private readonly ILogger _myLog = Log.Logger.ForContext(); + + // Returns whether this profile should be skipped on mouse events + public bool ShouldSkipProfile(Profile p, NewMouseHookEventArgs e) + { + // If the profile's checkbox is checked in the profiles list + if (!p.Checked) + { + _myLog.Information("Not checked"); + return true; + } + + if (p.Process == "*") + { + return false; + } + + if (currentWindowService.ForegroundWindow.Contains(p.Process)) + { + return false; + } + + if (currentWindowService.ForegroundWindow == "*") + { + return false; + } + + _myLog.Information( + "Foreground window: {ForegroundWindow}", + currentWindowService.ForegroundWindow + ); + _myLog.Information("Couldn't find foreground window {Process}", p.Process); + return true; + } +} diff --git a/YMouseButtonControl.Services.Linux/YMouseButtonControl.Services.Linux.csproj b/YMouseButtonControl.Services.Linux/YMouseButtonControl.Services.Linux.csproj new file mode 100644 index 0000000..3953205 --- /dev/null +++ b/YMouseButtonControl.Services.Linux/YMouseButtonControl.Services.Linux.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/YMouseButtonControl.sln b/YMouseButtonControl.sln index 4fb6e05..93715d1 100644 --- a/YMouseButtonControl.sln +++ b/YMouseButtonControl.sln @@ -17,6 +17,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YMouseButtonControl.Service EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YMouseButtonControl.Core.Tests", "YMouseButtonControl.Core.Tests\YMouseButtonControl.Core.Tests.csproj", "{3568CE4C-607E-4DB7-B724-CCA418B7D32A}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YMouseButtonControl.Services.Linux", "YMouseButtonControl.Services.Linux\YMouseButtonControl.Services.Linux.csproj", "{EE958A9F-3768-44CE-A08E-F692CB403BB8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -51,6 +53,10 @@ Global {3568CE4C-607E-4DB7-B724-CCA418B7D32A}.Debug|Any CPU.Build.0 = Debug|Any CPU {3568CE4C-607E-4DB7-B724-CCA418B7D32A}.Release|Any CPU.ActiveCfg = Release|Any CPU {3568CE4C-607E-4DB7-B724-CCA418B7D32A}.Release|Any CPU.Build.0 = Release|Any CPU + {EE958A9F-3768-44CE-A08E-F692CB403BB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE958A9F-3768-44CE-A08E-F692CB403BB8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE958A9F-3768-44CE-A08E-F692CB403BB8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE958A9F-3768-44CE-A08E-F692CB403BB8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/YMouseButtonControl/DependencyInjection/KeyboardAndMouseBootstrapper.cs b/YMouseButtonControl/DependencyInjection/KeyboardAndMouseBootstrapper.cs index fb7a02a..719e491 100644 --- a/YMouseButtonControl/DependencyInjection/KeyboardAndMouseBootstrapper.cs +++ b/YMouseButtonControl/DependencyInjection/KeyboardAndMouseBootstrapper.cs @@ -4,11 +4,9 @@ using SharpHook.Reactive; using YMouseButtonControl.Core.KeyboardAndMouse; using YMouseButtonControl.Core.KeyboardAndMouse.Interfaces; -using YMouseButtonControl.KeyboardAndMouse; using YMouseButtonControl.KeyboardAndMouse.SharpHook.Implementations; using YMouseButtonControl.KeyboardAndMouse.SharpHook.Implementations.SimulatedKeystrokesTypes; using YMouseButtonControl.KeyboardAndMouse.SharpHook.Implementations.SimulatedMousePressTypes; -using YMouseButtonControl.Services.MacOS; namespace YMouseButtonControl.DependencyInjection; @@ -26,9 +24,13 @@ private static void RegisterOsSpecificKeyboardAndMouseServices(IServiceCollectio { services.AddSingleton(); } - else if (OperatingSystem.IsMacOS() || OperatingSystem.IsLinux()) + else if (OperatingSystem.IsMacOS()) { - services.AddSingleton(); + services.AddSingleton(); + } + else if (OperatingSystem.IsLinux()) + { + services.AddSingleton(); } else { diff --git a/YMouseButtonControl/DependencyInjection/ServicesBootstrapper.cs b/YMouseButtonControl/DependencyInjection/ServicesBootstrapper.cs index c8e8a8f..4a49911 100644 --- a/YMouseButtonControl/DependencyInjection/ServicesBootstrapper.cs +++ b/YMouseButtonControl/DependencyInjection/ServicesBootstrapper.cs @@ -7,8 +7,6 @@ using YMouseButtonControl.Core.Services.BackgroundTasks; using YMouseButtonControl.Services.MacOS; using YMouseButtonControl.Services.Windows; -using BackgroundTasksRunner = YMouseButtonControl.Services.MacOS.BackgroundTasksRunner; -using CurrentWindowService = YMouseButtonControl.Services.MacOS.CurrentWindowService; namespace YMouseButtonControl.DependencyInjection; @@ -31,16 +29,27 @@ private static void RegisterPlatformSpecificServices(IServiceCollection services { RegisterWindowsServices(services); } - else if (OperatingSystem.IsMacOS() || OperatingSystem.IsLinux()) + else if (OperatingSystem.IsMacOS()) { RegisterMacOsServices(services); } + else if (OperatingSystem.IsLinux()) + { + RegisterLinuxServices(services); + } else { throw new Exception("Unsupported operating system"); } } + private static void RegisterLinuxServices(IServiceCollection services) + { + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + } + [SupportedOSPlatform("windows5.1.2600")] private static void RegisterWindowsServices(IServiceCollection services) { @@ -52,7 +61,7 @@ private static void RegisterWindowsServices(IServiceCollection services) private static void RegisterMacOsServices(IServiceCollection services) { services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); } } diff --git a/YMouseButtonControl/YMouseButtonControl.csproj b/YMouseButtonControl/YMouseButtonControl.csproj index 26d06c4..31cef5c 100644 --- a/YMouseButtonControl/YMouseButtonControl.csproj +++ b/YMouseButtonControl/YMouseButtonControl.csproj @@ -62,6 +62,7 @@ +