mirror of
https://github.com/Maassoft/ColorControl.git
synced 2026-10-21 16:12:18 -05:00
2277 lines
73 KiB
C#
2277 lines
73 KiB
C#
using ATI.ADL;
|
|
using LgTv;
|
|
using NLog;
|
|
using NStandard;
|
|
using NvAPIWrapper.Display;
|
|
using NvAPIWrapper.Native.Display;
|
|
using NWin32;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Deployment.Application;
|
|
using System.Diagnostics;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
|
|
namespace ColorControl
|
|
{
|
|
public partial class MainForm : Form
|
|
{
|
|
private static string TS_TASKNAME = "ColorControl";
|
|
private static bool SystemShutdown = false;
|
|
private static bool EndSession = false;
|
|
private static bool UserExit = false;
|
|
private static int SHORTCUTID_SCREENSAVER = -100;
|
|
|
|
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
|
|
|
private string _dataDir;
|
|
|
|
private NvService _nvService;
|
|
private string _lastDisplayRefreshRates = string.Empty;
|
|
|
|
private NotifyIcon _trayIcon;
|
|
private bool _initialized = false;
|
|
private Config _config;
|
|
private bool _setVisibleCalled = false;
|
|
private RestartDetector _restartDetector;
|
|
|
|
private LgService _lgService;
|
|
private RemoteControlForm _remoteControlForm;
|
|
|
|
private MenuItem _nvTrayMenu;
|
|
private MenuItem _amdTrayMenu;
|
|
private MenuItem _lgTrayMenu;
|
|
|
|
private StartUpParams StartUpParams { get; }
|
|
|
|
private AmdService _amdService;
|
|
|
|
public MainForm(AppContext appContext)
|
|
{
|
|
InitializeComponent();
|
|
StartUpParams = appContext.StartUpParams;
|
|
|
|
_dataDir = Program.DataDir;
|
|
_config = Program.Config;
|
|
|
|
LoadConfig();
|
|
|
|
MessageForms.MainForm = this;
|
|
|
|
_nvTrayMenu = new MenuItem("NVIDIA presets");
|
|
_amdTrayMenu = new MenuItem("NVIDIA presets");
|
|
_lgTrayMenu = new MenuItem("LG presets");
|
|
_trayIcon = new NotifyIcon()
|
|
{
|
|
Icon = Icon,
|
|
ContextMenu = new ContextMenu(new MenuItem[] {
|
|
_nvTrayMenu,
|
|
_amdTrayMenu,
|
|
_lgTrayMenu,
|
|
new MenuItem("-"),
|
|
new MenuItem("Open", OpenForm),
|
|
new MenuItem("-"),
|
|
new MenuItem("Exit", Exit)
|
|
}),
|
|
Visible = _config.MinimizeToTray,
|
|
Text = Text
|
|
};
|
|
_trayIcon.MouseDoubleClick += trayIcon_MouseDoubleClick;
|
|
_trayIcon.ContextMenu.Popup += trayIconContextMenu_Popup;
|
|
|
|
chkStartAfterLogin.Checked = Utils.TaskExists(TS_TASKNAME, true);
|
|
|
|
chkFixChromeFonts.Enabled = Utils.IsChromeInstalled();
|
|
if (chkFixChromeFonts.Enabled)
|
|
{
|
|
chkFixChromeFonts.Checked = Utils.IsChromeFixInstalled();
|
|
}
|
|
|
|
InitNvService();
|
|
InitAmdService();
|
|
InitLgService();
|
|
|
|
InitInfo();
|
|
|
|
UserSessionInfo.Install();
|
|
|
|
_restartDetector = new RestartDetector();
|
|
|
|
//Scale(new SizeF(1.25F, 1.25F));
|
|
|
|
_initialized = true;
|
|
|
|
AfterInitialized();
|
|
}
|
|
|
|
private void InitNvService()
|
|
{
|
|
try
|
|
{
|
|
_nvService = new NvService(_dataDir);
|
|
FillNvPresets();
|
|
}
|
|
catch (Exception)
|
|
{
|
|
//Logger.Error("Error initializing NvService: " + e.ToLogString());
|
|
Logger.Debug("No NVIDIA device detected");
|
|
tcMain.TabPages.Remove(tabNVIDIA);
|
|
}
|
|
}
|
|
|
|
private void InitAmdService()
|
|
{
|
|
try
|
|
{
|
|
_amdService = new AmdService(_dataDir);
|
|
FillAmdPresets();
|
|
}
|
|
catch (Exception)
|
|
{
|
|
//Logger.Error("Error initializing AmdService: " + e.ToLogString());
|
|
Logger.Debug("No AMD device detected");
|
|
tcMain.TabPages.Remove(tabAMD);
|
|
}
|
|
}
|
|
|
|
private void InitLgService()
|
|
{
|
|
try
|
|
{
|
|
_lgService = new LgService(_dataDir, StartUpParams.RunningFromScheduledTask);
|
|
_lgService.RefreshDevices(afterStartUp: true).ContinueWith((_) => BeginInvoke(new Action(AfterLgServiceRefreshDevices)));
|
|
|
|
FillLgPresets();
|
|
|
|
clbLgPower.SetItemChecked(0, _lgService.Config.PowerOnAfterStartup);
|
|
clbLgPower.SetItemChecked(1, _lgService.Config.PowerOnAfterResume);
|
|
clbLgPower.SetItemChecked(2, _lgService.Config.PowerOffOnShutdown);
|
|
clbLgPower.SetItemChecked(3, _lgService.Config.PowerOffOnStandby);
|
|
clbLgPower.SetItemChecked(4, _lgService.Config.PowerSwitchOnScreenSaver);
|
|
edtLgMaxPowerOnRetries.Value = _lgService.Config.PowerOnRetries;
|
|
edtLgDeviceFilter.Text = _lgService.Config.DeviceSearchKey;
|
|
chkLgOldWolMechanism.Checked = _lgService.Config.UseOldNpcapWol;
|
|
|
|
var values = Enum.GetValues(typeof(ButtonType));
|
|
foreach (var button in values)
|
|
{
|
|
var text = button.ToString();
|
|
if (text[0] == '_')
|
|
{
|
|
text = text.Substring(1);
|
|
}
|
|
|
|
var item = mnuLgRcButtons.DropDownItems.Add(text);
|
|
item.Click += miLgAddButton_Click;
|
|
}
|
|
|
|
var actions = _lgService.GetInvokableActions();
|
|
foreach (var keyValuePair in actions)
|
|
{
|
|
var text = keyValuePair.Key;
|
|
|
|
var item = mnuLgActions.DropDownItems.Add(text);
|
|
item.Click += miLgAddAction_Click;
|
|
}
|
|
|
|
_lgService.InstallEventHandlers();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Logger.Error("Error initializing LgService: " + e.ToLogString());
|
|
}
|
|
}
|
|
|
|
private void AfterLgServiceRefreshDevices()
|
|
{
|
|
if (StartUpParams.ExecuteLgPreset)
|
|
{
|
|
var _ = _lgService.ApplyPreset(StartUpParams.LgPresetName);
|
|
}
|
|
}
|
|
|
|
private void InitInfo()
|
|
{
|
|
var fileVersionInfo = FileVersionInfo.GetVersionInfo(Path.GetFileName(Application.ExecutablePath));
|
|
|
|
if (ApplicationDeployment.IsNetworkDeployed)
|
|
{
|
|
Text = Application.ProductName + " " + ApplicationDeployment.CurrentDeployment.CurrentVersion.ToString();
|
|
}
|
|
else
|
|
{
|
|
Text = Application.ProductName + " " + Application.ProductVersion;
|
|
}
|
|
|
|
lblInfo.Text = Text + " - " + fileVersionInfo.LegalCopyright;
|
|
|
|
lbPlugins.Items.Add("lgtv.net by gr4b4z");
|
|
lbPlugins.Items.Add("Newtonsoft.Json by James Newton-King");
|
|
lbPlugins.Items.Add("NLog by Jarek Kowalski, Kim Christensen, Julian Verdurmen");
|
|
lbPlugins.Items.Add("NvAPIWrapper.Net by Soroush Falahati");
|
|
lbPlugins.Items.Add("NWin32 by zmjack");
|
|
lbPlugins.Items.Add("TaskScheduler by David Hall");
|
|
}
|
|
|
|
private void OpenForm(object sender, EventArgs e)
|
|
{
|
|
Show();
|
|
WindowState = FormWindowState.Normal;
|
|
Activate();
|
|
}
|
|
|
|
void Exit(object sender, EventArgs e)
|
|
{
|
|
UserExit = true;
|
|
Close();
|
|
}
|
|
|
|
private void trayIcon_MouseDoubleClick(object sender, MouseEventArgs e)
|
|
{
|
|
Show();
|
|
WindowState = FormWindowState.Normal;
|
|
}
|
|
|
|
private void FillNvPresets()
|
|
{
|
|
Utils.InitListView(lvNvPresets, NvPreset.GetColumnNames());
|
|
|
|
UpdateDisplayInfoItems();
|
|
|
|
foreach (var preset in _nvService.GetPresets())
|
|
{
|
|
AddOrUpdateItem(preset);
|
|
Utils.RegisterShortcut(Handle, preset.id, preset.shortcut);
|
|
}
|
|
}
|
|
|
|
private void FillAmdPresets()
|
|
{
|
|
Utils.InitListView(lvAmdPresets, AmdPreset.GetColumnNames());
|
|
|
|
UpdateDisplayInfoItemsAmd();
|
|
|
|
foreach (var preset in _amdService.GetPresets())
|
|
{
|
|
AddOrUpdateItemAmd(preset);
|
|
Utils.RegisterShortcut(Handle, preset.id, preset.shortcut);
|
|
}
|
|
}
|
|
|
|
private void UpdateDisplayInfoItems()
|
|
{
|
|
var displays = _nvService?.GetDisplayInfos();
|
|
if (displays == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var text = TS_TASKNAME;
|
|
foreach (var displayInfo in displays)
|
|
{
|
|
var display = displayInfo.Display;
|
|
|
|
var id = Math.Abs((int)display.Handle.MemoryAddress.ToInt64());
|
|
|
|
ListViewItem item = null;
|
|
for (var i = 0; i < lvNvPresets.Items.Count; i++)
|
|
{
|
|
item = lvNvPresets.Items[i];
|
|
|
|
if (item.Tag == null && item.ImageIndex == id)
|
|
{
|
|
break;
|
|
}
|
|
item = null;
|
|
}
|
|
|
|
if (item == null)
|
|
{
|
|
item = lvNvPresets.Items.Add(display.Name);
|
|
item.ImageIndex = id;
|
|
item.Font = new Font(item.Font, item.Font.Style | FontStyle.Bold);
|
|
item.BackColor = Color.LightGray;
|
|
}
|
|
|
|
var values = displayInfo.Values;
|
|
|
|
item.Text = values[0];
|
|
for (var i = 1; i < values.Count; i++)
|
|
{
|
|
if (item.SubItems.Count - 1 >= i)
|
|
{
|
|
item.SubItems[i].Text = values[i];
|
|
}
|
|
else
|
|
{
|
|
item.SubItems.Add(values[i]);
|
|
}
|
|
}
|
|
|
|
text += "\n" + displayInfo.InfoLine;
|
|
}
|
|
|
|
Utils.SetNotifyIconText(_trayIcon, text);
|
|
}
|
|
|
|
private void UpdateDisplayInfoItemsAmd()
|
|
{
|
|
var displays = _amdService?.GetDisplayInfos();
|
|
if (displays == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var text = TS_TASKNAME;
|
|
foreach (var displayInfo in displays)
|
|
{
|
|
var display = displayInfo.Display;
|
|
|
|
var id = display.DisplayID.DisplayPhysicalIndex;
|
|
|
|
ListViewItem item = null;
|
|
for (var i = 0; i < lvAmdPresets.Items.Count; i++)
|
|
{
|
|
item = lvAmdPresets.Items[i];
|
|
|
|
if (item.Tag == null && item.ImageIndex == id)
|
|
{
|
|
break;
|
|
}
|
|
item = null;
|
|
}
|
|
|
|
if (item == null)
|
|
{
|
|
item = lvAmdPresets.Items.Add(display.DisplayName);
|
|
item.ImageIndex = id;
|
|
item.Font = new Font(item.Font, item.Font.Style | FontStyle.Bold);
|
|
item.BackColor = Color.LightGray;
|
|
}
|
|
|
|
var values = displayInfo.Values;
|
|
|
|
item.Text = values[0];
|
|
for (var i = 1; i < values.Count; i++)
|
|
{
|
|
if (item.SubItems.Count - 1 >= i)
|
|
{
|
|
item.SubItems[i].Text = values[i];
|
|
}
|
|
else
|
|
{
|
|
item.SubItems.Add(values[i]);
|
|
}
|
|
}
|
|
|
|
text += "\n" + displayInfo.InfoLine;
|
|
}
|
|
|
|
Utils.SetNotifyIconText(_trayIcon, text);
|
|
}
|
|
|
|
private void AddOrUpdateItem(NvPreset preset = null)
|
|
{
|
|
Utils.AddOrUpdateListItem(lvNvPresets, _nvService.GetPresets(), _config, preset);
|
|
}
|
|
|
|
private void AddOrUpdateItemAmd(AmdPreset preset = null)
|
|
{
|
|
Utils.AddOrUpdateListItem(lvAmdPresets, _amdService.GetPresets(), _config, preset);
|
|
}
|
|
|
|
private void btnApply_Click(object sender, EventArgs e)
|
|
{
|
|
ApplySelectedNvPreset();
|
|
}
|
|
|
|
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
|
|
{
|
|
if (!(SystemShutdown || EndSession || UserExit) && _config.MinimizeOnClose)
|
|
{
|
|
e.Cancel = true;
|
|
WindowState = FormWindowState.Minimized;
|
|
UserExit = false;
|
|
return;
|
|
}
|
|
|
|
GlobalSave();
|
|
|
|
if (SystemShutdown && _lgService.Config.PowerOffOnShutdown)
|
|
{
|
|
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)
|
|
{
|
|
Logger.Debug("Not powering off because CONTROL-key is down");
|
|
}
|
|
else
|
|
{
|
|
Logger.Debug("Powering off tv...");
|
|
var task = _lgService.PowerOff();
|
|
Utils.WaitForTask(task);
|
|
Logger.Debug("Done powering off tv");
|
|
//ExecPowerOffPreset(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void GlobalSave()
|
|
{
|
|
_nvService?.GlobalSave();
|
|
_amdService?.GlobalSave();
|
|
_lgService?.GlobalSave();
|
|
|
|
SaveConfig();
|
|
}
|
|
|
|
private void lvNvPresets_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedNvPreset();
|
|
var enabled = preset != null;
|
|
|
|
btnApply.Enabled = enabled;
|
|
btnChange.Enabled = enabled;
|
|
edtNvPresetName.Enabled = enabled;
|
|
edtShortcut.Enabled = enabled;
|
|
btnNvPresetSave.Enabled = enabled;
|
|
btnClone.Enabled = enabled;
|
|
btnNvPresetDelete.Enabled = enabled;
|
|
|
|
if (preset != null)
|
|
{
|
|
edtNvPresetName.Text = preset.name;
|
|
edtShortcut.Text = preset.shortcut;
|
|
}
|
|
else
|
|
{
|
|
edtNvPresetName.Text = string.Empty;
|
|
edtShortcut.Text = string.Empty;
|
|
}
|
|
}
|
|
|
|
protected override void WndProc(ref Message m)
|
|
{
|
|
// 5. Catch when a HotKey is pressed !
|
|
if (m.Msg == NativeConstants.WM_HOTKEY && !edtShortcut.Focused && !edtShortcutLg.Focused && !edtAmdShortcut.Focused && !edtBlankScreenSaverShortcut.Focused)
|
|
{
|
|
int id = m.WParam.ToInt32();
|
|
|
|
// 6. Handle what will happen once a respective hotkey is pressed
|
|
if (id == SHORTCUTID_SCREENSAVER)
|
|
{
|
|
var screenSaver = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "scrnsave.scr");
|
|
Process.Start(screenSaver);
|
|
}
|
|
else
|
|
{
|
|
var preset = _nvService?.GetPresets().FirstOrDefault(x => x.id == id);
|
|
if (preset != null)
|
|
{
|
|
ApplyNvPreset(preset);
|
|
}
|
|
|
|
var amdPreset = _amdService?.GetPresets().FirstOrDefault(x => x.id == id);
|
|
if (amdPreset != null)
|
|
{
|
|
ApplyAmdPreset(amdPreset);
|
|
}
|
|
|
|
var lgPreset = _lgService?.GetPresets().FirstOrDefault(x => x.id == id);
|
|
if (lgPreset != null)
|
|
{
|
|
ApplyLgPreset(lgPreset);
|
|
}
|
|
}
|
|
}
|
|
else if (m.Msg == NativeConstants.WM_QUERYENDSESSION)
|
|
{
|
|
SystemShutdown = true;
|
|
}
|
|
else if (m.Msg == NativeConstants.WM_ENDSESSION)
|
|
{
|
|
EndSession = true;
|
|
}
|
|
else if (m.Msg == Utils.WM_BRINGTOFRONT)
|
|
{
|
|
Logger.Debug("WM_BRINGTOFRONT message received, opening form");
|
|
OpenForm(this, EventArgs.Empty);
|
|
}
|
|
|
|
base.WndProc(ref m);
|
|
}
|
|
|
|
private void edtShortcut_KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
((TextBox)sender).Text = Utils.FormatKeyboardShortcut(e);
|
|
}
|
|
|
|
private void btnSetShortcut_Click(object sender, EventArgs e)
|
|
{
|
|
var shortcut = edtShortcut.Text.Trim();
|
|
|
|
if (!string.IsNullOrWhiteSpace(shortcut) && !shortcut.Contains("+"))
|
|
{
|
|
MessageForms.WarningOk("Invalid shortcut. The shortcut should have modifiers and a normal key.");
|
|
return;
|
|
}
|
|
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
var name = edtNvPresetName.Text.Trim();
|
|
|
|
if (!string.IsNullOrEmpty(name) && _nvService.GetPresets().Any(x => x.id != preset.id && x.name != null && x.name.Equals(name, StringComparison.OrdinalIgnoreCase)))
|
|
{
|
|
MessageForms.WarningOk("The name must be unique.");
|
|
return;
|
|
}
|
|
|
|
var clear = !string.IsNullOrEmpty(preset.shortcut);
|
|
|
|
preset.shortcut = shortcut;
|
|
preset.name = name;
|
|
|
|
AddOrUpdateItem();
|
|
|
|
Utils.RegisterShortcut(Handle, preset.id, preset.shortcut, clear);
|
|
}
|
|
|
|
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
|
|
{
|
|
// Hide tray icon, otherwise it will remain shown until user mouses over it
|
|
_trayIcon.Visible = false;
|
|
}
|
|
|
|
private void MainForm_Resize(object sender, EventArgs e)
|
|
{
|
|
if (WindowState == FormWindowState.Minimized)
|
|
{
|
|
if (_config.MinimizeToTray)
|
|
{
|
|
Hide();
|
|
}
|
|
}
|
|
else if (WindowState == FormWindowState.Normal && _config != null)
|
|
{
|
|
_config.FormWidth = Width;
|
|
_config.FormHeight = Height;
|
|
}
|
|
}
|
|
|
|
private void chkStartAfterLogin_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
if (!_initialized)
|
|
{
|
|
return;
|
|
}
|
|
var enabled = chkStartAfterLogin.Checked;
|
|
Utils.RegisterTask(TS_TASKNAME, enabled);
|
|
}
|
|
|
|
private void LoadConfig()
|
|
{
|
|
chkStartMinimized.Checked = _config.StartMinimized;
|
|
chkMinimizeOnClose.Checked = _config.MinimizeOnClose;
|
|
chkMinimizeToSystemTray.Checked = _config.MinimizeToTray;
|
|
edtDelayDisplaySettings.Value = _config.DisplaySettingsDelay;
|
|
edtBlankScreenSaverShortcut.Text = _config.ScreenSaverShortcut;
|
|
|
|
if (!string.IsNullOrEmpty(_config.ScreenSaverShortcut))
|
|
{
|
|
Utils.RegisterShortcut(Handle, SHORTCUTID_SCREENSAVER, _config.ScreenSaverShortcut);
|
|
}
|
|
|
|
Width = _config.FormWidth;
|
|
Height = _config.FormHeight;
|
|
}
|
|
|
|
private void SaveConfig()
|
|
{
|
|
_config.StartMinimized = chkStartMinimized.Checked;
|
|
if (WindowState != FormWindowState.Minimized)
|
|
{
|
|
_config.FormWidth = Width;
|
|
_config.FormHeight = Height;
|
|
}
|
|
|
|
try
|
|
{
|
|
var data = Utils.JsonSerializer.Serialize(_config);
|
|
File.WriteAllText(Program.ConfigFilename, data);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Logger.Error(e.ToLogString());
|
|
}
|
|
}
|
|
|
|
private void ShowControls(Control parent, bool show = true, Control exclude = null)
|
|
{
|
|
for (var i = 0; i < parent.Controls.Count; i++)
|
|
{
|
|
var control = parent.Controls[i];
|
|
if (control != exclude)
|
|
{
|
|
control.Visible = show;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void MainForm_Shown(object sender, EventArgs e)
|
|
{
|
|
if (_nvService == null)
|
|
{
|
|
ShowControls(tabNVIDIA, false, lblError);
|
|
|
|
lblError.Text = "Error while initializing the NVIDIA-wrapper. You either don't have a NVIDIA GPU or it is disabled. NVIDIA controls will not be available.";
|
|
lblError.Visible = true;
|
|
}
|
|
|
|
if (_amdService == null)
|
|
{
|
|
ShowControls(tabAMD, false, lblErrorAMD);
|
|
|
|
lblErrorAMD.Text = "Error while initializing the ADL-wrapper. You either don't have a AMD GPU or it is disabled. AMD controls will not be available.";
|
|
lblErrorAMD.Visible = true;
|
|
}
|
|
|
|
if (_lgService == null)
|
|
{
|
|
ShowControls(tabLG, false, lblLgError);
|
|
lblLgError.Text = "Error while initializing the LG-controller. You either don't have a LG TV or it is disabled.";
|
|
lblLgError.Visible = true;
|
|
}
|
|
}
|
|
|
|
protected override void SetVisibleCore(bool value)
|
|
{
|
|
if (!_setVisibleCalled && _config.StartMinimized)
|
|
{
|
|
_setVisibleCalled = true;
|
|
if (_config.MinimizeToTray)
|
|
{
|
|
value = false;
|
|
}
|
|
else
|
|
{
|
|
WindowState = FormWindowState.Minimized;
|
|
}
|
|
}
|
|
if (!IsDisposed) {
|
|
base.SetVisibleCore(value);
|
|
}
|
|
}
|
|
|
|
private void edtShortcut_KeyUp(object sender, KeyEventArgs e)
|
|
{
|
|
Utils.HandleKeyboardShortcutUp(e);
|
|
}
|
|
|
|
private void edtShortcut_TextChanged(object sender, EventArgs e)
|
|
{
|
|
var text = edtShortcut.Text;
|
|
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
if (preset == null || string.IsNullOrEmpty(text))
|
|
{
|
|
edtShortcut.ForeColor = SystemColors.WindowText;
|
|
}
|
|
else
|
|
{
|
|
edtShortcut.ForeColor = ShortCutExists(text, preset.id) ? Color.Red : SystemColors.WindowText;
|
|
}
|
|
}
|
|
|
|
private NvPreset GetSelectedNvPreset()
|
|
{
|
|
if (lvNvPresets.SelectedItems.Count > 0)
|
|
{
|
|
var item = lvNvPresets.SelectedItems[0];
|
|
return (NvPreset)item.Tag;
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private AmdPreset GetSelectedAmdPreset()
|
|
{
|
|
if (lvAmdPresets.SelectedItems.Count > 0)
|
|
{
|
|
var item = lvAmdPresets.SelectedItems[0];
|
|
return (AmdPreset)item.Tag;
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private void btnClone_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
var newPreset = preset.Clone();
|
|
AddOrUpdateItem(newPreset);
|
|
}
|
|
|
|
private void miNvPresetColorSettings_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
preset.applyColorData = !preset.applyColorData;
|
|
|
|
AddOrUpdateItem();
|
|
}
|
|
|
|
private void miNvPresetApplyDithering_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
preset.applyDithering = !preset.applyDithering;
|
|
|
|
AddOrUpdateItem();
|
|
}
|
|
|
|
private void miNvPresetDitheringEnabled_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
preset.ditheringEnabled = !preset.ditheringEnabled;
|
|
|
|
AddOrUpdateItem();
|
|
}
|
|
|
|
private void btnChange_Click(object sender, EventArgs e)
|
|
{
|
|
mnuNvPresets.Show(btnChange, btnChange.PointToClient(Cursor.Position));
|
|
}
|
|
|
|
private void includedToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
preset.applyRefreshRate = !preset.applyRefreshRate;
|
|
|
|
AddOrUpdateItem();
|
|
}
|
|
|
|
private void mnuNvPresets_Opening(object sender, CancelEventArgs e)
|
|
{
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
miNvApply.Enabled = preset != null;
|
|
miNvPresetApplyOnStartup.Enabled = preset != null;
|
|
mnuNvDisplay.Enabled = preset != null;
|
|
miNvPresetColorSettings.Enabled = preset != null;
|
|
mnuNvPresetsColorSettings.Enabled = preset != null;
|
|
mnuRefreshRate.Enabled = preset != null;
|
|
miNvPresetDithering.Enabled = preset != null;
|
|
miNvHDR.Enabled = preset != null;
|
|
|
|
if (preset != null)
|
|
{
|
|
miNvPresetApplyOnStartup.Checked = _config.NvPresetId_ApplyOnStartup == preset.id;
|
|
|
|
if (mnuNvDisplay.DropDownItems.Count == 1)
|
|
{
|
|
var displays = _nvService.GetDisplays();
|
|
for (var i = 0; i < displays.Length; i++)
|
|
{
|
|
var display = displays[i];
|
|
var name = display.Name;
|
|
var screen = Screen.AllScreens.FirstOrDefault(x => x.DeviceName.Equals(name));
|
|
if (screen != null)
|
|
{
|
|
name += " (" + screen.DeviceFriendlyName() + ")";
|
|
}
|
|
|
|
var item = mnuNvDisplay.DropDownItems.Add(name);
|
|
item.Tag = display;
|
|
item.Click += displayMenuItem_Click;
|
|
}
|
|
}
|
|
|
|
Utils.BuildDropDownMenu(mnuNvPresetsColorSettings, "Bit depth", typeof(ColorDataDepth), preset.colorData, "ColorDepth", nvPresetColorDataMenuItem_Click);
|
|
Utils.BuildDropDownMenu(mnuNvPresetsColorSettings, "Format", typeof(ColorDataFormat), preset.colorData, "ColorFormat", nvPresetColorDataMenuItem_Click);
|
|
Utils.BuildDropDownMenu(mnuNvPresetsColorSettings, "Dynamic range", typeof(ColorDataDynamicRange), preset.colorData, "DynamicRange", nvPresetColorDataMenuItem_Click);
|
|
Utils.BuildDropDownMenu(mnuNvPresetsColorSettings, "Color space", typeof(ColorDataColorimetry), preset.colorData, "Colorimetry", nvPresetColorDataMenuItem_Click);
|
|
|
|
if (preset.displayName != _lastDisplayRefreshRates)
|
|
{
|
|
while (mnuRefreshRate.DropDownItems.Count > 1)
|
|
{
|
|
mnuRefreshRate.DropDownItems.RemoveAt(mnuRefreshRate.DropDownItems.Count - 1);
|
|
}
|
|
}
|
|
|
|
if (mnuRefreshRate.DropDownItems.Count == 1)
|
|
{
|
|
var refreshRates = _nvService.GetAvailableRefreshRates(preset);
|
|
_lastDisplayRefreshRates = preset.displayName;
|
|
|
|
foreach (var refreshRate in refreshRates)
|
|
{
|
|
var item = mnuRefreshRate.DropDownItems.Add(refreshRate.ToString() + "Hz");
|
|
item.Tag = refreshRate;
|
|
item.Click += refreshRateMenuItem_Click;
|
|
}
|
|
}
|
|
|
|
miNvPrimaryDisplay.Checked = preset.primaryDisplay;
|
|
foreach (var item in mnuNvDisplay.DropDownItems)
|
|
{
|
|
if (item is ToolStripMenuItem)
|
|
{
|
|
var menuItem = (ToolStripMenuItem)item;
|
|
if (menuItem.Tag != null)
|
|
{
|
|
menuItem.Checked = ((Display)menuItem.Tag).Name.Equals(preset.displayName);
|
|
}
|
|
}
|
|
}
|
|
|
|
miNvPresetColorSettings.Checked = preset.applyColorData;
|
|
|
|
miRefreshRateIncluded.Checked = preset.applyRefreshRate;
|
|
foreach (var item in mnuRefreshRate.DropDownItems)
|
|
{
|
|
if (item is ToolStripMenuItem)
|
|
{
|
|
var menuItem = (ToolStripMenuItem)item;
|
|
if (menuItem.Tag != null)
|
|
{
|
|
menuItem.Checked = (uint)menuItem.Tag == preset.refreshRate;
|
|
}
|
|
}
|
|
}
|
|
|
|
miNvPresetApplyDithering.Checked = preset.applyDithering;
|
|
miNvPresetDitheringEnabled.Checked = preset.ditheringEnabled;
|
|
|
|
foreach (var item in mnuNvDitheringBitDepth.DropDownItems.OfType<ToolStripMenuItem>())
|
|
{
|
|
if (item.Tag != null)
|
|
{
|
|
item.Checked = uint.Parse(item.Tag.ToString()) == preset.ditheringBits;
|
|
}
|
|
}
|
|
foreach (var item in mnuNvDitheringMode.DropDownItems.OfType<ToolStripMenuItem>())
|
|
{
|
|
if (item.Tag != null)
|
|
{
|
|
item.Checked = uint.Parse(item.Tag.ToString()) == preset.ditheringMode;
|
|
}
|
|
}
|
|
|
|
miHDRIncluded.Checked = preset.applyHDR;
|
|
miHDREnabled.Checked = preset.HDREnabled;
|
|
miToggleHDR.Checked = preset.toggleHDR;
|
|
}
|
|
}
|
|
|
|
private void nvPresetColorDataMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
var menuItem = (ToolStripMenuItem)sender;
|
|
var property = (PropertyInfo)menuItem.OwnerItem.Tag;
|
|
|
|
var value = menuItem.Tag;
|
|
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
var dictionary = new Dictionary<string, object>
|
|
{
|
|
{ "ColorFormat", preset.colorData.ColorFormat },
|
|
{ "ColorDepth", preset.colorData.ColorDepth },
|
|
{ "Colorimetry", preset.colorData.Colorimetry },
|
|
{ "DynamicRange", preset.colorData.DynamicRange },
|
|
{ "SelectionPolicy", preset.colorData.SelectionPolicy }
|
|
};
|
|
|
|
dictionary[property.Name] = value;
|
|
|
|
var colorData = NvPreset.GenerateColorData(dictionary);
|
|
|
|
preset.colorData = colorData;
|
|
|
|
AddOrUpdateItem();
|
|
}
|
|
|
|
private void refreshRateMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
var refreshRate = (uint)((ToolStripItem)sender).Tag;
|
|
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
preset.refreshRate = refreshRate;
|
|
|
|
AddOrUpdateItem();
|
|
}
|
|
|
|
private void refreshRateMenuItemAmd_Click(object sender, EventArgs e)
|
|
{
|
|
var refreshRate = (uint)((ToolStripItem)sender).Tag;
|
|
|
|
var preset = GetSelectedAmdPreset();
|
|
|
|
preset.refreshRate = refreshRate;
|
|
|
|
AddOrUpdateItemAmd();
|
|
}
|
|
|
|
private void displayMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
var menuItem = (ToolStripItem)sender;
|
|
if (menuItem.Tag != null)
|
|
{
|
|
var display = (Display)menuItem.Tag;
|
|
|
|
preset.displayName = display.Name;
|
|
preset.primaryDisplay = false;
|
|
}
|
|
else
|
|
{
|
|
preset.primaryDisplay = true;
|
|
preset.displayName = null;
|
|
}
|
|
|
|
AddOrUpdateItem();
|
|
}
|
|
|
|
private void displayMenuItemAmd_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedAmdPreset();
|
|
|
|
var menuItem = (ToolStripItem)sender;
|
|
if (menuItem.Tag != null)
|
|
{
|
|
var display = (ADLDisplayInfo)menuItem.Tag;
|
|
|
|
preset.displayName = display.DisplayName;
|
|
preset.primaryDisplay = false;
|
|
}
|
|
else
|
|
{
|
|
preset.primaryDisplay = true;
|
|
preset.displayName = null;
|
|
}
|
|
|
|
AddOrUpdateItemAmd();
|
|
}
|
|
|
|
private void miHDRIncluded_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
preset.applyHDR = !preset.applyHDR;
|
|
|
|
AddOrUpdateItem();
|
|
}
|
|
|
|
private void miToggleHDR_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
preset.toggleHDR = !preset.toggleHDR;
|
|
|
|
if (preset.toggleHDR)
|
|
{
|
|
preset.HDREnabled = false;
|
|
}
|
|
|
|
AddOrUpdateItem();
|
|
}
|
|
|
|
private void miHDREnabled_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
preset.HDREnabled = !preset.HDREnabled;
|
|
preset.toggleHDR = false;
|
|
|
|
AddOrUpdateItem();
|
|
}
|
|
|
|
private void FillLgPresets()
|
|
{
|
|
Utils.InitListView(lvLgPresets, LgPreset.GetColumnNames());
|
|
|
|
foreach (var preset in _lgService.GetPresets())
|
|
{
|
|
AddOrUpdateItemLg(preset);
|
|
Utils.RegisterShortcut(Handle, preset.id, preset.shortcut);
|
|
}
|
|
}
|
|
|
|
private void AddOrUpdateItemLg(LgPreset preset = null, ListViewItem specItem = null)
|
|
{
|
|
Utils.AddOrUpdateListItem(lvLgPresets, _lgService.GetPresets(), _config, preset, specItem);
|
|
}
|
|
|
|
private void btnCloneLg_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedLgPreset();
|
|
|
|
var newPreset = preset.Clone();
|
|
AddOrUpdateItemLg(newPreset);
|
|
}
|
|
|
|
private LgPreset GetSelectedLgPreset()
|
|
{
|
|
if (lvLgPresets.SelectedItems.Count > 0)
|
|
{
|
|
var item = lvLgPresets.SelectedItems[0];
|
|
return (LgPreset)item.Tag;
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private void lvLgPresets_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
var enabled = lvLgPresets.SelectedItems.Count > 0;
|
|
btnApplyLg.Enabled = enabled;
|
|
btnCloneLg.Enabled = enabled;
|
|
edtNameLg.Enabled = enabled;
|
|
edtShortcutLg.Enabled = enabled;
|
|
btnSetShortcutLg.Enabled = enabled;
|
|
edtStepsLg.Enabled = enabled;
|
|
btnLgAddButton.Enabled = enabled;
|
|
cbxLgApps.Enabled = enabled;
|
|
btnDeleteLg.Enabled = enabled;
|
|
|
|
var preset = GetSelectedLgPreset();
|
|
|
|
if (preset != null)
|
|
{
|
|
edtNameLg.Text = preset.name;
|
|
var lgApps = _lgService?.GetApps();
|
|
cbxLgApps.SelectedIndex = lgApps == null ? -1 : lgApps.FindIndex(x => x.appId.Equals(preset.appId));
|
|
edtShortcutLg.Text = preset.shortcut;
|
|
edtStepsLg.Text = preset.steps.Aggregate("", (a, b) => (string.IsNullOrEmpty(a) ? "" : a + ", ") + b);
|
|
}
|
|
else
|
|
{
|
|
edtNameLg.Text = string.Empty;
|
|
cbxLgApps.SelectedIndex = -1;
|
|
edtShortcutLg.Text = string.Empty;
|
|
edtStepsLg.Text = string.Empty;
|
|
}
|
|
}
|
|
|
|
private void btnApplyLg_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedLgPreset();
|
|
|
|
ApplyLgPreset(preset);
|
|
}
|
|
|
|
private void btnSetShortcutLg_Click(object sender, EventArgs e)
|
|
{
|
|
var shortcut = edtShortcutLg.Text.Trim();
|
|
if (!string.IsNullOrWhiteSpace(shortcut) && !shortcut.Contains("+"))
|
|
{
|
|
MessageForms.WarningOk("Invalid shortcut. The shortcut should have modifiers and a normal key.");
|
|
return;
|
|
}
|
|
|
|
var preset = GetSelectedLgPreset();
|
|
|
|
var name = edtNameLg.Text.Trim();
|
|
|
|
if (name.Length == 0 || _lgService.GetPresets().Any(x => x.id != preset.id && x.name.Equals(name, StringComparison.OrdinalIgnoreCase)))
|
|
{
|
|
MessageForms.WarningOk("The name can not be empty and must be unique.");
|
|
return;
|
|
}
|
|
|
|
var clear = !string.IsNullOrEmpty(preset.shortcut);
|
|
|
|
preset.name = name;
|
|
|
|
if (cbxLgApps.SelectedIndex == -1)
|
|
{
|
|
preset.appId = string.Empty;
|
|
}
|
|
else
|
|
{
|
|
var lgApp = (LgApp)cbxLgApps.SelectedItem;
|
|
preset.appId = lgApp.appId;
|
|
}
|
|
|
|
var shortcutChanged = !shortcut.Equals(preset.shortcut);
|
|
if (shortcutChanged)
|
|
{
|
|
preset.shortcut = shortcut;
|
|
}
|
|
|
|
var text = edtStepsLg.Text;
|
|
var clearSteps = string.IsNullOrEmpty(text);
|
|
|
|
preset.steps.Clear();
|
|
if (!clearSteps)
|
|
{
|
|
text = text.Replace(" ", string.Empty);
|
|
var steps = text.Split(',');
|
|
preset.steps.AddRange(steps);
|
|
}
|
|
|
|
AddOrUpdateItemLg();
|
|
|
|
if (shortcutChanged)
|
|
{
|
|
Utils.RegisterShortcut(Handle, preset.id, preset.shortcut, clear);
|
|
}
|
|
}
|
|
|
|
private void btnNvPresetDelete_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
if (preset == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty(preset.shortcut))
|
|
{
|
|
Utils.UnregisterHotKey(Handle, preset.id);
|
|
}
|
|
|
|
_nvService.GetPresets().Remove(preset);
|
|
|
|
var item = lvNvPresets.SelectedItems[0];
|
|
lvNvPresets.Items.Remove(item);
|
|
}
|
|
|
|
private void btnAddModesNv_Click(object sender, EventArgs e)
|
|
{
|
|
var presets = NvPreset.GetDefaultPresets();
|
|
var added = false;
|
|
|
|
foreach (var preset in presets)
|
|
{
|
|
if (!_nvService.GetPresets().Any(x => x.colorData.Equals(preset.colorData)))
|
|
{
|
|
AddOrUpdateItem(preset);
|
|
added = true;
|
|
}
|
|
}
|
|
|
|
if (added)
|
|
{
|
|
MessageForms.InfoOk("Missing presets added.");
|
|
}
|
|
else
|
|
{
|
|
MessageForms.InfoOk("All presets for every color setting already exist.");
|
|
}
|
|
}
|
|
|
|
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
if (tcMain.SelectedTab == tabLG)
|
|
{
|
|
if (cbxLgDevices.Items.Count == 0 && _lgService != null)
|
|
{
|
|
var devices = _lgService.Devices;
|
|
if (devices == null || !devices.Any())
|
|
{
|
|
RefreshLgDevices();
|
|
}
|
|
else
|
|
{
|
|
FillLgDevices();
|
|
}
|
|
}
|
|
}
|
|
else if (tcMain.SelectedTab == tabLog)
|
|
{
|
|
LoadLog();
|
|
}
|
|
else if (tcMain.SelectedTab == tabInfo)
|
|
{
|
|
LoadInfo();
|
|
}
|
|
else if (tcMain.SelectedTab == tabOptions)
|
|
{
|
|
grpNvidiaOptions.Visible = _nvService != null;
|
|
if (grpNvidiaOptions.Visible)
|
|
{
|
|
var firstTime = cbxDitheringBitDepth.Items.Count == 0;
|
|
|
|
if (firstTime)
|
|
{
|
|
cbxDitheringBitDepth.Items.AddRange(Utils.GetDescriptions<NvDitherBits>().ToArray());
|
|
cbxDitheringMode.Items.AddRange(Utils.GetDescriptions<NvDitherMode>().ToArray());
|
|
}
|
|
|
|
var preset = _nvService.GetLastAppliedPreset() ?? GetSelectedNvPreset();
|
|
if (firstTime || preset != null)
|
|
{
|
|
chkDitheringEnabled.Checked = preset?.ditheringEnabled ?? true;
|
|
cbxDitheringBitDepth.SelectedIndex = (int)(preset?.ditheringBits ?? (int)NvDitherBits.Bits8);
|
|
cbxDitheringMode.SelectedIndex = (int)(preset?.ditheringMode ?? (int)NvDitherMode.Temporal);
|
|
FillGradient();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void FillLgDevices()
|
|
{
|
|
cbxLgDevices.Items.Clear();
|
|
var devices = _lgService.Devices;
|
|
foreach (var device in devices)
|
|
{
|
|
cbxLgDevices.Items.Add(device);
|
|
}
|
|
if (_lgService.SelectedDevice != null)
|
|
{
|
|
cbxLgDevices.SelectedIndex = cbxLgDevices.Items.IndexOf(_lgService.SelectedDevice);
|
|
}
|
|
|
|
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.");
|
|
}
|
|
|
|
if (cbxLgApps.Items.Count == 0 && _lgService.SelectedDevice != null)
|
|
{
|
|
_lgService.RefreshApps().ContinueWith((task) => BeginInvoke(new Action(FillLgApps)));
|
|
}
|
|
}
|
|
|
|
private void FillLgApps()
|
|
{
|
|
var lgApps = _lgService?.GetApps();
|
|
if (lgApps == null || !lgApps.Any())
|
|
{
|
|
MessageForms.WarningOk("Could not refresh the apps. Check the log for details.");
|
|
return;
|
|
}
|
|
InitLgApps();
|
|
}
|
|
|
|
private void InitLgApps() {
|
|
var lgApps = _lgService?.GetApps();
|
|
|
|
cbxLgApps.Items.Clear();
|
|
if (lgApps != null)
|
|
{
|
|
cbxLgApps.Items.AddRange(lgApps.ToArray());
|
|
}
|
|
|
|
for (var i = 0; i < lvLgPresets.Items.Count; i++)
|
|
{
|
|
var item = lvLgPresets.Items[i];
|
|
AddOrUpdateItemLg((LgPreset)item.Tag, item);
|
|
}
|
|
|
|
var preset = GetSelectedLgPreset();
|
|
if (preset != null)
|
|
{
|
|
cbxLgApps.SelectedIndex = lgApps == null ? -1 : lgApps.FindIndex(x => x.appId.Equals(preset.appId));
|
|
}
|
|
}
|
|
|
|
private void UpdateTrayMenuNv()
|
|
{
|
|
var presets = _nvService.GetPresets().Where(x => x.applyColorData || x.applyDithering || x.applyHDR || x.applyRefreshRate);
|
|
|
|
_nvTrayMenu.MenuItems.Clear();
|
|
|
|
foreach (var preset in presets)
|
|
{
|
|
var name = preset.GetTextForMenuItem();
|
|
if (!string.IsNullOrEmpty(preset.shortcut))
|
|
{
|
|
name += "\t" + preset.shortcut;
|
|
}
|
|
|
|
var item = new MenuItem(name);
|
|
item.Tag = preset;
|
|
item.Click += TrayMenuItemNv_Click;
|
|
_nvTrayMenu.MenuItems.Add(item);
|
|
}
|
|
}
|
|
|
|
private void UpdateTrayMenuAmd()
|
|
{
|
|
var presets = _amdService.GetPresets().Where(x => x.applyColorData || x.applyDithering || x.applyHDR || x.applyRefreshRate);
|
|
|
|
_amdTrayMenu.MenuItems.Clear();
|
|
|
|
foreach (var preset in presets)
|
|
{
|
|
var name = preset.GetTextForMenuItem();
|
|
if (!string.IsNullOrEmpty(preset.shortcut))
|
|
{
|
|
name += "\t" + preset.shortcut;
|
|
}
|
|
|
|
var item = new MenuItem(name);
|
|
item.Tag = preset;
|
|
item.Click += TrayMenuItemAmd_Click;
|
|
_amdTrayMenu.MenuItems.Add(item);
|
|
}
|
|
}
|
|
|
|
private void TrayMenuItemNv_Click(object sender, EventArgs e)
|
|
{
|
|
var item = sender as MenuItem;
|
|
var preset = (NvPreset)item.Tag;
|
|
|
|
ApplyNvPreset(preset);
|
|
}
|
|
|
|
private void TrayMenuItemAmd_Click(object sender, EventArgs e)
|
|
{
|
|
var item = sender as MenuItem;
|
|
var preset = (AmdPreset)item.Tag;
|
|
|
|
ApplyAmdPreset(preset);
|
|
}
|
|
|
|
private void trayIconContextMenu_Popup(object sender, EventArgs e)
|
|
{
|
|
_nvTrayMenu.Visible = _nvService != null;
|
|
if (_nvTrayMenu.Visible)
|
|
{
|
|
UpdateTrayMenuNv();
|
|
}
|
|
|
|
_amdTrayMenu.Visible = _amdService != null;
|
|
if (_amdTrayMenu.Visible)
|
|
{
|
|
UpdateTrayMenuAmd();
|
|
}
|
|
|
|
_lgTrayMenu.Visible = _lgService != null;
|
|
if (_lgTrayMenu.Visible)
|
|
{
|
|
UpdateTrayMenuLg();
|
|
}
|
|
}
|
|
|
|
private void UpdateTrayMenuLg()
|
|
{
|
|
var presets = _lgService.GetPresets().Where(x => !string.IsNullOrEmpty(x.appId) || x.steps.Any());
|
|
|
|
_lgTrayMenu.MenuItems.Clear();
|
|
|
|
foreach (var preset in presets)
|
|
{
|
|
var name = preset.name;
|
|
if (!string.IsNullOrEmpty(preset.shortcut))
|
|
{
|
|
name += "\t" + preset.shortcut;
|
|
}
|
|
|
|
var item = new MenuItem(name);
|
|
item.Tag = preset;
|
|
item.Click += TrayMenuItemLg_Click;
|
|
_lgTrayMenu.MenuItems.Add(item);
|
|
}
|
|
}
|
|
|
|
private void TrayMenuItemLg_Click(object sender, EventArgs e)
|
|
{
|
|
var item = sender as MenuItem;
|
|
var preset = (LgPreset)item.Tag;
|
|
|
|
ApplyLgPreset(preset);
|
|
}
|
|
|
|
private void ApplySelectedNvPreset()
|
|
{
|
|
var preset = GetSelectedNvPreset();
|
|
ApplyNvPreset(preset);
|
|
}
|
|
|
|
private void ApplySelectedAmdPreset()
|
|
{
|
|
var preset = GetSelectedAmdPreset();
|
|
ApplyAmdPreset(preset);
|
|
}
|
|
|
|
private void btnDeleteLg_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedLgPreset();
|
|
|
|
if (preset == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty(preset.shortcut))
|
|
{
|
|
Utils.UnregisterHotKey(Handle, preset.id);
|
|
}
|
|
|
|
_lgService.GetPresets().Remove(preset);
|
|
|
|
var item = lvLgPresets.SelectedItems[0];
|
|
lvLgPresets.Items.Remove(item);
|
|
}
|
|
|
|
private void btnAddLg_Click(object sender, EventArgs e)
|
|
{
|
|
AddOrUpdateItemLg(_lgService.CreateNewPreset());
|
|
}
|
|
|
|
private void edtDelayDisplaySettings_ValueChanged(object sender, EventArgs e)
|
|
{
|
|
_config.DisplaySettingsDelay = (int)edtDelayDisplaySettings.Value;
|
|
}
|
|
|
|
private bool ApplyNvPreset(NvPreset preset)
|
|
{
|
|
if (preset == null || _nvService == null)
|
|
{
|
|
return false;
|
|
}
|
|
try
|
|
{
|
|
var result = _nvService.ApplyPreset(preset, Program.AppContext);
|
|
if (!result)
|
|
{
|
|
throw new Exception("Error while applying NVIDIA preset. At least one setting could not be applied. Check the log for details.");
|
|
}
|
|
|
|
UpdateDisplayInfoItems();
|
|
return true;
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
MessageForms.ErrorOk($"Error applying NVIDIA-preset ({e.TargetSite.Name}): {e.Message}");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private bool ApplyAmdPreset(AmdPreset preset)
|
|
{
|
|
if (preset == null || _amdService == null)
|
|
{
|
|
return false;
|
|
}
|
|
try
|
|
{
|
|
var result = _amdService.ApplyPreset(preset, Program.AppContext);
|
|
if (!result)
|
|
{
|
|
throw new Exception("Error while applying AMD preset. At least one setting could not be applied. Check the log for details.");
|
|
}
|
|
|
|
UpdateDisplayInfoItemsAmd();
|
|
return true;
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
MessageForms.ErrorOk($"Error applying AMD-preset ({e.TargetSite.Name}): {e.Message}");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private void ApplyLgPreset(LgPreset preset, bool reconnect = false, bool wait = false)
|
|
{
|
|
if (preset == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var applyTask = _lgService.ApplyPreset(preset, reconnect).ContinueWith((task) => BeginInvoke(new Action<Task<bool>>(LgPresetApplied), new[] { task }));
|
|
if (wait)
|
|
{
|
|
Utils.WaitForTask(applyTask);
|
|
}
|
|
}
|
|
|
|
private void LgPresetApplied(Task<bool> task)
|
|
{
|
|
var result = task.Result;
|
|
if (!result)
|
|
{
|
|
MessageForms.WarningOk("Could not apply the preset (entirely). Check the log for details.");
|
|
}
|
|
}
|
|
|
|
private void LoadLog()
|
|
{
|
|
var filename = Path.Combine(_dataDir, "LogFile.txt");
|
|
|
|
var log = "No log file found";
|
|
if (File.Exists(filename))
|
|
{
|
|
log = File.ReadAllText(filename);
|
|
}
|
|
edtLog.Text = log;
|
|
}
|
|
|
|
private void LoadInfo()
|
|
{
|
|
grpNVIDIAInfo.Visible = _nvService != null;
|
|
}
|
|
|
|
private void btnLgRefreshApps_Click(object sender, EventArgs e)
|
|
{
|
|
_lgService.RefreshApps(true).ContinueWith((task) => BeginInvoke(new Action(FillLgApps)));
|
|
}
|
|
|
|
private void cbxLgDevices_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
if (cbxLgDevices.SelectedIndex == -1)
|
|
{
|
|
_lgService.SelectedDevice = null;
|
|
}
|
|
else
|
|
{
|
|
_lgService.SelectedDevice = (PnpDev)cbxLgDevices.SelectedItem;
|
|
}
|
|
btnLGRemoteControl.Enabled = _lgService.SelectedDevice != null;
|
|
}
|
|
|
|
private void lvLgPresets_DoubleClick(object sender, EventArgs e)
|
|
{
|
|
ApplySelectedLgPreset();
|
|
}
|
|
|
|
private void ApplySelectedLgPreset()
|
|
{
|
|
var preset = GetSelectedLgPreset();
|
|
ApplyLgPreset(preset);
|
|
}
|
|
|
|
private void btnRefreshNVIDIAInfo_Click(object sender, EventArgs e)
|
|
{
|
|
if (_nvService != null)
|
|
{
|
|
tvNVIDIAInfo.Nodes.Clear();
|
|
var displays = Display.GetDisplays();
|
|
for (var i = 0; i < displays.Length; i++)
|
|
{
|
|
var display = displays[i];
|
|
var node = TreeNodeBuilder.CreateTree(display, $"Display[{i}]");
|
|
tvNVIDIAInfo.Nodes.Add(node);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void btnLgAddButton_Click(object sender, EventArgs e)
|
|
{
|
|
mnuLgButtons.Show(btnLgAddButton, btnLgAddButton.PointToClient(Cursor.Position));
|
|
}
|
|
|
|
private void miLgAddButton_Click(object sender, EventArgs e)
|
|
{
|
|
var item = sender as ToolStripItem;
|
|
|
|
AddToLgSteps(item.Text);
|
|
}
|
|
|
|
private void miLgAddAction_Click(object sender, EventArgs e)
|
|
{
|
|
var item = sender as ToolStripItem;
|
|
|
|
AddToLgSteps(item.Text);
|
|
}
|
|
|
|
private void AddToLgSteps(string step)
|
|
{
|
|
var text = edtStepsLg.Text;
|
|
if (string.IsNullOrWhiteSpace(text))
|
|
{
|
|
text = step;
|
|
}
|
|
else
|
|
{
|
|
var pos = edtStepsLg.SelectionStart;
|
|
while (pos < text.Length && text.CharAt(pos) != ',')
|
|
{
|
|
pos++;
|
|
}
|
|
if (pos == text.Length)
|
|
{
|
|
text += ", " + step;
|
|
}
|
|
else
|
|
{
|
|
text = text.Substring(0, pos + 1) + " " + step + ", " + text.Substring(pos + 1).Trim();
|
|
}
|
|
}
|
|
edtStepsLg.Text = text.Trim();
|
|
}
|
|
|
|
private void clbLgPower_ItemCheck(object sender, ItemCheckEventArgs e)
|
|
{
|
|
if (!_initialized)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!(_lgService.Config.PowerOnAfterResume || _lgService.Config.PowerOnAfterStartup || _lgService.Config.PowerSwitchOnScreenSaver))
|
|
{
|
|
MessageForms.InfoOk(
|
|
@"Be sure to activate the following setting on the TV, or the app will not be able to wake the TV:
|
|
|
|
Connection > Mobile TV On > Turn on via Wi-Fi (Networked Standby Mode)
|
|
|
|
See Options to test this functionality."
|
|
);
|
|
}
|
|
|
|
BeginInvoke(new Action(() =>
|
|
{
|
|
_lgService.Config.PowerOnAfterStartup = clbLgPower.GetItemChecked(0);
|
|
_lgService.Config.PowerOnAfterResume = clbLgPower.GetItemChecked(1);
|
|
_lgService.Config.PowerOffOnShutdown = clbLgPower.GetItemChecked(2);
|
|
_lgService.Config.PowerOffOnStandby = clbLgPower.GetItemChecked(3);
|
|
_lgService.Config.PowerSwitchOnScreenSaver = clbLgPower.GetItemChecked(4);
|
|
|
|
_lgService.InstallEventHandlers();
|
|
}));
|
|
}
|
|
|
|
private void edtLgPowerOnAfterResumeDelay_ValueChanged(object sender, EventArgs e)
|
|
{
|
|
_lgService.Config.PowerOnRetries = (int)edtLgMaxPowerOnRetries.Value;
|
|
}
|
|
|
|
private void chkFixChromeFonts_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
if (_initialized)
|
|
{
|
|
if (chkFixChromeFonts.Checked)
|
|
{
|
|
Utils.ExecuteElevated(StartUpParams.ActivateChromeFontFixParam);
|
|
}
|
|
else
|
|
{
|
|
Utils.ExecuteElevated(StartUpParams.DeactivateChromeFontFixParam);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void btnLGTestPower_Click(object sender, EventArgs e)
|
|
{
|
|
//_lgService.WakeSelectedDevice();
|
|
//return;
|
|
var text =
|
|
@"The TV will now power off. Please wait for the TV to be powered off completely (relay click) and press ENTER to wake it again.
|
|
For waking up to work, you need to activate the following setting on the TV:
|
|
|
|
Connection > Mobile TV On > Turn on via Wi-Fi
|
|
|
|
It will also work over a wired connection.
|
|
Do you want to continue?";
|
|
|
|
if (MessageForms.QuestionYesNo(text) == DialogResult.Yes)
|
|
{
|
|
Utils.WaitForTask(_lgService.PowerOff());
|
|
|
|
MessageForms.InfoOk("Press ENTER to wake the TV.");
|
|
|
|
_lgService.WakeSelectedDevice();
|
|
}
|
|
}
|
|
|
|
private void btnSetShortcutScreenSaver_Click(object sender, EventArgs e)
|
|
{
|
|
var shortcut = edtBlankScreenSaverShortcut.Text.Trim();
|
|
|
|
if (!string.IsNullOrWhiteSpace(shortcut) && !shortcut.Contains("+"))
|
|
{
|
|
MessageForms.WarningOk("Invalid shortcut. The shortcut should have modifiers and a normal key.");
|
|
return;
|
|
}
|
|
|
|
var oldShortcut = _config.ScreenSaverShortcut;
|
|
|
|
var clear = !string.IsNullOrEmpty(oldShortcut);
|
|
|
|
_config.ScreenSaverShortcut = shortcut;
|
|
|
|
Utils.RegisterShortcut(Handle, SHORTCUTID_SCREENSAVER, shortcut, clear);
|
|
}
|
|
|
|
private void chkMinimizeOnClose_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
_config.MinimizeOnClose = chkMinimizeOnClose.Checked;
|
|
}
|
|
|
|
private void MainForm_Activated(object sender, EventArgs e)
|
|
{
|
|
UpdateDisplayInfoItems();
|
|
UpdateDisplayInfoItemsAmd();
|
|
|
|
if (tcMain.SelectedTab == tabLog)
|
|
{
|
|
LoadLog();
|
|
}
|
|
}
|
|
|
|
private void btnClearLog_Click(object sender, EventArgs e)
|
|
{
|
|
var filename = Path.Combine(_dataDir, "LogFile.txt");
|
|
if (File.Exists(filename))
|
|
{
|
|
File.Delete(filename);
|
|
edtLog.Clear();
|
|
}
|
|
}
|
|
|
|
private void edtLgDeviceFilter_TextChanged(object sender, EventArgs e)
|
|
{
|
|
if (_lgService != null)
|
|
{
|
|
_lgService.Config.DeviceSearchKey = edtLgDeviceFilter.Text;
|
|
}
|
|
}
|
|
|
|
private void btnLgDeviceFilterRefresh_Click(object sender, EventArgs e)
|
|
{
|
|
RefreshLgDevices();
|
|
}
|
|
|
|
private void RefreshLgDevices()
|
|
{
|
|
_lgService.RefreshDevices(false).ContinueWith((task) => BeginInvoke(new Action(FillLgDevices)));
|
|
}
|
|
|
|
private void FillGradient()
|
|
{
|
|
if (pbGradient.Image == null)
|
|
{
|
|
pbGradient.Image = Utils.GenerateGradientBitmap(pbGradient.Width, pbGradient.Height);
|
|
}
|
|
}
|
|
|
|
private void chkDitheringEnabled_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
ApplyDitheringOptions();
|
|
}
|
|
|
|
private void ApplyDitheringOptions()
|
|
{
|
|
var bitDepth = cbxDitheringBitDepth.SelectedIndex;
|
|
var mode = cbxDitheringMode.SelectedIndex;
|
|
|
|
_nvService.SetDithering(chkDitheringEnabled.Checked, (uint)bitDepth, (uint)(mode > -1 ? mode : (int)NvDitherMode.Temporal));
|
|
}
|
|
|
|
private void cbxDitheringBitDepth_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
ApplyDitheringOptions();
|
|
}
|
|
|
|
private void cbxDitheringMode_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
ApplyDitheringOptions();
|
|
}
|
|
|
|
private void miNvDithering6bit_Click(object sender, EventArgs e)
|
|
{
|
|
var item = sender as ToolStripMenuItem;
|
|
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
preset.ditheringBits = uint.Parse(item.Tag.ToString());
|
|
|
|
AddOrUpdateItem();
|
|
}
|
|
|
|
private void spatial1ToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
var item = sender as ToolStripMenuItem;
|
|
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
preset.ditheringBits = uint.Parse(item.Tag.ToString());
|
|
|
|
AddOrUpdateItem();
|
|
|
|
}
|
|
|
|
private void btnLGRemoteControl_Click(object sender, EventArgs e)
|
|
{
|
|
if (_remoteControlForm == null || _remoteControlForm.IsDisposed)
|
|
{
|
|
var buttons = _lgService.GetRemoteControlButtons();
|
|
_remoteControlForm = new RemoteControlForm(_lgService, buttons);
|
|
_remoteControlForm.Show();
|
|
}
|
|
else
|
|
{
|
|
_remoteControlForm.Show();
|
|
}
|
|
}
|
|
|
|
private void AfterInitialized()
|
|
{
|
|
ApplyNvPresetOnStartup();
|
|
ApplyAmdPresetOnStartup();
|
|
}
|
|
|
|
private void ApplyNvPresetOnStartup(int attempts = 5) {
|
|
|
|
var presetIdOrName = !string.IsNullOrEmpty(StartUpParams.NvidiaPresetIdOrName) ? StartUpParams.NvidiaPresetIdOrName : _config.NvPresetId_ApplyOnStartup.ToString();
|
|
|
|
if (!string.IsNullOrEmpty(presetIdOrName))
|
|
{
|
|
var preset = _nvService?.GetPresetByIdOrName(presetIdOrName);
|
|
if (preset == null)
|
|
{
|
|
if (string.IsNullOrEmpty(StartUpParams.NvidiaPresetIdOrName))
|
|
{
|
|
_config.NvPresetId_ApplyOnStartup = 0;
|
|
}
|
|
}
|
|
else if (_nvService != null)
|
|
{
|
|
if (_nvService.HasDisplaysAttached())
|
|
{
|
|
ApplyNvPreset(preset);
|
|
}
|
|
else
|
|
{
|
|
attempts--;
|
|
if (attempts > 0)
|
|
{
|
|
Task.Run(async () =>
|
|
{
|
|
await Task.Delay(2000);
|
|
BeginInvoke(new Action(() => ApplyNvPresetOnStartup(attempts)));
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void ApplyAmdPresetOnStartup(int attempts = 5)
|
|
{
|
|
var presetIdOrName = !string.IsNullOrEmpty(StartUpParams.AmdPresetIdOrName) ? StartUpParams.AmdPresetIdOrName : _config.AmdPresetId_ApplyOnStartup.ToString();
|
|
|
|
if (!string.IsNullOrEmpty(presetIdOrName))
|
|
{
|
|
var preset = _amdService?.GetPresetByIdOrName(presetIdOrName);
|
|
if (preset == null)
|
|
{
|
|
if (string.IsNullOrEmpty(StartUpParams.AmdPresetIdOrName))
|
|
{
|
|
_config.AmdPresetId_ApplyOnStartup = 0;
|
|
}
|
|
}
|
|
else if (_amdService != null)
|
|
{
|
|
if (_amdService.HasDisplaysAttached())
|
|
{
|
|
ApplyAmdPreset(preset);
|
|
}
|
|
else
|
|
{
|
|
attempts--;
|
|
if (attempts > 0)
|
|
{
|
|
Task.Run(async () =>
|
|
{
|
|
await Task.Delay(2000);
|
|
BeginInvoke(new Action(() => ApplyAmdPresetOnStartup(attempts)));
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void miNvPresetApplyOnStartup_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedNvPreset();
|
|
_config.NvPresetId_ApplyOnStartup = miNvPresetApplyOnStartup.Checked ? preset.id : 0;
|
|
|
|
AddOrUpdateItem();
|
|
}
|
|
|
|
private void chkLgAlternateWolMechanism_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
_lgService.Config.UseOldNpcapWol = chkLgOldWolMechanism.Checked;
|
|
}
|
|
|
|
private void MainForm_Deactivate(object sender, EventArgs e)
|
|
{
|
|
GlobalSave();
|
|
}
|
|
|
|
private void btnApplyAmd_Click(object sender, EventArgs e)
|
|
{
|
|
ApplySelectedAmdPreset();
|
|
}
|
|
|
|
private void btnChangeAmd_Click(object sender, EventArgs e)
|
|
{
|
|
mnuAmdPresets.Show(btnChangeAmd, btnChangeAmd.PointToClient(Cursor.Position));
|
|
}
|
|
|
|
private void edtAmdShortcut_TextChanged(object sender, EventArgs e)
|
|
{
|
|
var text = edtAmdShortcut.Text;
|
|
|
|
var preset = GetSelectedAmdPreset();
|
|
|
|
if (preset == null || string.IsNullOrEmpty(text))
|
|
{
|
|
edtAmdShortcut.ForeColor = SystemColors.WindowText;
|
|
}
|
|
else
|
|
{
|
|
edtAmdShortcut.ForeColor = ShortCutExists(text, preset.id) ? Color.Red : SystemColors.WindowText;
|
|
}
|
|
}
|
|
|
|
private bool ShortCutExists(string shortcut, int presetId)
|
|
{
|
|
return
|
|
(_nvService?.GetPresets().Any(x => x.id != presetId && shortcut.Equals(x.shortcut)) ?? false) ||
|
|
(_amdService?.GetPresets().Any(x => x.id != presetId && shortcut.Equals(x.shortcut)) ?? false) ||
|
|
(_lgService?.GetPresets().Any(x => x.id != presetId && shortcut.Equals(x.shortcut)) ?? false);
|
|
}
|
|
|
|
private void edtShortcutLg_TextChanged(object sender, EventArgs e)
|
|
{
|
|
var text = edtShortcutLg.Text;
|
|
|
|
var preset = GetSelectedLgPreset();
|
|
|
|
if (preset == null || string.IsNullOrEmpty(text))
|
|
{
|
|
edtShortcutLg.ForeColor = SystemColors.WindowText;
|
|
}
|
|
else
|
|
{
|
|
edtShortcutLg.ForeColor = ShortCutExists(text, preset.id) ? Color.Red : SystemColors.WindowText;
|
|
}
|
|
}
|
|
|
|
private void btnSetAmdShortcut_Click(object sender, EventArgs e)
|
|
{
|
|
var shortcut = edtAmdShortcut.Text.Trim();
|
|
|
|
if (!string.IsNullOrWhiteSpace(shortcut) && !shortcut.Contains("+"))
|
|
{
|
|
MessageForms.WarningOk("Invalid shortcut. The shortcut should have modifiers and a normal key.");
|
|
return;
|
|
}
|
|
|
|
var preset = GetSelectedAmdPreset();
|
|
|
|
var name = edtAmdPresetName.Text.Trim();
|
|
|
|
if (!string.IsNullOrEmpty(name) && _amdService.GetPresets().Any(x => x.id != preset.id && x.name != null && x.name.Equals(name, StringComparison.OrdinalIgnoreCase)))
|
|
{
|
|
MessageForms.WarningOk("The name must be unique.");
|
|
return;
|
|
}
|
|
|
|
var clear = !string.IsNullOrEmpty(preset.shortcut);
|
|
|
|
preset.shortcut = shortcut;
|
|
preset.name = name;
|
|
|
|
AddOrUpdateItemAmd();
|
|
|
|
Utils.RegisterShortcut(Handle, preset.id, preset.shortcut, clear);
|
|
}
|
|
|
|
private void btnCloneAmd_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedAmdPreset();
|
|
|
|
var newPreset = preset.Clone();
|
|
AddOrUpdateItemAmd(newPreset);
|
|
}
|
|
|
|
private void btnDeleteAmd_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedAmdPreset();
|
|
|
|
if (preset == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty(preset.shortcut))
|
|
{
|
|
Utils.UnregisterHotKey(Handle, preset.id);
|
|
}
|
|
|
|
_amdService.GetPresets().Remove(preset);
|
|
|
|
var item = lvAmdPresets.SelectedItems[0];
|
|
lvAmdPresets.Items.Remove(item);
|
|
}
|
|
|
|
private void mnuAmdPresets_Opening(object sender, CancelEventArgs e)
|
|
{
|
|
var preset = GetSelectedAmdPreset();
|
|
|
|
miAmdApply.Enabled = preset != null;
|
|
miAmdPresetApplyOnStartup.Enabled = preset != null;
|
|
mnuAmdDisplay.Enabled = preset != null;
|
|
mnuAmdColorSettings.Enabled = preset != null;
|
|
mnuAmdRefreshRate.Enabled = preset != null;
|
|
mnuAmdDithering.Enabled = preset != null;
|
|
mnuAmdHDR.Enabled = preset != null;
|
|
|
|
if (preset != null)
|
|
{
|
|
miAmdPresetApplyOnStartup.Checked = _config.AmdPresetId_ApplyOnStartup == preset.id;
|
|
|
|
if (mnuAmdDisplay.DropDownItems.Count == 1)
|
|
{
|
|
var displays = _amdService.GetDisplays();
|
|
for (var i = 0; i < displays.Count; i++)
|
|
{
|
|
var display = displays[i];
|
|
var name = _amdService.GetFullDisplayName(display);
|
|
|
|
var item = mnuAmdDisplay.DropDownItems.Add(name);
|
|
item.Tag = display;
|
|
item.Click += displayMenuItemAmd_Click;
|
|
}
|
|
}
|
|
|
|
Utils.BuildDropDownMenu(mnuAmdColorSettings, "Color depth", typeof(ADLColorDepth), preset, "colorDepth", amdPresetColorDataMenuItem_Click);
|
|
Utils.BuildDropDownMenu(mnuAmdColorSettings, "Pixel format", typeof(ADLPixelFormat), preset, "pixelFormat", amdPresetColorDataMenuItem_Click);
|
|
|
|
if (preset.displayName != _lastDisplayRefreshRates)
|
|
{
|
|
while (mnuAmdRefreshRate.DropDownItems.Count > 1)
|
|
{
|
|
mnuAmdRefreshRate.DropDownItems.RemoveAt(mnuAmdRefreshRate.DropDownItems.Count - 1);
|
|
}
|
|
}
|
|
|
|
if (mnuAmdRefreshRate.DropDownItems.Count == 1)
|
|
{
|
|
var refreshRates = _amdService.GetAvailableRefreshRates(preset);
|
|
_lastDisplayRefreshRates = preset.displayName;
|
|
|
|
foreach (var refreshRate in refreshRates)
|
|
{
|
|
var item = mnuAmdRefreshRate.DropDownItems.Add(refreshRate.ToString() + "Hz");
|
|
item.Tag = refreshRate;
|
|
item.Click += refreshRateMenuItemAmd_Click;
|
|
}
|
|
}
|
|
|
|
miAmdPrimaryDisplay.Checked = preset.primaryDisplay;
|
|
foreach (var item in mnuAmdDisplay.DropDownItems)
|
|
{
|
|
if (item is ToolStripMenuItem)
|
|
{
|
|
var menuItem = (ToolStripMenuItem)item;
|
|
if (menuItem.Tag != null)
|
|
{
|
|
menuItem.Checked = ((ADLDisplayInfo)menuItem.Tag).DisplayName.Equals(preset.displayName);
|
|
}
|
|
}
|
|
}
|
|
|
|
miAmdColorSettingsIncluded.Checked = preset.applyColorData;
|
|
|
|
miAmdRefreshRateIncluded.Checked = preset.applyRefreshRate;
|
|
foreach (var item in mnuAmdRefreshRate.DropDownItems)
|
|
{
|
|
if (item is ToolStripMenuItem)
|
|
{
|
|
var menuItem = (ToolStripMenuItem)item;
|
|
if (menuItem.Tag != null)
|
|
{
|
|
menuItem.Checked = (uint)menuItem.Tag == preset.refreshRate;
|
|
}
|
|
}
|
|
}
|
|
|
|
miAmdDitheringIncluded.Checked = preset.applyDithering;
|
|
|
|
Utils.BuildDropDownMenu(mnuAmdDithering, "Mode", typeof(ADLDitherState), preset, "ditherState", amdPresetColorDataMenuItem_Click);
|
|
|
|
miAmdHDRIncluded.Checked = preset.applyHDR;
|
|
miAmdHDREnabled.Checked = preset.HDREnabled;
|
|
miAmdHDRToggle.Checked = preset.toggleHDR;
|
|
}
|
|
}
|
|
|
|
private void miAmdPresetApplyOnStartup_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedAmdPreset();
|
|
_config.AmdPresetId_ApplyOnStartup = miAmdPresetApplyOnStartup.Checked ? preset.id : 0;
|
|
|
|
AddOrUpdateItemAmd();
|
|
}
|
|
|
|
private void lvAmdPresets_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedAmdPreset();
|
|
var enabled = preset != null;
|
|
|
|
btnApplyAmd.Enabled = enabled;
|
|
btnChangeAmd.Enabled = enabled;
|
|
edtAmdPresetName.Enabled = enabled;
|
|
edtAmdShortcut.Enabled = enabled;
|
|
btnAmdPresetSave.Enabled = enabled;
|
|
btnCloneAmd.Enabled = enabled;
|
|
btnDeleteAmd.Enabled = enabled;
|
|
|
|
if (preset != null)
|
|
{
|
|
edtAmdPresetName.Text = preset.name;
|
|
edtAmdShortcut.Text = preset.shortcut;
|
|
}
|
|
else
|
|
{
|
|
edtAmdPresetName.Text = string.Empty;
|
|
edtAmdShortcut.Text = string.Empty;
|
|
}
|
|
}
|
|
|
|
private void amdPresetColorDataMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
var menuItem = (ToolStripMenuItem)sender;
|
|
var property = (PropertyInfo)menuItem.OwnerItem.Tag;
|
|
|
|
var value = menuItem.Tag;
|
|
|
|
var preset = GetSelectedAmdPreset();
|
|
|
|
property.SetValue(preset, value);
|
|
|
|
AddOrUpdateItemAmd();
|
|
}
|
|
|
|
private void miAmdColorSettingsIncluded_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedAmdPreset();
|
|
|
|
preset.applyColorData = !preset.applyColorData;
|
|
|
|
AddOrUpdateItemAmd();
|
|
}
|
|
|
|
private void miAmdRefreshRateIncluded_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedAmdPreset();
|
|
|
|
preset.applyRefreshRate = !preset.applyRefreshRate;
|
|
|
|
AddOrUpdateItemAmd();
|
|
}
|
|
|
|
private void miAmdDitheringIncluded_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedAmdPreset();
|
|
|
|
preset.applyDithering = !preset.applyDithering;
|
|
|
|
AddOrUpdateItemAmd();
|
|
}
|
|
|
|
private void miAmdHDRIncluded_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedAmdPreset();
|
|
|
|
preset.applyHDR = !preset.applyHDR;
|
|
|
|
AddOrUpdateItemAmd();
|
|
}
|
|
|
|
private void miAmdHDRToggle_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedAmdPreset();
|
|
|
|
preset.toggleHDR = !preset.toggleHDR;
|
|
|
|
if (preset.toggleHDR)
|
|
{
|
|
preset.HDREnabled = false;
|
|
}
|
|
|
|
AddOrUpdateItemAmd();
|
|
}
|
|
|
|
private void miAmdHDREnabled_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedAmdPreset();
|
|
|
|
preset.HDREnabled = !preset.HDREnabled;
|
|
preset.toggleHDR = false;
|
|
|
|
AddOrUpdateItemAmd();
|
|
}
|
|
|
|
private void btnAddAmd_Click(object sender, EventArgs e)
|
|
{
|
|
var presets = AmdPreset.GetDefaultPresets();
|
|
var added = false;
|
|
|
|
foreach (var preset in presets)
|
|
{
|
|
AddOrUpdateItemAmd(preset);
|
|
}
|
|
|
|
if (added)
|
|
{
|
|
MessageForms.InfoOk("Missing presets added.");
|
|
}
|
|
else
|
|
{
|
|
MessageForms.InfoOk("All presets for every color setting already exist.");
|
|
}
|
|
}
|
|
|
|
private void chkMinimizeToSystemTray_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
if (_initialized)
|
|
{
|
|
_config.MinimizeToTray = chkMinimizeToSystemTray.Checked;
|
|
_trayIcon.Visible = _config.MinimizeToTray;
|
|
}
|
|
}
|
|
|
|
private void miNvCopyId_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedNvPreset();
|
|
|
|
if (preset != null)
|
|
{
|
|
Clipboard.SetText(preset.id.ToString());
|
|
}
|
|
}
|
|
|
|
private void miAmdCopyId_Click(object sender, EventArgs e)
|
|
{
|
|
var preset = GetSelectedAmdPreset();
|
|
|
|
if (preset != null)
|
|
{
|
|
Clipboard.SetText(preset.id.ToString());
|
|
}
|
|
}
|
|
}
|
|
} |