From bce1dc5ffe8a772c4265a1487741be02e8e04e05 Mon Sep 17 00:00:00 2001 From: emoacht Date: Sat, 27 Aug 2022 11:09:46 +0900 Subject: [PATCH 1/7] Move IsInternal property --- Source/Monitorian.Core/Models/Monitor/DdcMonitorItem.cs | 1 + Source/Monitorian.Core/Models/Monitor/IMonitor.cs | 1 + Source/Monitorian.Core/Models/Monitor/MonitorItem.cs | 4 ++++ .../Models/Monitor/UnreachableMonitorItem.cs | 4 +--- Source/Monitorian.Core/Models/Monitor/WmiMonitorItem.cs | 7 +++---- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Source/Monitorian.Core/Models/Monitor/DdcMonitorItem.cs b/Source/Monitorian.Core/Models/Monitor/DdcMonitorItem.cs index 1f0f758c..eec55b6b 100644 --- a/Source/Monitorian.Core/Models/Monitor/DdcMonitorItem.cs +++ b/Source/Monitorian.Core/Models/Monitor/DdcMonitorItem.cs @@ -33,6 +33,7 @@ public DdcMonitorItem( displayIndex: displayIndex, monitorIndex: monitorIndex, monitorRect: monitorRect, + isInternal: false, isReachable: true) { this._handle = handle ?? throw new ArgumentNullException(nameof(handle)); diff --git a/Source/Monitorian.Core/Models/Monitor/IMonitor.cs b/Source/Monitorian.Core/Models/Monitor/IMonitor.cs index cb825041..dbcc86ee 100644 --- a/Source/Monitorian.Core/Models/Monitor/IMonitor.cs +++ b/Source/Monitorian.Core/Models/Monitor/IMonitor.cs @@ -14,6 +14,7 @@ public interface IMonitor : IDisposable byte DisplayIndex { get; } byte MonitorIndex { get; } Rect MonitorRect { get; } + bool IsInternal { get; } bool IsReachable { get; } bool IsBrightnessSupported { get; } bool IsContrastSupported { get; } diff --git a/Source/Monitorian.Core/Models/Monitor/MonitorItem.cs b/Source/Monitorian.Core/Models/Monitor/MonitorItem.cs index 9285c15f..d7c9b9ca 100644 --- a/Source/Monitorian.Core/Models/Monitor/MonitorItem.cs +++ b/Source/Monitorian.Core/Models/Monitor/MonitorItem.cs @@ -16,6 +16,7 @@ internal abstract class MonitorItem : IMonitor, IDisposable public byte DisplayIndex { get; } public byte MonitorIndex { get; } public Rect MonitorRect { get; } + public bool IsInternal { get; } public bool IsReachable { get; } public virtual bool IsBrightnessSupported => IsReachable; @@ -28,6 +29,7 @@ public MonitorItem( byte displayIndex, byte monitorIndex, Rect monitorRect, + bool isInternal, bool isReachable) { if (string.IsNullOrWhiteSpace(deviceInstanceId)) @@ -40,6 +42,7 @@ public MonitorItem( this.DisplayIndex = displayIndex; this.MonitorIndex = monitorIndex; this.MonitorRect = monitorRect; + this.IsInternal = isInternal; this.IsReachable = isReachable; } @@ -63,6 +66,7 @@ public override string ToString() (nameof(DisplayIndex), DisplayIndex), (nameof(MonitorIndex), MonitorIndex), (nameof(MonitorRect), MonitorRect), + (nameof(IsInternal), IsInternal), (nameof(IsReachable), IsReachable), (nameof(IsBrightnessSupported), IsBrightnessSupported), (nameof(IsContrastSupported), IsContrastSupported), diff --git a/Source/Monitorian.Core/Models/Monitor/UnreachableMonitorItem.cs b/Source/Monitorian.Core/Models/Monitor/UnreachableMonitorItem.cs index 381f26a3..83bc84ee 100644 --- a/Source/Monitorian.Core/Models/Monitor/UnreachableMonitorItem.cs +++ b/Source/Monitorian.Core/Models/Monitor/UnreachableMonitorItem.cs @@ -9,8 +9,6 @@ namespace Monitorian.Core.Models.Monitor { internal class UnreachableMonitorItem : MonitorItem { - public bool IsInternal { get; } - public UnreachableMonitorItem( string deviceInstanceId, string description, @@ -22,9 +20,9 @@ public UnreachableMonitorItem( displayIndex: displayIndex, monitorIndex: monitorIndex, monitorRect: Rect.Empty, + isInternal: isInternal, isReachable: false) { - this.IsInternal = isInternal; } public override AccessResult UpdateBrightness(int brightness = -1) => AccessResult.Failed; diff --git a/Source/Monitorian.Core/Models/Monitor/WmiMonitorItem.cs b/Source/Monitorian.Core/Models/Monitor/WmiMonitorItem.cs index f4c55ce0..cd20794a 100644 --- a/Source/Monitorian.Core/Models/Monitor/WmiMonitorItem.cs +++ b/Source/Monitorian.Core/Models/Monitor/WmiMonitorItem.cs @@ -14,7 +14,6 @@ namespace Monitorian.Core.Models.Monitor /// internal class WmiMonitorItem : MonitorItem { - private readonly bool _isInternal; private readonly byte[] _brightnessLevels; public WmiMonitorItem( @@ -30,15 +29,15 @@ public WmiMonitorItem( displayIndex: displayIndex, monitorIndex: monitorIndex, monitorRect: monitorRect, + isInternal: isInternal, isReachable: true) { - this._isInternal = isInternal; this._brightnessLevels = brightnessLevels?.ToArray() ?? throw new ArgumentNullException(nameof(brightnessLevels)); } public override AccessResult UpdateBrightness(int brightness = -1) { - if (_isInternal) + if (IsInternal) { this.Brightness = PowerManagement.GetActiveSchemeBrightness(); @@ -62,7 +61,7 @@ public override AccessResult SetBrightness(int brightness) if (brightness is < 0 or > 100) throw new ArgumentOutOfRangeException(nameof(brightness), brightness, "The brightness must be within 0 to 100."); - if (_isInternal) + if (IsInternal) { if (PowerManagement.SetActiveSchemeBrightness(brightness)) { From 0f6deaf3d409c6805cd3f2df3544ae27b6d03e43 Mon Sep 17 00:00:00 2001 From: emoacht Date: Sun, 28 Aug 2022 01:21:37 +0900 Subject: [PATCH 2/7] Modify function to scan monitors adding timeout and cancellation --- Source/Monitorian.Core/AppControllerCore.cs | 2 +- .../Models/Monitor/MonitorManager.cs | 217 +++++++++--------- 2 files changed, 111 insertions(+), 108 deletions(-) diff --git a/Source/Monitorian.Core/AppControllerCore.cs b/Source/Monitorian.Core/AppControllerCore.cs index 0f23533f..aa1068d0 100644 --- a/Source/Monitorian.Core/AppControllerCore.cs +++ b/Source/Monitorian.Core/AppControllerCore.cs @@ -263,7 +263,7 @@ await Task.Run(async () => var oldMonitorIndices = Enumerable.Range(0, Monitors.Count).ToList(); var newMonitorItems = new List(); - foreach (var item in await MonitorManager.EnumerateMonitorsAsync()) + foreach (var item in await MonitorManager.EnumerateMonitorsAsync(TimeSpan.FromSeconds(12))) { Recorder.AddGroupRecordItem("Items", item.ToString()); diff --git a/Source/Monitorian.Core/Models/Monitor/MonitorManager.cs b/Source/Monitorian.Core/Models/Monitor/MonitorManager.cs index b6e0a48e..6d27ec10 100644 --- a/Source/Monitorian.Core/Models/Monitor/MonitorManager.cs +++ b/Source/Monitorian.Core/Models/Monitor/MonitorManager.cs @@ -8,6 +8,7 @@ using System.Runtime.Serialization.Json; using System.Text; using System.Text.RegularExpressions; +using System.Threading; using System.Threading.Tasks; using Monitorian.Core.Helper; @@ -18,7 +19,7 @@ internal class MonitorManager { #region Type - private class DeviceItemPlus + private class BasicItem { private readonly DeviceContext.DeviceItem _deviceItem; @@ -29,7 +30,7 @@ private class DeviceItemPlus public byte MonitorIndex => _deviceItem.MonitorIndex; public bool IsInternal { get; } - public DeviceItemPlus( + public BasicItem( DeviceContext.DeviceItem deviceItem, string alternateDescription = null, bool isInternal = true) @@ -66,25 +67,18 @@ private static HashSet GetOptionIds(string option) #endregion - public static async Task> EnumerateMonitorsAsync() - { - var deviceItems = await GetMonitorDevicesAsync(); - - return EnumerateMonitors(deviceItems); - } - private static HashSet _foundIds; - private static async Task> GetMonitorDevicesAsync() + public static async Task> EnumerateMonitorsAsync(TimeSpan timeout, CancellationToken cancellationToken = default) { + var deviceItems = DeviceContext.EnumerateMonitorDevices().ToArray(); + _foundIds = new HashSet(deviceItems.Select(x => x.DeviceInstanceId)); + IDisplayItem[] displayItems = OsVersion.Is10Build17134OrGreater ? await DisplayMonitor.GetDisplayMonitorsAsync() : DisplayConfig.EnumerateDisplayConfigs().ToArray(); - var deviceItems = DeviceContext.EnumerateMonitorDevices().ToArray(); - _foundIds = new HashSet(deviceItems.Select(x => x.DeviceInstanceId)); - - IEnumerable Enumerate() + IEnumerable EnumerateBasicItems() { foreach (var deviceItem in deviceItems) { @@ -94,135 +88,144 @@ IEnumerable Enumerate() var displayItem = displayItems.FirstOrDefault(x => string.Equals(deviceItem.DeviceInstanceId, x.DeviceInstanceId, StringComparison.OrdinalIgnoreCase)); if (displayItem is null) { - yield return new DeviceItemPlus(deviceItem); + yield return new BasicItem(deviceItem); } else if (!string.IsNullOrWhiteSpace(displayItem.DisplayName)) { - yield return new DeviceItemPlus(deviceItem, displayItem.DisplayName, displayItem.IsInternal); + yield return new BasicItem(deviceItem, displayItem.DisplayName, displayItem.IsInternal); } else if (Regex.IsMatch(deviceItem.Description, "^Generic (?:PnP|Non-PnP) Monitor$", RegexOptions.IgnoreCase) && !string.IsNullOrWhiteSpace(displayItem.ConnectionDescription)) { - yield return new DeviceItemPlus(deviceItem, $"{deviceItem.Description} ({displayItem.ConnectionDescription})", displayItem.IsInternal); + yield return new BasicItem(deviceItem, $"{deviceItem.Description} ({displayItem.ConnectionDescription})", displayItem.IsInternal); } else { - yield return new DeviceItemPlus(deviceItem, null, displayItem.IsInternal); + yield return new BasicItem(deviceItem, null, displayItem.IsInternal); } } } - return Enumerate().Where(x => !string.IsNullOrWhiteSpace(x.AlternateDescription)).ToList(); - } - - private static IEnumerable EnumerateMonitors(List deviceItems) - { - if (deviceItems is not { Count: > 0 }) - yield break; + var basicItems = EnumerateBasicItems().Where(x => !string.IsNullOrWhiteSpace(x.AlternateDescription)).ToList(); + if (basicItems.Count == 0) + return Enumerable.Empty(); var handleItems = DeviceContext.GetMonitorHandles(); - // Obtained by DDC/CI - foreach (var handleItem in handleItems) + var physicalItemsTasks = handleItems + .Select(x => Task.Run(() => (x, physicalItems: MonitorConfiguration.EnumeratePhysicalMonitors(x.MonitorHandle)))) + .ToArray(); + + await Task.WhenAny(Task.WhenAll(physicalItemsTasks), Task.Delay(timeout, cancellationToken)); + cancellationToken.ThrowIfCancellationRequested(); + + var physicalItemsPairs = physicalItemsTasks.Where(x => x.Status == TaskStatus.RanToCompletion).Select(x => x.Result); + + IEnumerable EnumerateMonitorItems() { - foreach (var physicalItem in MonitorConfiguration.EnumeratePhysicalMonitors(handleItem.MonitorHandle)) + // Obtained by DDC/CI + foreach ((var handleItem, var physicalItems) in physicalItemsPairs) { - int index = -1; - if (physicalItem.Capability.IsBrightnessSupported || - _preclearedIds.Value.Any()) - { - index = deviceItems.FindIndex(x => - !x.IsInternal && - (x.DisplayIndex == handleItem.DisplayIndex) && - (x.MonitorIndex == physicalItem.MonitorIndex) && - string.Equals(x.Description, physicalItem.Description, StringComparison.OrdinalIgnoreCase)); - } - if (index < 0) + foreach (var physicalItem in physicalItems) { - physicalItem.Handle.Dispose(); - continue; + int index = -1; + if (physicalItem.Capability.IsBrightnessSupported || + _preclearedIds.Value.Any()) + { + index = basicItems.FindIndex(x => + !x.IsInternal && + (x.DisplayIndex == handleItem.DisplayIndex) && + (x.MonitorIndex == physicalItem.MonitorIndex) && + string.Equals(x.Description, physicalItem.Description, StringComparison.OrdinalIgnoreCase)); + } + if (index < 0) + { + physicalItem.Handle.Dispose(); + continue; + } + + var basicItem = basicItems[index]; + + MonitorCapability capability = null; + if (physicalItem.Capability.IsBrightnessSupported) + { + capability = physicalItem.Capability; + } + else if (_preclearedIds.Value.Contains(basicItem.DeviceInstanceId)) + { + capability = MonitorCapability.PreclearedCapability; + } + else + { + physicalItem.Handle.Dispose(); + continue; + } + + yield return new DdcMonitorItem( + deviceInstanceId: basicItem.DeviceInstanceId, + description: basicItem.AlternateDescription, + displayIndex: basicItem.DisplayIndex, + monitorIndex: basicItem.MonitorIndex, + monitorRect: handleItem.MonitorRect, + handle: physicalItem.Handle, + capability: capability); + + basicItems.RemoveAt(index); + if (basicItems.Count == 0) + yield break; } + } - var deviceItem = deviceItems[index]; + // Obtained by WMI + foreach (var desktopItem in MSMonitor.EnumerateDesktopMonitors()) + { + if (desktopItem.BrightnessLevels is not { Length: > 0 }) + continue; - MonitorCapability capability = null; - if (physicalItem.Capability.IsBrightnessSupported) - { - capability = physicalItem.Capability; - } - else if (_preclearedIds.Value.Contains(deviceItem.DeviceInstanceId)) + foreach (var handleItem in handleItems) { - capability = MonitorCapability.PreclearedCapability; - } - else - { - physicalItem.Handle.Dispose(); - continue; + int index = basicItems.FindIndex(x => + (x.DisplayIndex == handleItem.DisplayIndex) && + string.Equals(x.DeviceInstanceId, desktopItem.DeviceInstanceId, StringComparison.OrdinalIgnoreCase)); + if (index < 0) + continue; + + var basicItem = basicItems[index]; + yield return new WmiMonitorItem( + deviceInstanceId: basicItem.DeviceInstanceId, + description: basicItem.AlternateDescription, + displayIndex: basicItem.DisplayIndex, + monitorIndex: basicItem.MonitorIndex, + monitorRect: handleItem.MonitorRect, + isInternal: basicItem.IsInternal, + brightnessLevels: desktopItem.BrightnessLevels); + + basicItems.RemoveAt(index); + if (basicItems.Count == 0) + yield break; } - - yield return new DdcMonitorItem( - deviceInstanceId: deviceItem.DeviceInstanceId, - description: deviceItem.AlternateDescription, - displayIndex: deviceItem.DisplayIndex, - monitorIndex: deviceItem.MonitorIndex, - monitorRect: handleItem.MonitorRect, - handle: physicalItem.Handle, - capability: capability); - - deviceItems.RemoveAt(index); - if (deviceItems.Count == 0) - yield break; } - } - - // Obtained by WMI - foreach (var desktopItem in MSMonitor.EnumerateDesktopMonitors()) - { - if (!desktopItem.BrightnessLevels.Any()) - continue; - foreach (var handleItem in handleItems) + // Unreachable neither by DDC/CI nor by WMI + foreach (var basicItem in basicItems) { - int index = deviceItems.FindIndex(x => - (x.DisplayIndex == handleItem.DisplayIndex) && - string.Equals(x.DeviceInstanceId, desktopItem.DeviceInstanceId, StringComparison.OrdinalIgnoreCase)); - if (index < 0) - continue; - - var deviceItem = deviceItems[index]; - yield return new WmiMonitorItem( - deviceInstanceId: deviceItem.DeviceInstanceId, - description: deviceItem.AlternateDescription, - displayIndex: deviceItem.DisplayIndex, - monitorIndex: deviceItem.MonitorIndex, - monitorRect: handleItem.MonitorRect, - isInternal: deviceItem.IsInternal, - brightnessLevels: desktopItem.BrightnessLevels); - - deviceItems.RemoveAt(index); - if (deviceItems.Count == 0) - yield break; + yield return new UnreachableMonitorItem( + deviceInstanceId: basicItem.DeviceInstanceId, + description: basicItem.AlternateDescription, + displayIndex: basicItem.DisplayIndex, + monitorIndex: basicItem.MonitorIndex, + isInternal: basicItem.IsInternal); } } - // Unreachable neither by DDC/CI nor by WMI - foreach (var deviceItem in deviceItems) - { - yield return new UnreachableMonitorItem( - deviceInstanceId: deviceItem.DeviceInstanceId, - description: deviceItem.AlternateDescription, - displayIndex: deviceItem.DisplayIndex, - monitorIndex: deviceItem.MonitorIndex, - isInternal: deviceItem.IsInternal); - } + return EnumerateMonitorItems(); } public static bool CheckMonitorsChanged() { - var newIds = new HashSet(DeviceContext.EnumerateMonitorDevices().Select(x => x.DeviceInstanceId)); var oldIds = _foundIds; - _foundIds = newIds; - return (oldIds?.SetEquals(newIds) is not true); + _foundIds = new HashSet(DeviceContext.EnumerateMonitorDevices().Select(x => x.DeviceInstanceId)); + return (oldIds?.SetEquals(_foundIds) is not true); } #region Probe From ed2bebf73810223f920ccb25676f8493c3d3fe1d Mon Sep 17 00:00:00 2001 From: emoacht Date: Sun, 28 Aug 2022 22:49:32 +0900 Subject: [PATCH 3/7] Modify AppData service --- .../Monitorian.Core/Models/AppDataService.cs | 24 ++++++------------- Source/Monitorian.Core/Models/Logger.cs | 4 +--- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/Source/Monitorian.Core/Models/AppDataService.cs b/Source/Monitorian.Core/Models/AppDataService.cs index da66ff68..f272b3a5 100644 --- a/Source/Monitorian.Core/Models/AppDataService.cs +++ b/Source/Monitorian.Core/Models/AppDataService.cs @@ -12,22 +12,16 @@ namespace Monitorian.Core.Models { public static class AppDataService { - public static string FolderPath => _folderPath ??= GetFolderPath(); + public static string FolderPath => _folderPath ??= + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), ProductInfo.Product); private static string _folderPath; - private static string GetFolderPath() - { - var appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); - if (string.IsNullOrEmpty(appDataPath)) // This should not happen. - throw new DirectoryNotFoundException(); - - return Path.Combine(appDataPath, ProductInfo.Product); - } - - public static void AssureFolder() + public static string EnsureFolderPath() { if (!Directory.Exists(FolderPath)) Directory.CreateDirectory(FolderPath); + + return FolderPath; } #region Access @@ -54,9 +48,7 @@ public static async Task ReadAsync(string fileName) public static async Task WriteAsync(string fileName, bool append, string content) { - AssureFolder(); - - var filePath = Path.Combine(FolderPath, fileName); + var filePath = Path.Combine(EnsureFolderPath(), fileName); using var sw = new StreamWriter(filePath, append, Encoding.UTF8); // BOM will be emitted. await sw.WriteAsync(content); @@ -147,9 +139,7 @@ public static void Load(T instance, string fileName, BindingFlags flags, IEnu /// Known types of members of instance public static void Save(T instance, string fileName, IEnumerable knownTypes = null) where T : class { - AssureFolder(); - - var filePath = Path.Combine(FolderPath, fileName); + var filePath = Path.Combine(EnsureFolderPath(), fileName); using var sw = new StreamWriter(filePath, false, Encoding.UTF8); using var xw = XmlWriter.Create(sw, new XmlWriterSettings { Indent = true }); diff --git a/Source/Monitorian.Core/Models/Logger.cs b/Source/Monitorian.Core/Models/Logger.cs index 5b2710f8..c9c4394b 100644 --- a/Source/Monitorian.Core/Models/Logger.cs +++ b/Source/Monitorian.Core/Models/Logger.cs @@ -249,9 +249,7 @@ private static void RecordToAppData(string fileName, string content, int capacit { try { - AppDataService.AssureFolder(); - - var appDataFilePath = Path.Combine(AppDataService.FolderPath, fileName); + var appDataFilePath = Path.Combine(AppDataService.EnsureFolderPath(), fileName); UpdateContent(appDataFilePath, content, capacity); } From 96f29c09683ded5833e878fee63570f18d8ab602 Mon Sep 17 00:00:00 2001 From: emoacht Date: Sun, 28 Aug 2022 22:50:05 +0900 Subject: [PATCH 4/7] Refactor --- Source/Monitorian.Core/Helper/ArraySearch.cs | 2 +- Source/Monitorian.Core/Models/Monitor/MSMonitor.cs | 6 ++---- .../Monitorian.Core/Models/Monitor/PowerManagement.cs | 11 +++++------ 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Source/Monitorian.Core/Helper/ArraySearch.cs b/Source/Monitorian.Core/Helper/ArraySearch.cs index 7abaa87a..cbf42e6b 100644 --- a/Source/Monitorian.Core/Helper/ArraySearch.cs +++ b/Source/Monitorian.Core/Helper/ArraySearch.cs @@ -26,7 +26,7 @@ public static int GetNearestIndex(byte[] array, byte target) => public static int GetNearestIndex(T[] array, T target, Func measure) where T : IComparable { - if (array is null or { Length: 0 }) + if (array is not { Length: > 0 }) throw new ArgumentNullException(nameof(array)); // The source array must be sorted beforehand. diff --git a/Source/Monitorian.Core/Models/Monitor/MSMonitor.cs b/Source/Monitorian.Core/Models/Monitor/MSMonitor.cs index 8e55021e..12d42776 100644 --- a/Source/Monitorian.Core/Models/Monitor/MSMonitor.cs +++ b/Source/Monitorian.Core/Models/Monitor/MSMonitor.cs @@ -32,7 +32,7 @@ public class DesktopItem [OnSerializing] private void OnSerializing(StreamingContext context) { - _brightnessLevelsString = string.Join(" ", BrightnessLevels ?? Array.Empty()); + _brightnessLevelsString = string.Join(" ", BrightnessLevels ?? Enumerable.Empty()); } public DesktopItem( @@ -246,10 +246,8 @@ public static (ManagementEventWatcher watcher, string message) StartBrightnessEv { try { - var scope = @"root\wmi"; - var query = "SELECT * FROM WmiMonitorBrightnessEvent"; var option = new EventWatcherOptions(null, TimeSpan.FromSeconds(1), 1); - var watcher = new ManagementEventWatcher(scope, query, option); + var watcher = new ManagementEventWatcher(@"root\wmi", "SELECT * FROM WmiMonitorBrightnessEvent", option); watcher.Start(); diff --git a/Source/Monitorian.Core/Models/Monitor/PowerManagement.cs b/Source/Monitorian.Core/Models/Monitor/PowerManagement.cs index ca194243..5c95bf18 100644 --- a/Source/Monitorian.Core/Models/Monitor/PowerManagement.cs +++ b/Source/Monitorian.Core/Models/Monitor/PowerManagement.cs @@ -143,12 +143,11 @@ private static bool IsSettingAdaptiveBrightnessAdded() try { - using (var key = Registry.LocalMachine.OpenSubKey(name)) - { - // 1: Remove - // 2: Add - return ((int)key.GetValue("Attributes") == 2); - } + using var key = Registry.LocalMachine.OpenSubKey(name); + + // 1: Remove + // 2: Add + return ((int)key.GetValue("Attributes") == 2); } catch (Exception ex) { From af6e7f04f768091de638cd3a8600cf75cf9ef452 Mon Sep 17 00:00:00 2001 From: Steve <51911097+uDEV2019@users.noreply.github.com> Date: Tue, 2 Aug 2022 18:43:13 +0200 Subject: [PATCH 5/7] updated german translation --- Source/Monitorian.Core/Properties/Resources.de.resx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Source/Monitorian.Core/Properties/Resources.de.resx b/Source/Monitorian.Core/Properties/Resources.de.resx index 46516ae9..80bfbf70 100644 --- a/Source/Monitorian.Core/Properties/Resources.de.resx +++ b/Source/Monitorian.Core/Properties/Resources.de.resx @@ -165,6 +165,9 @@ Monitore neu abfragen + + Helligkeit bei Wiederverbinden wiederherstellen + Einstellungen @@ -189,4 +192,4 @@ Große Schieberegler verwenden - \ No newline at end of file + From dd25a4b036af4dd899c4f76cc4d43e4cb7ccbae7 Mon Sep 17 00:00:00 2001 From: emoacht Date: Sun, 28 Aug 2022 23:27:17 +0900 Subject: [PATCH 6/7] Cut line ending --- Source/Monitorian.Core/Properties/Resources.de.resx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Monitorian.Core/Properties/Resources.de.resx b/Source/Monitorian.Core/Properties/Resources.de.resx index 80bfbf70..7cf97150 100644 --- a/Source/Monitorian.Core/Properties/Resources.de.resx +++ b/Source/Monitorian.Core/Properties/Resources.de.resx @@ -192,4 +192,4 @@ Große Schieberegler verwenden - + \ No newline at end of file From f0f568577e6a89e887b678d1dfced59ead3db2b1 Mon Sep 17 00:00:00 2001 From: emoacht Date: Sun, 28 Aug 2022 23:39:01 +0900 Subject: [PATCH 7/7] Increment minor version --- Source/Installer/Product.wxs | 2 +- Source/Monitorian.Core/Properties/AssemblyInfo.cs | 4 ++-- Source/Monitorian/Properties/AssemblyInfo.cs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/Installer/Product.wxs b/Source/Installer/Product.wxs index 8e9ebc14..1d8f0d86 100644 --- a/Source/Installer/Product.wxs +++ b/Source/Installer/Product.wxs @@ -1,6 +1,6 @@  -