diff --git a/ColorControl/ColorControl.csproj b/ColorControl/ColorControl.csproj index 3153c1a..560c86d 100644 --- a/ColorControl/ColorControl.csproj +++ b/ColorControl/ColorControl.csproj @@ -56,9 +56,6 @@ - - Form - UserControl diff --git a/ColorControl/CommandLineHandler.cs b/ColorControl/CommandLineHandler.cs index 5e1edc1..ba8c9f0 100644 --- a/ColorControl/CommandLineHandler.cs +++ b/ColorControl/CommandLineHandler.cs @@ -1,10 +1,10 @@ -using ColorControl.Forms; -using ColorControl.Services.AMD; +using ColorControl.Services.AMD; using ColorControl.Services.LG; using ColorControl.Services.NVIDIA; using ColorControl.Services.Samsung; using ColorControl.Shared.Common; using ColorControl.Shared.Contracts; +using ColorControl.Svc; using Microsoft.Extensions.DependencyInjection; using System; using System.Diagnostics; @@ -19,7 +19,7 @@ namespace ColorControl { if (startUpParams.StartElevated) { - StartElevated(); + await StartElevated(); return true; } @@ -105,13 +105,17 @@ Options: return result; } - private static void StartElevated() + private static async Task StartElevated() { try { - var elevatedForm = Program.ServiceProvider.GetRequiredService(); + var backgroundService = Program.ServiceProvider.GetRequiredService(); - Application.Run(elevatedForm); + backgroundService.PipeName = "elevatedpipe"; + + await backgroundService.StartAndStopWithMutex(); + + Application.Run(); } catch (Exception ex) { diff --git a/ColorControl/Forms/ElevatedForm.Designer.cs b/ColorControl/Forms/ElevatedForm.Designer.cs deleted file mode 100644 index fb7a647..0000000 --- a/ColorControl/Forms/ElevatedForm.Designer.cs +++ /dev/null @@ -1,46 +0,0 @@ -namespace ColorControl.Forms -{ - partial class ElevatedForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.SuspendLayout(); - // - // ElevatedForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(251, 124); - this.Name = "ElevatedForm"; - this.Text = "ElevatedForm"; - this.ResumeLayout(false); - - } - - #endregion - } -} \ No newline at end of file diff --git a/ColorControl/Forms/ElevatedForm.cs b/ColorControl/Forms/ElevatedForm.cs deleted file mode 100644 index a2dcf2b..0000000 --- a/ColorControl/Forms/ElevatedForm.cs +++ /dev/null @@ -1,53 +0,0 @@ -using ColorControl.Svc; -using System; -using System.Drawing; -using System.Threading; -using System.Threading.Tasks; -using System.Windows.Forms; - -namespace ColorControl.Forms; - -public partial class ElevatedForm : Form -{ - private ColorControlBackgroundService _backgroundService; - - public ElevatedForm(ColorControlBackgroundService backgroundService) - { - InitializeComponent(); - - FormBorderStyle = FormBorderStyle.None; - ShowInTaskbar = false; - Load += ElevatedForm_Load; - Shown += ElevatedForm_Shown; - - Task.Run(CheckMutexAsync); - - _backgroundService = backgroundService; - _backgroundService.PipeName = "elevatedpipe"; - - Task.Run(async () => await _backgroundService.StartAsync(CancellationToken.None)); - } - - private void ElevatedForm_Shown(object sender, EventArgs e) - { - Hide(); - } - - protected void ElevatedForm_Load(object sender, EventArgs e) - { - Size = new Size(0, 0); - } - - private void CheckMutexAsync() - { - var mutex = new Mutex(false, Shared.Common.GlobalContext.CurrentContext.MutexId, out var created); - try - { - mutex.WaitOne(); - } - catch (AbandonedMutexException) - { - } - BeginInvoke(Application.Exit); - } -} diff --git a/ColorControl/Forms/ElevatedForm.resx b/ColorControl/Forms/ElevatedForm.resx deleted file mode 100644 index f298a7b..0000000 --- a/ColorControl/Forms/ElevatedForm.resx +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/ColorControl/Forms/OptionsPanel.Designer.cs b/ColorControl/Forms/OptionsPanel.Designer.cs index dce77fb..241954c 100644 --- a/ColorControl/Forms/OptionsPanel.Designer.cs +++ b/ColorControl/Forms/OptionsPanel.Designer.cs @@ -404,6 +404,7 @@ namespace ColorControl.Forms chkStartMinimized.TabIndex = 3; chkStartMinimized.Text = "Start minimized"; chkStartMinimized.UseVisualStyleBackColor = true; + chkStartMinimized.CheckedChanged += chkStartMinimized_CheckedChanged; // // chkStartAfterLogin // diff --git a/ColorControl/Forms/OptionsPanel.cs b/ColorControl/Forms/OptionsPanel.cs index 83812fe..afd036f 100644 --- a/ColorControl/Forms/OptionsPanel.cs +++ b/ColorControl/Forms/OptionsPanel.cs @@ -16,20 +16,20 @@ public partial class OptionsPanel : UserControl { private readonly WinApiService _winApiService; private readonly WinApiAdminService _winApiAdminService; - private readonly AppContextProvider _appContextProvider; + private readonly GlobalContext _globalContext; private readonly ElevationService _elevationService; private readonly KeyboardShortcutDispatcher _keyboardShortcutDispatcher; private bool _initialized; private Config _config; - public OptionsPanel(WinApiService winApiService, WinApiAdminService winApiAdminService, AppContextProvider appContextProvider, ElevationService elevationService, KeyboardShortcutDispatcher keyboardShortcutDispatcher) + public OptionsPanel(WinApiService winApiService, WinApiAdminService winApiAdminService, GlobalContext globalContext, ElevationService elevationService, KeyboardShortcutDispatcher keyboardShortcutDispatcher) { _winApiService = winApiService; _winApiAdminService = winApiAdminService; - _appContextProvider = appContextProvider; + _globalContext = globalContext; _elevationService = elevationService; _keyboardShortcutDispatcher = keyboardShortcutDispatcher; - _config = appContextProvider.GetAppContext().Config; + _config = globalContext.Config; InitializeComponent(); @@ -363,4 +363,11 @@ Currently ColorControl is {(_winApiService.IsAdministrator() ? "" : "not ")}runn ColorProfileWindow.CreateAndShow(isHDR: false); } + private void chkStartMinimized_CheckedChanged(object sender, EventArgs e) + { + if (_initialized) + { + _config.StartMinimized = chkStartMinimized.Checked; + } + } } diff --git a/ColorControl/MainForm.cs b/ColorControl/MainForm.cs index 5d1a19d..212f98f 100644 --- a/ColorControl/MainForm.cs +++ b/ColorControl/MainForm.cs @@ -11,7 +11,6 @@ using ColorControl.Shared.Contracts; using ColorControl.Shared.EventDispatcher; using ColorControl.Shared.Forms; using ColorControl.Shared.Native; -using ColorControl.Shared.Services; using Microsoft.Extensions.DependencyInjection; using NLog; using NWin32; @@ -49,15 +48,13 @@ namespace ColorControl private GamePanel _gamePanel; - public MainForm(AppContextProvider appContextProvider, ServiceManager serviceManager, + public MainForm(GlobalContext globalContext, ServiceManager serviceManager, IServiceProvider serviceProvider, ElevationService elevationService, NotifyIconManager notifyIconManager, KeyboardShortcutDispatcher keyboardShortcutDispatcher, UpdateManager updateManager) { InitializeComponent(); Icon = Resources.AppIcon; - var appContext = appContextProvider.GetAppContext(); - _serviceManager = serviceManager; _serviceProvider = serviceProvider; _elevationService = elevationService; @@ -66,7 +63,7 @@ namespace ColorControl _updateManager = updateManager; _config = Program.Config; - Text = appContext.ApplicationTitleAdmin; + Text = globalContext.ApplicationTitleAdmin; LoadConfig(); @@ -361,6 +358,31 @@ namespace ColorControl //InstallUpdate(""); //await Test(); + //var dm = DisplayManager.Create(DisplayManagerOptions.None); + + //var targets = dm.GetCurrentTargets(); + + //var monitor = targets.First().TryGetMonitor(); + + //var result = dm.TryReadCurrentStateForAllTargets(); + //var state = result.State; + + //var res2 = state.TryFunctionalize(DisplayStateFunctionalizeOptions.None); + + ////var path = state.ConnectTarget(targets.First()); + //var path = state.GetPathForTarget(targets.First()); + + //var res3 = state.TryApply(DisplayStateApplyOptions.None); + + //path.IsInterlaced = false; + //path.Scaling = DisplayPathScaling.Identity; + //path.SourcePixelFormat = Windows.Graphics.DirectX.DirectXPixelFormat.R8G8B8A8UIntNormalized; + //path.PresentationRate = null; + //path.Properties.Clear(); + //path.WireFormat = null; + + //var modes = path.FindModes(DisplayModeQueryOptions.None); + _serviceManager.NvService?.TestResolution(); } diff --git a/ColorControl/MainWorker.cs b/ColorControl/MainWorker.cs index 290b87d..f84d48f 100644 --- a/ColorControl/MainWorker.cs +++ b/ColorControl/MainWorker.cs @@ -20,7 +20,7 @@ internal class MainWorker private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private readonly BackgroundWorker _backgroundWorker; - private readonly AppContextProvider _appContextProvider; + private readonly GlobalContext _globalContext; private readonly ServiceManager _serviceManager; private readonly Config _config; private readonly NotifyIconManager _notifyIconManager; @@ -37,7 +37,7 @@ internal class MainWorker public static int SHORTCUTID_SCREENSAVER = -100; public MainWorker( - AppContextProvider appContextProvider, + GlobalContext globalContext, ServiceManager serviceManager, NotifyIconManager notifyIconManager, WindowMessageDispatcher windowMessageDispatcher, @@ -48,7 +48,7 @@ internal class MainWorker UpdateManager updateManager) { _backgroundWorker = new BackgroundWorker(); - _appContextProvider = appContextProvider; + _globalContext = globalContext; _serviceManager = serviceManager; _notifyIconManager = notifyIconManager; _windowMessageDispatcher = windowMessageDispatcher; @@ -57,7 +57,7 @@ internal class MainWorker _winApiService = winApiService; _winApiAdminService = winApiAdminService; _updateManager = updateManager; - _config = _appContextProvider.GetAppContext().Config; + _config = _globalContext.Config; } public async Task DoWork() @@ -74,6 +74,7 @@ internal class MainWorker System.Windows.Forms.Application.Run(_windowMessageDispatcher.MessageForm); + _serviceManager.Save(); _notifyIconManager.HideIcon(); if (_screenStateNotify != 0) @@ -88,12 +89,13 @@ internal class MainWorker private async Task Init() { - _appContextProvider.GetAppContext().SynchronizationContext = AsyncOperationManager.SynchronizationContext; + _globalContext.SynchronizationContext = AsyncOperationManager.SynchronizationContext; _windowMessageDispatcher.RegisterEventHandler(WindowMessageDispatcher.Event_WindowMessageQueryEndSession, HandleQueryEndSessionEvent); _windowMessageDispatcher.RegisterEventHandler(WindowMessageDispatcher.Event_WindowMessageClose, HandleCloseEvent); _windowMessageDispatcher.RegisterEventHandler(WindowMessageDispatcher.Event_WindowMessagePowerBroadcast, HandlePowerBroadcastEvent); _windowMessageDispatcher.RegisterEventHandler(WindowMessageDispatcher.Event_WindowMessageShowWindow, HandleShowWindowEvent); + _windowMessageDispatcher.RegisterEventHandler(WindowMessageDispatcher.Event_WindowMessageUserBringToFront, HandleUserBringToFrontEvent); _screenStateNotify = WinApi.RegisterPowerSettingNotification(_windowMessageDispatcher.MessageForm.Handle, ref Utils.GUID_CONSOLE_DISPLAY_STATE, 0); @@ -139,6 +141,11 @@ internal class MainWorker } } + private void HandleUserBringToFrontEvent(object sender, WindowMessageEventArgs e) + { + Program.OpenMainForm(); + } + private void HandlePowerBroadcastEvent(object sender, WindowMessageEventArgs e) { if (e.Message.WParam.ToInt32() == WinApi.PBT_POWERSETTINGCHANGE) diff --git a/ColorControl/Program.cs b/ColorControl/Program.cs index 6c2f7c3..aecc93a 100644 --- a/ColorControl/Program.cs +++ b/ColorControl/Program.cs @@ -94,16 +94,16 @@ namespace ColorControl Logger.Debug($"Result of setting SetHighDpiMode: {result}"); } - var host = CreateHostBuilder().Build(); - ServiceProvider = host.Services; - var mutexId = $"Global\\{typeof(MainForm).GUID}"; - var appContextProvider = ServiceProvider.GetRequiredService(); var startUpParams = StartUpParams.Parse(args); - AppContext = new GlobalContext(Config, startUpParams, DataDir, _loggingRule, ServiceProvider, mutexId); - appContextProvider.SetAppContext(AppContext); + AppContext = new GlobalContext(Config, startUpParams, DataDir, _loggingRule, null, mutexId); + + var host = CreateHostBuilder().Build(); + ServiceProvider = host.Services; + AppContext.ServiceProvider = ServiceProvider; + MessageForms.Title = AppContext.ApplicationTitle; var existingProcess = Utils.GetProcessByName("ColorControl"); @@ -279,7 +279,6 @@ namespace ColorControl services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); services.AddSingleton(); services.AddTransient(); services.AddSingleton(); @@ -299,6 +298,8 @@ namespace ColorControl { Logger.Debug("RUNNING SERVICE"); + AppContext = new GlobalContext(null, new StartUpParams(), DataDir, _loggingRule, null); + using IHost host = Host.CreateDefaultBuilder(args) .UseWindowsService(options => { @@ -313,17 +314,14 @@ namespace ColorControl .Build(); ServiceProvider = host.Services; - - var appContextProvider = ServiceProvider.GetRequiredService(); - AppContext = new GlobalContext(null, new StartUpParams(), DataDir, _loggingRule, ServiceProvider); - appContextProvider.SetAppContext(AppContext); + AppContext.ServiceProvider = ServiceProvider; await host.RunAsync(); } private static void RegisterSharedServices(this IServiceCollection services) { - services.AddSingleton(); + services.AddSingleton(AppContext); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); diff --git a/ColorControl/Services/AMD/AmdPanel.cs b/ColorControl/Services/AMD/AmdPanel.cs index 6a8f323..206116a 100644 --- a/ColorControl/Services/AMD/AmdPanel.cs +++ b/ColorControl/Services/AMD/AmdPanel.cs @@ -1,10 +1,10 @@ using ATI.ADL; using ColorControl.Services.Common; +using ColorControl.Shared.Common; using ColorControl.Shared.Contracts; using ColorControl.Shared.EventDispatcher; using ColorControl.Shared.Forms; using ColorControl.Shared.Native; -using ColorControl.Shared.Services; using System; using System.Collections.Generic; using System.ComponentModel; @@ -20,18 +20,18 @@ namespace ColorControl.Services.AMD { private readonly AmdService _amdService; private readonly NotifyIconManager _notifyIconManager; - private readonly AppContextProvider _appContextProvider; + private readonly GlobalContext _globalContext; private readonly KeyboardShortcutDispatcher _keyboardShortcutDispatcher; private Config _config; private string _lastDisplayRefreshRates = string.Empty; - internal AmdPanel(AmdService amdService, NotifyIconManager notifyIconManager, AppContextProvider appContextProvider, KeyboardShortcutDispatcher keyboardShortcutDispatcher) + internal AmdPanel(AmdService amdService, NotifyIconManager notifyIconManager, GlobalContext globalContext, KeyboardShortcutDispatcher keyboardShortcutDispatcher) { _amdService = amdService; _notifyIconManager = notifyIconManager; - _appContextProvider = appContextProvider; + _globalContext = globalContext; _keyboardShortcutDispatcher = keyboardShortcutDispatcher; - _config = Shared.Common.GlobalContext.CurrentContext.Config; + _config = globalContext.Config; InitializeComponent(); @@ -303,7 +303,7 @@ namespace ColorControl.Services.AMD if (!string.IsNullOrEmpty(preset.shortcut)) { - WinApi.UnregisterHotKey(_appContextProvider.GetAppContext().MainHandle, preset.id); + WinApi.UnregisterHotKey(_globalContext.MainHandle, preset.id); } _amdService.GetPresets().Remove(preset); diff --git a/ColorControl/Services/AMD/AmdService.cs b/ColorControl/Services/AMD/AmdService.cs index 4b1a9c9..e1b2e55 100644 --- a/ColorControl/Services/AMD/AmdService.cs +++ b/ColorControl/Services/AMD/AmdService.cs @@ -24,7 +24,7 @@ namespace ColorControl.Services.AMD public static readonly int SHORTCUTID_AMDQA = -201; - public AmdService(AppContextProvider appContextProvider) : base(appContextProvider) + public AmdService(GlobalContext globalContext) : base(globalContext) { LoadPresets(); } @@ -33,9 +33,9 @@ namespace ColorControl.Services.AMD { try { - var appContextProvider = Program.ServiceProvider.GetRequiredService(); + var globalContext = Program.ServiceProvider.GetRequiredService(); - var service = new AmdService(appContextProvider); + var service = new AmdService(globalContext); var result = await service.ApplyPreset(idOrName); @@ -57,7 +57,7 @@ namespace ColorControl.Services.AMD { base.InstallEventHandlers(); - SetShortcuts(SHORTCUTID_AMDQA, _appContextProvider.GetAppContext().Config.AmdQuickAccessShortcut); + SetShortcuts(SHORTCUTID_AMDQA, _globalContext.Config.AmdQuickAccessShortcut); } protected override List GetDefaultPresets() diff --git a/ColorControl/Services/Common/ElevationService.cs b/ColorControl/Services/Common/ElevationService.cs index c0cdbb0..912f499 100644 --- a/ColorControl/Services/Common/ElevationService.cs +++ b/ColorControl/Services/Common/ElevationService.cs @@ -11,17 +11,17 @@ public class ElevationService { private readonly WinApiService _winApiService; private readonly WinApiAdminService _winApiAdminService; - private readonly AppContextProvider _appContextProvider; + private readonly GlobalContext _globalContext; private readonly Config _config; - public ElevationService(WinApiService winApiService, WinApiAdminService winApiAdminService, AppContextProvider appContextProvider) + public ElevationService(WinApiService winApiService, WinApiAdminService winApiAdminService, GlobalContext globalContext) { _winApiService = winApiService; _winApiAdminService = winApiAdminService; - _appContextProvider = appContextProvider; + _globalContext = globalContext; - _config = appContextProvider.GetAppContext().Config; + _config = globalContext.Config; } public void SetElevationMethod(ElevationMethod elevationMethod, bool startAfterLoginChecked = false) diff --git a/ColorControl/Services/Common/GraphicsService.cs b/ColorControl/Services/Common/GraphicsService.cs index 8f672cd..84f29fc 100644 --- a/ColorControl/Services/Common/GraphicsService.cs +++ b/ColorControl/Services/Common/GraphicsService.cs @@ -1,5 +1,5 @@ -using ColorControl.Shared.Native; -using ColorControl.Shared.Services; +using ColorControl.Shared.Common; +using ColorControl.Shared.Native; using NWin32; using NWin32.NativeTypes; using System; @@ -15,7 +15,7 @@ namespace ColorControl.Services.Common { private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); - public GraphicsService(AppContextProvider appContextProvider) : base(appContextProvider) + public GraphicsService(GlobalContext globalContext) : base(globalContext) { } diff --git a/ColorControl/Services/Common/NotifyIconManager.cs b/ColorControl/Services/Common/NotifyIconManager.cs index 108588d..830dcde 100644 --- a/ColorControl/Services/Common/NotifyIconManager.cs +++ b/ColorControl/Services/Common/NotifyIconManager.cs @@ -4,9 +4,9 @@ using ColorControl.Services.GameLauncher; using ColorControl.Services.LG; using ColorControl.Services.NVIDIA; using ColorControl.Services.Samsung; +using ColorControl.Shared.Common; using ColorControl.Shared.Contracts; using ColorControl.Shared.Forms; -using ColorControl.Shared.Services; using novideo_srgb; using System; using System.Collections.Generic; @@ -17,7 +17,7 @@ namespace ColorControl.Services.Common; public class NotifyIconManager { - private readonly AppContextProvider _appContextProvider; + private readonly GlobalContext _globalContext; private readonly ServiceManager _serviceManager; private readonly Config _config; @@ -30,11 +30,11 @@ public class NotifyIconManager private ToolStripMenuItem _samsungTrayMenu; private ToolStripMenuItem _gameTrayMenu; - public NotifyIconManager(AppContextProvider appContextProvider, ServiceManager serviceManager) + public NotifyIconManager(GlobalContext globalContext, ServiceManager serviceManager) { - _appContextProvider = appContextProvider; + _globalContext = globalContext; _serviceManager = serviceManager; - _config = appContextProvider.GetAppContext().Config; + _config = globalContext.Config; } public void Build() @@ -234,7 +234,7 @@ public class NotifyIconManager internal void SetText(string text = null) { - var fullText = $"{_appContextProvider.GetAppContext().ApplicationTitleAdmin}{(text == null ? "" : $"\n{text}")}"; + var fullText = $"{_globalContext.ApplicationTitleAdmin}{(text == null ? "" : $"\n{text}")}"; FormUtils.SetNotifyIconText(NotifyIcon, fullText.Trim()); } diff --git a/ColorControl/Services/Common/ServiceBase.cs b/ColorControl/Services/Common/ServiceBase.cs index cc45ff6..035b782 100644 --- a/ColorControl/Services/Common/ServiceBase.cs +++ b/ColorControl/Services/Common/ServiceBase.cs @@ -1,7 +1,7 @@ -using ColorControl.Shared.EventDispatcher; +using ColorControl.Shared.Common; +using ColorControl.Shared.EventDispatcher; using ColorControl.Shared.Forms; using ColorControl.Shared.Native; -using ColorControl.Shared.Services; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using NStandard; @@ -37,14 +37,14 @@ namespace ColorControl.Services.Common protected T _lastTriggeredPreset; protected int _quickAccessShortcutId; - protected AppContextProvider _appContextProvider; + protected GlobalContext _globalContext; private List _jsonConverters; - public ServiceBase(AppContextProvider appContextProvider) + public ServiceBase(GlobalContext globalContext) { - _appContextProvider = appContextProvider; - _dataPath = appContextProvider.GetAppContext().DataPath; + _globalContext = globalContext; + _dataPath = globalContext.DataPath; _jsonConverters = new List(); Initialize(); @@ -114,7 +114,7 @@ namespace ColorControl.Services.Common { _quickAccessShortcutId = quickAccessShortcutId; - var keyboardShortcutDispatcher = _appContextProvider.GetAppContext().ServiceProvider.GetService(); + var keyboardShortcutDispatcher = _globalContext.ServiceProvider.GetService(); if (keyboardShortcutDispatcher == null) { diff --git a/ColorControl/Services/Common/ServiceManager.cs b/ColorControl/Services/Common/ServiceManager.cs index 3890689..c156f25 100644 --- a/ColorControl/Services/Common/ServiceManager.cs +++ b/ColorControl/Services/Common/ServiceManager.cs @@ -3,6 +3,7 @@ using ColorControl.Services.GameLauncher; using ColorControl.Services.LG; using ColorControl.Services.NVIDIA; using ColorControl.Services.Samsung; +using ColorControl.Shared.Common; using ColorControl.Shared.Contracts; using ColorControl.Shared.Services; using NLog; @@ -27,12 +28,12 @@ public class ServiceManager internal GameService GameService { get; set; } internal SamsungService SamsungService { get; set; } - public ServiceManager(WinApiAdminService winApiAdminService, IServiceProvider serviceProvider, AppContextProvider appContextProvider) + public ServiceManager(WinApiAdminService winApiAdminService, IServiceProvider serviceProvider, GlobalContext globalContext) { _winApiAdminService = winApiAdminService; _serviceProvider = serviceProvider; - _config = appContextProvider.GetAppContext().Config; + _config = globalContext.Config; } public void LoadModules() diff --git a/ColorControl/Services/Common/UpdateManager.cs b/ColorControl/Services/Common/UpdateManager.cs index 9524bef..7a641d3 100644 --- a/ColorControl/Services/Common/UpdateManager.cs +++ b/ColorControl/Services/Common/UpdateManager.cs @@ -12,7 +12,7 @@ namespace ColorControl.Services.Common; public class UpdateManager { - private readonly AppContextProvider _appContextProvider; + private readonly GlobalContext _globalContext; private readonly ServiceManager _serviceManager; private readonly NotifyIconManager _notifyIconManager; private readonly WinApiService _winApiService; @@ -23,14 +23,14 @@ public class UpdateManager private string _updateHtmlUrl; private string _downloadUrl; - public UpdateManager(AppContextProvider appContextProvider, ServiceManager serviceManager, NotifyIconManager notifyIconManager, WinApiService winApiService, WinApiAdminService winApiAdminService) + public UpdateManager(GlobalContext globalContext, ServiceManager serviceManager, NotifyIconManager notifyIconManager, WinApiService winApiService, WinApiAdminService winApiAdminService) { - _appContextProvider = appContextProvider; + _globalContext = globalContext; _serviceManager = serviceManager; _notifyIconManager = notifyIconManager; _winApiService = winApiService; _winApiAdminService = winApiAdminService; - _config = appContextProvider.GetAppContext().Config; + _config = globalContext.Config; } private void trayIconBalloonTip_Clicked(object sender, EventArgs e) @@ -119,7 +119,7 @@ public class UpdateManager return; } - _appContextProvider.GetAppContext().UpdateAvailable = true; + _globalContext.UpdateAvailable = true; if (_notifyIconManager.NotifyIcon.Visible) { @@ -172,7 +172,7 @@ public class UpdateManager else { _downloadUrl = null; - _appContextProvider.GetAppContext().UpdateAvailable = true; + _globalContext.UpdateAvailable = true; } } } diff --git a/ColorControl/Services/GameLauncher/GamePanel.cs b/ColorControl/Services/GameLauncher/GamePanel.cs index 0b5d0b1..ed4db6f 100644 --- a/ColorControl/Services/GameLauncher/GamePanel.cs +++ b/ColorControl/Services/GameLauncher/GamePanel.cs @@ -24,14 +24,14 @@ namespace ColorControl.Services.GameLauncher private Config _config; private GameService _gameService; private readonly ServiceManager _serviceManager; - private readonly AppContextProvider _appContextProvider; + private readonly GlobalContext _globalContext; private readonly KeyboardShortcutDispatcher _keyboardShortcutDispatcher; - public GamePanel(GameService gameService, ServiceManager serviceManager, AppContextProvider appContextProvider, KeyboardShortcutDispatcher keyboardShortcutDispatcher) + public GamePanel(GameService gameService, ServiceManager serviceManager, GlobalContext globalContext, KeyboardShortcutDispatcher keyboardShortcutDispatcher) { _gameService = gameService; _serviceManager = serviceManager; - _appContextProvider = appContextProvider; + _globalContext = globalContext; _keyboardShortcutDispatcher = keyboardShortcutDispatcher; _config = Shared.Common.GlobalContext.CurrentContext.Config; @@ -258,7 +258,7 @@ namespace ColorControl.Services.GameLauncher if (!string.IsNullOrEmpty(preset.shortcut)) { - WinApi.UnregisterHotKey(_appContextProvider.GetAppContext().MainHandle, preset.id); + WinApi.UnregisterHotKey(_globalContext.MainHandle, preset.id); } _gameService.GetPresets().Remove(preset); diff --git a/ColorControl/Services/GameLauncher/GameService.cs b/ColorControl/Services/GameLauncher/GameService.cs index 89d992e..8698b71 100644 --- a/ColorControl/Services/GameLauncher/GameService.cs +++ b/ColorControl/Services/GameLauncher/GameService.cs @@ -34,7 +34,7 @@ namespace ColorControl.Services.GameLauncher public static readonly int SHORTCUTID_GAMEQA = -203; - public GameService(AppContextProvider appContextProvider, ServiceManager serviceManager, ProcessEventDispatcher processEventDispatcher, WinApiAdminService winApiAdminService, WinApiService winApiService) : base(appContextProvider) + public GameService(GlobalContext globalContext, ServiceManager serviceManager, ProcessEventDispatcher processEventDispatcher, WinApiAdminService winApiAdminService, WinApiService winApiService) : base(globalContext) { LoadConfig(); LoadPresets(); @@ -49,7 +49,7 @@ namespace ColorControl.Services.GameLauncher { base.InstallEventHandlers(); - SetShortcuts(SHORTCUTID_GAMEQA, _appContextProvider.GetAppContext().Config.GameQuickAccessShortcut); + SetShortcuts(SHORTCUTID_GAMEQA, _globalContext.Config.GameQuickAccessShortcut); } private async Task ProcessChanged(object sender, ProcessChangedEventArgs e, CancellationToken token) diff --git a/ColorControl/Services/LG/LgDevice.cs b/ColorControl/Services/LG/LgDevice.cs index e7f55af..6e67bdc 100644 --- a/ColorControl/Services/LG/LgDevice.cs +++ b/ColorControl/Services/LG/LgDevice.cs @@ -73,7 +73,8 @@ namespace ColorControl.Services.LG protected static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); public static List DefaultActionsOnGameBar = new() { "backlight", "contrast", "brightness", "color" }; - private static List IreValueLabels = new() { "IRE 2.5", "IRE 5", "IRE 7.5", "IRE 10", "IRE 15", "IRE 20", "IRE 25", "IRE 30", "IRE 35", "IRE 40", "IRE 45", "IRE 50", "IRE 55", "IRE 60", "IRE 65", "IRE 70", "IRE 75", "IRE 80", "IRE 85", "IRE 90", "IRE 95", "IRE 100" }; + private static List IreValueLabels = ["IRE 2.5", "IRE 5", "IRE 7.5", "IRE 10", "IRE 15", "IRE 20", "IRE 25", "IRE 30", "IRE 35", "IRE 40", "IRE 45", "IRE 50", "IRE 55", "IRE 60", "IRE 65", "IRE 70", "IRE 75", "IRE 80", "IRE 85", "IRE 90", "IRE 95", "IRE 100"]; + private static List Ire10ptValueLabels = ["IRE 10", "IRE 20", "IRE 30", "IRE 40", "IRE 50", "IRE 60", "IRE 70", "IRE 80", "IRE 90", "IRE 100"]; public string Name { get; private set; } public string IpAddress { get; private set; } @@ -252,6 +253,16 @@ namespace ColorControl.Services.LG AddGenericPictureAction("whiteBalanceBlue", minValue: -50, maxValue: 50, numberOfValues: 22, valueLabels: IreValueLabels); AddGenericPictureAction("whiteBalanceGreen", minValue: -50, maxValue: 50, numberOfValues: 22, valueLabels: IreValueLabels); AddGenericPictureAction("whiteBalanceRed", minValue: -50, maxValue: 50, numberOfValues: 22, valueLabels: IreValueLabels); + AddGenericPictureAction("whiteBalanceBlue10pt", minValue: -50, maxValue: 50, numberOfValues: 10, valueLabels: Ire10ptValueLabels); + AddGenericPictureAction("whiteBalanceGreen10pt", minValue: -50, maxValue: 50, numberOfValues: 10, valueLabels: Ire10ptValueLabels); + AddGenericPictureAction("whiteBalanceRed10pt", minValue: -50, maxValue: 50, numberOfValues: 10, valueLabels: Ire10ptValueLabels); + AddGenericPictureAction("whiteBalanceBlueOffset", minValue: -50, maxValue: 50, title: "White Balance - Blue Offset"); + AddGenericPictureAction("whiteBalanceBlueGain", minValue: -50, maxValue: 50, title: "White Balance - Blue Gain"); + AddGenericPictureAction("whiteBalanceGreenOffset", minValue: -50, maxValue: 50, title: "White Balance - Green Offset"); + AddGenericPictureAction("whiteBalanceGreenGain", minValue: -50, maxValue: 50, title: "White Balance - Green Gain"); + AddGenericPictureAction("whiteBalanceRedOffset", minValue: -50, maxValue: 50, title: "White Balance - Red Offset"); + AddGenericPictureAction("whiteBalanceRedGain", minValue: -50, maxValue: 50, title: "White Balance - Red Gain"); + AddGenericPictureAction("whiteBalanceMethod", typeof(WhiteBalanceMethod), title: "White Balance - Method"); AddInvokableAction("turnScreenOff", TurnScreenOffAction); AddInvokableAction("turnScreenOn", TurnScreenOnAction); diff --git a/ColorControl/Services/LG/LgPanel.cs b/ColorControl/Services/LG/LgPanel.cs index d729b9b..e2f2214 100644 --- a/ColorControl/Services/LG/LgPanel.cs +++ b/ColorControl/Services/LG/LgPanel.cs @@ -26,17 +26,17 @@ namespace ColorControl.Services.LG private Config _config; private LgService _lgService; private readonly ServiceManager _serviceManager; - private readonly AppContextProvider _appContextProvider; + private readonly GlobalContext _globalContext; private readonly KeyboardShortcutDispatcher _keyboardShortcutDispatcher; private string _lgTabMessage; private bool _disableEvents = false; - internal LgPanel(LgService lgService, ServiceManager serviceManager, AppContextProvider appContextProvider, KeyboardShortcutDispatcher keyboardShortcutDispatcher) + internal LgPanel(LgService lgService, ServiceManager serviceManager, GlobalContext globalContext, KeyboardShortcutDispatcher keyboardShortcutDispatcher) { _lgService = lgService; _serviceManager = serviceManager; - _appContextProvider = appContextProvider; + _globalContext = globalContext; _keyboardShortcutDispatcher = keyboardShortcutDispatcher; _config = Shared.Common.GlobalContext.CurrentContext.Config; @@ -443,7 +443,7 @@ namespace ColorControl.Services.LG if (!string.IsNullOrEmpty(preset.shortcut)) { - WinApi.UnregisterHotKey(_appContextProvider.GetAppContext().MainHandle, preset.id); + WinApi.UnregisterHotKey(_globalContext.MainHandle, preset.id); } _lgService.GetPresets().Remove(preset); @@ -1208,7 +1208,7 @@ Do you want to continue?"; if (string.IsNullOrEmpty(shortcutGB)) { - WinApi.UnregisterHotKey(_appContextProvider.GetAppContext().MainHandle, LgService.SHORTCUTID_GAMEBAR); + WinApi.UnregisterHotKey(_globalContext.MainHandle, LgService.SHORTCUTID_GAMEBAR); } else { diff --git a/ColorControl/Services/LG/LgService.cs b/ColorControl/Services/LG/LgService.cs index 3c56583..574beb7 100644 --- a/ColorControl/Services/LG/LgService.cs +++ b/ColorControl/Services/LG/LgService.cs @@ -70,9 +70,9 @@ namespace ColorControl.Services.LG public static readonly int SHORTCUTID_LGQA = -202; public static readonly int SHORTCUTID_GAMEBAR = -101; - public LgService(AppContextProvider appContextProvider, PowerEventDispatcher powerEventDispatcher, SessionSwitchDispatcher sessionSwitchDispatcher, ProcessEventDispatcher processEventDispatcher, ServiceManager serviceManager, RestartDetector restartDetector, WinApiService winApiService, WinApiAdminService winApiAdminService) : base(appContextProvider) + public LgService(GlobalContext globalContext, PowerEventDispatcher powerEventDispatcher, SessionSwitchDispatcher sessionSwitchDispatcher, ProcessEventDispatcher processEventDispatcher, ServiceManager serviceManager, RestartDetector restartDetector, WinApiService winApiService, WinApiAdminService winApiAdminService) : base(globalContext) { - _allowPowerOn = appContextProvider.GetAppContext().StartUpParams.RunningFromScheduledTask; + _allowPowerOn = globalContext.StartUpParams.RunningFromScheduledTask; _powerEventDispatcher = powerEventDispatcher; _sessionSwitchDispatcher = sessionSwitchDispatcher; _processEventDispatcher = processEventDispatcher; @@ -82,7 +82,7 @@ namespace ColorControl.Services.LG _restartDetector = restartDetector; _winApiService = winApiService; _winApiAdminService = winApiAdminService; - _syncContext = appContextProvider.GetAppContext().SynchronizationContext; + _syncContext = globalContext.SynchronizationContext; LgTvApiCore.SyncContext = _syncContext; LoadConfig(); @@ -286,7 +286,7 @@ namespace ColorControl.Services.LG { Devices = Config.Devices; - if (!_appContextProvider.GetAppContext().StartUpParams.NoDeviceRefresh) + if (!_globalContext.StartUpParams.NoDeviceRefresh) { var customIpAddresses = Devices.Where(d => d.IsCustom).Select(d => d.IpAddress); @@ -446,7 +446,7 @@ namespace ColorControl.Services.LG SetShortcuts(SHORTCUTID_LGQA, Config.QuickAccessShortcut); - var keyboardShortcutDispatcher = _appContextProvider.GetAppContext().ServiceProvider.GetService(); + var keyboardShortcutDispatcher = _globalContext.ServiceProvider.GetService(); if (keyboardShortcutDispatcher != null) { keyboardShortcutDispatcher.RegisterShortcut(SHORTCUTID_GAMEBAR, Config.GameBarShortcut); @@ -468,10 +468,16 @@ namespace ColorControl.Services.LG { await RefreshDevices(afterStartUp: true); - if (_appContextProvider.GetAppContext().StartUpParams.RunningFromScheduledTask) + if (_globalContext.StartUpParams.RunningFromScheduledTask) { await ExecutePresetsForEvent(PresetTriggerType.Startup); } + + + if (_globalContext.StartUpParams.ExecuteLgPreset) + { + await ExecutePresetAsync(_globalContext.StartUpParams.LgPresetName); + } } private void SessionSwitched(object sender, SessionSwitchEventArgs e) diff --git a/ColorControl/Services/NVIDIA/NvPanel.cs b/ColorControl/Services/NVIDIA/NvPanel.cs index bd29477..9cce333 100644 --- a/ColorControl/Services/NVIDIA/NvPanel.cs +++ b/ColorControl/Services/NVIDIA/NvPanel.cs @@ -34,18 +34,18 @@ namespace ColorControl.Services.NVIDIA private Config _config; private NvService _nvService; private readonly NotifyIconManager _notifyIconManager; - private readonly AppContextProvider _appContextProvider; + private readonly GlobalContext _globalContext; private string _lastDisplayRefreshRates = string.Empty; private RpcClientService _rpcService; private readonly WinApiAdminService _winApiAdminService; private readonly KeyboardShortcutDispatcher _keyboardShortcutDispatcher; - public NvPanel(NvService nvService, NotifyIconManager notifyIconManager, AppContextProvider appContextProvider, RpcClientService rpcService, WinApiAdminService winApiAdminService, KeyboardShortcutDispatcher keyboardShortcutDispatcher) + public NvPanel(NvService nvService, NotifyIconManager notifyIconManager, GlobalContext globalContext, RpcClientService rpcService, WinApiAdminService winApiAdminService, KeyboardShortcutDispatcher keyboardShortcutDispatcher) { _nvService = nvService; _notifyIconManager = notifyIconManager; - _appContextProvider = appContextProvider; - _config = appContextProvider.GetAppContext().Config; + _globalContext = globalContext; + _config = globalContext.Config; _rpcService = rpcService; _winApiAdminService = winApiAdminService; _keyboardShortcutDispatcher = keyboardShortcutDispatcher; @@ -157,7 +157,7 @@ namespace ColorControl.Services.NVIDIA item.Font = new Font(item.Font, item.Font.Style | FontStyle.Bold); //item.BackColor = Color.LightGray; } - item.BackColor = _appContextProvider.GetAppContext().Config.UseDarkMode ? Color.DimGray : Color.LightGray; + item.BackColor = _globalContext.Config.UseDarkMode ? Color.DimGray : Color.LightGray; var values = displayInfo.Values; @@ -245,7 +245,7 @@ namespace ColorControl.Services.NVIDIA if (!string.IsNullOrEmpty(preset.shortcut)) { - WinApi.UnregisterHotKey(_appContextProvider.GetAppContext().MainHandle, preset.id); + WinApi.UnregisterHotKey(_globalContext.MainHandle, preset.id); } _nvService.GetPresets().Remove(preset); diff --git a/ColorControl/Services/NVIDIA/NvService.cs b/ColorControl/Services/NVIDIA/NvService.cs index c9fba39..c71e31c 100644 --- a/ColorControl/Services/NVIDIA/NvService.cs +++ b/ColorControl/Services/NVIDIA/NvService.cs @@ -222,7 +222,7 @@ namespace ColorControl.Services.NVIDIA public static readonly int SHORTCUTID_NVQA = -200; - public NvService(AppContextProvider appContextProvider, WinApiService winApiService, RpcClientService rpcClientService, PowerEventDispatcher powerEventDispatcher, ServiceManager serviceManager) : base(appContextProvider) + public NvService(GlobalContext globalContext, WinApiService winApiService, RpcClientService rpcClientService, PowerEventDispatcher powerEventDispatcher, ServiceManager serviceManager) : base(globalContext) { _winApiService = winApiService; _rpcClientService = rpcClientService; @@ -238,11 +238,11 @@ namespace ColorControl.Services.NVIDIA public override void InstallEventHandlers() { - SetShortcuts(SHORTCUTID_NVQA, _appContextProvider.GetAppContext().Config.NvQuickAccessShortcut); + SetShortcuts(SHORTCUTID_NVQA, _globalContext.Config.NvQuickAccessShortcut); GetDisplayInfos(false); - MainViewModel.ConfigPath = _appContextProvider.GetAppContext().DataPath; + MainViewModel.ConfigPath = _globalContext.DataPath; if (Config.ApplyNovideoOnStartup) { MainWindow.CreateAndShow(false); @@ -481,7 +481,7 @@ namespace ColorControl.Services.NVIDIA if (preset.ColorProfileSettings.ProfileName != null) { - CCD.SetDisplayDefaultColorProfile(display.Name, preset.ColorProfileSettings.ProfileName, _appContextProvider.GetAppContext().Config.SetMinTmlAndMaxTml); + CCD.SetDisplayDefaultColorProfile(display.Name, preset.ColorProfileSettings.ProfileName, _globalContext.Config.SetMinTmlAndMaxTml); } } @@ -1291,12 +1291,23 @@ namespace ColorControl.Services.NVIDIA public void SetColorProfile(Display display, string name) { - CCD.SetDisplayDefaultColorProfile(display.Name, name, _appContextProvider.GetAppContext().Config.SetMinTmlAndMaxTml); + CCD.SetDisplayDefaultColorProfile(display.Name, name, _globalContext.Config.SetMinTmlAndMaxTml); } public void TestResolution() { - SetDithering(NvDitherState.Enabled, 1, 4, setRegistryKey: true); + //var display = GetCurrentDisplay(); + + //var configs = DisplayApi.GetDisplayConfig(); + + //var displayDevice = display.DisplayDevice; + + //var output = displayDevice.Output; + //var bytes = File.ReadAllBytes(@"d:\S95C_mod.bin"); + + //displayDevice.PhysicalGPU.WriteEDIDData(output, bytes); + + //SetDithering(NvDitherState.Enabled, 1, 4, setRegistryKey: true); //GetHdrMetaData(); @@ -1449,13 +1460,13 @@ namespace ColorControl.Services.NVIDIA { var preset = GetPresetForDisplay(display, true, displays.Count()); - var values = preset.GetDisplayValues(_appContextProvider.GetAppContext().Config); + var values = preset.GetDisplayValues(_globalContext.Config); var displayInfo = new NvDisplayInfo(display, values, preset.InfoLine, preset.displayName); list.Add(displayInfo); } - var notifyIconManager = _appContextProvider.GetAppContext().ServiceProvider.GetService(); + var notifyIconManager = _globalContext.ServiceProvider.GetService(); if (notifyIconManager != null) { diff --git a/ColorControl/Services/Samsung/SamsungDevice.cs b/ColorControl/Services/Samsung/SamsungDevice.cs index a300205..57b64f7 100644 --- a/ColorControl/Services/Samsung/SamsungDevice.cs +++ b/ColorControl/Services/Samsung/SamsungDevice.cs @@ -44,6 +44,7 @@ namespace ColorControl.Services.Samsung public enum ServiceMenuType { HospitalityMenu, + FactoryMenu2024, } public delegate void GenericDelegate(object sender); @@ -701,35 +702,45 @@ namespace ColorControl.Services.Samsung private async Task ServiceMenuAction(Dictionary _) { - var preset1 = new SamsungPreset("ServiceMenuStep1", null, new[] { "KEY_MUTE:600", "KEY_1:600", "KEY_1:600", "KEY_9:600", "KEY_ENTER:2000" }); - var preset2 = new SamsungPreset("ServiceMenuStep2", null, new[] { "KEY_1", "KEY_2", "KEY_3", "KEY_4", "KEY_UP" }); - var preset3 = new SamsungPreset("ServiceMenuStep3", null, new[] { "KEY_VOLUP:5100:Press", "KEY_VOLUP:500:Release" }); - var rebootPreset = new SamsungPreset("ServiceMenuStep4", null, new[] { "KEY_POWER:5000", "WOL" }); + var serviceMenuTypes = new[] { ServiceMenuType.HospitalityMenu, ServiceMenuType.FactoryMenu2024 }.Select(t => Utils.GetDescription(t)); - var serviceMenuTypes = new[] { ServiceMenuType.HospitalityMenu }.Select(t => Utils.GetDescription(t)); + var serviceMenuTypeField = new FieldDefinition + { + Label = "Service Menu Access Type", + SubLabel = "Both types will not reset your settings. 'Factory Menu 2024' is recommended for 2024 series. Click 'Next >' to continue or 'X' to stop", + FieldType = FieldType.DropDown, + Values = serviceMenuTypes, + Value = ServiceMenuType.HospitalityMenu + }; - if (!MessageForms.ShowDialog($"Access Service Menu", new[] { - new FieldDefinition - { - Label = "Service Menu Access Type", - SubLabel = "'Hospitality Menu' will not reset your settings. Click 'Next >' to continue or 'X' to stop", - FieldType = FieldType.DropDown, - Values = serviceMenuTypes, - Value = ServiceMenuType.HospitalityMenu - } }, okButtonText: "Next >").Any()) + if (!MessageForms.ShowDialog($"Access Service Menu", [serviceMenuTypeField], okButtonText: "Next >").Any()) { return true; } + return serviceMenuTypeField.ValueAsEnum() switch + { + ServiceMenuType.HospitalityMenu => await OpenHospitalityMenu(), + ServiceMenuType.FactoryMenu2024 => await OpenFactoryMenu2024() + }; + } + + private async Task OpenHospitalityMenu() + { + var preset1 = new SamsungPreset("ServiceMenuStep1", null, ["KEY_MUTE:600", "KEY_1:600", "KEY_1:600", "KEY_9:600", "KEY_ENTER:2000"]); + var preset2 = new SamsungPreset("ServiceMenuStep2", null, ["KEY_1", "KEY_2", "KEY_3", "KEY_4", "KEY_UP"]); + var preset3 = new SamsungPreset("ServiceMenuStep3", null, ["KEY_VOLUP:5100:Press", "KEY_VOLUP:500:Release"]); + var rebootPreset = new SamsungPreset("ServiceMenuStep4", null, ["KEY_POWER:5000", "WOL"]); + await ExecutePresetWithProgressAsync(preset1, "Step 1: opening Service Menu. It is normal to see messages like 'Not Available'."); - if (!MessageForms.ShowDialog($"Access Service Menu - Step 2", new[] { + if (!MessageForms.ShowDialog($"Access Service Menu - Step 2", [ new FieldDefinition { Label = "Service Menu opened?", SubLabel = "If the menu is opened with the 'Hospitality Mode' item highlighted and the rest disabled, click 'Next >' to continue or 'X' to stop", FieldType = FieldType.Label - } }, okButtonText: "Next >").Any()) + } ], okButtonText: "Next >").Any()) { return true; } @@ -765,6 +776,43 @@ namespace ColorControl.Services.Samsung return true; } + private async Task OpenFactoryMenu2024() + { + var preset1 = new SamsungPreset("ServiceMenuStep1", null, ["KEY_INFO", "KEY_FACTORY:2000"]); + var preset2 = new SamsungPreset("ServiceMenuStep2", null, ["KEY_UP", "KEY_0", "KEY_0", "KEY_9", "KEY_8"]); + var rebootPreset = new SamsungPreset("ServiceMenuStep4", null, ["KEY_POWER:5000", "WOL"]); + + await ExecutePresetWithProgressAsync(preset1, "Step 1: opening Service Menu. It is normal to see messages like 'Not Available'."); + + var values = MessageForms.ShowDialog($"Access Service Menu - Step 2", new[] { + new FieldDefinition + { + Label = "Service Menu - Advanced", + SubLabel = "If the service menu opened and you want to access the Advanced settings, click 'Next >' or click 'X' to skip", + FieldType = FieldType.Label + } }, okButtonText: "Next >"); + + if (values.Any()) + { + await ExecutePresetWithProgressAsync(preset2, "Step 2: accessing Advanced Service Menu..."); + } + + if (!MessageForms.ShowDialog($"Reboot TV - Final Step", new[] { + new FieldDefinition + { + Label = "Reboot TV", + SubLabel = "After you have made the necessary changes, click 'Reboot TV' to reboot the TV or click 'X' to close. If the TV turns not back on automatically, power it on manually.", + FieldType = FieldType.Label + } }, okButtonText: "Reboot TV").Any()) + { + return true; + } + + await ExecutePresetWithProgressAsync(rebootPreset, "Final Step: rebooting TV..."); + + return true; + } + private async Task ExecutePresetWithProgressAsync(SamsungPreset preset, string text) { var progressForm = MessageForms.ShowProgress(text); diff --git a/ColorControl/Services/Samsung/SamsungPanel.cs b/ColorControl/Services/Samsung/SamsungPanel.cs index 9266f1b..8905921 100644 --- a/ColorControl/Services/Samsung/SamsungPanel.cs +++ b/ColorControl/Services/Samsung/SamsungPanel.cs @@ -6,7 +6,6 @@ using ColorControl.Shared.Contracts; using ColorControl.Shared.EventDispatcher; using ColorControl.Shared.Forms; using ColorControl.Shared.Native; -using ColorControl.Shared.Services; using NLog; using NStandard; using System; @@ -24,16 +23,16 @@ namespace ColorControl.Services.Samsung private Config _config; private SamsungService _samsungService; - private readonly AppContextProvider _appContextProvider; + private readonly GlobalContext _globalContext; private readonly KeyboardShortcutDispatcher _keyboardShortcutDispatcher; private readonly ServiceManager _serviceManager; private string _tabMessage; private bool _disableEvents = false; - public SamsungPanel(SamsungService samsungService, AppContextProvider appContextProvider, KeyboardShortcutDispatcher keyboardShortcutDispatcher, ServiceManager serviceManager) + public SamsungPanel(SamsungService samsungService, GlobalContext globalContext, KeyboardShortcutDispatcher keyboardShortcutDispatcher, ServiceManager serviceManager) { _samsungService = samsungService; - _appContextProvider = appContextProvider; + _globalContext = globalContext; _keyboardShortcutDispatcher = keyboardShortcutDispatcher; _serviceManager = serviceManager; _config = Shared.Common.GlobalContext.CurrentContext.Config; @@ -453,7 +452,7 @@ namespace ColorControl.Services.Samsung if (!string.IsNullOrEmpty(preset.shortcut)) { - WinApi.UnregisterHotKey(_appContextProvider.GetAppContext().MainHandle, preset.id); + WinApi.UnregisterHotKey(_globalContext.MainHandle, preset.id); } _samsungService.GetPresets().Remove(preset); diff --git a/ColorControl/Services/Samsung/SamsungService.cs b/ColorControl/Services/Samsung/SamsungService.cs index 5f7133b..2332638 100644 --- a/ColorControl/Services/Samsung/SamsungService.cs +++ b/ColorControl/Services/Samsung/SamsungService.cs @@ -44,9 +44,9 @@ namespace ColorControl.Services.Samsung public static readonly int SHORTCUTID_SAMSUNGQA = -204; - public SamsungService(AppContextProvider appContextProvider, ServiceManager serviceManager, PowerEventDispatcher powerEventDispatcher, SessionSwitchDispatcher sessionSwitchDispatcher, RestartDetector restartDetector, ProcessEventDispatcher processEventDispatcher, WinApiAdminService winApiAdminService) : base(appContextProvider) + public SamsungService(GlobalContext globalContext, ServiceManager serviceManager, PowerEventDispatcher powerEventDispatcher, SessionSwitchDispatcher sessionSwitchDispatcher, RestartDetector restartDetector, ProcessEventDispatcher processEventDispatcher, WinApiAdminService winApiAdminService) : base(globalContext) { - _appContext = appContextProvider.GetAppContext(); + _appContext = globalContext; _allowPowerOn = _appContext.StartUpParams.RunningFromScheduledTask; _serviceManager = serviceManager; _powerEventDispatcher = powerEventDispatcher; @@ -107,6 +107,11 @@ namespace ColorControl.Services.Samsung { await ExecutePresetsForEvent(PresetTriggerType.Startup); } + + if (_appContext.StartUpParams.ExecuteSamsungPreset) + { + await ExecutePresetAsync(_appContext.StartUpParams.SamsungPresetName); + } } private void LoadConfig() @@ -208,7 +213,7 @@ namespace ColorControl.Services.Samsung { Devices = Config.Devices; - if (!_appContextProvider.GetAppContext().StartUpParams.NoDeviceRefresh) + if (!_globalContext.StartUpParams.NoDeviceRefresh) { var customIpAddresses = Devices.Where(d => d.IsCustom).Select(d => d.IpAddress); diff --git a/ColorControl/Svc/ColorControlBackgroundService.cs b/ColorControl/Svc/ColorControlBackgroundService.cs index c24324b..bdd0648 100644 --- a/ColorControl/Svc/ColorControlBackgroundService.cs +++ b/ColorControl/Svc/ColorControlBackgroundService.cs @@ -249,5 +249,31 @@ namespace ColorControl.Svc } } } + + internal async Task StartAndStopWithMutex() + { + var cancellationTokenSource = new CancellationTokenSource(); + var cancellationToken = cancellationTokenSource.Token; + + var _ = Task.Run(() => CheckMutexAsync(cancellationTokenSource)); + + await StartAsync(cancellationToken); + } + + private void CheckMutexAsync(CancellationTokenSource cancellationTokenSource) + { + var mutex = new Mutex(false, GlobalContext.CurrentContext.MutexId, out var _); + try + { + mutex.WaitOne(); + } + catch (AbandonedMutexException) + { + } + + cancellationTokenSource.Cancel(); + + Environment.Exit(0); + } } } diff --git a/ColorControl/XForms/ColorProfileWindow.xaml.cs b/ColorControl/XForms/ColorProfileWindow.xaml.cs index 9bf73cc..36c9dcc 100644 --- a/ColorControl/XForms/ColorProfileWindow.xaml.cs +++ b/ColorControl/XForms/ColorProfileWindow.xaml.cs @@ -1,4 +1,5 @@ -using ColorControl.Shared.Forms; +using ColorControl.Shared.Common; +using ColorControl.Shared.Forms; using ColorControl.Shared.Native; using ColorControl.Shared.Services; using ColorControl.Shared.XForms; @@ -18,15 +19,15 @@ namespace ColorControl.XForms { private ColorProfileViewModel _viewModel; private readonly WinApiAdminService _winApiAdminService; - private readonly AppContextProvider _appContextProvider; + private readonly GlobalContext _globalContext; - public ColorProfileWindow(WinApiAdminService winApiAdminService, AppContextProvider appContextProvider, bool isHDR) + public ColorProfileWindow(WinApiAdminService winApiAdminService, GlobalContext globalContext, bool isHDR) { _winApiAdminService = winApiAdminService; - _appContextProvider = appContextProvider; + _globalContext = globalContext; _viewModel = new ColorProfileViewModel(isHDR); - _viewModel.SetMinMaxTml = appContextProvider.GetAppContext().Config.SetMinTmlAndMaxTml; + _viewModel.SetMinMaxTml = globalContext.Config.SetMinTmlAndMaxTml; DataContext = _viewModel; InitializeComponent(); @@ -49,8 +50,8 @@ namespace ColorControl.XForms } var winApiAdminService = Program.ServiceProvider.GetRequiredService(); - var appContextProvider = Program.ServiceProvider.GetRequiredService(); - var window = new ColorProfileWindow(winApiAdminService, appContextProvider, isHDR); + var globalContext = Program.ServiceProvider.GetRequiredService(); + var window = new ColorProfileWindow(winApiAdminService, globalContext, isHDR); if (show) { diff --git a/ColorControl/lgtv/LgTvApi.cs b/ColorControl/lgtv/LgTvApi.cs index b8869dc..e330b35 100644 --- a/ColorControl/lgtv/LgTvApi.cs +++ b/ColorControl/lgtv/LgTvApi.cs @@ -134,6 +134,16 @@ namespace LgTv bool_true } + public enum WhiteBalanceMethod + { + [Description("2-points")] + _2, + [Description("20-points")] + _10, + [Description("22-points")] + _22 + } + public enum GammaExp { low, diff --git a/Shared/Common/GlobalContext.cs b/Shared/Common/GlobalContext.cs index ccbdf93..453f55d 100644 --- a/Shared/Common/GlobalContext.cs +++ b/Shared/Common/GlobalContext.cs @@ -20,7 +20,7 @@ namespace ColorControl.Shared.Common public DateTime StartTime { get; private set; } = DateTime.Now; public string MutexId { get; private set; } public nint MainHandle { get; set; } - public IServiceProvider ServiceProvider { get; private set; } + public IServiceProvider ServiceProvider { get; set; } public string ApplicationTitle { get; private set; } public string ApplicationTitleAdmin { get; private set; } diff --git a/Shared/EventDispatcher/ProcessEventDispatcher.cs b/Shared/EventDispatcher/ProcessEventDispatcher.cs index bea6d5b..4e9e10f 100644 --- a/Shared/EventDispatcher/ProcessEventDispatcher.cs +++ b/Shared/EventDispatcher/ProcessEventDispatcher.cs @@ -37,11 +37,11 @@ public class ProcessEventDispatcher : EventDispatcher protected static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); - private AppContextProvider _appContextProvider { get; } + private GlobalContext _globalContext { get; } - public ProcessEventDispatcher(AppContextProvider appContextProvider) + public ProcessEventDispatcher(GlobalContext globalContext) { - _appContextProvider = appContextProvider; + _globalContext = globalContext; IsRunning = true; @@ -62,7 +62,7 @@ public class ProcessEventDispatcher : EventDispatcher while (IsRunning) { - await Task.Delay(_appContextProvider.GetAppContext().Config.ProcessMonitorPollingInterval); + await Task.Delay(_globalContext.Config.ProcessMonitorPollingInterval); if (!HasHandlers(Event_ProcessChanged)) { diff --git a/Shared/EventDispatcher/WindowMessageDispatcher.cs b/Shared/EventDispatcher/WindowMessageDispatcher.cs index 3a0fb5f..a3ce468 100644 --- a/Shared/EventDispatcher/WindowMessageDispatcher.cs +++ b/Shared/EventDispatcher/WindowMessageDispatcher.cs @@ -1,4 +1,4 @@ -using ColorControl.Shared.Services; +using ColorControl.Shared.Common; using NWin32; namespace ColorControl.Shared.EventDispatcher; @@ -22,9 +22,10 @@ public class WindowMessageDispatcher : EventDispatcher public const string Event_WindowMessageClose = "WindowMessageClose"; public const string Event_WindowMessagePowerBroadcast = "WindowMessagePowerBroadcast"; public const string Event_WindowMessageShowWindow = "WindowMessageShowWindow"; + public const string Event_WindowMessageUserBringToFront = "WindowMessageUserBringToFront"; private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); - private readonly AppContextProvider _appContextProvider; + private readonly GlobalContext _globalContext; public DummyForm MessageForm { get; set; } @@ -34,16 +35,17 @@ public class WindowMessageDispatcher : EventDispatcher { NativeConstants.WM_QUERYENDSESSION, Event_WindowMessageQueryEndSession }, { NativeConstants.WM_CLOSE, Event_WindowMessageClose }, { NativeConstants.WM_POWERBROADCAST, Event_WindowMessagePowerBroadcast }, - { NativeConstants.WM_SHOWWINDOW, Event_WindowMessageShowWindow } + { NativeConstants.WM_SHOWWINDOW, Event_WindowMessageShowWindow }, + { Utils.WM_BRINGTOFRONT, Event_WindowMessageUserBringToFront } }; - public WindowMessageDispatcher(AppContextProvider appContextProvider) + public WindowMessageDispatcher(GlobalContext globalContext) { MessageForm = new DummyForm(); MessageForm.OnMessage += MessageForm_OnMessage; - _appContextProvider = appContextProvider; + _globalContext = globalContext; - _appContextProvider.GetAppContext().MainHandle = MessageForm.Handle; + _globalContext.MainHandle = MessageForm.Handle; } private void MessageForm_OnMessage(object sender, Message e) diff --git a/Shared/Native/CCD.cs b/Shared/Native/CCD.cs index 371d80a..baac65e 100644 --- a/Shared/Native/CCD.cs +++ b/Shared/Native/CCD.cs @@ -3,6 +3,7 @@ using MHC2Gen; using NWin32; using System.ComponentModel; using System.IO; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace ColorControl.Shared.Native @@ -63,6 +64,19 @@ namespace ColorControl.Shared.Native } } + public static void GetAllPaths() + { + uint numPathArrayElements; + uint numModeInfoArrayElements; + + NativeMethods.GetDisplayConfigBufferSizes(QueryDisplayFlags.AllPaths, out numPathArrayElements, out numModeInfoArrayElements); + + var pathArray = new DisplayConfigPathInfo[numPathArrayElements]; + var modeArray = new DisplayConfigModeInfo[numModeInfoArrayElements]; + + var result = NativeMethods.QueryDisplayConfig(QueryDisplayFlags.AllPaths, ref numPathArrayElements, pathArray, ref numModeInfoArrayElements, modeArray, out Unsafe.NullRef()); + } + public static LUID GetAdapterId(string displayName = null) { return ExecuteForModeConfig((modeInfo) => diff --git a/Shared/Services/AppContextProvider.cs b/Shared/Services/AppContextProvider.cs deleted file mode 100644 index ffdca56..0000000 --- a/Shared/Services/AppContextProvider.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace ColorControl.Shared.Services -{ - public class AppContextProvider - { - private Common.GlobalContext _appContext; - - public void SetAppContext(Common.GlobalContext appContext) - { - _appContext = appContext; - } - - public Common.GlobalContext GetAppContext() - { - return _appContext; - } - - } -} diff --git a/Shared/Services/WinElevatedProcessManager.cs b/Shared/Services/WinElevatedProcessManager.cs index 92362e0..7d90c06 100644 --- a/Shared/Services/WinElevatedProcessManager.cs +++ b/Shared/Services/WinElevatedProcessManager.cs @@ -1,6 +1,5 @@ using ColorControl.Shared.Common; using ColorControl.Shared.Contracts; -using NWin32; using System.Diagnostics; namespace ColorControl.Shared.Services; @@ -73,36 +72,17 @@ public class WinElevatedProcessManager return 0; } - - private static nint ElevatedProcessWindowHandle = nint.Zero; + private static int ElevatedProcessId; public void CheckElevatedProcess() { - ElevatedProcessWindowHandle = NativeMethods.FindWindowW(null, "ElevatedForm"); - - if (ElevatedProcessWindowHandle != nint.Zero) + if (ElevatedProcessId != 0 && !Process.GetProcessById(ElevatedProcessId).HasExited) { return; } - ExecuteDirect(StartUpParams.StartElevatedParam, false); + ElevatedProcessId = ExecuteDirect(StartUpParams.StartElevatedParam, false); - var delay = 1000; - - while (delay >= 0) - { - Thread.Sleep(100); - - ElevatedProcessWindowHandle = NativeMethods.FindWindowW(null, "ElevatedForm"); - - if (ElevatedProcessWindowHandle != nint.Zero) - { - Thread.Sleep(500); - break; - } - - delay -= 100; - } + Thread.Sleep(500); } - }