diff --git a/ColorControl/ColorControl.csproj b/ColorControl/ColorControl.csproj
index 4d1fe11..bcca5c8 100644
--- a/ColorControl/ColorControl.csproj
+++ b/ColorControl/ColorControl.csproj
@@ -18,8 +18,8 @@
Maassoft
Maassoft
0
- 5.4.0.0
- 5.4.0.0
+ 5.5.0.0
+ 5.5.0.0
false
true
false
diff --git a/ColorControl/LgDevice.cs b/ColorControl/LgDevice.cs
index 4b420b5..1e1eb08 100644
--- a/ColorControl/LgDevice.cs
+++ b/ColorControl/LgDevice.cs
@@ -138,6 +138,7 @@ namespace ColorControl
AddGenericPictureAction("colorGamut", typeof(ColorGamut), title: "Color Gamut");
AddGenericPictureAction("dynamicContrast", typeof(OffToHigh), title: "Dynamic Contrast");
AddGenericPictureAction("gamma", typeof(GammaExp));
+ AddGenericPictureAction("whiteBalanceColorTemperature", typeof(WhiteBalanceColorTemperature), title: "White Balance Color Temperature");
//AddGenericPictureAction("dynamicColor", typeof(OffToAuto));
//AddGenericPictureAction("superResolution", typeof(OffToAuto));
AddGenericPictureAction("peakBrightness", typeof(OffToHigh), title: "Peak Brightness");
@@ -148,6 +149,7 @@ namespace ColorControl
//AddGenericPictureAction("ambientLightCompensation", typeof(OffToAuto2));
//AddGenericPictureAction("truMotionMode", typeof(TruMotionMode));
AddGenericPictureAction("motionProOLED", typeof(OffToHigh), title: "OLED Motion Pro");
+ AddGenericPictureAction("motionPro", typeof(OffToOn), title: "Motion Pro");
AddGenericPictureAction("uhdDeepColorHDMI1", typeof(OffToOn), category: "other");
AddGenericPictureAction("uhdDeepColorHDMI2", typeof(OffToOn), category: "other");
AddGenericPictureAction("uhdDeepColorHDMI3", typeof(OffToOn), category: "other");
@@ -702,7 +704,7 @@ namespace ColorControl
var resumeScript = Path.Combine(Program.DataDir, "ResumeScript.bat");
if (File.Exists(resumeScript))
{
- Utils.StartProcess(resumeScript);
+ Utils.StartProcess(resumeScript, hidden: true);
}
}
diff --git a/ColorControl/LgService.cs b/ColorControl/LgService.cs
index b7ee9fe..6a06e77 100644
--- a/ColorControl/LgService.cs
+++ b/ColorControl/LgService.cs
@@ -495,7 +495,7 @@ namespace ColorControl
var standByScript = Path.Combine(Program.DataDir, "StandByScript.bat");
if (File.Exists(standByScript))
{
- Utils.StartProcess(standByScript);
+ Utils.StartProcess(standByScript, hidden: true);
}
Logger.Debug("Powering off tv...");
diff --git a/ColorControl/LgServiceConfig.cs b/ColorControl/LgServiceConfig.cs
index 410396d..faa715a 100644
--- a/ColorControl/LgServiceConfig.cs
+++ b/ColorControl/LgServiceConfig.cs
@@ -15,10 +15,12 @@ namespace ColorControl
public string GameBarShortcut { get; set; }
public int GameBarTop { get; set; }
public int GameBarLeft { get; set; }
+ public int ShutdownDelay { get; set; }
public LgServiceConfig()
{
PowerOnDelayAfterResume = 5000;
+ ShutdownDelay = 1000;
DeviceSearchKey = "[LG]";
PowerOnRetries = 10;
Devices = new List();
diff --git a/ColorControl/MainForm.Designer.cs b/ColorControl/MainForm.Designer.cs
index 943c1fd..09fdab3 100644
--- a/ColorControl/MainForm.Designer.cs
+++ b/ColorControl/MainForm.Designer.cs
@@ -172,6 +172,9 @@
this.lblFixChromeFontsDescription = new System.Windows.Forms.Label();
this.chkFixChromeFonts = new System.Windows.Forms.CheckBox();
this.grpLGOptions = new System.Windows.Forms.GroupBox();
+ this.lblLgOptionShutdownDelayHelp = new System.Windows.Forms.Label();
+ this.edtLgOptionShutdownDelay = new System.Windows.Forms.NumericUpDown();
+ this.lblLgOptionShutdownDelay = new System.Windows.Forms.Label();
this.chkLgShowAdvancedActions = new System.Windows.Forms.CheckBox();
this.btnLGTestPower = new System.Windows.Forms.Button();
this.lblLgMaxPowerOnRetriesDescription = new System.Windows.Forms.Label();
@@ -214,6 +217,7 @@
((System.ComponentModel.ISupportInitialize)(this.pbGradient)).BeginInit();
this.grpMiscellaneousOptions.SuspendLayout();
this.grpLGOptions.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.edtLgOptionShutdownDelay)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.edtLgMaxPowerOnRetries)).BeginInit();
this.grpHDROptions.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.edtDelayDisplaySettings)).BeginInit();
@@ -1732,7 +1736,7 @@
this.grpMiscellaneousOptions.Controls.Add(this.edtBlankScreenSaverShortcut);
this.grpMiscellaneousOptions.Controls.Add(this.lblFixChromeFontsDescription);
this.grpMiscellaneousOptions.Controls.Add(this.chkFixChromeFonts);
- this.grpMiscellaneousOptions.Location = new System.Drawing.Point(7, 292);
+ this.grpMiscellaneousOptions.Location = new System.Drawing.Point(7, 332);
this.grpMiscellaneousOptions.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.grpMiscellaneousOptions.Name = "grpMiscellaneousOptions";
this.grpMiscellaneousOptions.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3);
@@ -1797,6 +1801,9 @@
//
// grpLGOptions
//
+ this.grpLGOptions.Controls.Add(this.lblLgOptionShutdownDelayHelp);
+ this.grpLGOptions.Controls.Add(this.edtLgOptionShutdownDelay);
+ this.grpLGOptions.Controls.Add(this.lblLgOptionShutdownDelay);
this.grpLGOptions.Controls.Add(this.chkLgShowAdvancedActions);
this.grpLGOptions.Controls.Add(this.btnLGTestPower);
this.grpLGOptions.Controls.Add(this.lblLgMaxPowerOnRetriesDescription);
@@ -1806,15 +1813,56 @@
this.grpLGOptions.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.grpLGOptions.Name = "grpLGOptions";
this.grpLGOptions.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3);
- this.grpLGOptions.Size = new System.Drawing.Size(470, 149);
+ this.grpLGOptions.Size = new System.Drawing.Size(470, 190);
this.grpLGOptions.TabIndex = 4;
this.grpLGOptions.TabStop = false;
this.grpLGOptions.Text = "LG controller";
//
+ // lblLgOptionShutdownDelayHelp
+ //
+ this.lblLgOptionShutdownDelayHelp.AutoSize = true;
+ this.lblLgOptionShutdownDelayHelp.Location = new System.Drawing.Point(7, 94);
+ this.lblLgOptionShutdownDelayHelp.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lblLgOptionShutdownDelayHelp.Name = "lblLgOptionShutdownDelayHelp";
+ this.lblLgOptionShutdownDelayHelp.Size = new System.Drawing.Size(385, 15);
+ this.lblLgOptionShutdownDelayHelp.TabIndex = 11;
+ this.lblLgOptionShutdownDelayHelp.Text = "This delay may prevent the tv from powering off when restarting the pc.";
+ //
+ // edtLgOptionShutdownDelay
+ //
+ this.edtLgOptionShutdownDelay.Increment = new decimal(new int[] {
+ 100,
+ 0,
+ 0,
+ 0});
+ this.edtLgOptionShutdownDelay.Location = new System.Drawing.Point(349, 68);
+ this.edtLgOptionShutdownDelay.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
+ this.edtLgOptionShutdownDelay.Maximum = new decimal(new int[] {
+ 5000,
+ 0,
+ 0,
+ 0});
+ this.edtLgOptionShutdownDelay.Name = "edtLgOptionShutdownDelay";
+ this.edtLgOptionShutdownDelay.ReadOnly = true;
+ this.edtLgOptionShutdownDelay.Size = new System.Drawing.Size(86, 23);
+ this.edtLgOptionShutdownDelay.TabIndex = 10;
+ this.edtLgOptionShutdownDelay.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
+ this.edtLgOptionShutdownDelay.ValueChanged += new System.EventHandler(this.edtLgOptionShutdownDelay_ValueChanged);
+ //
+ // lblLgOptionShutdownDelay
+ //
+ this.lblLgOptionShutdownDelay.AutoSize = true;
+ this.lblLgOptionShutdownDelay.Location = new System.Drawing.Point(7, 70);
+ this.lblLgOptionShutdownDelay.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lblLgOptionShutdownDelay.Name = "lblLgOptionShutdownDelay";
+ this.lblLgOptionShutdownDelay.Size = new System.Drawing.Size(249, 15);
+ this.lblLgOptionShutdownDelay.TabIndex = 9;
+ this.lblLgOptionShutdownDelay.Text = "Delay when shutting down/restarting pc (ms):";
+ //
// chkLgShowAdvancedActions
//
this.chkLgShowAdvancedActions.AutoSize = true;
- this.chkLgShowAdvancedActions.Location = new System.Drawing.Point(10, 112);
+ this.chkLgShowAdvancedActions.Location = new System.Drawing.Point(8, 155);
this.chkLgShowAdvancedActions.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.chkLgShowAdvancedActions.Name = "chkLgShowAdvancedActions";
this.chkLgShowAdvancedActions.Size = new System.Drawing.Size(419, 19);
@@ -1825,7 +1873,7 @@
//
// btnLGTestPower
//
- this.btnLGTestPower.Location = new System.Drawing.Point(10, 78);
+ this.btnLGTestPower.Location = new System.Drawing.Point(8, 121);
this.btnLGTestPower.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.btnLGTestPower.Name = "btnLGTestPower";
this.btnLGTestPower.Size = new System.Drawing.Size(167, 27);
@@ -2182,6 +2230,7 @@
this.grpMiscellaneousOptions.PerformLayout();
this.grpLGOptions.ResumeLayout(false);
this.grpLGOptions.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.edtLgOptionShutdownDelay)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.edtLgMaxPowerOnRetries)).EndInit();
this.grpHDROptions.ResumeLayout(false);
this.grpHDROptions.PerformLayout();
@@ -2368,6 +2417,9 @@
private System.Windows.Forms.TextBox edtLgGameBarShortcut;
private System.Windows.Forms.CheckBox chkGdiScaling;
private System.Windows.Forms.Button btnLgDeviceOptionsHelp;
+ private System.Windows.Forms.Label lblLgOptionShutdownDelayHelp;
+ private System.Windows.Forms.NumericUpDown edtLgOptionShutdownDelay;
+ private System.Windows.Forms.Label lblLgOptionShutdownDelay;
}
}
diff --git a/ColorControl/MainForm.cs b/ColorControl/MainForm.cs
index 0c6588c..40add6f 100644
--- a/ColorControl/MainForm.cs
+++ b/ColorControl/MainForm.cs
@@ -16,6 +16,7 @@ using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
+using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
@@ -50,6 +51,7 @@ namespace ColorControl
private ToolStripMenuItem _lgTrayMenu;
private StartUpParams StartUpParams { get; }
+ public string _lgTabMessage { get; private set; }
private AmdService _amdService;
private bool _skipResize;
@@ -184,6 +186,7 @@ namespace ColorControl
FillLgPresets();
edtLgMaxPowerOnRetries.Value = _lgService.Config.PowerOnRetries;
+ edtLgOptionShutdownDelay.Value = _lgService.Config.ShutdownDelay;
edtLgDeviceFilter.Text = _lgService.Config.DeviceSearchKey;
chkLgShowAdvancedActions.Checked = _lgService.Config.ShowAdvancedActions;
@@ -478,22 +481,42 @@ namespace ColorControl
{
Logger.Debug($"MainForm_FormClosing: SystemShutdown");
- if (_restartDetector != null && (_restartDetector.RestartDetected || _restartDetector.IsRebootInProgress()))
- {
- Logger.Debug("Not powering off because of a restart");
- }
- else if (NativeMethods.GetAsyncKeyState(NativeConstants.VK_CONTROL) < 0 || NativeMethods.GetAsyncKeyState(NativeConstants.VK_RCONTROL) < 0)
+ if (NativeMethods.GetAsyncKeyState(NativeConstants.VK_CONTROL) < 0 || NativeMethods.GetAsyncKeyState(NativeConstants.VK_RCONTROL) < 0)
{
Logger.Debug("Not powering off because CONTROL-key is down");
+ return;
}
- else
+
+ var sleep = _lgService.Config.ShutdownDelay;
+
+ Logger.Debug($"MainForm_FormClosing: Waiting for {sleep} milliseconds...");
+
+ NativeMethods.SetThreadExecutionState(NativeConstants.ES_CONTINUOUS | NativeConstants.ES_SYSTEM_REQUIRED | NativeConstants.ES_AWAYMODE_REQUIRED);
+ try
{
+ while (sleep > 0 && _restartDetector?.PowerOffDetected == false)
+ {
+ Thread.Sleep(100);
+
+ if (_restartDetector != null && (_restartDetector.RestartDetected || _restartDetector.IsRebootInProgress()))
+ {
+ Logger.Debug("Not powering off because of a restart");
+ return;
+ }
+
+ sleep -= 100;
+ }
+
Logger.Debug("Powering off tv...");
var task = _lgService.PowerOffOnShutdownOrResume();
Utils.WaitForTask(task);
Logger.Debug("Done powering off tv");
//ExecPowerOffPreset(true);
}
+ finally
+ {
+ NativeMethods.SetThreadExecutionState(NativeConstants.ES_CONTINUOUS);
+ }
}
}
@@ -1384,7 +1407,13 @@ namespace ColorControl
chkLgRemoteControlShow.Checked = _lgService.Config.ShowRemoteControl;
scLgController.Panel2Collapsed = !_lgService.Config.ShowRemoteControl;
- Utils.BuildComboBox(cbxLgPresetTrigger, PresetTriggerType.Resume, PresetTriggerType.Shutdown, PresetTriggerType.Standby, PresetTriggerType.Startup, PresetTriggerType.Reserved5, PresetTriggerType.ScreensaverStart, PresetTriggerType.ScreensaverStop);
+ Utils.BuildComboBox(cbxLgPresetTrigger, PresetTriggerType.Resume, PresetTriggerType.Shutdown, PresetTriggerType.Standby, PresetTriggerType.Startup, PresetTriggerType.Reserved5, PresetTriggerType.ScreensaverStart, PresetTriggerType.ScreensaverStop);
+
+ if (!string.IsNullOrEmpty(_lgTabMessage))
+ {
+ MessageForms.WarningOk(_lgTabMessage);
+ _lgTabMessage = null;
+ }
}
private void InitOptionsTab()
@@ -1452,7 +1481,16 @@ namespace ColorControl
if (!devices.Any())
{
- MessageForms.WarningOk("It seems there's no LG TV available! Please make sure it's connected to the same network as this PC.");
+ var message = "It seems there's no LG TV available! Please make sure it's connected to the same network as this PC.";
+
+ if (tcMain.SelectedTab == tabLG)
+ {
+ MessageForms.WarningOk(message);
+ }
+ else
+ {
+ _lgTabMessage = message;
+ }
}
if (cbxLgApps.Items.Count == 0 && device != null)
@@ -2137,7 +2175,6 @@ Do you want to continue?";
preset.ditheringMode = uint.Parse(item.Tag.ToString());
AddOrUpdateItem();
-
}
private void btnLGRemoteControl_Click(object sender, EventArgs e)
@@ -3090,5 +3127,10 @@ The InStart and Software Update items are now visible under the Expert-button."
- power off on shutdown: because this app cannot detect a restart, restarting could also trigger this. Hold down Ctrl on restart to prevent power off.
");
}
+
+ private void edtLgOptionShutdownDelay_ValueChanged(object sender, EventArgs e)
+ {
+ _lgService.Config.ShutdownDelay = (int)edtLgOptionShutdownDelay.Value;
+ }
}
}
\ No newline at end of file
diff --git a/ColorControl/RestartDetector.cs b/ColorControl/RestartDetector.cs
index 1a752f3..e1811a4 100644
--- a/ColorControl/RestartDetector.cs
+++ b/ColorControl/RestartDetector.cs
@@ -9,7 +9,8 @@ namespace ColorControl
public class RestartDetector : IDisposable
{
public bool RestartDetected { get; private set; }
-
+ public bool PowerOffDetected { get; private set; }
+
private EventLogWatcher watcher = null;
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
@@ -17,8 +18,7 @@ namespace ColorControl
{
try
{
- EventLogQuery subscriptionQuery = new EventLogQuery(
- "System", PathType.LogName, "*[System[Provider[@Name='USER32'] and (EventID=1074)]]");
+ EventLogQuery subscriptionQuery = new EventLogQuery("System", PathType.LogName, "*[System[Provider[@Name='USER32'] and (EventID=1074)]]");
watcher = new EventLogWatcher(subscriptionQuery);
@@ -47,6 +47,7 @@ namespace ColorControl
public void EventLogEventRead(object obj, EventRecordWrittenEventArgs arg)
{
RestartDetected = false;
+ PowerOffDetected = false;
try
{
Logger.Debug("Logging event: " + arg);
@@ -60,26 +61,14 @@ namespace ColorControl
{
RestartDetected = true;
break;
- }
+ }
+ if (x.Value.Equals("power off"))
+ {
+ PowerOffDetected = true;
+ break;
+ }
}
}
-
- //if (arg.EventRecord != null)
- //{
- // String[] xPathRefs = new String[1];
- // xPathRefs[0] = "Event/EventData/Data";
- // IEnumerable xPathEnum = xPathRefs;
-
- // EventLogPropertySelector logPropertyContext = new EventLogPropertySelector(xPathEnum);
- // IList