This commit is contained in:
PhyxionNL
2022-06-27 19:07:18 +02:00
parent b0de6e3ad7
commit 54a407dc50
2 changed files with 306 additions and 266 deletions
+242 -205
View File
@@ -10,7 +10,6 @@ using System.ComponentModel;
using System.Drawing; using System.Drawing;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Windows.Forms; using System.Windows.Forms;
using Aga.Controls.Tree; using Aga.Controls.Tree;
using Aga.Controls.Tree.NodeControls; using Aga.Controls.Tree.NodeControls;
@@ -18,51 +17,46 @@ using LibreHardwareMonitor.Hardware;
using LibreHardwareMonitor.Utilities; using LibreHardwareMonitor.Utilities;
using LibreHardwareMonitor.Wmi; using LibreHardwareMonitor.Wmi;
namespace LibreHardwareMonitor.UI namespace LibreHardwareMonitor.UI
{ {
public sealed partial class MainForm : Form public sealed partial class MainForm : Form
{ {
private int _delayCount;
private readonly PersistentSettings _settings;
private readonly UnitManager _unitManager;
private readonly Computer _computer;
private readonly Node _root;
private IDictionary<ISensor, Color> _sensorPlotColors = new Dictionary<ISensor, Color>();
private readonly Color[] _plotColorPalette;
private readonly SystemTray _systemTray;
private readonly StartupManager _startupManager = new StartupManager();
private readonly UpdateVisitor _updateVisitor = new UpdateVisitor();
private readonly SensorGadget _gadget;
private Form _plotForm;
private readonly PlotPanel _plotPanel;
private UserOption _showPlot;
private readonly UserOption _minimizeToTray;
private readonly UserOption _minimizeOnClose;
private readonly UserOption _autoStart; private readonly UserOption _autoStart;
private readonly Computer _computer;
private readonly UserOption _readMainboardSensors; private readonly SensorGadget _gadget;
private readonly Logger _logger;
private readonly UserRadioGroup _loggingInterval;
private readonly UserOption _logSensors;
private readonly UserOption _minimizeOnClose;
private readonly UserOption _minimizeToTray;
private readonly Color[] _plotColorPalette;
private readonly PlotPanel _plotPanel;
private readonly UserOption _readBatterySensors;
private readonly UserOption _readCpuSensors; private readonly UserOption _readCpuSensors;
private readonly UserOption _readRamSensors;
private readonly UserOption _readGpuSensors;
private readonly UserOption _readFanControllersSensors; private readonly UserOption _readFanControllersSensors;
private readonly UserOption _readGpuSensors;
private readonly UserOption _readHddSensors; private readonly UserOption _readHddSensors;
private readonly UserOption _readMainboardSensors;
private readonly UserOption _readNicSensors; private readonly UserOption _readNicSensors;
private readonly UserOption _readPsuSensors; private readonly UserOption _readPsuSensors;
private readonly UserOption _readBatterySensors; private readonly UserOption _readRamSensors;
private readonly Node _root;
private readonly UserOption _runWebServer;
private readonly UserRadioGroup _sensorValuesTimeWindow;
private readonly PersistentSettings _settings;
private readonly UserOption _showGadget; private readonly UserOption _showGadget;
private UserRadioGroup _plotLocation; private readonly StartupManager _startupManager = new();
private readonly SystemTray _systemTray;
private readonly UnitManager _unitManager;
private readonly UpdateVisitor _updateVisitor = new();
private readonly WmiProvider _wmiProvider; private readonly WmiProvider _wmiProvider;
private readonly UserOption _runWebServer; private int _delayCount;
private readonly UserOption _logSensors; private Form _plotForm;
private readonly UserRadioGroup _loggingInterval; private UserRadioGroup _plotLocation;
private readonly UserRadioGroup _sensorValuesTimeWindow;
private readonly Logger _logger;
private bool _selectionDragging; private bool _selectionDragging;
private IDictionary<ISensor, Color> _sensorPlotColors = new Dictionary<ISensor, Color>();
private UserOption _showPlot;
public MainForm() public MainForm()
{ {
@@ -105,7 +99,7 @@ namespace LibreHardwareMonitor.UI
foreach (TreeColumn column in treeView.Columns) foreach (TreeColumn column in treeView.Columns)
column.Width = Math.Max(20, Math.Min(400, _settings.GetValue("treeView.Columns." + column.Header + ".Width", column.Width))); column.Width = Math.Max(20, Math.Min(400, _settings.GetValue("treeView.Columns." + column.Header + ".Width", column.Width)));
TreeModel treeModel = new TreeModel(); TreeModel treeModel = new();
_root = new Node(Environment.MachineName) { Image = EmbeddedResources.GetImage("computer.png") }; _root = new Node(Environment.MachineName) { Image = EmbeddedResources.GetImage("computer.png") };
treeModel.Nodes.Add(_root); treeModel.Nodes.Add(_root);
@@ -132,7 +126,8 @@ namespace LibreHardwareMonitor.UI
startMinMenuItem.Visible = false; startMinMenuItem.Visible = false;
} }
else else
{ // Windows {
// Windows
treeView.RowHeight = Math.Max(treeView.Font.Height + 1, 18); treeView.RowHeight = Math.Max(treeView.Font.Height + 1, 18);
_gadget = new SensorGadget(_computer, _settings, _unitManager); _gadget = new SensorGadget(_computer, _settings, _unitManager);
_gadget.HideShowCommand += HideShowClick; _gadget.HideShowCommand += HideShowClick;
@@ -167,36 +162,21 @@ namespace LibreHardwareMonitor.UI
backgroundUpdater.DoWork += BackgroundUpdater_DoWork; backgroundUpdater.DoWork += BackgroundUpdater_DoWork;
timer.Enabled = true; timer.Enabled = true;
UserOption showHiddenSensors = new UserOption("hiddenMenuItem", false, hiddenMenuItem, _settings); UserOption showHiddenSensors = new("hiddenMenuItem", false, hiddenMenuItem, _settings);
showHiddenSensors.Changed += delegate showHiddenSensors.Changed += delegate { treeModel.ForceVisible = showHiddenSensors.Value; };
{
treeModel.ForceVisible = showHiddenSensors.Value;
};
UserOption showValue = new UserOption("valueMenuItem", true, valueMenuItem, _settings); UserOption showValue = new("valueMenuItem", true, valueMenuItem, _settings);
showValue.Changed += delegate showValue.Changed += delegate { treeView.Columns[1].IsVisible = showValue.Value; };
{
treeView.Columns[1].IsVisible = showValue.Value;
};
UserOption showMin = new UserOption("minMenuItem", false, minMenuItem, _settings); UserOption showMin = new("minMenuItem", false, minMenuItem, _settings);
showMin.Changed += delegate showMin.Changed += delegate { treeView.Columns[2].IsVisible = showMin.Value; };
{
treeView.Columns[2].IsVisible = showMin.Value;
};
UserOption showMax = new UserOption("maxMenuItem", true, maxMenuItem, _settings); UserOption showMax = new("maxMenuItem", true, maxMenuItem, _settings);
showMax.Changed += delegate showMax.Changed += delegate { treeView.Columns[3].IsVisible = showMax.Value; };
{
treeView.Columns[3].IsVisible = showMax.Value;
};
var _ = new UserOption("startMinMenuItem", false, startMinMenuItem, _settings); var _ = new UserOption("startMinMenuItem", false, startMinMenuItem, _settings);
_minimizeToTray = new UserOption("minTrayMenuItem", true, minTrayMenuItem, _settings); _minimizeToTray = new UserOption("minTrayMenuItem", true, minTrayMenuItem, _settings);
_minimizeToTray.Changed += delegate _minimizeToTray.Changed += delegate { _systemTray.IsMainIconEnabled = _minimizeToTray.Value; };
{
_systemTray.IsMainIconEnabled = _minimizeToTray.Value;
};
_minimizeOnClose = new UserOption("minCloseMenuItem", false, minCloseMenuItem, _settings); _minimizeOnClose = new UserOption("minCloseMenuItem", false, minCloseMenuItem, _settings);
@@ -209,65 +189,41 @@ namespace LibreHardwareMonitor.UI
} }
catch (InvalidOperationException) catch (InvalidOperationException)
{ {
MessageBox.Show("Updating the auto-startup option failed.", "Error", MessageBox.Show("Updating the auto-startup option failed.",
MessageBoxButtons.OK, MessageBoxIcon.Error); "Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
_autoStart.Value = _startupManager.Startup; _autoStart.Value = _startupManager.Startup;
} }
}; };
_readMainboardSensors = new UserOption("mainboardMenuItem", true, mainboardMenuItem, _settings); _readMainboardSensors = new UserOption("mainboardMenuItem", true, mainboardMenuItem, _settings);
_readMainboardSensors.Changed += delegate _readMainboardSensors.Changed += delegate { _computer.IsMotherboardEnabled = _readMainboardSensors.Value; };
{
_computer.IsMotherboardEnabled = _readMainboardSensors.Value;
};
_readCpuSensors = new UserOption("cpuMenuItem", true, cpuMenuItem, _settings); _readCpuSensors = new UserOption("cpuMenuItem", true, cpuMenuItem, _settings);
_readCpuSensors.Changed += delegate _readCpuSensors.Changed += delegate { _computer.IsCpuEnabled = _readCpuSensors.Value; };
{
_computer.IsCpuEnabled = _readCpuSensors.Value;
};
_readRamSensors = new UserOption("ramMenuItem", true, ramMenuItem, _settings); _readRamSensors = new UserOption("ramMenuItem", true, ramMenuItem, _settings);
_readRamSensors.Changed += delegate _readRamSensors.Changed += delegate { _computer.IsMemoryEnabled = _readRamSensors.Value; };
{
_computer.IsMemoryEnabled = _readRamSensors.Value;
};
_readGpuSensors = new UserOption("gpuMenuItem", true, gpuMenuItem, _settings); _readGpuSensors = new UserOption("gpuMenuItem", true, gpuMenuItem, _settings);
_readGpuSensors.Changed += delegate _readGpuSensors.Changed += delegate { _computer.IsGpuEnabled = _readGpuSensors.Value; };
{
_computer.IsGpuEnabled = _readGpuSensors.Value;
};
_readFanControllersSensors = new UserOption("fanControllerMenuItem", true, fanControllerMenuItem, _settings); _readFanControllersSensors = new UserOption("fanControllerMenuItem", true, fanControllerMenuItem, _settings);
_readFanControllersSensors.Changed += delegate _readFanControllersSensors.Changed += delegate { _computer.IsControllerEnabled = _readFanControllersSensors.Value; };
{
_computer.IsControllerEnabled = _readFanControllersSensors.Value;
};
_readHddSensors = new UserOption("hddMenuItem", true, hddMenuItem, _settings); _readHddSensors = new UserOption("hddMenuItem", true, hddMenuItem, _settings);
_readHddSensors.Changed += delegate _readHddSensors.Changed += delegate { _computer.IsStorageEnabled = _readHddSensors.Value; };
{
_computer.IsStorageEnabled = _readHddSensors.Value;
};
_readNicSensors = new UserOption("nicMenuItem", true, nicMenuItem, _settings); _readNicSensors = new UserOption("nicMenuItem", true, nicMenuItem, _settings);
_readNicSensors.Changed += delegate _readNicSensors.Changed += delegate { _computer.IsNetworkEnabled = _readNicSensors.Value; };
{
_computer.IsNetworkEnabled = _readNicSensors.Value;
};
_readPsuSensors = new UserOption("psuMenuItem", true, psuMenuItem, _settings); _readPsuSensors = new UserOption("psuMenuItem", true, psuMenuItem, _settings);
_readPsuSensors.Changed += delegate _readPsuSensors.Changed += delegate { _computer.IsPsuEnabled = _readPsuSensors.Value; };
{
_computer.IsPsuEnabled = _readPsuSensors.Value;
};
_readBatterySensors = new UserOption("batteryMenuItem", true, batteryMenuItem, _settings); _readBatterySensors = new UserOption("batteryMenuItem", true, batteryMenuItem, _settings);
_readBatterySensors.Changed += delegate _readBatterySensors.Changed += delegate { _computer.IsBatteryEnabled = _readBatterySensors.Value; };
{
_computer.IsBatteryEnabled = _readBatterySensors.Value;
};
_showGadget = new UserOption("gadgetMenuItem", false, gadgetMenuItem, _settings); _showGadget = new UserOption("gadgetMenuItem", false, gadgetMenuItem, _settings);
_showGadget.Changed += delegate _showGadget.Changed += delegate
@@ -279,7 +235,12 @@ namespace LibreHardwareMonitor.UI
celsiusMenuItem.Checked = _unitManager.TemperatureUnit == TemperatureUnit.Celsius; celsiusMenuItem.Checked = _unitManager.TemperatureUnit == TemperatureUnit.Celsius;
fahrenheitMenuItem.Checked = !celsiusMenuItem.Checked; fahrenheitMenuItem.Checked = !celsiusMenuItem.Checked;
Server = new HttpServer(_root, _settings.GetValue("listenerPort", 8085), _settings.GetValue("authenticationEnabled", false), _settings.GetValue("authenticationUserName", ""), _settings.GetValue("authenticationPassword", "")); Server = new HttpServer(_root,
_settings.GetValue("listenerPort", 8085),
_settings.GetValue("authenticationEnabled", false),
_settings.GetValue("authenticationUserName", ""),
_settings.GetValue("authenticationPassword", ""));
if (Server.PlatformNotSupported) if (Server.PlatformNotSupported)
{ {
webMenuItemSeparator.Visible = false; webMenuItemSeparator.Visible = false;
@@ -299,58 +260,131 @@ namespace LibreHardwareMonitor.UI
_logSensors = new UserOption("logSensorsMenuItem", false, logSensorsMenuItem, _settings); _logSensors = new UserOption("logSensorsMenuItem", false, logSensorsMenuItem, _settings);
_loggingInterval = new UserRadioGroup("loggingInterval", 0, _loggingInterval = new UserRadioGroup("loggingInterval",
new[] { log1sMenuItem, log2sMenuItem, log5sMenuItem, log10sMenuItem, 0,
log30sMenuItem, log1minMenuItem, log2minMenuItem, log5minMenuItem, new[]
log10minMenuItem, log30minMenuItem, log1hMenuItem, log2hMenuItem, {
log6hMenuItem}, _settings); log1sMenuItem,
log2sMenuItem,
log5sMenuItem,
log10sMenuItem,
log30sMenuItem,
log1minMenuItem,
log2minMenuItem,
log5minMenuItem,
log10minMenuItem,
log30minMenuItem,
log1hMenuItem,
log2hMenuItem,
log6hMenuItem
},
_settings);
_loggingInterval.Changed += (sender, e) => _loggingInterval.Changed += (sender, e) =>
{ {
switch (_loggingInterval.Value) switch (_loggingInterval.Value)
{ {
case 0: _logger.LoggingInterval = new TimeSpan(0, 0, 1); break; case 0:
case 1: _logger.LoggingInterval = new TimeSpan(0, 0, 2); break; _logger.LoggingInterval = new TimeSpan(0, 0, 1);
case 2: _logger.LoggingInterval = new TimeSpan(0, 0, 5); break; break;
case 3: _logger.LoggingInterval = new TimeSpan(0, 0, 10); break; case 1:
case 4: _logger.LoggingInterval = new TimeSpan(0, 0, 30); break; _logger.LoggingInterval = new TimeSpan(0, 0, 2);
case 5: _logger.LoggingInterval = new TimeSpan(0, 1, 0); break; break;
case 6: _logger.LoggingInterval = new TimeSpan(0, 2, 0); break; case 2:
case 7: _logger.LoggingInterval = new TimeSpan(0, 5, 0); break; _logger.LoggingInterval = new TimeSpan(0, 0, 5);
case 8: _logger.LoggingInterval = new TimeSpan(0, 10, 0); break; break;
case 9: _logger.LoggingInterval = new TimeSpan(0, 30, 0); break; case 3:
case 10: _logger.LoggingInterval = new TimeSpan(1, 0, 0); break; _logger.LoggingInterval = new TimeSpan(0, 0, 10);
case 11: _logger.LoggingInterval = new TimeSpan(2, 0, 0); break; break;
case 12: _logger.LoggingInterval = new TimeSpan(6, 0, 0); break; case 4:
_logger.LoggingInterval = new TimeSpan(0, 0, 30);
break;
case 5:
_logger.LoggingInterval = new TimeSpan(0, 1, 0);
break;
case 6:
_logger.LoggingInterval = new TimeSpan(0, 2, 0);
break;
case 7:
_logger.LoggingInterval = new TimeSpan(0, 5, 0);
break;
case 8:
_logger.LoggingInterval = new TimeSpan(0, 10, 0);
break;
case 9:
_logger.LoggingInterval = new TimeSpan(0, 30, 0);
break;
case 10:
_logger.LoggingInterval = new TimeSpan(1, 0, 0);
break;
case 11:
_logger.LoggingInterval = new TimeSpan(2, 0, 0);
break;
case 12:
_logger.LoggingInterval = new TimeSpan(6, 0, 0);
break;
} }
}; };
_sensorValuesTimeWindow = new UserRadioGroup("sensorValuesTimeWindow", 10, _sensorValuesTimeWindow = new UserRadioGroup("sensorValuesTimeWindow",
new[] { timeWindow30sMenuItem, timeWindow1minMenuItem, timeWindow2minMenuItem, 10,
timeWindow5minMenuItem, timeWindow10minMenuItem, timeWindow30minMenuItem, new[]
timeWindow1hMenuItem, timeWindow2hMenuItem, timeWindow6hMenuItem, {
timeWindow12hMenuItem, timeWindow24hMenuItem}, _settings); timeWindow30sMenuItem,
timeWindow1minMenuItem,
timeWindow2minMenuItem,
timeWindow5minMenuItem,
timeWindow10minMenuItem,
timeWindow30minMenuItem,
timeWindow1hMenuItem,
timeWindow2hMenuItem,
timeWindow6hMenuItem,
timeWindow12hMenuItem,
timeWindow24hMenuItem
},
_settings);
_sensorValuesTimeWindow.Changed += (sender, e) => _sensorValuesTimeWindow.Changed += (sender, e) =>
{ {
TimeSpan timeWindow = TimeSpan.Zero; TimeSpan timeWindow = TimeSpan.Zero;
switch (_sensorValuesTimeWindow.Value) switch (_sensorValuesTimeWindow.Value)
{ {
case 0: timeWindow = new TimeSpan(0, 0, 30); break; case 0:
case 1: timeWindow = new TimeSpan(0, 1, 0); break; timeWindow = new TimeSpan(0, 0, 30);
case 2: timeWindow = new TimeSpan(0, 2, 0); break; break;
case 3: timeWindow = new TimeSpan(0, 5, 0); break; case 1:
case 4: timeWindow = new TimeSpan(0, 10, 0); break; timeWindow = new TimeSpan(0, 1, 0);
case 5: timeWindow = new TimeSpan(0, 30, 0); break; break;
case 6: timeWindow = new TimeSpan(1, 0, 0); break; case 2:
case 7: timeWindow = new TimeSpan(2, 0, 0); break; timeWindow = new TimeSpan(0, 2, 0);
case 8: timeWindow = new TimeSpan(6, 0, 0); break; break;
case 9: timeWindow = new TimeSpan(12, 0, 0); break; case 3:
case 10: timeWindow = new TimeSpan(24, 0, 0); break; timeWindow = new TimeSpan(0, 5, 0);
break;
case 4:
timeWindow = new TimeSpan(0, 10, 0);
break;
case 5:
timeWindow = new TimeSpan(0, 30, 0);
break;
case 6:
timeWindow = new TimeSpan(1, 0, 0);
break;
case 7:
timeWindow = new TimeSpan(2, 0, 0);
break;
case 8:
timeWindow = new TimeSpan(6, 0, 0);
break;
case 9:
timeWindow = new TimeSpan(12, 0, 0);
break;
case 10:
timeWindow = new TimeSpan(24, 0, 0);
break;
} }
_computer.Accept(new SensorVisitor(delegate (ISensor sensor) _computer.Accept(new SensorVisitor(delegate(ISensor sensor) { sensor.ValuesTimeWindow = timeWindow; }));
{
sensor.ValuesTimeWindow = timeWindow;
}));
}; };
InitializePlotForm(); InitializePlotForm();
@@ -385,6 +419,14 @@ namespace LibreHardwareMonitor.UI
Microsoft.Win32.SystemEvents.PowerModeChanged += PowerModeChanged; Microsoft.Win32.SystemEvents.PowerModeChanged += PowerModeChanged;
} }
public bool AuthWebServerMenuItemChecked
{
get { return authWebServerMenuItem.Checked; }
set { authWebServerMenuItem.Checked = value; }
}
public HttpServer Server { get; }
private void BackgroundUpdater_DoWork(object sender, DoWorkEventArgs e) private void BackgroundUpdater_DoWork(object sender, DoWorkEventArgs e)
{ {
_computer.Accept(_updateVisitor); _computer.Accept(_updateVisitor);
@@ -409,10 +451,7 @@ namespace LibreHardwareMonitor.UI
private void InitializeSplitter() private void InitializeSplitter()
{ {
splitContainer.SplitterDistance = _settings.GetValue("splitContainer.SplitterDistance", 400); splitContainer.SplitterDistance = _settings.GetValue("splitContainer.SplitterDistance", 400);
splitContainer.SplitterMoved += delegate splitContainer.SplitterMoved += delegate { _settings.SetValue("splitContainer.SplitterDistance", splitContainer.SplitterDistance); };
{
_settings.SetValue("splitContainer.SplitterDistance", splitContainer.SplitterDistance);
};
} }
private void InitializePlotForm() private void InitializePlotForm()
@@ -443,8 +482,10 @@ namespace LibreHardwareMonitor.UI
{ {
splitContainer.Panel2Collapsed = !_showPlot.Value; splitContainer.Panel2Collapsed = !_showPlot.Value;
} }
treeView.Invalidate(); treeView.Invalidate();
}; };
_plotLocation.Changed += delegate _plotLocation.Changed += delegate
{ {
switch (_plotLocation.Value) switch (_plotLocation.Value)
@@ -455,6 +496,7 @@ namespace LibreHardwareMonitor.UI
_plotForm.Controls.Add(_plotPanel); _plotForm.Controls.Add(_plotPanel);
if (_showPlot.Value && Visible) if (_showPlot.Value && Visible)
_plotForm.Show(); _plotForm.Show();
break; break;
case 1: case 1:
_plotForm.Controls.Clear(); _plotForm.Controls.Clear();
@@ -473,7 +515,7 @@ namespace LibreHardwareMonitor.UI
} }
}; };
_plotForm.FormClosing += delegate (object sender, FormClosingEventArgs e) _plotForm.FormClosing += delegate(object sender, FormClosingEventArgs e)
{ {
if (e.CloseReason == CloseReason.UserClosing) if (e.CloseReason == CloseReason.UserClosing)
{ {
@@ -482,11 +524,11 @@ namespace LibreHardwareMonitor.UI
{ {
_showPlot.Value = false; _showPlot.Value = false;
} }
e.Cancel = true; e.Cancel = true;
} }
}; };
void MoveOrResizePlotForm(object sender, EventArgs e) void MoveOrResizePlotForm(object sender, EventArgs e)
{ {
if (_plotForm.WindowState != FormWindowState.Minimized) if (_plotForm.WindowState != FormWindowState.Minimized)
@@ -503,15 +545,14 @@ namespace LibreHardwareMonitor.UI
_plotForm.VisibleChanged += delegate _plotForm.VisibleChanged += delegate
{ {
Rectangle bounds = new Rectangle(_plotForm.Location, _plotForm.Size); Rectangle bounds = new(_plotForm.Location, _plotForm.Size);
Screen screen = Screen.FromRectangle(bounds); Screen screen = Screen.FromRectangle(bounds);
Rectangle intersection = Rectangle.Intersect(screen.WorkingArea, bounds); Rectangle intersection = Rectangle.Intersect(screen.WorkingArea, bounds);
if (intersection.Width < Math.Min(16, bounds.Width) || if (intersection.Width < Math.Min(16, bounds.Width) ||
intersection.Height < Math.Min(16, bounds.Height)) intersection.Height < Math.Min(16, bounds.Height))
{ {
_plotForm.Location = new Point( _plotForm.Location = new Point(screen.WorkingArea.Width / 2 - bounds.Width / 2,
screen.WorkingArea.Width / 2 - bounds.Width / 2, screen.WorkingArea.Height / 2 - bounds.Height / 2);
screen.WorkingArea.Height / 2 - bounds.Height / 2);
} }
}; };
@@ -535,7 +576,7 @@ namespace LibreHardwareMonitor.UI
private void SubHardwareAdded(IHardware hardware, Node node) private void SubHardwareAdded(IHardware hardware, Node node)
{ {
HardwareNode hardwareNode = new HardwareNode(hardware, _settings, _unitManager); HardwareNode hardwareNode = new(hardware, _settings, _unitManager);
hardwareNode.PlotSelectionChanged += PlotSelectionChanged; hardwareNode.PlotSelectionChanged += PlotSelectionChanged;
InsertSorted(node.Nodes, hardwareNode); InsertSorted(node.Nodes, hardwareNode);
foreach (IHardware subHardware in hardware.SubHardware) foreach (IHardware subHardware in hardware.SubHardware)
@@ -550,17 +591,19 @@ namespace LibreHardwareMonitor.UI
private void HardwareRemoved(IHardware hardware) private void HardwareRemoved(IHardware hardware)
{ {
List<HardwareNode> nodesToRemove = new List<HardwareNode>(); List<HardwareNode> nodesToRemove = new();
foreach (Node node in _root.Nodes) foreach (Node node in _root.Nodes)
{ {
if (node is HardwareNode hardwareNode && hardwareNode.Hardware == hardware) if (node is HardwareNode hardwareNode && hardwareNode.Hardware == hardware)
nodesToRemove.Add(hardwareNode); nodesToRemove.Add(hardwareNode);
} }
foreach (HardwareNode hardwareNode in nodesToRemove) foreach (HardwareNode hardwareNode in nodesToRemove)
{ {
_root.Nodes.Remove(hardwareNode); _root.Nodes.Remove(hardwareNode);
hardwareNode.PlotSelectionChanged -= PlotSelectionChanged; hardwareNode.PlotSelectionChanged -= PlotSelectionChanged;
} }
PlotSelectionChanged(this, null); PlotSelectionChanged(this, null);
} }
@@ -580,7 +623,7 @@ namespace LibreHardwareMonitor.UI
private void PlotSelectionChanged(object sender, EventArgs e) private void PlotSelectionChanged(object sender, EventArgs e)
{ {
List<ISensor> selected = new List<ISensor>(); List<ISensor> selected = new();
IDictionary<ISensor, Color> colors = new Dictionary<ISensor, Color>(); IDictionary<ISensor, Color> colors = new Dictionary<ISensor, Color>();
int colorIndex = 0; int colorIndex = 0;
@@ -593,10 +636,12 @@ namespace LibreHardwareMonitor.UI
if (!sensorNode.PenColor.HasValue) if (!sensorNode.PenColor.HasValue)
{ {
colors.Add(sensorNode.Sensor, colors.Add(sensorNode.Sensor,
_plotColorPalette[colorIndex % _plotColorPalette.Length]); _plotColorPalette[colorIndex % _plotColorPalette.Length]);
} }
selected.Add(sensorNode.Sensor); selected.Add(sensorNode.Sensor);
} }
colorIndex++; colorIndex++;
} }
} }
@@ -636,6 +681,7 @@ namespace LibreHardwareMonitor.UI
if (node.Tag is SensorNode sensorNode && sensorNode.Plot && sensorNode.PenColor.HasValue) if (node.Tag is SensorNode sensorNode && sensorNode.Plot && sensorNode.PenColor.HasValue)
colors.Add(sensorNode.Sensor, sensorNode.PenColor.Value); colors.Add(sensorNode.Sensor, sensorNode.PenColor.Value);
} }
_sensorPlotColors = colors; _sensorPlotColors = colors;
_plotPanel.SetSensors(selected, colors); _plotPanel.SetSensors(selected, colors);
} }
@@ -673,7 +719,6 @@ namespace LibreHardwareMonitor.UI
if (_plotPanel == null || _settings == null) if (_plotPanel == null || _settings == null)
return; return;
_plotPanel.SetCurrentSettings(); _plotPanel.SetCurrentSettings();
foreach (TreeColumn column in treeView.Columns) foreach (TreeColumn column in treeView.Columns)
@@ -692,21 +737,29 @@ namespace LibreHardwareMonitor.UI
} }
catch (UnauthorizedAccessException) catch (UnauthorizedAccessException)
{ {
MessageBox.Show("Access to the path '" + fileName + "' is denied. " + MessageBox.Show("Access to the path '" +
"The current settings could not be saved.", fileName +
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error); "' is denied. " +
"The current settings could not be saved.",
"Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
} }
catch (IOException) catch (IOException)
{ {
MessageBox.Show("The path '" + fileName + "' is not writeable. " + MessageBox.Show("The path '" +
"The current settings could not be saved.", fileName +
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error); "' is not writeable. " +
"The current settings could not be saved.",
"Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
} }
} }
private void MainForm_Load(object sender, EventArgs e) private void MainForm_Load(object sender, EventArgs e)
{ {
Rectangle newBounds = new Rectangle Rectangle newBounds = new()
{ {
X = _settings.GetValue("mainForm.Location.X", Location.X), X = _settings.GetValue("mainForm.Location.X", Location.X),
Y = _settings.GetValue("mainForm.Location.Y", Location.Y), Y = _settings.GetValue("mainForm.Location.Y", Location.Y),
@@ -714,7 +767,7 @@ namespace LibreHardwareMonitor.UI
Height = _settings.GetValue("mainForm.Height", 640) Height = _settings.GetValue("mainForm.Height", 640)
}; };
Rectangle fullWorkingArea = new Rectangle(int.MaxValue, int.MaxValue, int.MinValue, int.MinValue); Rectangle fullWorkingArea = new(int.MaxValue, int.MaxValue, int.MinValue, int.MinValue);
foreach (Screen screen in Screen.AllScreens) foreach (Screen screen in Screen.AllScreens)
fullWorkingArea = Rectangle.Union(fullWorkingArea, screen.Bounds); fullWorkingArea = Rectangle.Union(fullWorkingArea, screen.Bounds);
@@ -725,6 +778,7 @@ namespace LibreHardwareMonitor.UI
newBounds.X = (Screen.PrimaryScreen.WorkingArea.Width / 2) - (newBounds.Width / 2); newBounds.X = (Screen.PrimaryScreen.WorkingArea.Width / 2) - (newBounds.Width / 2);
newBounds.Y = (Screen.PrimaryScreen.WorkingArea.Height / 2) - (newBounds.Height / 2); newBounds.Y = (Screen.PrimaryScreen.WorkingArea.Height / 2) - (newBounds.Height / 2);
} }
Bounds = newBounds; Bounds = newBounds;
RestoreCollapsedNodeState(treeView); RestoreCollapsedNodeState(treeView);
@@ -735,9 +789,9 @@ namespace LibreHardwareMonitor.UI
private void RestoreCollapsedNodeState(TreeViewAdv treeViewAdv) private void RestoreCollapsedNodeState(TreeViewAdv treeViewAdv)
{ {
var collapsedHwNodes = treeViewAdv.AllNodes var collapsedHwNodes = treeViewAdv.AllNodes
.Where(n => n.IsExpanded && n.Tag is IExpandPersistNode expandPersistNode && !expandPersistNode.Expanded) .Where(n => n.IsExpanded && n.Tag is IExpandPersistNode expandPersistNode && !expandPersistNode.Expanded)
.OrderByDescending(n => n.Level) .OrderByDescending(n => n.Level)
.ToList(); .ToList();
foreach (TreeNodeAdv node in collapsedHwNodes) foreach (TreeNodeAdv node in collapsedHwNodes)
{ {
@@ -756,6 +810,7 @@ namespace LibreHardwareMonitor.UI
SaveConfiguration(); SaveConfiguration();
if (_runWebServer.Value) if (_runWebServer.Value)
Server.Quit(); Server.Quit();
_systemTray.Dispose(); _systemTray.Dispose();
timer.Dispose(); timer.Dispose();
backgroundUpdater.Dispose(); backgroundUpdater.Dispose();
@@ -798,61 +853,52 @@ namespace LibreHardwareMonitor.UI
if (node.Sensor.Parameters.Count > 0) if (node.Sensor.Parameters.Count > 0)
{ {
ToolStripItem item = new ToolStripMenuItem("Parameters..."); ToolStripItem item = new ToolStripMenuItem("Parameters...");
item.Click += delegate item.Click += delegate { ShowParameterForm(node.Sensor); };
{
ShowParameterForm(node.Sensor);
};
treeContextMenu.Items.Add(item); treeContextMenu.Items.Add(item);
} }
if (nodeTextBoxText.EditEnabled) if (nodeTextBoxText.EditEnabled)
{ {
ToolStripItem item = new ToolStripMenuItem("Rename"); ToolStripItem item = new ToolStripMenuItem("Rename");
item.Click += delegate item.Click += delegate { nodeTextBoxText.BeginEdit(); };
{
nodeTextBoxText.BeginEdit();
};
treeContextMenu.Items.Add(item); treeContextMenu.Items.Add(item);
} }
if (node.IsVisible) if (node.IsVisible)
{ {
ToolStripItem item = new ToolStripMenuItem("Hide"); ToolStripItem item = new ToolStripMenuItem("Hide");
item.Click += delegate item.Click += delegate { node.IsVisible = false; };
{
node.IsVisible = false;
};
treeContextMenu.Items.Add(item); treeContextMenu.Items.Add(item);
} }
else else
{ {
ToolStripItem item = new ToolStripMenuItem("Unhide"); ToolStripItem item = new ToolStripMenuItem("Unhide");
item.Click += delegate item.Click += delegate { node.IsVisible = true; };
{
node.IsVisible = true;
};
treeContextMenu.Items.Add(item); treeContextMenu.Items.Add(item);
} }
treeContextMenu.Items.Add(new ToolStripSeparator()); treeContextMenu.Items.Add(new ToolStripSeparator());
{ {
ToolStripItem item = new ToolStripMenuItem("Pen Color..."); ToolStripItem item = new ToolStripMenuItem("Pen Color...");
item.Click += delegate item.Click += delegate
{ {
ColorDialog dialog = new ColorDialog { Color = node.PenColor.GetValueOrDefault() }; ColorDialog dialog = new() { Color = node.PenColor.GetValueOrDefault() };
if (dialog.ShowDialog() == DialogResult.OK) if (dialog.ShowDialog() == DialogResult.OK)
node.PenColor = dialog.Color; node.PenColor = dialog.Color;
}; };
treeContextMenu.Items.Add(item); treeContextMenu.Items.Add(item);
} }
{ {
ToolStripItem item = new ToolStripMenuItem("Reset Pen Color"); ToolStripItem item = new ToolStripMenuItem("Reset Pen Color");
item.Click += delegate item.Click += delegate { node.PenColor = null; };
{
node.PenColor = null;
};
treeContextMenu.Items.Add(item); treeContextMenu.Items.Add(item);
} }
treeContextMenu.Items.Add(new ToolStripSeparator()); treeContextMenu.Items.Add(new ToolStripSeparator());
{ {
ToolStripMenuItem item = new ToolStripMenuItem("Show in Tray") { Checked = _systemTray.Contains(node.Sensor) }; ToolStripMenuItem item = new("Show in Tray") { Checked = _systemTray.Contains(node.Sensor) };
item.Click += delegate item.Click += delegate
{ {
if (item.Checked) if (item.Checked)
@@ -860,11 +906,13 @@ namespace LibreHardwareMonitor.UI
else else
_systemTray.Add(node.Sensor, true); _systemTray.Add(node.Sensor, true);
}; };
treeContextMenu.Items.Add(item); treeContextMenu.Items.Add(item);
} }
if (_gadget != null) if (_gadget != null)
{ {
ToolStripMenuItem item = new ToolStripMenuItem("Show in Gadget") { Checked = _gadget.Contains(node.Sensor) }; ToolStripMenuItem item = new("Show in Gadget") { Checked = _gadget.Contains(node.Sensor) };
item.Click += delegate item.Click += delegate
{ {
if (item.Checked) if (item.Checked)
@@ -876,20 +924,19 @@ namespace LibreHardwareMonitor.UI
_gadget.Add(node.Sensor); _gadget.Add(node.Sensor);
} }
}; };
treeContextMenu.Items.Add(item); treeContextMenu.Items.Add(item);
} }
if (node.Sensor.Control != null) if (node.Sensor.Control != null)
{ {
treeContextMenu.Items.Add(new ToolStripSeparator()); treeContextMenu.Items.Add(new ToolStripSeparator());
IControl control = node.Sensor.Control; IControl control = node.Sensor.Control;
ToolStripMenuItem controlItem = new ToolStripMenuItem("Control"); ToolStripMenuItem controlItem = new("Control");
ToolStripItem defaultItem = new ToolStripMenuItem("Default") { Checked = control.ControlMode == ControlMode.Default }; ToolStripItem defaultItem = new ToolStripMenuItem("Default") { Checked = control.ControlMode == ControlMode.Default };
controlItem.DropDownItems.Add(defaultItem); controlItem.DropDownItems.Add(defaultItem);
defaultItem.Click += delegate defaultItem.Click += delegate { control.SetDefault(); };
{ ToolStripMenuItem manualItem = new("Manual");
control.SetDefault();
};
ToolStripMenuItem manualItem = new ToolStripMenuItem("Manual");
controlItem.DropDownItems.Add(manualItem); controlItem.DropDownItems.Add(manualItem);
manualItem.Checked = control.ControlMode == ControlMode.Software; manualItem.Checked = control.ControlMode == ControlMode.Software;
for (int i = 0; i <= 100; i += 5) for (int i = 0; i <= 100; i += 5)
@@ -901,12 +948,10 @@ namespace LibreHardwareMonitor.UI
manualItem.DropDownItems.Add(item); manualItem.DropDownItems.Add(item);
item.Checked = control.ControlMode == ControlMode.Software && Math.Round(control.SoftwareValue) == i; item.Checked = control.ControlMode == ControlMode.Software && Math.Round(control.SoftwareValue) == i;
int softwareValue = i; int softwareValue = i;
item.Click += delegate item.Click += delegate { control.SetSoftware(softwareValue); };
{
control.SetSoftware(softwareValue);
};
} }
} }
treeContextMenu.Items.Add(controlItem); treeContextMenu.Items.Add(controlItem);
} }
@@ -920,10 +965,7 @@ namespace LibreHardwareMonitor.UI
if (nodeTextBoxText.EditEnabled) if (nodeTextBoxText.EditEnabled)
{ {
ToolStripItem item = new ToolStripMenuItem("Rename"); ToolStripItem item = new ToolStripMenuItem("Rename");
item.Click += delegate item.Click += delegate { nodeTextBoxText.BeginEdit(); };
{
nodeTextBoxText.BeginEdit();
};
treeContextMenu.Items.Add(item); treeContextMenu.Items.Add(item);
} }
@@ -963,7 +1005,6 @@ namespace LibreHardwareMonitor.UI
} }
else if (_minimizeOnClose.Value && m.Msg == WM_SYSCOMMAND && m.WParam.ToInt64() == SC_CLOSE) else if (_minimizeOnClose.Value && m.Msg == WM_SYSCOMMAND && m.WParam.ToInt64() == SC_CLOSE)
{ {
//Apparently the user wants to minimize rather than close //Apparently the user wants to minimize rather than close
//Now we still need to check if we're going to the tray or not //Now we still need to check if we're going to the tray or not
//Note: the correct way to do this would be to send out SC_MINIMIZE, //Note: the correct way to do this would be to send out SC_MINIMIZE,
@@ -987,7 +1028,7 @@ namespace LibreHardwareMonitor.UI
private void ShowParameterForm(ISensor sensorForm) private void ShowParameterForm(ISensor sensorForm)
{ {
ParameterForm form = new ParameterForm { Parameters = sensorForm.Parameters, captionLabel = { Text = sensorForm.Name } }; ParameterForm form = new() { Parameters = sensorForm.Parameters, captionLabel = { Text = sensorForm.Name } };
form.ShowDialog(); form.ShowDialog();
} }
@@ -1013,7 +1054,7 @@ namespace LibreHardwareMonitor.UI
private void ResetMinMaxMenuItem_Click(object sender, EventArgs e) private void ResetMinMaxMenuItem_Click(object sender, EventArgs e)
{ {
_computer.Accept(new SensorVisitor(delegate (ISensor sensorClick) _computer.Accept(new SensorVisitor(delegate(ISensor sensorClick)
{ {
sensorClick.ResetMin(); sensorClick.ResetMin();
sensorClick.ResetMax(); sensorClick.ResetMax();
@@ -1063,13 +1104,9 @@ namespace LibreHardwareMonitor.UI
new PortForm(this).ShowDialog(); new PortForm(this).ShowDialog();
} }
public HttpServer Server { get; }
private void AuthWebServerMenuItem_Click(object sender, EventArgs e) private void AuthWebServerMenuItem_Click(object sender, EventArgs e)
{ {
new AuthForm(this).ShowDialog(); new AuthForm(this).ShowDialog();
} }
public bool AuthWebServerMenuItemChecked { get { return authWebServerMenuItem.Checked; } set { authWebServerMenuItem.Checked = value; } }
} }
} }
+64 -61
View File
@@ -10,8 +10,10 @@ using System.Management.Instrumentation;
using LibreHardwareMonitor.Hardware; using LibreHardwareMonitor.Hardware;
[assembly: Instrumented("root/LibreHardwareMonitor")] [assembly: Instrumented("root/LibreHardwareMonitor")]
[System.ComponentModel.RunInstaller(true)] [System.ComponentModel.RunInstaller(true)]
public class InstanceInstaller : DefaultManagementProjectInstaller { } public class InstanceInstaller : DefaultManagementProjectInstaller
{ }
namespace LibreHardwareMonitor.Wmi namespace LibreHardwareMonitor.Wmi
{ {
@@ -21,73 +23,81 @@ namespace LibreHardwareMonitor.Wmi
/// </summary> /// </summary>
public class WmiProvider : IDisposable public class WmiProvider : IDisposable
{ {
private List<IWmiObject> _activeInstances; private readonly object _activeInstancesLock = new();
private readonly List<IWmiObject> _activeInstances;
public WmiProvider(IComputer computer) public WmiProvider(IComputer computer)
{ {
_activeInstances = new List<IWmiObject>(); _activeInstances = new List<IWmiObject>();
foreach (IHardware hardware in computer.Hardware) foreach (IHardware hardware in computer.Hardware)
{ OnHardwareAdded(hardware);
ComputerHardwareAdded(hardware);
} computer.HardwareAdded += OnHardwareAdded;
computer.HardwareAdded += ComputerHardwareAdded; computer.HardwareRemoved += OnHardwareRemoved;
computer.HardwareRemoved += ComputerHardwareRemoved;
} }
public void Update() public void Update()
{ {
foreach (IWmiObject instance in _activeInstances) lock (_activeInstancesLock)
instance.Update(); {
foreach (IWmiObject instance in _activeInstances)
instance.Update();
}
} }
#region Eventhandlers private void OnHardwareAdded(IHardware hardware)
private void ComputerHardwareAdded(IHardware hardware)
{ {
if (!Exists(hardware.Identifier.ToString())) lock (_activeInstancesLock)
{ {
foreach (ISensor sensor in hardware.Sensors) if (!_activeInstances.Exists(h => h.Identifier == hardware.Identifier.ToString()))
HardwareSensorAdded(sensor);
hardware.SensorAdded += HardwareSensorAdded;
hardware.SensorRemoved += HardwareSensorRemoved;
Hardware hw = new Hardware(hardware);
_activeInstances.Add(hw);
try
{ {
Instrumentation.Publish(hw); foreach (ISensor sensor in hardware.Sensors)
OnSensorAdded(sensor);
hardware.SensorAdded += OnSensorAdded;
hardware.SensorRemoved += HardwareSensorRemoved;
Hardware hw = new(hardware);
_activeInstances.Add(hw);
try
{
Instrumentation.Publish(hw);
}
catch
{ }
} }
catch { }
} }
foreach (IHardware subHardware in hardware.SubHardware) foreach (IHardware subHardware in hardware.SubHardware)
ComputerHardwareAdded(subHardware); OnHardwareAdded(subHardware);
} }
private void HardwareSensorAdded(ISensor data) private void OnSensorAdded(ISensor data)
{ {
Sensor sensor = new Sensor(data); Sensor sensor = new(data);
_activeInstances.Add(sensor);
lock (_activeInstancesLock)
_activeInstances.Add(sensor);
try try
{ {
Instrumentation.Publish(sensor); Instrumentation.Publish(sensor);
} }
catch { } catch
{ }
} }
private void ComputerHardwareRemoved(IHardware hardware) private void OnHardwareRemoved(IHardware hardware)
{ {
hardware.SensorAdded -= HardwareSensorAdded; hardware.SensorAdded -= OnSensorAdded;
hardware.SensorRemoved -= HardwareSensorRemoved; hardware.SensorRemoved -= HardwareSensorRemoved;
foreach (ISensor sensor in hardware.Sensors) foreach (ISensor sensor in hardware.Sensors)
HardwareSensorRemoved(sensor); HardwareSensorRemoved(sensor);
foreach (IHardware subHardware in hardware.SubHardware) foreach (IHardware subHardware in hardware.SubHardware)
ComputerHardwareRemoved(subHardware); OnHardwareRemoved(subHardware);
RevokeInstance(hardware.Identifier.ToString()); RevokeInstance(hardware.Identifier.ToString());
} }
@@ -97,46 +107,39 @@ namespace LibreHardwareMonitor.Wmi
RevokeInstance(sensor.Identifier.ToString()); RevokeInstance(sensor.Identifier.ToString());
} }
#endregion
#region Helpers
private bool Exists(string identifier)
{
return _activeInstances.Exists(h => h.Identifier == identifier);
}
private void RevokeInstance(string identifier) private void RevokeInstance(string identifier)
{ {
int instanceIndex = _activeInstances.FindIndex( lock (_activeInstancesLock)
item => item.Identifier == identifier.ToString()
);
if (instanceIndex == -1)
return;
try
{ {
Instrumentation.Revoke(_activeInstances[instanceIndex]); int instanceIndex = _activeInstances.FindIndex(item => item.Identifier == identifier);
if (instanceIndex == -1)
return;
try
{
Instrumentation.Revoke(_activeInstances[instanceIndex]);
}
catch
{ }
_activeInstances.RemoveAt(instanceIndex);
} }
catch { }
_activeInstances.RemoveAt(instanceIndex);
} }
#endregion
public void Dispose() public void Dispose()
{ {
foreach (IWmiObject instance in _activeInstances) lock (_activeInstancesLock)
{ {
try foreach (IWmiObject instance in _activeInstances)
{ {
Instrumentation.Revoke(instance); try
{
Instrumentation.Revoke(instance);
}
catch
{ }
} }
catch { }
} }
_activeInstances = null;
} }
} }
} }