From 126d54184dfc46e660d4a2e174f7910c7521ba5b Mon Sep 17 00:00:00 2001 From: Jonas Kohl Date: Mon, 5 Apr 2021 14:19:26 +0200 Subject: [PATCH] Version 3.11.0.0 --- CapsLockIndicatorV3.sln | 7 +- .../CapsLockIndicatorV3.csproj | 16 + .../CapsLockIndicatorV3.csproj.user | 14 +- CapsLockIndicatorV3/DarkModeForm.cs | 30 + CapsLockIndicatorV3/DarkModeProvider.cs | 40 + CapsLockIndicatorV3/DownloadDialog.cs | 245 ++- .../FirstRunDialog.Designer.cs | 170 +- CapsLockIndicatorV3/FirstRunDialog.cs | 76 +- CapsLockIndicatorV3/IndSettingsWindow.cs | 566 +++---- CapsLockIndicatorV3/IndicatorOverlay.cs | 564 +++---- CapsLockIndicatorV3/MainForm.cs | 1362 +++++++++-------- CapsLockIndicatorV3/NumberInputDialog.cs | 26 +- CapsLockIndicatorV3/Program.cs | 312 ++-- .../Properties/AssemblyInfo.cs | 4 +- .../Resources/CLIv3_Icon_Dark.ico | Bin 0 -> 25746 bytes .../Resources/MainWindow.Icon.ico | Bin 0 -> 26973 bytes .../Resources/defaultSettings.txt | 6 +- .../Resources/generalIcon.Icon.ico | Bin 0 -> 1150 bytes .../Resources/generalIcon_dark.Icon.ico | Bin 0 -> 1150 bytes CapsLockIndicatorV3/Resources/logo.Image.png | Bin 0 -> 818 bytes CapsLockIndicatorV3/Resources/settings.ico | Bin 0 -> 107606 bytes CapsLockIndicatorV3/Resources/settings_w.ico | Bin 0 -> 106328 bytes CapsLockIndicatorV3/UpdateDialog.cs | 108 +- CapsLockIndicatorV3/VersionCheck.cs | 2 +- .../bin/Release/pack-lang-files.ps1 | 3 + CapsLockIndicatorV3/resources.Designer.cs | 76 +- CapsLockIndicatorV3/resources.resx | 21 + CapsLockIndicatorV3/strings.Designer.cs | 47 +- CapsLockIndicatorV3/strings.cs.resx | 325 ++++ CapsLockIndicatorV3/strings.de.resx | 15 + CapsLockIndicatorV3/strings.es.resx | 607 ++++---- CapsLockIndicatorV3/strings.fr.resx | 637 ++++---- CapsLockIndicatorV3/strings.it.resx | 612 ++++---- CapsLockIndicatorV3/strings.ko.resx | 325 ++++ CapsLockIndicatorV3/strings.nl.resx | 325 ++++ CapsLockIndicatorV3/strings.pt-BR.resx | 40 + CapsLockIndicatorV3/strings.pt-PT.resx | 637 ++++---- CapsLockIndicatorV3/strings.resx | 22 +- CapsLockIndicatorV3/strings.ru.resx | 607 ++++---- CapsLockIndicatorV3/strings.tr-TR.resx | 325 ++++ CapsLockIndicatorV3/strings.zh-CN.resx | 637 ++++---- README.md | 38 +- 42 files changed, 5498 insertions(+), 3349 deletions(-) create mode 100644 CapsLockIndicatorV3/DarkModeForm.cs create mode 100644 CapsLockIndicatorV3/DarkModeProvider.cs create mode 100644 CapsLockIndicatorV3/Resources/CLIv3_Icon_Dark.ico create mode 100644 CapsLockIndicatorV3/Resources/MainWindow.Icon.ico create mode 100644 CapsLockIndicatorV3/Resources/generalIcon.Icon.ico create mode 100644 CapsLockIndicatorV3/Resources/generalIcon_dark.Icon.ico create mode 100644 CapsLockIndicatorV3/Resources/logo.Image.png create mode 100644 CapsLockIndicatorV3/Resources/settings.ico create mode 100644 CapsLockIndicatorV3/Resources/settings_w.ico create mode 100644 CapsLockIndicatorV3/bin/Release/pack-lang-files.ps1 create mode 100644 CapsLockIndicatorV3/strings.cs.resx create mode 100644 CapsLockIndicatorV3/strings.ko.resx create mode 100644 CapsLockIndicatorV3/strings.nl.resx create mode 100644 CapsLockIndicatorV3/strings.tr-TR.resx diff --git a/CapsLockIndicatorV3.sln b/CapsLockIndicatorV3.sln index efb286f..fd58ba7 100644 --- a/CapsLockIndicatorV3.sln +++ b/CapsLockIndicatorV3.sln @@ -1,7 +1,8 @@  -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -# SharpDevelop 5.1 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31105.61 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CapsLockIndicatorV3", "CapsLockIndicatorV3\CapsLockIndicatorV3.csproj", "{D73D960D-7FF8-4F22-A19F-C555AAB7DD52}" EndProject Global diff --git a/CapsLockIndicatorV3/CapsLockIndicatorV3.csproj b/CapsLockIndicatorV3/CapsLockIndicatorV3.csproj index 29b59dd..894f9ce 100644 --- a/CapsLockIndicatorV3/CapsLockIndicatorV3.csproj +++ b/CapsLockIndicatorV3/CapsLockIndicatorV3.csproj @@ -74,6 +74,10 @@ Component + + Form + + Form @@ -191,16 +195,21 @@ ResXFileCodeGenerator resources.Designer.cs + + + + ResXFileCodeGenerator strings.Designer.cs + UpdateDialog.cs @@ -208,6 +217,13 @@ + + + + + + + diff --git a/CapsLockIndicatorV3/CapsLockIndicatorV3.csproj.user b/CapsLockIndicatorV3/CapsLockIndicatorV3.csproj.user index c10e84b..a9d953f 100644 --- a/CapsLockIndicatorV3/CapsLockIndicatorV3.csproj.user +++ b/CapsLockIndicatorV3/CapsLockIndicatorV3.csproj.user @@ -1,6 +1,10 @@ - - - - ProjectFiles - + + + + ProjectFiles + + + + + \ No newline at end of file diff --git a/CapsLockIndicatorV3/DarkModeForm.cs b/CapsLockIndicatorV3/DarkModeForm.cs new file mode 100644 index 0000000..8b7b337 --- /dev/null +++ b/CapsLockIndicatorV3/DarkModeForm.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace CapsLockIndicatorV3 +{ + public class DarkModeForm : Form + { + public event EventHandler DarkModeChanged; + + internal void OnDarkModeChanged() + { + DarkModeChanged?.Invoke(this, EventArgs.Empty); + } + + protected void ControlScheduleSetDarkMode(Control control, bool isDark) + { + if (control.IsHandleCreated) + Native.ControlSetDarkMode(control, isDark); + else + control.HandleCreated += (sender, e) => + { + Native.ControlSetDarkMode(control, isDark); + }; + } + } +} diff --git a/CapsLockIndicatorV3/DarkModeProvider.cs b/CapsLockIndicatorV3/DarkModeProvider.cs new file mode 100644 index 0000000..335dac8 --- /dev/null +++ b/CapsLockIndicatorV3/DarkModeProvider.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace CapsLockIndicatorV3 +{ + public static class DarkModeProvider + { + public static bool IsDark => Environment.OSVersion.Version.Major >= 10 && SettingsManager.Get("darkMode"); + + private static List registeredForms = new List(); + + public static void RegisterForm(DarkModeForm form) + { + registeredForms.Add(form); + form.FormClosing += Form_FormClosing; + form.OnDarkModeChanged(); + } + + public static void SetDarkModeEnabled(bool enabled) + { + SettingsManager.Set("darkMode", enabled); + UpdateForms(); + } + + private static void UpdateForms() + { + foreach (var f in registeredForms) + f.OnDarkModeChanged(); + } + + private static void Form_FormClosing(object sender, FormClosingEventArgs e) + { + registeredForms.Remove(sender as DarkModeForm); + } + } +} diff --git a/CapsLockIndicatorV3/DownloadDialog.cs b/CapsLockIndicatorV3/DownloadDialog.cs index 6e0bd42..eb1c844 100644 --- a/CapsLockIndicatorV3/DownloadDialog.cs +++ b/CapsLockIndicatorV3/DownloadDialog.cs @@ -1,148 +1,143 @@ -using Microsoft.Win32; -using System; -using System.ComponentModel; -using System.Diagnostics; +using Microsoft.Win32; +using System; +using System.ComponentModel; +using System.Diagnostics; using System.Drawing; -using System.IO; +using System.IO; using System.Linq; -using System.Net; +using System.Net; using System.Threading; -using System.Windows.Forms; - -namespace CapsLockIndicatorV3 -{ - public partial class DownloadDialog : Form - { - WebClient Client; - Stopwatch sw = new Stopwatch(); - string newPath; - +using System.Windows.Forms; + +namespace CapsLockIndicatorV3 +{ + public partial class DownloadDialog : DarkModeForm + { + WebClient Client; + Stopwatch sw = new Stopwatch(); + string newPath; + public string DownloadURL; - + protected override void WndProc(ref Message message) { if (message.Msg == 0x0084) // WM_NCHITTEST message.Result = (IntPtr)1; else base.WndProc(ref message); - } - - public DownloadDialog() - { - InitializeComponent(); - - if (SettingsManager.Get("beta_enableDarkMode")) + } + + public DownloadDialog() + { + InitializeComponent(); + + HandleCreated += (sender, e) => { - HandleCreated += DownloadDialog_HandleCreated; + DarkModeChanged += DownloadDialog_DarkModeChanged; + DarkModeProvider.RegisterForm(this); + }; + } - statusLabel.ForeColor = - infoLabel.ForeColor = - Color.White; + private void DownloadDialog_DarkModeChanged(object sender, EventArgs e) + { + var dark = DarkModeProvider.IsDark; - BackColor = Color.FromArgb(255, 32, 32, 32); - ForeColor = Color.White; + Native.UseImmersiveDarkModeColors(Handle, dark); - ControlScheduleSetDarkMode(downloadProgress); - ControlScheduleSetDarkMode(restartButton); - ControlScheduleSetDarkMode(closeButton); - ControlScheduleSetDarkMode(cancelButton); - } + statusLabel.ForeColor = + infoLabel.ForeColor = + ForeColor = + dark ? Color.White : SystemColors.WindowText; + + BackColor = dark ? Color.FromArgb(255, 32, 32, 32) : SystemColors.Window; + + ControlScheduleSetDarkMode(downloadProgress, dark); + ControlScheduleSetDarkMode(restartButton, dark); + ControlScheduleSetDarkMode(closeButton, dark); + ControlScheduleSetDarkMode(cancelButton, dark); } - private void DownloadDialog_HandleCreated(object sender, EventArgs e) + public void Download(string url) { - Native.UseImmersiveDarkModeColors(Handle, true); +#if !DEBUG + Uri uri = new Uri(url); + string filename = Path.GetFileName(uri.LocalPath); + string currentPath = Path.GetDirectoryName(Application.ExecutablePath); + string path = Path.Combine(currentPath, filename); + //string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"Jonas_Kohl\" + filename); + + sw.Start(); + + Client = new WebClient(); + Client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressCallback); + Client.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCompleteCallback); + Client.DownloadFileAsync(new Uri(url), path); + + newPath = path; +#endif + } + + private void DownloadProgressCallback(object sender, DownloadProgressChangedEventArgs e) + { + downloadProgress.Value = e.ProgressPercentage; + + infoLabel.Text = string.Format("Downloaded {0}/{1}KB ({2}%) @ {3} KB/s", (e.BytesReceived / 1024d).ToString("0.0"), (e.TotalBytesToReceive / 1024d).ToString("0.0"), e.ProgressPercentage, (e.BytesReceived / 1024d / sw.Elapsed.TotalSeconds).ToString("0.00")); } - private void ControlScheduleSetDarkMode(Control control) + private void DownloadFileCompleteCallback(object sender, AsyncCompletedEventArgs e) { - control.HandleCreated += (sender, e) => + infoLabel.Text = ""; + cancelButton.Hide(); + cancelButton.Enabled = false; + + if (e.Cancelled == true) { - Native.ControlSetDarkMode(control, true); - }; + closeButton.Show(); + closeButton.Enabled = true; + statusLabel.Text = "Download aborted."; + downloadProgress.Value = 0; + } + else + { + restartButton.Show(); + restartButton.Enabled = true; + statusLabel.Text = "Download completed."; + } + } + + private void DownloadDialog_Load(object sender, EventArgs e) + { + Download(DownloadURL); } - public void Download(string url) + private void button1_Click(object sender, EventArgs e) { -#if !DEBUG - Uri uri = new Uri(url); - string filename = Path.GetFileName(uri.LocalPath); - string currentPath = Path.GetDirectoryName(Application.ExecutablePath); - string path = Path.Combine(currentPath, filename); - //string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"Jonas_Kohl\" + filename); - - sw.Start(); - - Client = new WebClient(); - Client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressCallback); - Client.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCompleteCallback); - Client.DownloadFileAsync(new Uri(url), path); - - newPath = path; -#endif - } - - private void DownloadProgressCallback(object sender, DownloadProgressChangedEventArgs e) - { - downloadProgress.Value = e.ProgressPercentage; - - infoLabel.Text = string.Format("Downloaded {0}/{1}KB ({2}%) @ {3} KB/s", (e.BytesReceived / 1024d).ToString("0.0"), (e.TotalBytesToReceive / 1024d).ToString("0.0"), e.ProgressPercentage, (e.BytesReceived / 1024d / sw.Elapsed.TotalSeconds).ToString("0.00")); - } - - private void DownloadFileCompleteCallback(object sender, AsyncCompletedEventArgs e) - { - infoLabel.Text = ""; - cancelButton.Hide(); - cancelButton.Enabled = false; - - if (e.Cancelled == true) - { - closeButton.Show(); - closeButton.Enabled = true; - statusLabel.Text = "Download aborted."; - downloadProgress.Value = 0; - } - else - { - restartButton.Show(); - restartButton.Enabled = true; - statusLabel.Text = "Download completed."; - } - } - - private void DownloadDialog_Load(object sender, EventArgs e) - { - Download(DownloadURL); - } - - private void button1_Click(object sender, EventArgs e) - { - Client.CancelAsync(); - } - - private void button2_Click(object sender, EventArgs e) - { - Close(); - } - - private void restartButton_Click(object sender, EventArgs e) - { - bool runAtStarup = Registry.GetValue(@"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "CapsLock Indicator", null) != null; - - if (runAtStarup) - { - RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true); - rk.SetValue("CapsLock Indicator", newPath); - } - - MainForm mainForm = Application.OpenForms.OfType().First(); - - mainForm.askCancel = false; - Program.ReleaseMutex(); - - Thread.Sleep(100); - - Process.Start(newPath); - Application.Exit(); - } - } -} + Client?.CancelAsync(); + } + + private void button2_Click(object sender, EventArgs e) + { + Close(); + } + + private void restartButton_Click(object sender, EventArgs e) + { + bool runAtStarup = Registry.GetValue(@"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "CapsLock Indicator", null) != null; + + if (runAtStarup) + { + RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true); + rk.SetValue("CapsLock Indicator", newPath); + } + + MainForm mainForm = Application.OpenForms.OfType().First(); + + mainForm.askCancel = false; + Program.ReleaseMutex(); + + Thread.Sleep(100); + + Process.Start(newPath); + Application.Exit(); + } + } +} diff --git a/CapsLockIndicatorV3/FirstRunDialog.Designer.cs b/CapsLockIndicatorV3/FirstRunDialog.Designer.cs index cd1d0f7..7754ffa 100644 --- a/CapsLockIndicatorV3/FirstRunDialog.Designer.cs +++ b/CapsLockIndicatorV3/FirstRunDialog.Designer.cs @@ -32,17 +32,20 @@ private void InitializeComponent() System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FirstRunDialog)); this.headerLabel = new System.Windows.Forms.Label(); this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); - this.flowLayoutPanel2 = new System.Windows.Forms.FlowLayoutPanel(); - this.exitButton = new System.Windows.Forms.Button(); - this.okButton = new System.Windows.Forms.Button(); this.messageLabel = new System.Windows.Forms.Label(); this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); this.allowUpdatesCheckBox = new System.Windows.Forms.CheckBox(); - this.lnkLabel1 = new CapsLockIndicatorV3.LnkLabel(); + this.flowLayoutPanel2 = new System.Windows.Forms.FlowLayoutPanel(); + this.exitButton = new System.Windows.Forms.Button(); + this.okButton = new System.Windows.Forms.Button(); + this.themeLabel = new System.Windows.Forms.Label(); + this.lightButton = new System.Windows.Forms.Button(); + this.darkButton = new System.Windows.Forms.Button(); this.lnkLabel2 = new CapsLockIndicatorV3.LnkLabel(); + this.lnkLabel1 = new CapsLockIndicatorV3.LnkLabel(); this.tableLayoutPanel1.SuspendLayout(); - this.flowLayoutPanel2.SuspendLayout(); this.flowLayoutPanel1.SuspendLayout(); + this.flowLayoutPanel2.SuspendLayout(); this.SuspendLayout(); // // headerLabel @@ -63,29 +66,75 @@ private void InitializeComponent() this.tableLayoutPanel1.ColumnCount = 2; this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); - this.tableLayoutPanel1.Controls.Add(this.lnkLabel2, 0, 3); + this.tableLayoutPanel1.Controls.Add(this.lnkLabel2, 0, 5); this.tableLayoutPanel1.Controls.Add(this.headerLabel, 0, 0); this.tableLayoutPanel1.Controls.Add(this.messageLabel, 0, 1); - this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel1, 0, 2); - this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel2, 1, 3); + this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel1, 0, 4); + this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel2, 1, 5); + this.tableLayoutPanel1.Controls.Add(this.themeLabel, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.lightButton, 0, 3); + this.tableLayoutPanel1.Controls.Add(this.darkButton, 1, 3); this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel1.Location = new System.Drawing.Point(9, 9); this.tableLayoutPanel1.Name = "tableLayoutPanel1"; - this.tableLayoutPanel1.RowCount = 4; + this.tableLayoutPanel1.RowCount = 6; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 48F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.Size = new System.Drawing.Size(343, 239); + this.tableLayoutPanel1.Size = new System.Drawing.Size(339, 292); this.tableLayoutPanel1.TabIndex = 1; // + // messageLabel + // + this.messageLabel.AutoSize = true; + this.tableLayoutPanel1.SetColumnSpan(this.messageLabel, 2); + this.messageLabel.Dock = System.Windows.Forms.DockStyle.Top; + this.messageLabel.Location = new System.Drawing.Point(0, 30); + this.messageLabel.Margin = new System.Windows.Forms.Padding(0); + this.messageLabel.Name = "messageLabel"; + this.messageLabel.Size = new System.Drawing.Size(339, 75); + this.messageLabel.TabIndex = 1; + this.messageLabel.Text = resources.GetString("messageLabel.Text"); + // + // flowLayoutPanel1 + // + this.tableLayoutPanel1.SetColumnSpan(this.flowLayoutPanel1, 2); + this.flowLayoutPanel1.Controls.Add(this.allowUpdatesCheckBox); + this.flowLayoutPanel1.Controls.Add(this.lnkLabel1); + this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 182); + this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0, 6, 0, 0); + this.flowLayoutPanel1.Name = "flowLayoutPanel1"; + this.flowLayoutPanel1.Size = new System.Drawing.Size(339, 81); + this.flowLayoutPanel1.TabIndex = 3; + // + // allowUpdatesCheckBox + // + this.allowUpdatesCheckBox.Checked = true; + this.allowUpdatesCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + this.allowUpdatesCheckBox.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.allowUpdatesCheckBox.Location = new System.Drawing.Point(0, 0); + this.allowUpdatesCheckBox.Margin = new System.Windows.Forms.Padding(0); + this.allowUpdatesCheckBox.Name = "allowUpdatesCheckBox"; + this.allowUpdatesCheckBox.Size = new System.Drawing.Size(312, 38); + this.allowUpdatesCheckBox.TabIndex = 0; + this.allowUpdatesCheckBox.Text = "Allow CapsLock Indicator to periodically check for updates online (can be changed" + + " later)"; + this.allowUpdatesCheckBox.UseCompatibleTextRendering = true; + this.allowUpdatesCheckBox.UseVisualStyleBackColor = true; + this.allowUpdatesCheckBox.CheckedChanged += new System.EventHandler(this.allowUpdatesCheckBox_CheckedChanged); + // // flowLayoutPanel2 // this.flowLayoutPanel2.Anchor = System.Windows.Forms.AnchorStyles.Right; this.flowLayoutPanel2.AutoSize = true; this.flowLayoutPanel2.Controls.Add(this.exitButton); this.flowLayoutPanel2.Controls.Add(this.okButton); - this.flowLayoutPanel2.Location = new System.Drawing.Point(184, 210); + this.flowLayoutPanel2.Location = new System.Drawing.Point(180, 263); this.flowLayoutPanel2.Margin = new System.Windows.Forms.Padding(0); this.flowLayoutPanel2.Name = "flowLayoutPanel2"; this.flowLayoutPanel2.Size = new System.Drawing.Size(159, 29); @@ -118,66 +167,47 @@ private void InitializeComponent() this.okButton.UseVisualStyleBackColor = true; this.okButton.Click += new System.EventHandler(this.okButton_Click); // - // messageLabel + // themeLabel // - this.messageLabel.AutoSize = true; - this.tableLayoutPanel1.SetColumnSpan(this.messageLabel, 2); - this.messageLabel.Dock = System.Windows.Forms.DockStyle.Top; - this.messageLabel.Location = new System.Drawing.Point(0, 30); - this.messageLabel.Margin = new System.Windows.Forms.Padding(0); - this.messageLabel.Name = "messageLabel"; - this.messageLabel.Size = new System.Drawing.Size(343, 75); - this.messageLabel.TabIndex = 1; - this.messageLabel.Text = resources.GetString("messageLabel.Text"); + this.themeLabel.AutoSize = true; + this.tableLayoutPanel1.SetColumnSpan(this.themeLabel, 2); + this.themeLabel.Location = new System.Drawing.Point(0, 113); + this.themeLabel.Margin = new System.Windows.Forms.Padding(0, 8, 0, 0); + this.themeLabel.Name = "themeLabel"; + this.themeLabel.Size = new System.Drawing.Size(194, 15); + this.themeLabel.TabIndex = 5; + this.themeLabel.Text = "Which color scheme do you prefer?"; // - // flowLayoutPanel1 - // - this.tableLayoutPanel1.SetColumnSpan(this.flowLayoutPanel1, 2); - this.flowLayoutPanel1.Controls.Add(this.allowUpdatesCheckBox); - this.flowLayoutPanel1.Controls.Add(this.lnkLabel1); - this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; - this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; - this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 111); - this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0, 6, 0, 0); - this.flowLayoutPanel1.Name = "flowLayoutPanel1"; - this.flowLayoutPanel1.Size = new System.Drawing.Size(343, 99); - this.flowLayoutPanel1.TabIndex = 3; + // lightButton // - // allowUpdatesCheckBox - // - this.allowUpdatesCheckBox.Checked = true; - this.allowUpdatesCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.allowUpdatesCheckBox.FlatStyle = System.Windows.Forms.FlatStyle.System; - this.allowUpdatesCheckBox.Location = new System.Drawing.Point(0, 0); - this.allowUpdatesCheckBox.Margin = new System.Windows.Forms.Padding(0); - this.allowUpdatesCheckBox.Name = "allowUpdatesCheckBox"; - this.allowUpdatesCheckBox.Size = new System.Drawing.Size(312, 38); - this.allowUpdatesCheckBox.TabIndex = 0; - this.allowUpdatesCheckBox.Text = "Allow CapsLock Indicator to periodically check for updates online (can be changed" + - " later)"; - this.allowUpdatesCheckBox.UseCompatibleTextRendering = true; - this.allowUpdatesCheckBox.UseVisualStyleBackColor = true; - this.allowUpdatesCheckBox.CheckedChanged += new System.EventHandler(this.allowUpdatesCheckBox_CheckedChanged); + this.lightButton.Dock = System.Windows.Forms.DockStyle.Fill; + this.lightButton.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lightButton.Location = new System.Drawing.Point(3, 131); + this.lightButton.Name = "lightButton"; + this.lightButton.Size = new System.Drawing.Size(163, 42); + this.lightButton.TabIndex = 6; + this.lightButton.Text = "Light"; + this.lightButton.UseVisualStyleBackColor = true; + this.lightButton.Click += new System.EventHandler(this.lightButton_Click); // - // lnkLabel1 + // darkButton // - this.lnkLabel1.AutoSize = true; - this.lnkLabel1.LinkColor = System.Drawing.SystemColors.HotTrack; - this.lnkLabel1.Location = new System.Drawing.Point(13, 38); - this.lnkLabel1.Margin = new System.Windows.Forms.Padding(13, 0, 0, 0); - this.lnkLabel1.Name = "lnkLabel1"; - this.lnkLabel1.Size = new System.Drawing.Size(168, 15); - this.lnkLabel1.TabIndex = 1; - this.lnkLabel1.TabStop = true; - this.lnkLabel1.Text = "What information will be sent?"; - this.lnkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkLabel1_LinkClicked); + this.darkButton.Dock = System.Windows.Forms.DockStyle.Fill; + this.darkButton.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.darkButton.Location = new System.Drawing.Point(172, 131); + this.darkButton.Name = "darkButton"; + this.darkButton.Size = new System.Drawing.Size(164, 42); + this.darkButton.TabIndex = 7; + this.darkButton.Text = "Dark"; + this.darkButton.UseVisualStyleBackColor = true; + this.darkButton.Click += new System.EventHandler(this.darkButton_Click); // // lnkLabel2 // this.lnkLabel2.Anchor = System.Windows.Forms.AnchorStyles.Left; this.lnkLabel2.AutoSize = true; this.lnkLabel2.LinkColor = System.Drawing.SystemColors.HotTrack; - this.lnkLabel2.Location = new System.Drawing.Point(0, 217); + this.lnkLabel2.Location = new System.Drawing.Point(0, 270); this.lnkLabel2.Margin = new System.Windows.Forms.Padding(0); this.lnkLabel2.Name = "lnkLabel2"; this.lnkLabel2.Size = new System.Drawing.Size(64, 15); @@ -186,6 +216,19 @@ private void InitializeComponent() this.lnkLabel2.Text = "Contribute"; this.lnkLabel2.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkLabel2_LinkClicked); // + // lnkLabel1 + // + this.lnkLabel1.AutoSize = true; + this.lnkLabel1.LinkColor = System.Drawing.SystemColors.HotTrack; + this.lnkLabel1.Location = new System.Drawing.Point(13, 38); + this.lnkLabel1.Margin = new System.Windows.Forms.Padding(13, 0, 0, 0); + this.lnkLabel1.Name = "lnkLabel1"; + this.lnkLabel1.Size = new System.Drawing.Size(168, 15); + this.lnkLabel1.TabIndex = 1; + this.lnkLabel1.TabStop = true; + this.lnkLabel1.Text = "What information will be sent?"; + this.lnkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkLabel1_LinkClicked); + // // FirstRunDialog // this.AcceptButton = this.okButton; @@ -193,7 +236,7 @@ private void InitializeComponent() this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.BackColor = System.Drawing.SystemColors.Window; this.CancelButton = this.exitButton; - this.ClientSize = new System.Drawing.Size(361, 257); + this.ClientSize = new System.Drawing.Size(357, 310); this.ControlBox = false; this.Controls.Add(this.tableLayoutPanel1); this.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -208,9 +251,9 @@ private void InitializeComponent() this.Text = "CapsLock Indicator"; this.tableLayoutPanel1.ResumeLayout(false); this.tableLayoutPanel1.PerformLayout(); - this.flowLayoutPanel2.ResumeLayout(false); this.flowLayoutPanel1.ResumeLayout(false); this.flowLayoutPanel1.PerformLayout(); + this.flowLayoutPanel2.ResumeLayout(false); this.ResumeLayout(false); } @@ -227,5 +270,8 @@ private void InitializeComponent() private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel2; private System.Windows.Forms.Button exitButton; private LnkLabel lnkLabel2; + private System.Windows.Forms.Label themeLabel; + private System.Windows.Forms.Button lightButton; + private System.Windows.Forms.Button darkButton; } } \ No newline at end of file diff --git a/CapsLockIndicatorV3/FirstRunDialog.cs b/CapsLockIndicatorV3/FirstRunDialog.cs index 960b2f5..ca2cbc9 100644 --- a/CapsLockIndicatorV3/FirstRunDialog.cs +++ b/CapsLockIndicatorV3/FirstRunDialog.cs @@ -11,30 +11,19 @@ namespace CapsLockIndicatorV3 { - public partial class FirstRunDialog : Form + public partial class FirstRunDialog : DarkModeForm { public FirstRunDialog() { InitializeComponent(); - if (SettingsManager.Get("beta_enableDarkMode")) - { - HandleCreated += FirstRunDialog_HandleCreated; - - headerLabel.ForeColor = - messageLabel.ForeColor = - lnkLabel1.LinkColor = - lnkLabel2.LinkColor = - allowUpdatesCheckBox.ForeColor = - Color.White; - allowUpdatesCheckBox.FlatStyle = FlatStyle.Standard; - - BackColor = Color.FromArgb(255, 32, 32, 32); - ForeColor = Color.White; + HandleCreated += (object sender, EventArgs e) => + { + DarkModeChanged += FirstRunDialog_DarkModeChanged; + DarkModeProvider.RegisterForm(this); + }; - ControlScheduleSetDarkMode(okButton); - ControlScheduleSetDarkMode(exitButton); - } + ControlScheduleSetDarkMode(darkButton, true); headerLabel.Text = strings.firstRunHeading; messageLabel.Text = strings.firstRunMessage; @@ -43,19 +32,40 @@ public FirstRunDialog() lnkLabel2.Text = strings.firstRunContribute; okButton.Text = strings.firstRunStart; exitButton.Text = strings.firstRunExit; - } - - private void FirstRunDialog_HandleCreated(object sender, EventArgs e) - { - Native.UseImmersiveDarkModeColors(Handle, true); + themeLabel.Text = strings.firstRunColorSchemePreference; + lightButton.Text = strings.firstRunColorSchemeLight; + darkButton.Text = strings.firstRunColorSchemeDark; + + if (Environment.OSVersion.Version.Major < 10) + { + darkButton.Enabled = false; + darkButton.Text += "\r\n" + strings.firstRunColorSchemeWin10Only; + } } - private void ControlScheduleSetDarkMode(Control control) + private void FirstRunDialog_DarkModeChanged(object sender, EventArgs e) { - control.HandleCreated += (sender, e) => - { - Native.ControlSetDarkMode(control, true); - }; + var dark = DarkModeProvider.IsDark; + + Native.UseImmersiveDarkModeColors(Handle, dark); + + headerLabel.ForeColor = dark ? Color.White : Color.FromArgb(255, 0, 51, 153); + + lnkLabel1.LinkColor = + lnkLabel2.LinkColor = + dark ? Color.White : SystemColors.HotTrack; + + messageLabel.ForeColor = + allowUpdatesCheckBox.ForeColor = + dark ? Color.White : SystemColors.WindowText; + + allowUpdatesCheckBox.FlatStyle = dark ? FlatStyle.Standard: FlatStyle.System; + + BackColor = dark ? Color.FromArgb(255, 32, 32, 32) : SystemColors.Window; + ForeColor = dark ? Color.White : SystemColors.WindowText; + + ControlScheduleSetDarkMode(okButton, dark); + ControlScheduleSetDarkMode(exitButton, dark); } private void allowUpdatesCheckBox_CheckedChanged(object sender, EventArgs e) @@ -79,5 +89,15 @@ private void lnkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs { Process.Start("https://github.com/jonaskohl/CapsLockIndicator"); } + + private void lightButton_Click(object sender, EventArgs e) + { + DarkModeProvider.SetDarkModeEnabled(false); + } + + private void darkButton_Click(object sender, EventArgs e) + { + DarkModeProvider.SetDarkModeEnabled(true); + } } } diff --git a/CapsLockIndicatorV3/IndSettingsWindow.cs b/CapsLockIndicatorV3/IndSettingsWindow.cs index c125aad..074d43c 100644 --- a/CapsLockIndicatorV3/IndSettingsWindow.cs +++ b/CapsLockIndicatorV3/IndSettingsWindow.cs @@ -1,284 +1,288 @@ -using System; +using System; using System.Diagnostics; -using System.Drawing; -using System.Windows.Forms; - -namespace CapsLockIndicatorV3 -{ - public partial class IndSettingsWindow : Form - { - public IndSettingsWindow() - { - InitializeComponent(); - - if (SettingsManager.Get("beta_enableDarkMode")) - { - HandleCreated += IndSettingsWindow_HandleCreated; - - displayTimeGroup.ForeColor = - displayTimeLabel.ForeColor = - fontGroupBox.ForeColor = - fontButton.ForeColor = - positionGroup.ForeColor = - opacityGroup.ForeColor = - opacityLabel.ForeColor = - coloursGroup.ForeColor = - backgroundColourActivatedButton.ForeColor = - backgroundColourDeactivatedButton.ForeColor = - foregroundColourActivatedButton.ForeColor = - foregroundColourDeactivatedButton.ForeColor = - borderColourActivatedButton.ForeColor = - borderColourDeactivatedButton.ForeColor = - borderGroup.ForeColor = - bdSizeLabel.ForeColor = - lnkLabel1.LinkColor = - onlyShowWhenActiveCheckBox.ForeColor = - Color.White; - - onlyShowWhenActiveCheckBox.FlatStyle = FlatStyle.Standard; - - BackColor = Color.FromArgb(255, 32, 32, 32); - ForeColor = Color.White; - - ControlScheduleSetDarkMode(fontButton); - ControlScheduleSetDarkMode(backgroundColourActivatedButton); - ControlScheduleSetDarkMode(backgroundColourDeactivatedButton); - ControlScheduleSetDarkMode(foregroundColourActivatedButton); - ControlScheduleSetDarkMode(foregroundColourDeactivatedButton); - ControlScheduleSetDarkMode(borderColourActivatedButton); - ControlScheduleSetDarkMode(borderColourDeactivatedButton); - ControlScheduleSetDarkMode(positionTopLeft); - ControlScheduleSetDarkMode(positionTopCenter); - ControlScheduleSetDarkMode(positionTopRight); - ControlScheduleSetDarkMode(positionMiddleLeft); - ControlScheduleSetDarkMode(positionMiddleCenter); - ControlScheduleSetDarkMode(positionMiddleRight); - ControlScheduleSetDarkMode(positionBottomLeft); - ControlScheduleSetDarkMode(positionBottomCenter); - ControlScheduleSetDarkMode(positionBottomRight); - ControlScheduleSetDarkMode(displayTimeSlider); - ControlScheduleSetDarkMode(opacitySlider); - ControlScheduleSetDarkMode(bdSizeSlider); - ControlScheduleSetDarkMode(saveButton); - } - - MaximumSize = new Size(int.MaxValue, Screen.FromControl(this).WorkingArea.Height); - AutoScroll = true; - - displayTimeSlider.Value = SettingsManager.Get("indDisplayTime") > 0 ? SettingsManager.Get("indDisplayTime") : 2001; - displayTimeLabel.Text = displayTimeSlider.Value < 2001 ? string.Format("{0} ms", displayTimeSlider.Value) : strings.permanentIndicator; - - opacitySlider.Value = SettingsManager.Get("indOpacity"); - opacityLabel.Text = string.Format("{0} %", opacitySlider.Value); - - bdSizeSlider.Value = SettingsManager.Get("bdSize"); - bdSizeLabel.Text = string.Format("{0}", bdSizeSlider.Value); - - backgroundColourActivatedPreview.BackColor = SettingsManager.Get("indBgColourActive"); - backgroundColourDeactivatedPreview.BackColor = SettingsManager.Get("indBgColourInactive"); - - foregroundColourActivatedPreview.BackColor = SettingsManager.Get("indFgColourActive"); - foregroundColourDeactivatedPreview.BackColor = SettingsManager.Get("indFgColourInactive"); - - borderColourActivatedPreview.BackColor = SettingsManager.Get("indBdColourActive"); - borderColourDeactivatedPreview.BackColor = SettingsManager.Get("indBdColourInactive"); - - fontButton.Font = SettingsManager.GetOrDefault("indFont"); - - onlyShowWhenActiveCheckBox.Checked = SettingsManager.Get("alwaysShowWhenActive"); - - switch (SettingsManager.Get("overlayPosition")) - { - case IndicatorDisplayPosition.TopLeft: - positionTopLeft.Checked = true; - break; - case IndicatorDisplayPosition.TopCenter: - positionTopCenter.Checked = true; - break; - case IndicatorDisplayPosition.TopRight: - positionTopRight.Checked = true; - break; - case IndicatorDisplayPosition.MiddleLeft: - positionMiddleLeft.Checked = true; - break; - case IndicatorDisplayPosition.MiddleCenter: - positionMiddleCenter.Checked = true; - break; - case IndicatorDisplayPosition.MiddleRight: - positionMiddleRight.Checked = true; - break; - case IndicatorDisplayPosition.BottomLeft: - positionBottomLeft.Checked = true; - break; - case IndicatorDisplayPosition.BottomCenter: - positionBottomCenter.Checked = true; - break; - case IndicatorDisplayPosition.BottomRight: - positionBottomRight.Checked = true; - break; - default: - break; - } - - Text = strings.notificationSettingsTitle; - displayTimeGroup.Text = strings.displayTime; - opacityGroup.Text = strings.opacity; - fontGroupBox.Text = strings.fontGroup; - coloursGroup.Text = strings.coloursGroup; - fontButton.Text = string.Format(strings.keyIsOff, strings.capsLock); - saveButton.Text = strings.saveAndCloseButton; - backgroundColourActivatedButton.Text = strings.backgroundColourActivatedButton; - backgroundColourDeactivatedButton.Text = strings.backgroundColourDeactivatedButton; - borderColourActivatedButton.Text = strings.borderColourActivatedButton; - borderColourDeactivatedButton.Text = strings.borderColourDeactivatedButton; - foregroundColourActivatedButton.Text = strings.foregroundColourActivatedButton; - foregroundColourDeactivatedButton.Text = strings.foregroundColourDeactivatedButton; - positionGroup.Text = strings.overlayPositionGroup; - onlyShowWhenActiveCheckBox.Text = strings.showOverlayOnlyWhenActive; - lnkLabel1.Text = strings.advancedSettings; - borderGroup.Text = strings.borderThicknessGroup; +using System.Drawing; +using System.Reflection; +using System.Resources; +using System.Windows.Forms; + +namespace CapsLockIndicatorV3 +{ + public partial class IndSettingsWindow : DarkModeForm + { + ResourceManager resources; + + public IndSettingsWindow() + { + InitializeComponent(); + + resources = new ResourceManager("CapsLockIndicatorV3.resources", Assembly.GetExecutingAssembly()); + + HandleCreated += (sender, e) => + { + DarkModeChanged += IndSettingsWindow_DarkModeChanged; + DarkModeProvider.RegisterForm(this); + }; + + MaximumSize = new Size(int.MaxValue, Screen.FromControl(this).WorkingArea.Height); + AutoScroll = true; + + displayTimeSlider.Value = SettingsManager.Get("indDisplayTime") > 0 ? SettingsManager.Get("indDisplayTime") : 2001; + displayTimeLabel.Text = displayTimeSlider.Value < 2001 ? string.Format("{0} ms", displayTimeSlider.Value) : strings.permanentIndicator; + + opacitySlider.Value = SettingsManager.Get("indOpacity"); + opacityLabel.Text = string.Format("{0} %", opacitySlider.Value); + + bdSizeSlider.Value = SettingsManager.Get("bdSize"); + bdSizeLabel.Text = string.Format("{0}", bdSizeSlider.Value); + + backgroundColourActivatedPreview.BackColor = SettingsManager.Get("indBgColourActive"); + backgroundColourDeactivatedPreview.BackColor = SettingsManager.Get("indBgColourInactive"); + + foregroundColourActivatedPreview.BackColor = SettingsManager.Get("indFgColourActive"); + foregroundColourDeactivatedPreview.BackColor = SettingsManager.Get("indFgColourInactive"); + + borderColourActivatedPreview.BackColor = SettingsManager.Get("indBdColourActive"); + borderColourDeactivatedPreview.BackColor = SettingsManager.Get("indBdColourInactive"); + + fontButton.Font = SettingsManager.GetOrDefault("indFont"); + + onlyShowWhenActiveCheckBox.Checked = SettingsManager.Get("alwaysShowWhenActive"); + + switch (SettingsManager.Get("overlayPosition")) + { + case IndicatorDisplayPosition.TopLeft: + positionTopLeft.Checked = true; + break; + case IndicatorDisplayPosition.TopCenter: + positionTopCenter.Checked = true; + break; + case IndicatorDisplayPosition.TopRight: + positionTopRight.Checked = true; + break; + case IndicatorDisplayPosition.MiddleLeft: + positionMiddleLeft.Checked = true; + break; + case IndicatorDisplayPosition.MiddleCenter: + positionMiddleCenter.Checked = true; + break; + case IndicatorDisplayPosition.MiddleRight: + positionMiddleRight.Checked = true; + break; + case IndicatorDisplayPosition.BottomLeft: + positionBottomLeft.Checked = true; + break; + case IndicatorDisplayPosition.BottomCenter: + positionBottomCenter.Checked = true; + break; + case IndicatorDisplayPosition.BottomRight: + positionBottomRight.Checked = true; + break; + default: + break; + } + + Text = strings.notificationSettingsTitle; + displayTimeGroup.Text = strings.displayTime; + opacityGroup.Text = strings.opacity; + fontGroupBox.Text = strings.fontGroup; + coloursGroup.Text = strings.coloursGroup; + fontButton.Text = string.Format(strings.keyIsOff, strings.capsLock); + saveButton.Text = strings.saveAndCloseButton; + backgroundColourActivatedButton.Text = strings.backgroundColourActivatedButton; + backgroundColourDeactivatedButton.Text = strings.backgroundColourDeactivatedButton; + borderColourActivatedButton.Text = strings.borderColourActivatedButton; + borderColourDeactivatedButton.Text = strings.borderColourDeactivatedButton; + foregroundColourActivatedButton.Text = strings.foregroundColourActivatedButton; + foregroundColourDeactivatedButton.Text = strings.foregroundColourDeactivatedButton; + positionGroup.Text = strings.overlayPositionGroup; + onlyShowWhenActiveCheckBox.Text = strings.showOverlayOnlyWhenActive; + lnkLabel1.Text = strings.advancedSettings; + borderGroup.Text = strings.borderThicknessGroup; + } + + private void IndSettingsWindow_DarkModeChanged(object sender, EventArgs e) + { + var dark = DarkModeProvider.IsDark; + + Native.UseImmersiveDarkMode(Handle, dark); + Native.UseImmersiveDarkModeColors(Handle, dark); + Native.UseImmersiveDarkModeColors(mainColourPicker.PInstance, dark); + + Icon = (Icon)resources.GetObject("settings" + (dark ? "_dark" : "")); + + displayTimeGroup.ForeColor = + displayTimeLabel.ForeColor = + fontGroupBox.ForeColor = + fontButton.ForeColor = + positionGroup.ForeColor = + opacityGroup.ForeColor = + opacityLabel.ForeColor = + coloursGroup.ForeColor = + backgroundColourActivatedButton.ForeColor = + backgroundColourDeactivatedButton.ForeColor = + foregroundColourActivatedButton.ForeColor = + foregroundColourDeactivatedButton.ForeColor = + borderColourActivatedButton.ForeColor = + borderColourDeactivatedButton.ForeColor = + borderGroup.ForeColor = + bdSizeLabel.ForeColor = + onlyShowWhenActiveCheckBox.ForeColor = + dark ? Color.White : SystemColors.WindowText; + + + lnkLabel1.LinkColor = dark ? Color.White : SystemColors.HotTrack; + + onlyShowWhenActiveCheckBox.FlatStyle = dark ? FlatStyle.Standard : FlatStyle.System; + + BackColor = dark ? Color.FromArgb(255, 32, 32, 32) : SystemColors.Window; + ForeColor = dark ? Color.White : SystemColors.WindowText; + + ControlScheduleSetDarkMode(fontButton, dark); + ControlScheduleSetDarkMode(backgroundColourActivatedButton, dark); + ControlScheduleSetDarkMode(backgroundColourDeactivatedButton, dark); + ControlScheduleSetDarkMode(foregroundColourActivatedButton, dark); + ControlScheduleSetDarkMode(foregroundColourDeactivatedButton, dark); + ControlScheduleSetDarkMode(borderColourActivatedButton, dark); + ControlScheduleSetDarkMode(borderColourDeactivatedButton, dark); + ControlScheduleSetDarkMode(positionTopLeft, dark); + ControlScheduleSetDarkMode(positionTopCenter, dark); + ControlScheduleSetDarkMode(positionTopRight, dark); + ControlScheduleSetDarkMode(positionMiddleLeft, dark); + ControlScheduleSetDarkMode(positionMiddleCenter, dark); + ControlScheduleSetDarkMode(positionMiddleRight, dark); + ControlScheduleSetDarkMode(positionBottomLeft, dark); + ControlScheduleSetDarkMode(positionBottomCenter, dark); + ControlScheduleSetDarkMode(positionBottomRight, dark); + ControlScheduleSetDarkMode(displayTimeSlider, dark); + ControlScheduleSetDarkMode(opacitySlider, dark); + ControlScheduleSetDarkMode(bdSizeSlider, dark); + ControlScheduleSetDarkMode(saveButton, dark); + } + + private void displayTimeSlider_Scroll(object sender, EventArgs e) + { + SettingsManager.Set("indDisplayTime", displayTimeSlider.Value < 2001 ? displayTimeSlider.Value : -1); + displayTimeLabel.Text = displayTimeSlider.Value < 2001 ? string.Format("{0} ms", displayTimeSlider.Value) : strings.permanentIndicator; } - private void IndSettingsWindow_HandleCreated(object sender, EventArgs e) + private void button1_Click(object sender, EventArgs e) { - Native.UseImmersiveDarkMode(Handle, true); - Native.UseImmersiveDarkModeColors(Handle, true); + DialogResult = DialogResult.OK; + SettingsManager.Save(); + Close(); + } - Native.UseImmersiveDarkModeColors(mainColourPicker.PInstance, true); + private void displayTimeLabel_Click(object sender, EventArgs e) + { + if (displayTimeSlider.Value > 2000) + return; + NumberInputDialog numberInputDialog = new NumberInputDialog(displayTimeSlider.Value, displayTimeSlider.Minimum, displayTimeSlider.Maximum - 1); + if (numberInputDialog.ShowDialog() == DialogResult.OK) + { + displayTimeSlider.Value = numberInputDialog.Value; + SettingsManager.Set("indDisplayTime", numberInputDialog.Value); + displayTimeLabel.Text = string.Format("{0} ms", displayTimeSlider.Value); + } } - private void ControlScheduleSetDarkMode(Control control) + private void backgroundColourActivatedButton_Click(object sender, EventArgs e) { - control.HandleCreated += (sender, e) => + mainColourPicker.Color = SettingsManager.Get("indBgColourActive"); + if (mainColourPicker.ShowDialog() == DialogResult.OK) { - Native.ControlSetDarkMode(control, true); - }; - } - - private void displayTimeSlider_Scroll(object sender, EventArgs e) - { - SettingsManager.Set("indDisplayTime", displayTimeSlider.Value < 2001 ? displayTimeSlider.Value : -1); - displayTimeLabel.Text = displayTimeSlider.Value < 2001 ? string.Format("{0} ms", displayTimeSlider.Value) : strings.permanentIndicator; - } - - private void button1_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.OK; - SettingsManager.Save(); - Close(); - } - - private void displayTimeLabel_Click(object sender, EventArgs e) - { - if (displayTimeSlider.Value > 2000) - return; - NumberInputDialog numberInputDialog = new NumberInputDialog(displayTimeSlider.Value, displayTimeSlider.Minimum, displayTimeSlider.Maximum - 1); - if (numberInputDialog.ShowDialog() == DialogResult.OK) - { - displayTimeSlider.Value = numberInputDialog.Value; - SettingsManager.Set("indDisplayTime", numberInputDialog.Value); - displayTimeLabel.Text = string.Format("{0} ms", displayTimeSlider.Value); - } - } - - private void backgroundColourActivatedButton_Click(object sender, EventArgs e) - { - mainColourPicker.Color = SettingsManager.Get("indBgColourActive"); - if (mainColourPicker.ShowDialog() == DialogResult.OK) - { - SettingsManager.Set("indBgColourActive", mainColourPicker.Color); - } - backgroundColourActivatedPreview.BackColor = mainColourPicker.Color; - } - - private void backgroundColourDeactivatedButton_Click(object sender, EventArgs e) - { - mainColourPicker.Color = SettingsManager.Get("indBgColourInactive"); - if (mainColourPicker.ShowDialog() == DialogResult.OK) - { - SettingsManager.Set("indBgColourInactive", mainColourPicker.Color); - } - backgroundColourDeactivatedPreview.BackColor = mainColourPicker.Color; - } - - private void foregroundColourActivatedButton_Click(object sender, EventArgs e) - { - mainColourPicker.Color = SettingsManager.Get("indFgColourActive"); - if (mainColourPicker.ShowDialog() == DialogResult.OK) - { - SettingsManager.Set("indFgColourActive", mainColourPicker.Color); - } - foregroundColourActivatedPreview.BackColor = mainColourPicker.Color; - } - - private void foregroundColourDeactivatedButton_Click(object sender, EventArgs e) - { - mainColourPicker.Color = SettingsManager.Get("indFgColourInactive"); - if (mainColourPicker.ShowDialog() == DialogResult.OK) - { - SettingsManager.Set("indFgColourInactive", mainColourPicker.Color); - } - foregroundColourDeactivatedPreview.BackColor = mainColourPicker.Color; - } - - private void borderColourActivatedButton_Click(object sender, EventArgs e) - { - mainColourPicker.Color = SettingsManager.Get("indBdColourActive"); - if (mainColourPicker.ShowDialog() == DialogResult.OK) - { - SettingsManager.Set("indBdColourActive", mainColourPicker.Color); - } - borderColourActivatedPreview.BackColor = mainColourPicker.Color; - } - - private void borderColourDeactivatedButton_Click(object sender, EventArgs e) - { - mainColourPicker.Color = SettingsManager.Get("indBdColourInactive"); - if (mainColourPicker.ShowDialog() == DialogResult.OK) - { - SettingsManager.Set("indBdColourInactive", mainColourPicker.Color); - } - borderColourDeactivatedPreview.BackColor = mainColourPicker.Color; - } - - private void fontButton_Click(object sender, EventArgs e) - { - indFontChooser.Font = SettingsManager.GetOrDefault("indFont"); - if (indFontChooser.ShowDialog() == DialogResult.OK) - { - SettingsManager.Set("indFont", indFontChooser.Font); - fontButton.Font = indFontChooser.Font; - } - } - - private void cancelButton_Click(object sender, EventArgs e) - { - - } - - private void positionButton_CheckedChanged(object sender, EventArgs e) - { - RadioButton _sender = sender as RadioButton; - string posName = _sender.Name.Substring(8); - Enum.TryParse(posName, out IndicatorDisplayPosition position); - SettingsManager.Set("overlayPosition", position); - } - - private void opacityLabel_Click(object sender, EventArgs e) - { - NumberInputDialog numberInputDialog = new NumberInputDialog(opacitySlider.Value, opacitySlider.Minimum, opacitySlider.Maximum); - if (numberInputDialog.ShowDialog() == DialogResult.OK) - { - opacitySlider.Value = numberInputDialog.Value; - SettingsManager.Set("indOpacity", numberInputDialog.Value); - opacityLabel.Text = string.Format("{0} %", opacitySlider.Value); - } - } - - private void opacitySlider_Scroll(object sender, EventArgs e) - { - SettingsManager.Set("indOpacity", opacitySlider.Value); - opacityLabel.Text = string.Format("{0} %", opacitySlider.Value); + SettingsManager.Set("indBgColourActive", mainColourPicker.Color); + } + backgroundColourActivatedPreview.BackColor = mainColourPicker.Color; + } + + private void backgroundColourDeactivatedButton_Click(object sender, EventArgs e) + { + mainColourPicker.Color = SettingsManager.Get("indBgColourInactive"); + if (mainColourPicker.ShowDialog() == DialogResult.OK) + { + SettingsManager.Set("indBgColourInactive", mainColourPicker.Color); + } + backgroundColourDeactivatedPreview.BackColor = mainColourPicker.Color; + } + + private void foregroundColourActivatedButton_Click(object sender, EventArgs e) + { + mainColourPicker.Color = SettingsManager.Get("indFgColourActive"); + if (mainColourPicker.ShowDialog() == DialogResult.OK) + { + SettingsManager.Set("indFgColourActive", mainColourPicker.Color); + } + foregroundColourActivatedPreview.BackColor = mainColourPicker.Color; + } + + private void foregroundColourDeactivatedButton_Click(object sender, EventArgs e) + { + mainColourPicker.Color = SettingsManager.Get("indFgColourInactive"); + if (mainColourPicker.ShowDialog() == DialogResult.OK) + { + SettingsManager.Set("indFgColourInactive", mainColourPicker.Color); + } + foregroundColourDeactivatedPreview.BackColor = mainColourPicker.Color; + } + + private void borderColourActivatedButton_Click(object sender, EventArgs e) + { + mainColourPicker.Color = SettingsManager.Get("indBdColourActive"); + if (mainColourPicker.ShowDialog() == DialogResult.OK) + { + SettingsManager.Set("indBdColourActive", mainColourPicker.Color); + } + borderColourActivatedPreview.BackColor = mainColourPicker.Color; + } + + private void borderColourDeactivatedButton_Click(object sender, EventArgs e) + { + mainColourPicker.Color = SettingsManager.Get("indBdColourInactive"); + if (mainColourPicker.ShowDialog() == DialogResult.OK) + { + SettingsManager.Set("indBdColourInactive", mainColourPicker.Color); + } + borderColourDeactivatedPreview.BackColor = mainColourPicker.Color; + } + + private void fontButton_Click(object sender, EventArgs e) + { + indFontChooser.Font = SettingsManager.GetOrDefault("indFont"); + if (indFontChooser.ShowDialog() == DialogResult.OK) + { + SettingsManager.Set("indFont", indFontChooser.Font); + fontButton.Font = indFontChooser.Font; + } + } + + private void cancelButton_Click(object sender, EventArgs e) + { + + } + + private void positionButton_CheckedChanged(object sender, EventArgs e) + { + RadioButton _sender = sender as RadioButton; + string posName = _sender.Name.Substring(8); + Enum.TryParse(posName, out IndicatorDisplayPosition position); + SettingsManager.Set("overlayPosition", position); + } + + private void opacityLabel_Click(object sender, EventArgs e) + { + NumberInputDialog numberInputDialog = new NumberInputDialog(opacitySlider.Value, opacitySlider.Minimum, opacitySlider.Maximum); + if (numberInputDialog.ShowDialog() == DialogResult.OK) + { + opacitySlider.Value = numberInputDialog.Value; + SettingsManager.Set("indOpacity", numberInputDialog.Value); + opacityLabel.Text = string.Format("{0} %", opacitySlider.Value); + } + } + + private void opacitySlider_Scroll(object sender, EventArgs e) + { + SettingsManager.Set("indOpacity", opacitySlider.Value); + opacityLabel.Text = string.Format("{0} %", opacitySlider.Value); } private void onlyShowWhenActiveCheckBox_CheckedChanged(object sender, EventArgs e) @@ -288,18 +292,18 @@ private void onlyShowWhenActiveCheckBox_CheckedChanged(object sender, EventArgs private void bdSizeLabel_Click(object sender, EventArgs e) { - NumberInputDialog numberInputDialog = new NumberInputDialog(bdSizeSlider.Value, bdSizeSlider.Minimum, bdSizeSlider.Maximum); - if (numberInputDialog.ShowDialog() == DialogResult.OK) - { - bdSizeSlider.Value = numberInputDialog.Value; - SettingsManager.Set("bdSize", numberInputDialog.Value); - bdSizeLabel.Text = string.Format("{0}", bdSizeSlider.Value); + NumberInputDialog numberInputDialog = new NumberInputDialog(bdSizeSlider.Value, bdSizeSlider.Minimum, bdSizeSlider.Maximum); + if (numberInputDialog.ShowDialog() == DialogResult.OK) + { + bdSizeSlider.Value = numberInputDialog.Value; + SettingsManager.Set("bdSize", numberInputDialog.Value); + bdSizeLabel.Text = string.Format("{0}", bdSizeSlider.Value); } } private void bdSizeSlider_Scroll(object sender, EventArgs e) { - SettingsManager.Set("bdSize", bdSizeSlider.Value); + SettingsManager.Set("bdSize", bdSizeSlider.Value); bdSizeLabel.Text = string.Format("{0}", bdSizeSlider.Value); } @@ -313,5 +317,5 @@ private void lnkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs } Process.Start("explorer", "/select,\"" + SettingsManager.GetActualPath() + "\""); } - } -} + } +} diff --git a/CapsLockIndicatorV3/IndicatorOverlay.cs b/CapsLockIndicatorV3/IndicatorOverlay.cs index 07f896e..5659a7d 100644 --- a/CapsLockIndicatorV3/IndicatorOverlay.cs +++ b/CapsLockIndicatorV3/IndicatorOverlay.cs @@ -1,30 +1,30 @@ -/* - * Created 09.07.2017 20:22 - * - * Copyright (c) Jonas Kohl - */ -using System; -using System.Drawing; -using System.Runtime.InteropServices; -using System.Windows.Forms; - -namespace CapsLockIndicatorV3 +/* + * Created 09.07.2017 20:22 + * + * Copyright (c) Jonas Kohl + */ +using System; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace CapsLockIndicatorV3 { - /// - /// A form that indicates if a keystate has changed. - /// + /// + /// A form that indicates if a keystate has changed. + /// public partial class IndicatorOverlay : Form - { - [DllImport("user32.dll", SetLastError = true)] - static extern uint GetWindowLong(IntPtr hWnd, int nIndex); - [DllImport("user32.dll", EntryPoint = "SetWindowLong")] - private static extern int SetWindowLong32(IntPtr hWnd, int nIndex, uint dwNewLong); - [DllImport("user32.dll", CharSet = CharSet.Ansi, SetLastError = true)] - static extern int SetLayeredWindowAttributes(IntPtr hWnd, int crKey, byte bAlpha, uint dwFlags); - [DllImport("user32.dll", SetLastError = true, EntryPoint = "GetWindowLong")] - static extern int GetWindowLongInt(IntPtr hWnd, int nIndex); - [DllImport("user32.dll")] - static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong); + { + [DllImport("user32.dll", SetLastError = true)] + static extern uint GetWindowLong(IntPtr hWnd, int nIndex); + [DllImport("user32.dll", EntryPoint = "SetWindowLong")] + private static extern int SetWindowLong32(IntPtr hWnd, int nIndex, uint dwNewLong); + [DllImport("user32.dll", CharSet = CharSet.Ansi, SetLastError = true)] + static extern int SetLayeredWindowAttributes(IntPtr hWnd, int crKey, byte bAlpha, uint dwFlags); + [DllImport("user32.dll", SetLastError = true, EntryPoint = "GetWindowLong")] + static extern int GetWindowLongInt(IntPtr hWnd, int nIndex); + [DllImport("user32.dll")] + static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong); [DllImport("user32.dll")] static extern int GetDpiForWindow(IntPtr hWnd); @@ -40,43 +40,43 @@ static float GetDisplayScaleFactor(IntPtr windowHandle) } } - const int GWL_EXSTYLE = -20; - const uint WS_EX_LAYERED = 0x80000; - const uint LWA_ALPHA = 0x2; - const uint LWA_COLORKEY = 0x1; + const int GWL_EXSTYLE = -20; + const uint WS_EX_LAYERED = 0x80000; + const uint LWA_ALPHA = 0x2; + const uint LWA_COLORKEY = 0x1; const uint WS_EX_TRANSPARENT = 0x00000020; const int WM_NCHITTEST = 0x84; - const int HTTRANSPARENT = -1; - + const int HTTRANSPARENT = -1; + private Size originalSize; private IndicatorDisplayPosition pos = IndicatorDisplayPosition.BottomRight; - const int WINDOW_MARGIN = 16; - private double lastOpacity = 1; - double opacity_timer_value = 2.0; - - Color BorderColour = Color.FromArgb( - 0xFF, - 0x34, - 0x4D, - 0xB4 - ); - int BorderSize = 4; - + const int WINDOW_MARGIN = 16; + private double lastOpacity = 1; + double opacity_timer_value = 2.0; + + Color BorderColour = Color.FromArgb( + 0xFF, + 0x34, + 0x4D, + 0xB4 + ); + int BorderSize = 4; + protected override void OnFormClosing(FormClosingEventArgs e) { fadeTimer.Stop(); windowCloseTimer.Stop(); positionUpdateTimer.Stop(); base.OnFormClosing(e); - } - + } + protected override bool ShowWithoutActivation { get { return true; } - } - + } + protected override CreateParams CreateParams { get @@ -96,258 +96,282 @@ protected override void WndProc(ref Message m) } protected override void OnShown(EventArgs e) - { - UpdatePosition(); - + { + UpdatePosition(); + base.OnShown(e); - } - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - } - - void UpdatePosition() - { - Rectangle workingArea = Screen.GetWorkingArea(Cursor.Position); - + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + } + + void UpdatePosition() + { + Rectangle workingArea = Screen.GetWorkingArea(Cursor.Position); + var factor = GetDisplayScaleFactor(Handle); Size = new Size( - (int)(originalSize.Width * factor), - (int)(originalSize.Height * factor) + Width, + Height + //(int)(originalSize.Width * factor), + //(int)(originalSize.Height * factor) ); - switch (pos) - { - case IndicatorDisplayPosition.TopLeft: - Left = workingArea.X + WINDOW_MARGIN; - Top = workingArea.Y + WINDOW_MARGIN; - break; - case IndicatorDisplayPosition.TopCenter: - Left = workingArea.X + (workingArea.Width / 2 - Width / 2); - Top = workingArea.Y + WINDOW_MARGIN; - break; - case IndicatorDisplayPosition.TopRight: - Left = workingArea.X + workingArea.Left + (workingArea.Width - Width - WINDOW_MARGIN - workingArea.Left); - Top = workingArea.Y + WINDOW_MARGIN; - break; - case IndicatorDisplayPosition.MiddleLeft: - Left = workingArea.X + WINDOW_MARGIN; - Top = workingArea.Y + (workingArea.Height / 2 - Height / 2); - break; - case IndicatorDisplayPosition.MiddleCenter: - Left = workingArea.X + (workingArea.Width / 2 - Width / 2); - Top = workingArea.Y + (workingArea.Height / 2 - Height / 2); - break; - case IndicatorDisplayPosition.MiddleRight: - Left = workingArea.X + workingArea.Left + (workingArea.Width - Width - WINDOW_MARGIN - workingArea.Left); - Top = workingArea.Y + (workingArea.Height / 2 - Height / 2); - break; - case IndicatorDisplayPosition.BottomLeft: - Left = workingArea.X + WINDOW_MARGIN; - Top = workingArea.Y + workingArea.Top + (workingArea.Height - Height - WINDOW_MARGIN - workingArea.Top); - break; - case IndicatorDisplayPosition.BottomCenter: - Left = workingArea.X + (workingArea.Width / 2 - Width / 2); - Top = workingArea.Y + workingArea.Top + (workingArea.Height - Height - WINDOW_MARGIN - workingArea.Top); - break; - case IndicatorDisplayPosition.BottomRight: - Left = workingArea.X + workingArea.Left + (workingArea.Width - Width - WINDOW_MARGIN - workingArea.Left); - Top = workingArea.Y + workingArea.Top + (workingArea.Height - Height - WINDOW_MARGIN - workingArea.Top); - break; - default: - break; - } + switch (pos) + { + case IndicatorDisplayPosition.TopLeft: + Left = workingArea.X + WINDOW_MARGIN; + Top = workingArea.Y + WINDOW_MARGIN; + break; + case IndicatorDisplayPosition.TopCenter: + Left = workingArea.X + (workingArea.Width / 2 - Width / 2); + Top = workingArea.Y + WINDOW_MARGIN; + break; + case IndicatorDisplayPosition.TopRight: + Left = workingArea.X + workingArea.Left + (workingArea.Width - Width - WINDOW_MARGIN - workingArea.Left); + Top = workingArea.Y + WINDOW_MARGIN; + break; + case IndicatorDisplayPosition.MiddleLeft: + Left = workingArea.X + WINDOW_MARGIN; + Top = workingArea.Y + (workingArea.Height / 2 - Height / 2); + break; + case IndicatorDisplayPosition.MiddleCenter: + Left = workingArea.X + (workingArea.Width / 2 - Width / 2); + Top = workingArea.Y + (workingArea.Height / 2 - Height / 2); + break; + case IndicatorDisplayPosition.MiddleRight: + Left = workingArea.X + workingArea.Left + (workingArea.Width - Width - WINDOW_MARGIN - workingArea.Left); + Top = workingArea.Y + (workingArea.Height / 2 - Height / 2); + break; + case IndicatorDisplayPosition.BottomLeft: + Left = workingArea.X + WINDOW_MARGIN; + Top = workingArea.Y + workingArea.Top + (workingArea.Height - Height - WINDOW_MARGIN - workingArea.Top); + break; + case IndicatorDisplayPosition.BottomCenter: + Left = workingArea.X + (workingArea.Width / 2 - Width / 2); + Top = workingArea.Y + workingArea.Top + (workingArea.Height - Height - WINDOW_MARGIN - workingArea.Top); + break; + case IndicatorDisplayPosition.BottomRight: + Left = workingArea.X + workingArea.Left + (workingArea.Width - Width - WINDOW_MARGIN - workingArea.Left); + Top = workingArea.Y + workingArea.Top + (workingArea.Height - Height - WINDOW_MARGIN - workingArea.Top); + break; + default: + break; + } } protected override void OnPaint(PaintEventArgs e) { - base.OnPaint(e); - + base.OnPaint(e); + if (BorderSize > 0) - e.Graphics.DrawRectangle(new Pen(BorderColour, BorderSize), e.ClipRectangle); - + e.Graphics.DrawRectangle(new Pen(BorderColour, BorderSize), e.ClipRectangle); + using (var sf = new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }) - using (var b = new SolidBrush(contentLabel.ForeColor)) - e.Graphics.DrawString(contentLabel.Text, contentLabel.Font, b, ClientRectangle, sf); - } - - private void ClickThroughWindow(double opacity = 1d) - { - //Opacity = opacity; - try - { - IntPtr Handle = this.Handle; - uint windowLong = GetWindowLong(Handle, GWL_EXSTYLE); - SetWindowLong32(Handle, GWL_EXSTYLE, windowLong ^ WS_EX_LAYERED); - SetLayeredWindowAttributes(Handle, 0, (byte)(opacity * 255), LWA_ALPHA); + using (var b = new SolidBrush(contentLabel.ForeColor)) + e.Graphics.DrawString(contentLabel.Text, contentLabel.Font, b, ClientRectangle, sf); + } + + private int ClickThroughWindow(double opacity = 1d) + { + if (IsDisposed) + return -1; + + uint windowLong = GetWindowLong(Handle, GWL_EXSTYLE); + SetWindowLong32(Handle, GWL_EXSTYLE, windowLong ^ WS_EX_LAYERED); + SetLayeredWindowAttributes(Handle, 0, (byte)(opacity * 255), LWA_ALPHA); + + var style = GetWindowLong(Handle, GWL_EXSTYLE); + SetWindowLong(Handle, GWL_EXSTYLE, style | WS_EX_LAYERED | WS_EX_TRANSPARENT); + + return 0; + } - var style = GetWindowLong(this.Handle, GWL_EXSTYLE); - SetWindowLong(this.Handle, GWL_EXSTYLE, style | WS_EX_LAYERED | WS_EX_TRANSPARENT); - } - catch (ObjectDisposedException) - { } - } - public IndicatorOverlay(string content) { - InitializeComponent(); - - originalSize = Size; + InitializeComponent(); + + //if (IsDisposed) + // return; + + //originalSize = Size; + + //contentLabel.Text = content; + + //ClickThroughWindow(); + } + + public IndicatorOverlay(string content, int timeoutInMs, IndicatorDisplayPosition position) + { + pos = position; + + if (IsDisposed) + return; - contentLabel.Text = content; - - ClickThroughWindow(); - } - - public IndicatorOverlay(string content, int timeoutInMs, IndicatorDisplayPosition position) - { - pos = position; InitializeComponent(); - contentLabel.Text = content; - Application.DoEvents(); - originalSize = Size; - - if (timeoutInMs < 1) - { + if (IsDisposed) + return; + + contentLabel.Text = content; + originalSize = Size; + + if (timeoutInMs < 1) + { windowCloseTimer.Enabled = false; - fadeTimer.Enabled = false; - } - else - { - windowCloseTimer.Interval = timeoutInMs; - fadeTimer.Interval = (int)Math.Floor((decimal)(timeoutInMs / 20)); - } - ClickThroughWindow(); - } - - public IndicatorOverlay(string content, int timeoutInMs, Color bgColour, Color fgColour, Color bdColour, int bdSize, Font font, IndicatorDisplayPosition position, int indOpacity, bool alwaysShow) - { - pos = position; - InitializeComponent(); - - contentLabel.Text = content; - Font = font; - Application.DoEvents(); + fadeTimer.Enabled = false; + } + else + { + windowCloseTimer.Interval = timeoutInMs; + fadeTimer.Interval = (int)Math.Floor((decimal)(timeoutInMs / 20)); + } + ClickThroughWindow(); + } + + public IndicatorOverlay(string content, int timeoutInMs, Color bgColour, Color fgColour, Color bdColour, int bdSize, Font font, IndicatorDisplayPosition position, int indOpacity, bool alwaysShow) + { + var ret = 0; + + pos = position; + + InitializeComponent(); + + + contentLabel.Text = content; + Font = font; originalSize = Size; - var op = indOpacity / 100d; - lastOpacity = op; - SetOpacity(op); - if (timeoutInMs < 0 || alwaysShow) - { - windowCloseTimer.Enabled = false; - fadeTimer.Enabled = false; - } - else - { - windowCloseTimer.Interval = timeoutInMs; - fadeTimer.Interval = (int)Math.Floor((decimal)(timeoutInMs / 20)); - } - BackColor = bgColour; - ForeColor = fgColour; - BorderColour = bdColour; - BorderSize = bdSize; - ClickThroughWindow(op); - } - - private void SetOpacity(double op) - { - if (IsDisposed) - return; - + var op = indOpacity / 100d; + lastOpacity = op; + ret |= SetOpacity(op); + if (timeoutInMs < 0 || alwaysShow) + { + windowCloseTimer.Enabled = false; + fadeTimer.Enabled = false; + } + else + { + windowCloseTimer.Interval = timeoutInMs; + fadeTimer.Interval = (int)Math.Floor((decimal)(timeoutInMs / 20)); + } + BackColor = bgColour; + ForeColor = fgColour; + BorderColour = bdColour; + BorderSize = bdSize; + ret |= ClickThroughWindow(op); + if (ret != -1) + Show(); + } + + private int SetOpacity(double op) + { + if (IsDisposed) + return -1; + + byte opb = 0xFF; + try { - //Opacity = op; - byte opb = (byte)Math.Min(255, op * 0xFF); - SetLayeredWindowAttributes(Handle, 0, opb, LWA_ALPHA); + opb = (byte)Math.Min(255, Math.Max(op * 0xFF, 0)); } - catch (ObjectDisposedException) - { } - } - - public void UpdateIndicator(string content, IndicatorDisplayPosition position) - { - pos = position; - Opacity = 1; - contentLabel.Text = content; - opacity_timer_value = 2.0; - windowCloseTimer.Stop(); - windowCloseTimer.Start(); - fadeTimer.Stop(); - fadeTimer.Start(); - UpdatePosition(); - } - - public void UpdateIndicator(string content, int timeoutInMs, IndicatorDisplayPosition position) - { - pos = position; - Opacity = 1; - contentLabel.Text = content; - opacity_timer_value = 2.0; - if (timeoutInMs < 0) - { - windowCloseTimer.Enabled = false; - fadeTimer.Enabled = false; - } - else - { - windowCloseTimer.Stop(); - windowCloseTimer.Interval = timeoutInMs; - windowCloseTimer.Start(); - fadeTimer.Stop(); - fadeTimer.Start(); - } - UpdatePosition(); - } - - public void UpdateIndicator(string content, int timeoutInMs, Color bgColour, Color fgColour, Color bdColour, int bdSize, Font font, IndicatorDisplayPosition position, int indOpacity, bool alwaysShow) - { - pos = position; - var op = indOpacity / 100d; - lastOpacity = op; - contentLabel.Text = content; - Font = font; - opacity_timer_value = 2.0; - if (timeoutInMs < 0 || alwaysShow) - { - windowCloseTimer.Enabled = false; - fadeTimer.Enabled = false; - } - else - { - windowCloseTimer.Stop(); - windowCloseTimer.Interval = timeoutInMs; - windowCloseTimer.Start(); - fadeTimer.Stop(); - fadeTimer.Start(); - } - SetOpacity(op); - BackColor = bgColour; - ForeColor = fgColour; - BorderColour = bdColour; - BorderSize = bdSize; - Invalidate(); - UpdatePosition(); - } - + catch (OverflowException) { } + SetLayeredWindowAttributes(Handle, 0, opb, LWA_ALPHA); + return 0; + } + + public void UpdateIndicator(string content, IndicatorDisplayPosition position) + { + pos = position; + Opacity = 1; + contentLabel.Text = content; + opacity_timer_value = 2.0; + windowCloseTimer.Stop(); + windowCloseTimer.Start(); + fadeTimer.Stop(); + fadeTimer.Start(); + Show(); + UpdatePosition(); + } + + public void UpdateIndicator(string content, int timeoutInMs, IndicatorDisplayPosition position) + { + pos = position; + Opacity = 1; + contentLabel.Text = content; + opacity_timer_value = 2.0; + if (timeoutInMs < 0) + { + windowCloseTimer.Enabled = false; + fadeTimer.Enabled = false; + } + else + { + windowCloseTimer.Stop(); + windowCloseTimer.Interval = timeoutInMs; + windowCloseTimer.Start(); + fadeTimer.Stop(); + fadeTimer.Interval = (int)Math.Floor((decimal)(timeoutInMs / 20)); + fadeTimer.Start(); + } + Show(); + UpdatePosition(); + } + + public void UpdateIndicator(string content, int timeoutInMs, Color bgColour, Color fgColour, Color bdColour, int bdSize, Font font, IndicatorDisplayPosition position, int indOpacity, bool alwaysShow) + { + pos = position; + var op = indOpacity / 100d; + lastOpacity = op; + SetOpacity(op); + contentLabel.Text = content; + Font = font; + opacity_timer_value = 2.0; + if (timeoutInMs < 0 || alwaysShow) + { + windowCloseTimer.Enabled = false; + fadeTimer.Enabled = false; + } + else + { + windowCloseTimer.Stop(); + windowCloseTimer.Interval = timeoutInMs; + windowCloseTimer.Start(); + fadeTimer.Stop(); + fadeTimer.Interval = (int)Math.Floor((decimal)(timeoutInMs / 20)); + fadeTimer.Start(); + } + BackColor = bgColour; + ForeColor = fgColour; + BorderColour = bdColour; + BorderSize = bdSize; + Show(); + Invalidate(); + UpdatePosition(); + } + void WindowCloseTimerTick(object sender, EventArgs e) { - Close(); - } - - private void fadeTimer_Tick(object sender, EventArgs e) - { - opacity_timer_value -= 0.1; - if (opacity_timer_value <= 1.0) - SetOpacity(opacity_timer_value * lastOpacity); + Hide(); + } + + private void fadeTimer_Tick(object sender, EventArgs e) + { + if (opacity_timer_value > 0) + { + opacity_timer_value -= 0.1; + opacity_timer_value = Math.Max(opacity_timer_value, 0); + if (opacity_timer_value <= 1.0) + SetOpacity(opacity_timer_value * lastOpacity); + } } private void positionUpdateTimer_Tick(object sender, EventArgs e) { UpdatePosition(); } - } -} + } +} diff --git a/CapsLockIndicatorV3/MainForm.cs b/CapsLockIndicatorV3/MainForm.cs index c83f239..bf37c25 100644 --- a/CapsLockIndicatorV3/MainForm.cs +++ b/CapsLockIndicatorV3/MainForm.cs @@ -1,90 +1,91 @@ -/* - * Created 09.07.2017 18:16 - * - * Copyright (c) Jonas Kohl - */ - -// Use project namespace, for easier access to e.g helper classes -using CapsLockIndicatorV3; - -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Diagnostics; -using System.Windows.Forms; -using System.Reflection; -using System.Resources; -using System.Linq; -using Microsoft.Win32; -using System.Xml.Linq; -using System.Globalization; -using System.Threading; -using System.IO; - -namespace CapsLockIndicatorV3 -{ - public partial class MainForm : Form - { - public bool isHidden = false; - - // Define variables used to load the icons from resources.resx - ResourceManager resources; - - Icon CapsOff; - Icon CapsOn; - - Icon NumOff; - Icon NumOn; - - Icon ScrollOff; - Icon ScrollOn; - - // Store the key states of the previous timer tick - bool numState; - bool capsState; - bool scrollState; - - public bool askCancel = true; - private bool shouldClose = false; - - private int previousLocaleIndex = -1; - - public MainForm() - { - Assembly assembly = Assembly.GetExecutingAssembly(); - FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location); - string version = fvi.FileVersion; - - // Initialize component - InitializeComponent(); - - Opacity = 0; - ShowInTaskbar = false; - - // Load "resources.resx" into a ResourceManager to access its resources - resources = new ResourceManager("CapsLockIndicatorV3.resources", Assembly.GetExecutingAssembly()); - - // Load the icons into variables - ReloadIcons(); - - // Set the values - numState = KeyHelper.isNumlockActive; - capsState = KeyHelper.isCapslockActive; - scrollState = KeyHelper.isScrolllockActive; - - // Load settings - enableNumIcon.Checked = SettingsManager.Get("numIco"); - enableCapsIcon.Checked = SettingsManager.Get("capsIco"); - enableScrollIcon.Checked = SettingsManager.Get("scrollIco"); - - enableNumInd.Checked = SettingsManager.Get("numInd"); - enableCapsInd.Checked = SettingsManager.Get("capsInd"); - enableScrollInd.Checked = SettingsManager.Get("scrollInd"); - - showNoIcons.Checked = SettingsManager.Get("noIco"); - showNoNotification.Checked = SettingsManager.Get("noInd"); - - iconsGroup.Enabled = !showNoIcons.Checked; +/* + * Created 09.07.2017 18:16 + * + * Copyright (c) Jonas Kohl + */ + +// Use project namespace, for easier access to e.g helper classes +using CapsLockIndicatorV3; + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Reflection; +using System.Resources; +using System.Linq; +using Microsoft.Win32; +using System.Xml.Linq; +using System.Globalization; +using System.Threading; +using System.IO; +using System.ComponentModel; + +namespace CapsLockIndicatorV3 +{ + public partial class MainForm : DarkModeForm + { + public bool isHidden = false; + + // Define variables used to load the icons from resources.resx + ResourceManager resources; + + Icon CapsOff; + Icon CapsOn; + + Icon NumOff; + Icon NumOn; + + Icon ScrollOff; + Icon ScrollOn; + + // Store the key states of the previous timer tick + bool numState; + bool capsState; + bool scrollState; + + public bool askCancel = true; + private bool shouldClose = false; + + private int previousLocaleIndex = -1; + + public MainForm() + { + Assembly assembly = Assembly.GetExecutingAssembly(); + FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location); + string version = fvi.FileVersion; + + // Initialize component + InitializeComponent(); + + Opacity = 0; + ShowInTaskbar = false; + + // Load "resources.resx" into a ResourceManager to access its resources + resources = new ResourceManager("CapsLockIndicatorV3.resources", Assembly.GetExecutingAssembly()); + + // Load the icons into variables + ReloadIcons(); + + // Set the values + numState = KeyHelper.isNumlockActive; + capsState = KeyHelper.isCapslockActive; + scrollState = KeyHelper.isScrolllockActive; + + // Load settings + enableNumIcon.Checked = SettingsManager.Get("numIco"); + enableCapsIcon.Checked = SettingsManager.Get("capsIco"); + enableScrollIcon.Checked = SettingsManager.Get("scrollIco"); + + enableNumInd.Checked = SettingsManager.Get("numInd"); + enableCapsInd.Checked = SettingsManager.Get("capsInd"); + enableScrollInd.Checked = SettingsManager.Get("scrollInd"); + + showNoIcons.Checked = SettingsManager.Get("noIco"); + showNoNotification.Checked = SettingsManager.Get("noInd"); + + iconsGroup.Enabled = !showNoIcons.Checked; indicatorGroup.Enabled = !showNoNotification.Checked; generalIcon.ContextMenu = @@ -93,570 +94,647 @@ public MainForm() scrollLockIcon.ContextMenu = contextMenu1; - if (SettingsManager.Get("beta_enableDarkMode")) - { - HandleCreated += MainForm_HandleCreated; - - iconsGroup.ForeColor = - indicatorGroup.ForeColor = - enableNumInd.ForeColor = - enableCapsInd.ForeColor = - enableScrollInd.ForeColor = - enableNumIcon.ForeColor = - enableCapsIcon.ForeColor = - enableScrollIcon.ForeColor = - showNoIcons.ForeColor = - showNoNotification.ForeColor = - startonlogonCheckBox.ForeColor = - hideOnStartupCheckBox.ForeColor = - Color.White; - - enableNumInd.FlatStyle = - enableCapsInd.FlatStyle = - enableScrollInd.FlatStyle = - enableNumIcon.FlatStyle = - enableCapsIcon.FlatStyle = - enableScrollIcon.FlatStyle = - showNoIcons.FlatStyle = - showNoNotification.FlatStyle = - startonlogonCheckBox.FlatStyle = - hideOnStartupCheckBox.FlatStyle = - FlatStyle.Standard; - - BackColor = Color.FromArgb(255, 32, 32, 32); - ForeColor = Color.White; - aboutPanelTopBorder.BackColor = Color.FromArgb(255, 196, 204, 238); - appNameLabel.LinkColor = - appNameLabel.ActiveLinkColor = - Color.FromArgb(255, 196, 204, 238); - logo.Image = (Bitmap)resources.GetObject("logo_dark"); - - ControlScheduleSetDarkMode(checkForUpdatesButton); - ControlScheduleSetDarkMode(indSettings); - ControlScheduleSetDarkMode(exitApplication); - ControlScheduleSetDarkMode(hideWindow); - ControlScheduleSetDarkMode(enableNumInd); - ControlScheduleSetDarkMode(enableCapsInd); - ControlScheduleSetDarkMode(enableScrollInd); - ControlScheduleSetDarkMode(enableNumIcon); - ControlScheduleSetDarkMode(enableCapsIcon); - ControlScheduleSetDarkMode(enableScrollIcon); - ControlScheduleSetDarkMode(localeComboBox); - } - - // Check if application is in startup - startonlogonCheckBox.Checked = Registry.GetValue(@"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "CapsLock Indicator", null) != null; - - // Hides the window on startup if enabled - if (SettingsManager.Get("hideOnStartup")) - { - hideOnStartupCheckBox.Checked = true; - hideWindowTimer.Start(); - } - else - { - Opacity = 1; - ShowInTaskbar = true; - } - - checkForUpdatedCheckBox.Checked = SettingsManager.Get("checkForUpdates"); - - AddCultures(); - - ApplyLocales(); - } - - private void MainForm_HandleCreated(object sender, EventArgs e) - { - Native.UseImmersiveDarkModeColors(Handle, true); - } - - private void ControlScheduleSetDarkMode(Control control) - { - control.HandleCreated += (sender, e) => + HandleCreated += (sender, e) => { - Native.ControlSetDarkMode(control, true); + DarkModeChanged += MainForm_DarkModeChanged; + DarkModeProvider.RegisterForm(this); }; + + // Check if application is in startup + startonlogonCheckBox.Checked = Registry.GetValue(@"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "CapsLock Indicator", null) != null; + + // Hides the window on startup if enabled + if (SettingsManager.Get("hideOnStartup")) + { + hideOnStartupCheckBox.Checked = true; + hideWindowTimer.Start(); + } + else + { + Opacity = 1; + ShowInTaskbar = true; + } + + checkForUpdatedCheckBox.Checked = SettingsManager.Get("checkForUpdates"); + + AddCultures(); + + ApplyLocales(); + + SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; + } + + protected override void OnClosing(CancelEventArgs e) + { + base.OnClosing(e); + + SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged; + } + + private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) + { + if (e.Mode == PowerModes.Resume) + { + if (SettingsManager.Get("searchForUpdatesAfterResume")) + doVersionCheck(false); + } + } + + private void MainForm_DarkModeChanged(object sender, EventArgs e) + { + var dark = DarkModeProvider.IsDark; + + Native.UseImmersiveDarkModeColors(Handle, dark); + generalIcon.Icon = (Icon)resources.GetObject("generalIcon"); + Icon = (Icon)resources.GetObject("CLIv3_Icon" + (dark ? "_Dark" : "")); + + iconsGroup.ForeColor = + indicatorGroup.ForeColor = + enableNumInd.ForeColor = + enableCapsInd.ForeColor = + enableScrollInd.ForeColor = + enableNumIcon.ForeColor = + enableCapsIcon.ForeColor = + enableScrollIcon.ForeColor = + showNoIcons.ForeColor = + showNoNotification.ForeColor = + startonlogonCheckBox.ForeColor = + hideOnStartupCheckBox.ForeColor = + dark ? Color.White : SystemColors.WindowText; + + enableNumInd.FlatStyle = + enableCapsInd.FlatStyle = + enableScrollInd.FlatStyle = + enableNumIcon.FlatStyle = + enableCapsIcon.FlatStyle = + enableScrollIcon.FlatStyle = + showNoIcons.FlatStyle = + showNoNotification.FlatStyle = + startonlogonCheckBox.FlatStyle = + hideOnStartupCheckBox.FlatStyle = + dark ? FlatStyle.Standard : FlatStyle.System; + + BackColor = dark ? Color.FromArgb(255, 32, 32, 32) : SystemColors.Window; + ForeColor = dark ? Color.White : SystemColors.WindowText; + aboutPanelTopBorder.BackColor = + appNameLabel.LinkColor = + appNameLabel.ActiveLinkColor = + dark ? Color.FromArgb(255, 196, 204, 238) : Color.FromArgb(255, 52, 77, 180); ; + logo.Image = (Bitmap)resources.GetObject("logo" + (dark ? "_dark" : "")); + + ControlScheduleSetDarkMode(checkForUpdatesButton, dark); + ControlScheduleSetDarkMode(indSettings, dark); + ControlScheduleSetDarkMode(exitApplication, dark); + ControlScheduleSetDarkMode(hideWindow, dark); + ControlScheduleSetDarkMode(enableNumInd, dark); + ControlScheduleSetDarkMode(enableCapsInd, dark); + ControlScheduleSetDarkMode(enableScrollInd, dark); + ControlScheduleSetDarkMode(enableNumIcon, dark); + ControlScheduleSetDarkMode(enableCapsIcon, dark); + ControlScheduleSetDarkMode(enableScrollIcon, dark); + ControlScheduleSetDarkMode(localeComboBox, dark); } - private void ReloadIcons() - { - var dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - - CapsOff = File.Exists(Path.Combine(dir, "caps0.ico")) ? Icon.ExtractAssociatedIcon(Path.Combine(dir, "caps0.ico")) : (Icon)resources.GetObject("CLIv3_Caps_Off"); - CapsOn = File.Exists(Path.Combine(dir, "caps1.ico")) ? Icon.ExtractAssociatedIcon(Path.Combine(dir, "caps1.ico")) : (Icon)resources.GetObject("CLIv3_Caps_On"); - - NumOff = File.Exists(Path.Combine(dir, "num0.ico")) ? Icon.ExtractAssociatedIcon(Path.Combine(dir, "num0.ico")) : (Icon)resources.GetObject("CLIv3_Num_Off"); - NumOn = File.Exists(Path.Combine(dir, "num1.ico")) ? Icon.ExtractAssociatedIcon(Path.Combine(dir, "num1.ico")) : (Icon)resources.GetObject("CLIv3_Num_On"); - - ScrollOff = File.Exists(Path.Combine(dir, "scroll0.ico")) ? Icon.ExtractAssociatedIcon(Path.Combine(dir, "scroll0.ico")) : (Icon)resources.GetObject("CLIv3_Scroll_Off"); - ScrollOn = File.Exists(Path.Combine(dir, "scroll1.ico")) ? Icon.ExtractAssociatedIcon(Path.Combine(dir, "scroll1.ico")) : (Icon)resources.GetObject("CLIv3_Scroll_On"); - } - - private void AddCultures() - { - int index = 1; - int selectIndex = 0; - - localeComboBox.Items.Clear(); - - localeComboBox.Items.Add(new DropDownLocale("en-GB", "English (United Kingdom)")); - - foreach (CultureInfo c in GetSupportedCulture()) - { - if (c.Name.Trim().Length < 1) - continue; - else - { - localeComboBox.Items.Add(new DropDownLocale(c.Name, c.NativeName)); - - if (c.TwoLetterISOLanguageName == Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName) - selectIndex = index; - - index++; - } - } - - if (SettingsManager.Get("selectedUICulture") < 0) - localeComboBox.SelectedIndex = selectIndex; - else if (SettingsManager.Get("selectedUICulture") < localeComboBox.Items.Count) - localeComboBox.SelectedIndex = SettingsManager.Get("selectedUICulture"); - else - localeComboBox.SelectedIndex = 0; - - localeComboBox.Items.Add(new DropDownLocale("--ln", "")); - localeComboBox.Items.Add(new DropDownLocale("--get-more", strings.downloadMoreTranslations)); - } - - public IEnumerable GetSupportedCulture() - { - //Get all culture - CultureInfo[] culture = CultureInfo.GetCultures(CultureTypes.AllCultures); - - //Find the location where application installed. - string exeLocation = Path.GetDirectoryName(Uri.UnescapeDataString(new UriBuilder(Assembly.GetExecutingAssembly().CodeBase).Path)); - - //Return all culture for which satellite folder found with culture code. - return culture.Where(cultureInfo => Directory.Exists(Path.Combine(exeLocation, cultureInfo.Name))); - } - - void ApplyLocales() - { - iconsGroup.Text = strings.showIconsFor; - indicatorGroup.Text = strings.showNotificationWhen; - enableNumIcon.Text = strings.numLock; - enableCapsIcon.Text = strings.capsLock; - enableScrollIcon.Text = strings.scrollLock; - enableNumInd.Text = string.Format(strings.keyChanged, strings.numLock); - enableCapsInd.Text = string.Format(strings.keyChanged, strings.capsLock); - enableScrollInd.Text = string.Format(strings.keyChanged, strings.scrollLock); - showNoIcons.Text = strings.showNoIcons; - showNoNotification.Text = strings.showNoNotification; - hideWindow.Text = strings.hideWindow; - exitApplication.Text = strings.exitApplication; - indSettings.Text = strings.notificationSettings; - checkForUpdatesButton.Text = strings.checkForUpdates; - startonlogonCheckBox.Text = strings.startOnLogon; - generalIcon.BalloonTipText = strings.generalIconBalloonText; - showToolStripMenuItem.Text = strings.contextMenuShow; - showMenuItem.Text = strings.contextMenuShow; - exitToolStripMenuItem.Text = strings.contextMenuExit; - exitMenuItem.Text = strings.contextMenuExit; - hideOnStartupCheckBox.Text = strings.hideOnStartup; - } - - // This timer ticks approx. 60 times a second (overkill?) - void UpdateTimerTick(object sender, EventArgs e) - { - // Set the icons for the NotifyIcons depending on the key state - if (enableNumIcon.Checked && !showNoIcons.Checked) - numLockIcon.Icon = KeyHelper.isNumlockActive ? NumOn : NumOff; - else - numLockIcon.Icon = null; - - if (enableCapsIcon.Checked && !showNoIcons.Checked) - capsLockIcon.Icon = KeyHelper.isCapslockActive ? CapsOn : CapsOff; - else - capsLockIcon.Icon = null; - - if (enableScrollIcon.Checked && !showNoIcons.Checked) - scrollLockIcon.Icon = KeyHelper.isScrolllockActive ? ScrollOn : ScrollOff; - else - scrollLockIcon.Icon = null; - + private void ReloadIcons(bool isUserInitiated = false) + { + var dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + + CapsOff = File.Exists(Path.Combine(dir, "caps0.ico")) ? Icon.ExtractAssociatedIcon(Path.Combine(dir, "caps0.ico")) : (Icon)resources.GetObject("CLIv3_Caps_Off"); + CapsOn = File.Exists(Path.Combine(dir, "caps1.ico")) ? Icon.ExtractAssociatedIcon(Path.Combine(dir, "caps1.ico")) : (Icon)resources.GetObject("CLIv3_Caps_On"); + + NumOff = File.Exists(Path.Combine(dir, "num0.ico")) ? Icon.ExtractAssociatedIcon(Path.Combine(dir, "num0.ico")) : (Icon)resources.GetObject("CLIv3_Num_Off"); + NumOn = File.Exists(Path.Combine(dir, "num1.ico")) ? Icon.ExtractAssociatedIcon(Path.Combine(dir, "num1.ico")) : (Icon)resources.GetObject("CLIv3_Num_On"); + + ScrollOff = File.Exists(Path.Combine(dir, "scroll0.ico")) ? Icon.ExtractAssociatedIcon(Path.Combine(dir, "scroll0.ico")) : (Icon)resources.GetObject("CLIv3_Scroll_Off"); + ScrollOn = File.Exists(Path.Combine(dir, "scroll1.ico")) ? Icon.ExtractAssociatedIcon(Path.Combine(dir, "scroll1.ico")) : (Icon)resources.GetObject("CLIv3_Scroll_On"); + + if (isUserInitiated) + ShowOverlayInfo(strings.reloadedIconsInfo); + } + + private void AddCultures() + { + int index = 1; + int selectIndex = 0; + + localeComboBox.Items.Clear(); + + localeComboBox.Items.Add(new DropDownLocale("en-GB", "English (United Kingdom)")); + + var cultures = GetSupportedCulture(); + + foreach (CultureInfo c in cultures) + { + if (c.Name.Trim().Length < 1) + continue; + else + { + localeComboBox.Items.Add(new DropDownLocale(c.Name, c.NativeName)); + + if (c.TwoLetterISOLanguageName == Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName) + selectIndex = index; + + index++; + } + } + + //if (SettingsManager.Get("selectedUICulture") < 0) + // localeComboBox.SelectedIndex = selectIndex; + //else if (SettingsManager.Get("selectedUICulture") < localeComboBox.Items.Count) + // localeComboBox.SelectedIndex = SettingsManager.Get("selectedUICulture"); + //else + // localeComboBox.SelectedIndex = 0; + + if (SettingsManager.Has("selectedUICulture")) + { + var legacySelectedUICulture = SettingsManager.Get("selectedUICulture"); + SettingsManager.Unset("selectedUICulture"); + selectIndex = legacySelectedUICulture; + } + + var cultureCodes = cultures.Select(c => c.TwoLetterISOLanguageName); + var selLang = SettingsManager.Get("selectedLanguage"); + + if (selLang == "") + localeComboBox.SelectedIndex = selectIndex; + else if (cultureCodes.Contains(selLang)) + localeComboBox.SelectedIndex = cultureCodes.ToList().FindIndex(c => c == selLang); + else + localeComboBox.SelectedIndex = 0; + + localeComboBox.Items.Add(new DropDownLocale("--ln", "")); + localeComboBox.Items.Add(new DropDownLocale("--get-more", strings.downloadMoreTranslations)); + } + + public IEnumerable GetSupportedCulture() + { + //Get all culture + CultureInfo[] culture = CultureInfo.GetCultures(CultureTypes.AllCultures); + + //Find the location where application installed. + string exeLocation = Path.GetDirectoryName(Uri.UnescapeDataString(new UriBuilder(Assembly.GetExecutingAssembly().CodeBase).Path)); + + //Return all culture for which satellite folder found with culture code. + return culture.Where(cultureInfo => Directory.Exists(Path.Combine(exeLocation, cultureInfo.Name))); + } + + void ApplyLocales() + { + iconsGroup.Text = strings.showIconsFor; + indicatorGroup.Text = strings.showNotificationWhen; + enableNumIcon.Text = strings.numLock; + enableCapsIcon.Text = strings.capsLock; + enableScrollIcon.Text = strings.scrollLock; + enableNumInd.Text = string.Format(strings.keyChanged, strings.numLock); + enableCapsInd.Text = string.Format(strings.keyChanged, strings.capsLock); + enableScrollInd.Text = string.Format(strings.keyChanged, strings.scrollLock); + showNoIcons.Text = strings.showNoIcons; + showNoNotification.Text = strings.showNoNotification; + hideWindow.Text = strings.hideWindow; + exitApplication.Text = strings.exitApplication; + indSettings.Text = strings.notificationSettings; + checkForUpdatesButton.Text = strings.checkForUpdates; + startonlogonCheckBox.Text = strings.startOnLogon; + generalIcon.BalloonTipText = strings.generalIconBalloonText; + showToolStripMenuItem.Text = strings.contextMenuShow; + showMenuItem.Text = strings.contextMenuShow; + exitToolStripMenuItem.Text = strings.contextMenuExit; + exitMenuItem.Text = strings.contextMenuExit; + hideOnStartupCheckBox.Text = strings.hideOnStartup; + } + + // This timer ticks approx. 60 times a second (overkill?) + void UpdateTimerTick(object sender, EventArgs e) + { + // Set the icons for the NotifyIcons depending on the key state + if (enableNumIcon.Checked && !showNoIcons.Checked) + numLockIcon.Icon = KeyHelper.isNumlockActive ? NumOn : NumOff; + else + numLockIcon.Icon = null; + + if (enableCapsIcon.Checked && !showNoIcons.Checked) + capsLockIcon.Icon = KeyHelper.isCapslockActive ? CapsOn : CapsOff; + else + capsLockIcon.Icon = null; + + if (enableScrollIcon.Checked && !showNoIcons.Checked) + scrollLockIcon.Icon = KeyHelper.isScrolllockActive ? ScrollOn : ScrollOff; + else + scrollLockIcon.Icon = null; + generalIcon.Visible = - !(enableNumIcon.Checked && !showNoIcons.Checked) && - !(enableCapsIcon.Checked && !showNoIcons.Checked) && - !(enableScrollIcon.Checked && !showNoIcons.Checked) - ; - - // Handle the overlay - if (numState != KeyHelper.isNumlockActive && enableNumInd.Checked && !showNoNotification.Checked) - ShowOverlay( - KeyHelper.isNumlockActive ? - (SettingsManager.Get("customMessageNumOn").Trim().Length > 0 ? SettingsManager.Get("customMessageNumOn") : string.Format(strings.keyIsOn, strings.numLock)) : - (SettingsManager.Get("customMessageNumOff").Trim().Length > 0 ? SettingsManager.Get("customMessageNumOff") : string.Format(strings.keyIsOff, strings.numLock)), - KeyHelper.isNumlockActive); - //ShowOverlay("Numlock is " + (KeyHelper.isNumlockActive ? "on" : "off"), KeyHelper.isNumlockActive); - - if (capsState != KeyHelper.isCapslockActive && enableCapsInd.Checked && !showNoNotification.Checked) - ShowOverlay( - KeyHelper.isCapslockActive ? - (SettingsManager.Get("customMessageCapsOn").Trim().Length > 0 ? SettingsManager.Get("customMessageCapsOn") : string.Format(strings.keyIsOn, strings.capsLock)) : - (SettingsManager.Get("customMessageCapsOff").Trim().Length > 0 ? SettingsManager.Get("customMessageCapsOff") : string.Format(strings.keyIsOff, strings.capsLock)), - KeyHelper.isCapslockActive); - - if (scrollState != KeyHelper.isScrolllockActive && enableScrollInd.Checked && !showNoNotification.Checked) - ShowOverlay( - KeyHelper.isScrolllockActive ? - (SettingsManager.Get("customMessageScrollOn").Trim().Length > 0 ? SettingsManager.Get("customMessageScrollOn") : string.Format(strings.keyIsOn, strings.scrollLock)) : - (SettingsManager.Get("customMessageScrollOff").Trim().Length > 0 ? SettingsManager.Get("customMessageScrollOff") : string.Format(strings.keyIsOff, strings.scrollLock)), - KeyHelper.isScrolllockActive); - - // Reset the values - numState = KeyHelper.isNumlockActive; - capsState = KeyHelper.isCapslockActive; - scrollState = KeyHelper.isScrolllockActive; - } - - void ShowOverlay(string message, bool isActive) - { - int timeOut = SettingsManager.Get("indDisplayTime"); - var alwaysShow = SettingsManager.Get("alwaysShowWhenActive") && isActive; - if (Application.OpenForms.OfType().Any() && Application.OpenForms.OfType().Where(f => !f.IsDisposed).Any()) - { - IndicatorOverlay indicatorOverlay = Application.OpenForms.OfType().Where(f => !f.IsDisposed).First(); - indicatorOverlay.UpdateIndicator( - message - , timeOut - , isActive ? SettingsManager.Get("indBgColourActive") : SettingsManager.Get("indBgColourInactive") - , isActive ? SettingsManager.Get("indFgColourActive") : SettingsManager.Get("indFgColourInactive") - , isActive ? SettingsManager.Get("indBdColourActive") : SettingsManager.Get("indBdColourInactive") - , SettingsManager.Get("bdSize") - , SettingsManager.GetOrDefault("indFont") - , SettingsManager.Get("overlayPosition") - , SettingsManager.Get("indOpacity") - , alwaysShow - ); - } - else - { - IndicatorOverlay indicatorOverlay = new IndicatorOverlay( - message - , timeOut - , isActive ? SettingsManager.Get("indBgColourActive") : SettingsManager.Get("indBgColourInactive") - , isActive ? SettingsManager.Get("indFgColourActive") : SettingsManager.Get("indFgColourInactive") - , isActive ? SettingsManager.Get("indBdColourActive") : SettingsManager.Get("indBdColourInactive") - , SettingsManager.Get("bdSize") - , SettingsManager.GetOrDefault("indFont") - , SettingsManager.Get("overlayPosition") - , SettingsManager.Get("indOpacity") - , alwaysShow - ); - indicatorOverlay.Show(); - } - } - void ShowNoIconsCheckedChanged(object sender, EventArgs e) - { - iconsGroup.Enabled = !showNoIcons.Checked; - SettingsManager.Set("noIco", showNoIcons.Checked); - SettingsManager.Save(); - } - void ShowNoNotificationCheckedChanged(object sender, EventArgs e) - { - indicatorGroup.Enabled = !showNoNotification.Checked; - SettingsManager.Set("noInd", showNoNotification.Checked); - SettingsManager.Save(); - } - - void handleVersion(string xmlData) - { - try - { - Assembly assembly = Assembly.GetExecutingAssembly(); - FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location); - string currentVersion = fvi.FileVersion; - - XDocument doc = XDocument.Parse(xmlData); - - IEnumerable parent = doc.Descendants("cli"); - - string latestVersion = parent.Descendants() - .Where(x => (string)x.Attribute("name") == "version_number") - .FirstOrDefault() - .Value; - - string release_date = parent.Descendants() - .Where(x => (string)x.Attribute("name") == "release_date") - .FirstOrDefault() - .Value; - - string release_url = parent.Descendants() - .Where(x => (string)x.Attribute("name") == "release_url") - .FirstOrDefault() - .Value; - - string download_url = parent.Descendants() - .Where(x => (string)x.Attribute("name") == "download_url") - .FirstOrDefault() - .Value; - - string changelog = parent.Descendants() - .Where(x => (string)x.Attribute("name") == "changelog") - .FirstOrDefault() - .Value; - - Version cVersion = new Version(currentVersion); + !(enableNumIcon.Checked && !showNoIcons.Checked) && + !(enableCapsIcon.Checked && !showNoIcons.Checked) && + !(enableScrollIcon.Checked && !showNoIcons.Checked) + ; + + // Handle the overlay + if (numState != KeyHelper.isNumlockActive && enableNumInd.Checked && !showNoNotification.Checked) + ShowOverlay( + KeyHelper.isNumlockActive ? + (SettingsManager.Get("customMessageNumOn").Trim().Length > 0 ? SettingsManager.Get("customMessageNumOn") : string.Format(strings.keyIsOn, strings.numLock)) : + (SettingsManager.Get("customMessageNumOff").Trim().Length > 0 ? SettingsManager.Get("customMessageNumOff") : string.Format(strings.keyIsOff, strings.numLock)), + KeyHelper.isNumlockActive); + //ShowOverlay("Numlock is " + (KeyHelper.isNumlockActive ? "on" : "off"), KeyHelper.isNumlockActive); + + if (capsState != KeyHelper.isCapslockActive && enableCapsInd.Checked && !showNoNotification.Checked) + ShowOverlay( + KeyHelper.isCapslockActive ? + (SettingsManager.Get("customMessageCapsOn").Trim().Length > 0 ? SettingsManager.Get("customMessageCapsOn") : string.Format(strings.keyIsOn, strings.capsLock)) : + (SettingsManager.Get("customMessageCapsOff").Trim().Length > 0 ? SettingsManager.Get("customMessageCapsOff") : string.Format(strings.keyIsOff, strings.capsLock)), + KeyHelper.isCapslockActive); + + if (scrollState != KeyHelper.isScrolllockActive && enableScrollInd.Checked && !showNoNotification.Checked) + ShowOverlay( + KeyHelper.isScrolllockActive ? + (SettingsManager.Get("customMessageScrollOn").Trim().Length > 0 ? SettingsManager.Get("customMessageScrollOn") : string.Format(strings.keyIsOn, strings.scrollLock)) : + (SettingsManager.Get("customMessageScrollOff").Trim().Length > 0 ? SettingsManager.Get("customMessageScrollOff") : string.Format(strings.keyIsOff, strings.scrollLock)), + KeyHelper.isScrolllockActive); + + // Reset the values + numState = KeyHelper.isNumlockActive; + capsState = KeyHelper.isCapslockActive; + scrollState = KeyHelper.isScrolllockActive; + } + + void ShowOverlay(string message, bool isActive) + { + int timeOut = SettingsManager.Get("indDisplayTime"); + var alwaysShow = SettingsManager.Get("alwaysShowWhenActive") && isActive; + if (Application.OpenForms.OfType().Any() && Application.OpenForms.OfType().Where(f => !f.IsDisposed).Any()) + { + IndicatorOverlay indicatorOverlay = Application.OpenForms.OfType().Where(f => !f.IsDisposed).First(); + indicatorOverlay.UpdateIndicator( + message + , timeOut + , isActive ? SettingsManager.Get("indBgColourActive") : SettingsManager.Get("indBgColourInactive") + , isActive ? SettingsManager.Get("indFgColourActive") : SettingsManager.Get("indFgColourInactive") + , isActive ? SettingsManager.Get("indBdColourActive") : SettingsManager.Get("indBdColourInactive") + , SettingsManager.Get("bdSize") + , SettingsManager.GetOrDefault("indFont") + , SettingsManager.Get("overlayPosition") + , SettingsManager.Get("indOpacity") + , alwaysShow + ); + } + else + { + IndicatorOverlay indicatorOverlay = new IndicatorOverlay( + message + , timeOut + , isActive ? SettingsManager.Get("indBgColourActive") : SettingsManager.Get("indBgColourInactive") + , isActive ? SettingsManager.Get("indFgColourActive") : SettingsManager.Get("indFgColourInactive") + , isActive ? SettingsManager.Get("indBdColourActive") : SettingsManager.Get("indBdColourInactive") + , SettingsManager.Get("bdSize") + , SettingsManager.GetOrDefault("indFont") + , SettingsManager.Get("overlayPosition") + , SettingsManager.Get("indOpacity") + , alwaysShow + ); + } + } + + void ShowOverlayInfo(string message) + { + int timeOut = SettingsManager.Get("indDisplayTime"); + if (timeOut < 0) + timeOut = 2000; + var alwaysShow = false; + if (Application.OpenForms.OfType().Any() && Application.OpenForms.OfType().Where(f => !f.IsDisposed).Any()) + { + IndicatorOverlay indicatorOverlay = Application.OpenForms.OfType().Where(f => !f.IsDisposed).First(); + indicatorOverlay.UpdateIndicator( + message + , timeOut + , SettingsManager.Get("indBgColourInactive") + , SettingsManager.Get("indFgColourInactive") + , SettingsManager.Get("indFgColourInactive") + , SettingsManager.Get("bdSize") + , SettingsManager.GetOrDefault("indFont") + , SettingsManager.Get("overlayPosition") + , SettingsManager.Get("indOpacity") + , alwaysShow + ); + } + else + { + IndicatorOverlay indicatorOverlay = new IndicatorOverlay( + message + , timeOut + , SettingsManager.Get("indBgColourInactive") + , SettingsManager.Get("indFgColourInactive") + , SettingsManager.Get("indFgColourInactive") + , SettingsManager.Get("bdSize") + , SettingsManager.GetOrDefault("indFont") + , SettingsManager.Get("overlayPosition") + , SettingsManager.Get("indOpacity") + , alwaysShow + ); + } + } + + void ShowNoIconsCheckedChanged(object sender, EventArgs e) + { + iconsGroup.Enabled = !showNoIcons.Checked; + SettingsManager.Set("noIco", showNoIcons.Checked); + SettingsManager.Save(); + } + void ShowNoNotificationCheckedChanged(object sender, EventArgs e) + { + indicatorGroup.Enabled = !showNoNotification.Checked; + SettingsManager.Set("noInd", showNoNotification.Checked); + SettingsManager.Save(); + } + + void handleVersion(string xmlData) + { + try + { + Assembly assembly = Assembly.GetExecutingAssembly(); + FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location); + string currentVersion = fvi.FileVersion; + + XDocument doc = XDocument.Parse(xmlData); + + IEnumerable parent = doc.Descendants("cli"); + + string latestVersion = parent.Descendants() + .Where(x => (string)x.Attribute("name") == "version_number") + .FirstOrDefault() + .Value; + + string release_date = parent.Descendants() + .Where(x => (string)x.Attribute("name") == "release_date") + .FirstOrDefault() + .Value; + + string release_url = parent.Descendants() + .Where(x => (string)x.Attribute("name") == "release_url") + .FirstOrDefault() + .Value; + + string download_url = parent.Descendants() + .Where(x => (string)x.Attribute("name") == "download_url") + .FirstOrDefault() + .Value; + + string changelog = parent.Descendants() + .Where(x => (string)x.Attribute("name") == "changelog") + .FirstOrDefault() + .Value; + + Version cVersion = new Version(currentVersion); Version lVersion = new Version(latestVersion); -#if !DEBUG - if (lVersion > cVersion) -#endif - { - UpdateDialog ud = new UpdateDialog(); - ud.ShowInTaskbar = isHidden; - ud.SetNewVersion(lVersion); - ud.changelogRtf.Rtf = changelog; - ud.infoLabel.Text = string.Format(strings.updateInfoFormat, latestVersion, release_date); - DialogResult res = ud.ShowDialog(); - - if (res == DialogResult.OK) - { - DownloadDialog dd = new DownloadDialog(); - dd.DownloadURL = download_url; - dd.ShowDialog(); - } - else if (res == DialogResult.Ignore) // Download manually - { - Process.Start(release_url + "&ov=" + currentVersion); - } - } - } - catch (Exception) - { - - } - - checkForUpdatesButton.Text = strings.checkForUpdates; - checkForUpdatesButton.Enabled = true; - } - - void doVersionCheck(bool isManualCheck) - { - VersionCheck.IsLatestVersion(handleVersion, isManualCheck); - } - - void MainFormLoad(object sender, EventArgs e) - { - Assembly assembly = Assembly.GetExecutingAssembly(); - FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location); - string version = fvi.FileVersion; - string copyright = fvi.LegalCopyright; - aboutText.Text = string.Format(resources.GetString("aboutTextFormat"), version, copyright); - - if (SettingsManager.Get("checkForUpdates")) - doVersionCheck(false); - } - - void ExitApplicationClick(object sender, EventArgs e) - { - if (MessageBox.Show(strings.exitMessage, "CapsLock Indicator", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes) - { - shouldClose = true; - Close(); - } - } - void HideWindowClick(object sender, EventArgs e) - { - HideForm(); - } - - private void HideForm() - { - //generalIcon.Visible = true; - //generalIcon.ShowBalloonTip(100); - Hide(); - isHidden = true; - Opacity = 1; - } - - void GeneralIconMouseDoubleClick(object sender, MouseEventArgs e) - { - Show(); - Focus(); - generalIcon.Visible = false; - isHidden = false; - ShowInTaskbar = true; - } - - private void enableNumIcon_CheckedChanged(object sender, EventArgs e) - { - SettingsManager.Set("numIco", enableNumIcon.Checked); - SettingsManager.Save(); - } - - private void enableCapsIcon_CheckedChanged(object sender, EventArgs e) - { - SettingsManager.Set("capsIco", enableCapsIcon.Checked); - SettingsManager.Save(); - } - - private void enableScrollIcon_CheckedChanged(object sender, EventArgs e) - { - SettingsManager.Set("scrollIco", enableScrollIcon.Checked); - SettingsManager.Save(); - } - - private void enableNumInd_CheckedChanged(object sender, EventArgs e) - { - SettingsManager.Set("numInd", enableNumInd.Checked); - SettingsManager.Save(); - } - - private void enableCapsInd_CheckedChanged(object sender, EventArgs e) - { - SettingsManager.Set("capsInd", enableCapsInd.Checked); - SettingsManager.Save(); - } - - private void enableScrollInd_CheckedChanged(object sender, EventArgs e) - { - SettingsManager.Set("scrollInd", enableScrollInd.Checked); - SettingsManager.Save(); - } - - private void indSettings_Click(object sender, EventArgs e) - { - IndSettingsWindow indSettingsWindow = new IndSettingsWindow(); - indSettingsWindow.ShowDialog(); - } - - private void checkForUpdatesButton_Click(object sender, EventArgs e) - { - checkForUpdatesButton.Enabled = false; - checkForUpdatesButton.Text = strings.checkingForUpdates; - doVersionCheck(true); - } - - private void startonlogonCheckBox_CheckedChanged(object sender, EventArgs e) - { - RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true); - - if (startonlogonCheckBox.Checked) - rk.SetValue("CapsLock Indicator", Application.ExecutablePath); - else - rk.DeleteValue("CapsLock Indicator", false); - } - - private void hideOnStartupCheckBox_CheckedChanged(object sender, EventArgs e) - { - SettingsManager.Set("hideOnStartup", hideOnStartupCheckBox.Checked); - SettingsManager.Save(); - } - - - // This timer is required for some reason - private void hideWindowTimer_Tick(object sender, EventArgs e) - { - hideWindowTimer.Stop(); - hideWindow.PerformClick(); - } - - private void MainForm_FormClosing(object sender, FormClosingEventArgs e) - { - if (e.CloseReason == CloseReason.UserClosing && !shouldClose) - { - e.Cancel = true; - HideForm(); - } - } - - private void lnkLabel1_Click(object sender, EventArgs e) - { - Process.Start("https://jonaskohl.de/"); - } - - private void showToolStripMenuItem_Click(object sender, EventArgs e) - { - Show(); - Focus(); - generalIcon.Visible = false; - isHidden = false; - ShowInTaskbar = true; - } - - private void exitToolStripMenuItem_Click(object sender, EventArgs e) - { - shouldClose = true; - Close(); - } - - private void appNameLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - Process.Start("https://cli.jonaskohl.de/"); - } - - private void checkForUpdatedCheckBox_CheckedChanged(object sender, EventArgs e) - { - SettingsManager.Set("checkForUpdates", checkForUpdatedCheckBox.Checked); - SettingsManager.Save(); - } - - private void localeComboBox_SelectedIndexChanged(object sender, EventArgs e) - { - DropDownLocale locale = (DropDownLocale)localeComboBox.SelectedItem; - - if (locale.localeString == "__default") - { - Thread.CurrentThread.CurrentUICulture = CultureInfo.DefaultThreadCurrentCulture; - previousLocaleIndex = localeComboBox.SelectedIndex; - } - else if (locale.localeString == "--get-more") - { - localeComboBox.SelectedIndex = previousLocaleIndex; - Process.Start("https://cli.jonaskohl.de/!/translations#download-translations"); - } - else - { - Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(locale.localeString); - previousLocaleIndex = localeComboBox.SelectedIndex; - } - - SettingsManager.Set("selectedUICulture", localeComboBox.SelectedIndex); - SettingsManager.Save(); - - ApplyLocales(); - } - - private void MainForm_KeyDown(object sender, KeyEventArgs e) - { - if (e.Control && e.Shift && !e.Alt && e.KeyCode == Keys.P) - { - e.Handled = true; - e.SuppressKeyPress = true; - ReloadIcons(); - } - } - - private void localeComboBox_Format(object sender, ListControlConvertEventArgs e) - { - var itm = (DropDownLocale)e.ListItem; - if (itm.localeString == "--get-more") - e.Value = strings.downloadMoreTranslations; - else if (itm.localeString == "__default") - e.Value = itm.displayText; - else if (itm.localeString == "--ln") - e.Value = "--LINE--"; - else - e.Value = string.Format("{0} ({1})", itm.displayText, itm.localeString); +#if !DEBUG + if (lVersion > cVersion) +#endif + { + UpdateDialog ud = new UpdateDialog(); + ud.ShowInTaskbar = isHidden; + ud.SetNewVersion(lVersion); + ud.changelogRtf.Rtf = changelog; + ud.infoLabel.Text = string.Format(strings.updateInfoFormat, latestVersion, release_date); + DialogResult res = ud.ShowDialog(); + + if (res == DialogResult.OK) + { + DownloadDialog dd = new DownloadDialog(); + dd.DownloadURL = download_url; + dd.ShowDialog(); + } + else if (res == DialogResult.Ignore) // Download manually + { + Process.Start(release_url + "&ov=" + currentVersion); + } + } + } + catch (Exception) + { + + } + + checkForUpdatesButton.Text = strings.checkForUpdates; + checkForUpdatesButton.Enabled = true; + } + + void doVersionCheck(bool isManualCheck) + { + VersionCheck.IsLatestVersion(handleVersion, isManualCheck); + } + + void MainFormLoad(object sender, EventArgs e) + { + Assembly assembly = Assembly.GetExecutingAssembly(); + FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location); + string version = fvi.FileVersion; + string copyright = fvi.LegalCopyright; + aboutText.Text = string.Format(resources.GetString("aboutTextFormat"), version, copyright); + + if (SettingsManager.Get("checkForUpdates")) + doVersionCheck(false); + } + + void ExitApplicationClick(object sender, EventArgs e) + { + if (MessageBox.Show(strings.exitMessage, "CapsLock Indicator", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes) + { + shouldClose = true; + Close(); + } + } + void HideWindowClick(object sender, EventArgs e) + { + HideForm(); + } + + private void HideForm() + { + //generalIcon.Visible = true; + //generalIcon.ShowBalloonTip(100); + Hide(); + isHidden = true; + Opacity = 1; + } + + void GeneralIconMouseDoubleClick(object sender, MouseEventArgs e) + { + Show(); + Focus(); + generalIcon.Visible = false; + isHidden = false; + ShowInTaskbar = true; + } + + private void enableNumIcon_CheckedChanged(object sender, EventArgs e) + { + SettingsManager.Set("numIco", enableNumIcon.Checked); + SettingsManager.Save(); + } + + private void enableCapsIcon_CheckedChanged(object sender, EventArgs e) + { + SettingsManager.Set("capsIco", enableCapsIcon.Checked); + SettingsManager.Save(); + } + + private void enableScrollIcon_CheckedChanged(object sender, EventArgs e) + { + SettingsManager.Set("scrollIco", enableScrollIcon.Checked); + SettingsManager.Save(); + } + + private void enableNumInd_CheckedChanged(object sender, EventArgs e) + { + SettingsManager.Set("numInd", enableNumInd.Checked); + SettingsManager.Save(); + } + + private void enableCapsInd_CheckedChanged(object sender, EventArgs e) + { + SettingsManager.Set("capsInd", enableCapsInd.Checked); + SettingsManager.Save(); + } + + private void enableScrollInd_CheckedChanged(object sender, EventArgs e) + { + SettingsManager.Set("scrollInd", enableScrollInd.Checked); + SettingsManager.Save(); + } + + private void indSettings_Click(object sender, EventArgs e) + { + IndSettingsWindow indSettingsWindow = new IndSettingsWindow(); + indSettingsWindow.ShowDialog(); + } + + private void checkForUpdatesButton_Click(object sender, EventArgs e) + { + checkForUpdatesButton.Enabled = false; + checkForUpdatesButton.Text = strings.checkingForUpdates; + doVersionCheck(true); + } + + private void startonlogonCheckBox_CheckedChanged(object sender, EventArgs e) + { + RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true); + + if (startonlogonCheckBox.Checked) + rk.SetValue("CapsLock Indicator", Application.ExecutablePath); + else + rk.DeleteValue("CapsLock Indicator", false); + } + + private void hideOnStartupCheckBox_CheckedChanged(object sender, EventArgs e) + { + SettingsManager.Set("hideOnStartup", hideOnStartupCheckBox.Checked); + SettingsManager.Save(); + } + + + // This timer is required for some reason + private void hideWindowTimer_Tick(object sender, EventArgs e) + { + hideWindowTimer.Stop(); + hideWindow.PerformClick(); + } + + private void MainForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (e.CloseReason == CloseReason.UserClosing && !shouldClose) + { + e.Cancel = true; + HideForm(); + } + } + + private void lnkLabel1_Click(object sender, EventArgs e) + { + Process.Start("https://jonaskohl.de/"); + } + + private void showToolStripMenuItem_Click(object sender, EventArgs e) + { + Show(); + Focus(); + generalIcon.Visible = false; + isHidden = false; + ShowInTaskbar = true; + } + + private void exitToolStripMenuItem_Click(object sender, EventArgs e) + { + shouldClose = true; + Close(); + } + + private void appNameLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start("https://cli.jonaskohl.de/"); + } + + private void checkForUpdatedCheckBox_CheckedChanged(object sender, EventArgs e) + { + SettingsManager.Set("checkForUpdates", checkForUpdatedCheckBox.Checked); + SettingsManager.Save(); + } + + private void localeComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + DropDownLocale locale = (DropDownLocale)localeComboBox.SelectedItem; + + if (locale.localeString == "__default") + { + Thread.CurrentThread.CurrentUICulture = CultureInfo.DefaultThreadCurrentCulture; + previousLocaleIndex = localeComboBox.SelectedIndex; + } + else if (locale.localeString == "--get-more") + { + localeComboBox.SelectedIndex = previousLocaleIndex; + Process.Start("https://cli.jonaskohl.de/!/translations#download-translations"); + } + else + { + Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(locale.localeString); + previousLocaleIndex = localeComboBox.SelectedIndex; + } + + //SettingsManager.Set("selectedUICulture", localeComboBox.SelectedIndex); + SettingsManager.Set("selectedLanguage", locale.localeString); + SettingsManager.Save(); + + ApplyLocales(); + } + + private void MainForm_KeyDown(object sender, KeyEventArgs e) + { + if (e.Control && e.Shift && !e.Alt && e.KeyCode == Keys.P) + { + e.Handled = true; + e.SuppressKeyPress = true; + ReloadIcons(true); + } + } + + private void localeComboBox_Format(object sender, ListControlConvertEventArgs e) + { + var itm = (DropDownLocale)e.ListItem; + if (itm.localeString == "--get-more") + e.Value = strings.downloadMoreTranslations; + else if (itm.localeString == "__default") + e.Value = itm.displayText; + else if (itm.localeString == "--ln") + e.Value = "--LINE--"; + else + e.Value = string.Format("{0} ({1})", itm.displayText, itm.localeString); } private void showMenuItem_Click(object sender, EventArgs e) { - Show(); - Focus(); - generalIcon.Visible = false; - isHidden = false; + Show(); + Focus(); + generalIcon.Visible = false; + isHidden = false; ShowInTaskbar = true; } @@ -665,5 +743,5 @@ private void exitMenuItem_Click(object sender, EventArgs e) shouldClose = true; Close(); } - } -} + } +} diff --git a/CapsLockIndicatorV3/NumberInputDialog.cs b/CapsLockIndicatorV3/NumberInputDialog.cs index 76a0b15..4102e85 100644 --- a/CapsLockIndicatorV3/NumberInputDialog.cs +++ b/CapsLockIndicatorV3/NumberInputDialog.cs @@ -9,7 +9,7 @@ namespace CapsLockIndicatorV3 { - public partial class NumberInputDialog : Form + public partial class NumberInputDialog : DarkModeForm { protected override void WndProc(ref Message message) { @@ -29,6 +29,30 @@ public NumberInputDialog(int defaultValue, int minValue, int maxValue) min = minValue; max = maxValue; inputTextBox.Text = defaultValue.ToString(); + + HandleCreated += (sender, e) => + { + DarkModeChanged += NumberInputDialog_DarkModeChanged; + DarkModeProvider.RegisterForm(this); + }; + } + + private void NumberInputDialog_DarkModeChanged(object sender, EventArgs e) + { + var dark = DarkModeProvider.IsDark; + + Native.UseImmersiveDarkModeColors(Handle, dark); + + ForeColor = + inputTextBox.ForeColor = dark ? Color.White : SystemColors.WindowText; + + inputTextBox.BackColor = dark ? Color.FromArgb(255, 56, 56, 56) : SystemColors.Window; + inputTextBox.BorderStyle = dark ? BorderStyle.FixedSingle : BorderStyle.Fixed3D; + + BackColor = dark ? Color.FromArgb(255, 32, 32, 32) : SystemColors.Window; + + ControlScheduleSetDarkMode(inputTextBox, dark); + ControlScheduleSetDarkMode(okButton, dark); } private void button1_Click(object sender, EventArgs e) diff --git a/CapsLockIndicatorV3/Program.cs b/CapsLockIndicatorV3/Program.cs index 212b7eb..7e6026c 100644 --- a/CapsLockIndicatorV3/Program.cs +++ b/CapsLockIndicatorV3/Program.cs @@ -1,159 +1,159 @@ -/* - * Created 09.07.2017 18:16 - * - * Copyright (c) Jonas Kohl - */ -using Microsoft.Win32; -using Mono.Options; -using System; -using System.Collections.Generic; +/* + * Created 09.07.2017 18:16 + * + * Copyright (c) Jonas Kohl + */ +using Microsoft.Win32; +using Mono.Options; +using System; +using System.Collections.Generic; using System.Diagnostics; -using System.Globalization; -using System.IO; +using System.Globalization; +using System.IO; using System.Reflection; -using System.Threading; -using System.Windows.Forms; - -namespace CapsLockIndicatorV3 +using System.Threading; +using System.Windows.Forms; + +namespace CapsLockIndicatorV3 { internal sealed class Program - { - [Flags] - enum KeyType - { - None = 0, - NumLock = 1, - CapsLock = 2, - ScrollLock = 4 - } - - enum DisplayType - { - Icon, - Notification - } - - static void SetDisplay(DisplayType type, int keys) - { - switch (type) - { - case DisplayType.Icon: - SettingsManager.Set("numIco", (keys & (int)KeyType.NumLock) != 0); - SettingsManager.Set("capsIco", (keys & (int)KeyType.CapsLock) != 0); - SettingsManager.Set("scrollIco", (keys & (int)KeyType.ScrollLock) != 0); - break; - case DisplayType.Notification: - SettingsManager.Set("numInd", (keys & (int)KeyType.NumLock) != 0); - SettingsManager.Set("capsInd", (keys & (int)KeyType.CapsLock) != 0); - SettingsManager.Set("scrollInd", (keys & (int)KeyType.ScrollLock) != 0); - break; - default: - break; - } - } - static void SetHideStartup(bool v) - { - SettingsManager.Set("hideOnStartup", v); - } - static void SetStartup(bool v) - { - RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true); - - if (v) - rk.SetValue("CapsLock Indicator", Application.ExecutablePath); - else - rk.DeleteValue("CapsLock Indicator", false); - } - static void SetVerCheck(bool v) - { - SettingsManager.Set("checkForUpdates", v); - } - static void DisplayHelp(OptionSet p) - { + { + [Flags] + enum KeyType + { + None = 0, + NumLock = 1, + CapsLock = 2, + ScrollLock = 4 + } + + enum DisplayType + { + Icon, + Notification + } + + static void SetDisplay(DisplayType type, int keys) + { + switch (type) + { + case DisplayType.Icon: + SettingsManager.Set("numIco", (keys & (int)KeyType.NumLock) != 0); + SettingsManager.Set("capsIco", (keys & (int)KeyType.CapsLock) != 0); + SettingsManager.Set("scrollIco", (keys & (int)KeyType.ScrollLock) != 0); + break; + case DisplayType.Notification: + SettingsManager.Set("numInd", (keys & (int)KeyType.NumLock) != 0); + SettingsManager.Set("capsInd", (keys & (int)KeyType.CapsLock) != 0); + SettingsManager.Set("scrollInd", (keys & (int)KeyType.ScrollLock) != 0); + break; + default: + break; + } + } + static void SetHideStartup(bool v) + { + SettingsManager.Set("hideOnStartup", v); + } + static void SetStartup(bool v) + { + RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true); + + if (v) + rk.SetValue("CapsLock Indicator", Application.ExecutablePath); + else + rk.DeleteValue("CapsLock Indicator", false); + } + static void SetVerCheck(bool v) + { + SettingsManager.Set("checkForUpdates", v); + } + static void DisplayHelp(OptionSet p) + { StringWriter sw = new StringWriter(); - sw.WriteLine("CapsLock Indicator"); - sw.WriteLine(); - sw.WriteLine("Options:"); - p.WriteOptionDescriptions(sw); - sw.WriteLine(); + sw.WriteLine("CapsLock Indicator"); + sw.WriteLine(); + sw.WriteLine("Options:"); + p.WriteOptionDescriptions(sw); + sw.WriteLine(); sw.WriteLine("For more information, visit: http://cli.jonaskohl.de/!/commandline"); - string result = sw.ToString(); - - sw.Close(); - sw.Dispose(); - - //MessageBox.Show(result, "CapsLock Indicator", MessageBoxButtons.OK, MessageBoxIcon.Information); - - HelpWindow h = new HelpWindow(result); - Application.Run(h); - } - static void SetLocale(string l) - { - Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(l); - } - static void SetDisplayLocation(string v) - { - if (Enum.TryParse(v, out IndicatorDisplayPosition position)) - SettingsManager.Set("overlayPosition", position); - } - - // Create a mutex to check if an instance is already running - static Mutex mutex = new Mutex(true, "{6f54c357-0542-4d7d-9225-338bc3cd7834}"); + string result = sw.ToString(); + + sw.Close(); + sw.Dispose(); + + //MessageBox.Show(result, "CapsLock Indicator", MessageBoxButtons.OK, MessageBoxIcon.Information); + + HelpWindow h = new HelpWindow(result); + Application.Run(h); + } + static void SetLocale(string l) + { + Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(l); + } + static void SetDisplayLocation(string v) + { + if (Enum.TryParse(v, out IndicatorDisplayPosition position)) + SettingsManager.Set("overlayPosition", position); + } + + // Create a mutex to check if an instance is already running + static Mutex mutex = new Mutex(true, "{6f54c357-0542-4d7d-9225-338bc3cd7834}"); [STAThread] private static void Main(string[] args) - { - //__FIXME__.SettingsKey = Environment.ExpandEnvironmentVariables(@"%appdata%\Jonas Kohl\CapsLock Indicator\settings\any\user.config"); - SettingsManager.Load(); - - if (mutex.WaitOne(TimeSpan.Zero, true)) // No instance is open - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - - #region Parse command line - - bool show_help = false; - - OptionSet oSet = new OptionSet() - { - { "h|?|help", "Display help", v => show_help = v != null }, - { "i|icons=", "The icons to show (Type: IconMask)", (int v) => SetDisplay(DisplayType.Icon, v) }, - { "n|notifs=", "The notifications to show (Type: IconMask)", (int v) => SetDisplay(DisplayType.Notification, v) }, - { "a|autostart=", "Enable auto start (Type: Boolean)", (bool v) => SetStartup(v) }, - { "s|hidestarup=", "Enable or disable hide on startup setting (Type: Boolean)", (bool v) => SetHideStartup(v) }, - { "v|disverchk=", "Disable the automatic version checking (Type: Boolean)", (bool v) => SetVerCheck(v) }, - { "l|locale=", "Override the UI locale (Type: String)", (string v) => SetLocale(v) }, - { "p|position=", "Set the indicator display position (Type: IndicatorDisplayPosition)", (string v) => SetDisplayLocation(v) } - }; - - List extra; - try - { - extra = oSet.Parse(args); - } - catch (OptionException) - { - //MessageBox.Show("Failed to parse command line:\n" + e.ToString(), "error", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - - if (show_help) - { - DisplayHelp(oSet); - return; - } - + { + //__FIXME__.SettingsKey = Environment.ExpandEnvironmentVariables(@"%appdata%\Jonas Kohl\CapsLock Indicator\settings\any\user.config"); + SettingsManager.Load(); + + if (mutex.WaitOne(TimeSpan.Zero, true)) // No instance is open + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + + #region Parse command line + + bool show_help = false; + + OptionSet oSet = new OptionSet() + { + { "h|?|help", "Display help", v => show_help = v != null }, + { "i|icons=", "The icons to show (Type: IconMask)", (int v) => SetDisplay(DisplayType.Icon, v) }, + { "n|notifs=", "The notifications to show (Type: IconMask)", (int v) => SetDisplay(DisplayType.Notification, v) }, + { "a|autostart=", "Enable auto start (Type: Boolean)", (bool v) => SetStartup(v) }, + { "s|hidestarup=", "Enable or disable hide on startup setting (Type: Boolean)", (bool v) => SetHideStartup(v) }, + { "v|disverchk=", "Disable the automatic version checking (Type: Boolean)", (bool v) => SetVerCheck(v) }, + { "l|locale=", "Override the UI locale (Type: String)", (string v) => SetLocale(v) }, + { "p|position=", "Set the indicator display position (Type: IndicatorDisplayPosition)", (string v) => SetDisplayLocation(v) } + }; + + List extra; + try + { + extra = oSet.Parse(args); + } + catch (OptionException) + { + //MessageBox.Show("Failed to parse command line:\n" + e.ToString(), "error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + if (show_help) + { + DisplayHelp(oSet); + return; + } + SettingsManager.Save(); - + if (SettingsManager.Get("beta_enableDarkMode")) - Native.SetPrefferDarkMode(true); + Native.SetPrefferDarkMode(true); var runApp = true; - #endregion + #endregion -#if DEBUG +#if DEBUG if (SettingsManager.Get("firstRun")) #else if (SettingsManager.Get("firstRun") && new Version(SettingsManager.Get("versionNo")) >= Assembly.GetExecutingAssembly().GetName().Version) @@ -166,20 +166,20 @@ private static void Main(string[] args) else runApp = false; } - } - - if (runApp) - Application.Run(new MainForm()); - - // Release the mutex - mutex.ReleaseMutex(); - - SettingsManager.Save(); - } - else // An instance is already open - { - Application.EnableVisualStyles(); - MessageBox.Show("An instance is already open!"); + } + + if (runApp) + Application.Run(new MainForm()); + + // Release the mutex + mutex.ReleaseMutex(); + + SettingsManager.Save(); + } + else // An instance is already open + { + Application.EnableVisualStyles(); + MessageBox.Show("An instance is already open!"); } } @@ -189,5 +189,5 @@ public static void ReleaseMutex() mutex.Close(); mutex.Dispose(); } - } -} + } +} diff --git a/CapsLockIndicatorV3/Properties/AssemblyInfo.cs b/CapsLockIndicatorV3/Properties/AssemblyInfo.cs index 06dd573..6bf5105 100644 --- a/CapsLockIndicatorV3/Properties/AssemblyInfo.cs +++ b/CapsLockIndicatorV3/Properties/AssemblyInfo.cs @@ -24,6 +24,6 @@ // // You can specify all the values or you can use the default the Revision and // Build Numbers by using the '*' as shown below: -[assembly: AssemblyVersion("3.10.0.0")] -[assembly: AssemblyFileVersion("3.10.0.0")] +[assembly: AssemblyVersion("3.11.0.0")] +[assembly: AssemblyFileVersion("3.11.0.0")] [assembly: Guid ("6f54c357-0542-4d7d-9225-338bc3cd7834")] diff --git a/CapsLockIndicatorV3/Resources/CLIv3_Icon_Dark.ico b/CapsLockIndicatorV3/Resources/CLIv3_Icon_Dark.ico new file mode 100644 index 0000000000000000000000000000000000000000..1b6573e7372ddab871a15ec90c4435398db7b7ab GIT binary patch literal 25746 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 U`y|2;PKBC}>Y%!)4Ql)U0Ea*3q5uE@ literal 0 HcmV?d00001 diff --git a/CapsLockIndicatorV3/Resources/defaultSettings.txt b/CapsLockIndicatorV3/Resources/defaultSettings.txt index 802a905..f16eb0e 100644 --- a/CapsLockIndicatorV3/Resources/defaultSettings.txt +++ b/CapsLockIndicatorV3/Resources/defaultSettings.txt @@ -6,12 +6,13 @@ b:capsInd=True b:scrollInd=True b:noIco=False b:noInd=False -b:beta_enableDarkMode=False +b:darkMode=False b:hideOnStartup=False b:checkForUpdates=True b:upgradeRequired=True b:alwaysShowWhenActive=False b:firstRun=True +b:searchForUpdatesAfterResume=True b:advSettingsWarnShown=False c:indBgColourActive=255;66;66;66 c:indFgColourActive=255;255;255;255 @@ -21,7 +22,7 @@ c:indFgColourInactive=255;255;255;255 c:indBdColourInactive=255;180;52;77 f:indFont=Segoe UI; 12pt i:indDisplayTime=500 -i:selectedUICulture=1 +i:selectedUICulture=0 i:indOpacity=100 i:bdSize=4 s:versionNo=3.10.0.0 @@ -32,3 +33,4 @@ s:customMessageNumOn= s:customMessageNumOff= s:customMessageScrollOn= s:customMessageScrollOff= +s:selectedLanguage= diff --git a/CapsLockIndicatorV3/Resources/generalIcon.Icon.ico b/CapsLockIndicatorV3/Resources/generalIcon.Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c109f1365a3e523fd06b09970a3f29dacee548c8 GIT binary patch literal 1150 zcmb`GJ4*vm5QQfg1VJ&Cje;TI18WNv3%3*rTBHyxB_tx&A&8xlR{RNq-4+&t7Fz6| z@R3Teuu-rI2txcu@4zkY-B`Hc%M54EnPu6%A_ab>lJH-aW>I89MCJhrAI>e zjz9x4=sSAUd$@!nSO_gc-+@=K+zovlR$&P?p#>+f1!J~{z5|xKrmxs6RGBZstj?$h zVA=DKKc+)|gPo7Rz-;F+dmgkGj{vrS5?*AUUN1jgh z)aCUVHuAio8JS5h-wk;NY2^349T$WAp*i_uZ^teDOvq;%^A-5{em!j)?FH;xzN6oR zHPACugEr{-(X%vaS*vKnunU^CJ)iUspy&4x=FI;wlqS!TCfQe-boyyB?wF?fn64i6 HYDTl)wO-VW literal 0 HcmV?d00001 diff --git a/CapsLockIndicatorV3/Resources/generalIcon_dark.Icon.ico b/CapsLockIndicatorV3/Resources/generalIcon_dark.Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fad3723207c4bf89a11b37eb004436a11bce1077 GIT binary patch literal 1150 zcmbu8y-Gtt5QRq!f?!B0n*Rfxh7s@`iR~DqemZ^5kjcFT6AE^ZcPb`77^?2j=yV&ouViF#Z2}+7a42SUobFLlg84 z9YP26{^(s=vaEHq1vmlCTKzCQgWlgR)Xe`iFY?BhXFPB0>`I@s`)2&+ z{p|Vo#=G_K(Y^=U##7^?abWx~R>t)We8)x^b*RfV%2yK77|A{3rSZ+ECc?G&z?W)c z6lomczVXSpG*nPiz!yI8t=b$!8V9&zyfrQi6@&-)rVZLsF{~ktf(OQTLp53g+M-Pr zO9yG}@x(YcR6`}9&Bum{DIkq4o*T;fT>LSJLB&=hjW;YEe4A&6ig8c?-9|ZD3Z8`Q zPHP5(!Lvl4AA^|I26pF%!SprfY?BJHb*9*M@W33bF1$^=F+$Ak;8_JdSJ#@@&#&JX z)rZ|9>7xgWU0AW(0$9q`1zCJP{29SXb$WVPi%>oUYzR97*i5Y~klAhe>>+?WRTaA9c;_1q5J0l63SB7>JRBo{69ZM~hI6-RbA|wp zJyf9!h3Vcz*(X;>eyGM0H-XDD8TeaC^@K^;l`d|w-{%8?4 z`f#^_<8_X-m7^s{I$m$s=ocIfx8W7jVDKP~J$Q6Wj0xJze#zIs;F)uFqOG+7tB}S4 zn7-zC(ak*HnJWK>G>*V3$Wrbp1Yh_JD{L&%7zrCdc7$weRZuZ-Ek5dv*%YL40whH{ w#-2freQcZ=&EIYKj*T+vP}kw_Hv3zD0aXOT;Aa=csQ>@~07*qoM6N<$g05C^wEzGB literal 0 HcmV?d00001 diff --git a/CapsLockIndicatorV3/Resources/settings.ico b/CapsLockIndicatorV3/Resources/settings.ico new file mode 100644 index 0000000000000000000000000000000000000000..f6d8646639352fffe4d220490c786324fd51315a GIT binary patch literal 107606 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 luTZNc+Y{h`W_>%mjNz!=8C93UgS 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 V+=znUKP-{yvROF~;zNY@`yUBdgX;hQ literal 0 HcmV?d00001 diff --git a/CapsLockIndicatorV3/Resources/settings_w.ico b/CapsLockIndicatorV3/Resources/settings_w.ico new file mode 100644 index 0000000000000000000000000000000000000000..cf9c1a1a72a99a909eaad5fc57bfaef22e408bfd GIT binary patch literal 106328 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 literal 0 HcmV?d00001 diff --git a/CapsLockIndicatorV3/UpdateDialog.cs b/CapsLockIndicatorV3/UpdateDialog.cs index 707a8e0..fb88c81 100644 --- a/CapsLockIndicatorV3/UpdateDialog.cs +++ b/CapsLockIndicatorV3/UpdateDialog.cs @@ -1,59 +1,55 @@ using Microsoft.Win32; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; - -namespace CapsLockIndicatorV3 -{ - public partial class UpdateDialog : Form - { - private Version newVersion; - - public UpdateDialog() - { - InitializeComponent(); - - Text = strings.updateAvailable; - updateNowButton.Text = strings.updateNow; - dismissButton.Text = strings.dismissButton; - downloadManuallyButton.Text = strings.downloadManuallyButton; - - if (SettingsManager.Get("beta_enableDarkMode")) - { - HandleCreated += UpdateDialog_HandleCreated; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; - lnkLabel1.ForeColor = - lnkLabel1.LinkColor = - Color.White; +namespace CapsLockIndicatorV3 +{ + public partial class UpdateDialog : DarkModeForm + { + private Version newVersion; - BackColor = Color.FromArgb(255, 32, 32, 32); - ForeColor = Color.White; - infoLabel.ForeColor = Color.FromArgb(255, 196, 204, 238); - changelogRtf.BackColor = Color.FromArgb(255, 56, 56, 56); + public UpdateDialog() + { + InitializeComponent(); - ControlScheduleSetDarkMode(dismissButton); - ControlScheduleSetDarkMode(updateNowButton); - ControlScheduleSetDarkMode(downloadManuallyButton); - } - } + Text = strings.updateAvailable; + updateNowButton.Text = strings.updateNow; + dismissButton.Text = strings.dismissButton; + downloadManuallyButton.Text = strings.downloadManuallyButton; - private void UpdateDialog_HandleCreated(object sender, EventArgs e) - { - Native.UseImmersiveDarkModeColors(Handle, true); + HandleCreated += (sender, e) => + { + DarkModeChanged += UpdateDialog_DarkModeChanged; + DarkModeProvider.RegisterForm(this); + }; } - private void ControlScheduleSetDarkMode(Control control) + private void UpdateDialog_DarkModeChanged(object sender, EventArgs e) { - control.HandleCreated += (sender, e) => - { - Native.ControlSetDarkMode(control, true); - }; + var dark = DarkModeProvider.IsDark; + + Native.UseImmersiveDarkModeColors(Handle, dark); + + lnkLabel1.ForeColor = + lnkLabel1.LinkColor = + dark ? Color.White : SystemColors.HotTrack; + + BackColor = dark ? Color.FromArgb(255, 32, 32, 32) : SystemColors.Window; + ForeColor = dark ? Color.White : SystemColors.WindowText; + infoLabel.ForeColor = dark ? Color.FromArgb(255, 196, 204, 238) : Color.FromArgb(255, 52, 77, 180); + changelogRtf.BackColor = dark ? Color.FromArgb(255, 56, 56, 56) : SystemColors.Window; + + ControlScheduleSetDarkMode(changelogRtf, dark); + ControlScheduleSetDarkMode(dismissButton, dark); + ControlScheduleSetDarkMode(updateNowButton, dark); + ControlScheduleSetDarkMode(downloadManuallyButton, dark); } public void SetNewVersion(Version v) @@ -72,12 +68,12 @@ public void SetNewVersion(Version v) downloadManuallyButton.Location.Y ); } - } - - private void downloadManuallyButton_Click(object sender, EventArgs e) - { - DialogResult = DialogResult.Ignore; - Close(); + } + + private void downloadManuallyButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Ignore; + Close(); } private void lnkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) @@ -106,5 +102,5 @@ public string FriendlyName() } return "an unknown OS"; } - } -} + } +} diff --git a/CapsLockIndicatorV3/VersionCheck.cs b/CapsLockIndicatorV3/VersionCheck.cs index b136482..541fbaf 100644 --- a/CapsLockIndicatorV3/VersionCheck.cs +++ b/CapsLockIndicatorV3/VersionCheck.cs @@ -27,7 +27,7 @@ public static async void IsLatestVersion(Action callback, bool isManualC ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; try { - string data = await client.DownloadStringTaskAsync(CheckURL + (SettingsManager.Get("beta_enableDarkMode") ? "&dark=true" : "")); + string data = await client.DownloadStringTaskAsync(CheckURL + (DarkModeProvider.IsDark ? "&dark=true" : "")); callback(data); } catch (Exception e) diff --git a/CapsLockIndicatorV3/bin/Release/pack-lang-files.ps1 b/CapsLockIndicatorV3/bin/Release/pack-lang-files.ps1 new file mode 100644 index 0000000..c9d038c --- /dev/null +++ b/CapsLockIndicatorV3/bin/Release/pack-lang-files.ps1 @@ -0,0 +1,3 @@ +Get-ChildItem -Recurse -Directory | ForEach-Object { + Compress-Archive -Path "$($_.FullName)\*.dll" -DestinationPath ".\$($_.Name).zip" +} diff --git a/CapsLockIndicatorV3/resources.Designer.cs b/CapsLockIndicatorV3/resources.Designer.cs index cc7086f..66e5e0e 100644 --- a/CapsLockIndicatorV3/resources.Designer.cs +++ b/CapsLockIndicatorV3/resources.Designer.cs @@ -89,6 +89,26 @@ internal static System.Drawing.Icon CLIv3_Caps_On { } } + ///

+ /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon CLIv3_Icon { + get { + object obj = ResourceManager.GetObject("CLIv3_Icon", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon CLIv3_Icon_Dark { + get { + object obj = ResourceManager.GetObject("CLIv3_Icon_Dark", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// @@ -138,20 +158,20 @@ internal static System.Drawing.Icon CLIv3_Scroll_On { ///b:scrollInd=True ///b:noIco=False ///b:noInd=False - ///b:beta_enableDarkMode=False + ///b:darkMode=False ///b:hideOnStartup=False ///b:checkForUpdates=True ///b:upgradeRequired=True ///b:alwaysShowWhenActive=False ///b:firstRun=True + ///b:advSettingsWarnShown=False ///c:indBgColourActive=255;66;66;66 ///c:indFgColourActive=255;255;255;255 ///c:indBdColourActive=255;77;180;52 ///c:indBgColourInactive=255;66;66;66 ///c:indFgColourInactive=255;255;255;255 ///c:indBdColourInactive=255;180;52;77 - ///f:indFont=Segoe UI; 12pt - ///i:indDisplayTi [rest of string was truncated]";. + ///f:indFont=Segoe UI; 1 [rest of string was truncated]";. /// internal static string defaultSettings { get { @@ -159,6 +179,36 @@ internal static string defaultSettings { } } + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon generalIcon { + get { + object obj = ResourceManager.GetObject("generalIcon", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon generalIcon_dark { + get { + object obj = ResourceManager.GetObject("generalIcon_dark", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap logo { + get { + object obj = ResourceManager.GetObject("logo", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -168,5 +218,25 @@ internal static System.Drawing.Bitmap logo_dark { return ((System.Drawing.Bitmap)(obj)); } } + + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon settings { + get { + object obj = ResourceManager.GetObject("settings", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon settings_dark { + get { + object obj = ResourceManager.GetObject("settings_dark", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } } } diff --git a/CapsLockIndicatorV3/resources.resx b/CapsLockIndicatorV3/resources.resx index c95a6b5..522f620 100644 --- a/CapsLockIndicatorV3/resources.resx +++ b/CapsLockIndicatorV3/resources.resx @@ -127,6 +127,12 @@ Resources\CLIv3_Caps_On.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Resources\MainWindow.Icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\CLIv3_Icon_Dark.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Resources\CLIv3_Num_Off.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -142,7 +148,22 @@ Resources\defaultSettings.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + Resources\generalIcon.Icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\generalIcon_dark.Icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\logo.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Resources\logo_dark.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Resources\settings.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\settings_w.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/CapsLockIndicatorV3/strings.Designer.cs b/CapsLockIndicatorV3/strings.Designer.cs index 0d12261..fe847e0 100644 --- a/CapsLockIndicatorV3/strings.Designer.cs +++ b/CapsLockIndicatorV3/strings.Designer.cs @@ -223,7 +223,7 @@ internal static string exitMessage { } /// - /// Looks up a localized string similar to Allow CapsLock Indicator to periodically check for updates online (can be changed later). + /// Looks up a localized string similar to &Allow CapsLock Indicator to periodically check for updates online (can be changed later). /// internal static string firstRunAllowUpdateCheck { get { @@ -231,6 +231,42 @@ internal static string firstRunAllowUpdateCheck { } } + /// + /// Looks up a localized string similar to &Dark. + /// + internal static string firstRunColorSchemeDark { + get { + return ResourceManager.GetString("firstRunColorSchemeDark", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to L&ight. + /// + internal static string firstRunColorSchemeLight { + get { + return ResourceManager.GetString("firstRunColorSchemeLight", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Which color scheme do you prefer?. + /// + internal static string firstRunColorSchemePreference { + get { + return ResourceManager.GetString("firstRunColorSchemePreference", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only available on Windows 10. + /// + internal static string firstRunColorSchemeWin10Only { + get { + return ResourceManager.GetString("firstRunColorSchemeWin10Only", resourceCulture); + } + } + /// /// Looks up a localized string similar to Contribute. /// @@ -420,6 +456,15 @@ internal static string permanentIndicator { } } + /// + /// Looks up a localized string similar to Reloaded icons. + /// + internal static string reloadedIconsInfo { + get { + return ResourceManager.GetString("reloadedIconsInfo", resourceCulture); + } + } + /// /// Looks up a localized string similar to &Save && close. /// diff --git a/CapsLockIndicatorV3/strings.cs.resx b/CapsLockIndicatorV3/strings.cs.resx new file mode 100644 index 0000000..3ede48a --- /dev/null +++ b/CapsLockIndicatorV3/strings.cs.resx @@ -0,0 +1,325 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Pokročilá nastavení + Label of the hyperlink that opens the settings file + + + Barva pozadí při aktivování + The caption for the "Background colour activated" button. + + + Barva pozadí při deaktivování + The caption for the "Background colour deactivated" button. + + + Barva rámečku při aktivování + The caption for the "Border colour activated" button. + + + Barva rámečku při deaktivování + The caption for the "Border colour deactivated" button. + + + Tloušťka rámečku + Label of the border thickness groupbox + + + Caps lock + The name of the caps lock key + + + Zkontrolovat &aktualizace + The caption for the button that manually checks for updates. The character after the "&" is the hotkey that is used with the ALT key. + + + Kontrola aktualizací… + The caption for the "Check for updates" button when it's searching for updates. + + + Barvy + The title for the "Colours" group box + + + &Ukončit + Used in the context menu of the CLI tray icon. + + + &Zobrazit + Used in the context menu of the CLI tray icon. + + + &Zavřít + The caption for the "Dismiss" button. The character after the "&" is the hotkey that is used with the ALT key. + + + Čas zobrazení + The title for the "Display time" group box + + + Stáhnout &manuálně + The caption for the "Download manually" button. The character after the "&" is the hotkey that is used with the ALT key. + + + Stáhnout více překladů… + The last dropdown item in the locale dropdown. + + + &Ukončit aplikaci + The caption for the button that exits the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Ukončení aplikace způsobí skrytí ikon a oznámení. Pokračovat? + The message to display on application exit + + + Povolit automatické kontroly aktualizací (možno změnit později) + Label of the checkbox that determines whether or not CLI should search for updates + + + Přispět + Label of the hyperlink that takes you to CLI's GitHub page + + + &Ukončit + Button that exists the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Vítejte v programu CapsLock Indicator + The heading of the first-run dialog + + + Děkujeme za to, že jste si zvolili CapsLock Indicator! Tento program je open-source a zdarma, vždy byl a vždy bude! Rádi byste sami přispívali? Klikněte na odkaz níže pro více informací! Také se, prosíme, podívejte na nastavení níže! + The message of the first-run dialog + + + Jaké informace budou odeslány? + The label of the hyperlink that shows which information will be sent on each update check + + + &Začít! + Button that starts the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Písmo + The title for the "Font" group box + + + Barva písma při aktivování + The caption for the "Text colour activated" button. + + + Barva písma při deaktivování + The caption for the "Text colour deactivated" button. + + + Můžete ukázat indikátor klávesy „CapsLock“ dvojitým kliknutím na tuto ikonu. + The text that is shown in the icon balloon tip when CLI is being hidden. + + + Skrýt při spuštění + Used for the hide on startup checkbox + + + &Skrýt okno + The caption for the button that hides the window. The character after the "&" is the hotkey that is used with the ALT key. + + + Stav klávesy „{0}“ změněn + Used for the check boxes in the "Show notification when..." group box. "{0}" will be replaced with the key name + + + Klávesa „{0}“ je deaktivována + The text to display in the notification when a key is off. "{0}" will be replaced with the key name + + + Klávesa „{0}“ je aktivována + The text to display in the notification when a key is on. "{0}" will be replaced with the key name + + + Nastavení &oznámení + The caption for the button that opens the notification settings. The character after the "&" is the hotkey that is used with the ALT key. + + + Nastavení oznámení + The caption of the notification settings window + + + Num lock + The name of the num lock key + + + Krytí (neprůhlednost) + The title for the "Opacity" group box + + + Pozice překrytí + The title for the "Overlay position" group box + + + Trvale + Text to display instead of the time if indicator overlay display is set to permanently. + + + &Uložit a zavřít + The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character + + + Scroll lock + The name of the scroll lock key + + + Zobrazit ikony pro… + The title for the "Show icons for..." group box + + + Skrýt všechny ikony + The label for the check box that enables or disables all icons + + + Skrýt všechna oznámení + The label for the check box that enables or disables all notifications + + + Zobrazovat oznámení, pokud… + The title for the "Show notification when..." group box + + + Nechat zobrazené po dobu aktivace + The label for the check box that indicates whether overlay should only be shown when active + + + Spustit při přihlášení + The label for the check box that enables or disabled the auto start. + + + Dostupná aktualizace programu „CapsLock Indicator“ + The title for the update window. + + + Verze {0}, vydána {1} + Displayed in the "Update Available" dialog. {0} is the version, {1} is the release date and time. + + + &Aktualizovat teď + The caption for the "Update now" button. The character after the "&" is the hotkey that is used with the ALT key. + + + \ No newline at end of file diff --git a/CapsLockIndicatorV3/strings.de.resx b/CapsLockIndicatorV3/strings.de.resx index aa726c0..4f87931 100644 --- a/CapsLockIndicatorV3/strings.de.resx +++ b/CapsLockIndicatorV3/strings.de.resx @@ -174,6 +174,18 @@ Zulassen, dass CapsLock Indicator online nach Aktualisierungen sucht + + &Dunkel + + + &Hell + + + Welches Farbschema bevorzugen Sie? + + + Nur auf Windows 10 + Mitarbeiten @@ -237,6 +249,9 @@ Dauerhaft + + Symbole neu geladen + &Speichern && schließen diff --git a/CapsLockIndicatorV3/strings.es.resx b/CapsLockIndicatorV3/strings.es.resx index 5ea4563..3a9c4fc 100644 --- a/CapsLockIndicatorV3/strings.es.resx +++ b/CapsLockIndicatorV3/strings.es.resx @@ -1,284 +1,325 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Color de fondo activado - The caption for the "Background colour activated" button. - - - Color de fondo desactivado - The caption for the "Background colour deactivated" button. - - - Color del borde activado - The caption for the "Border colour activated" button. - - - Color del borde desactivado - The caption for the "Border colour deactivated" button. - - - Bloq. Mayúsculas - The name of the caps lock key - - - Comprobar &actualizaciones - The caption for the button that manually checks for updates. The character after the "&" is the hotkey that is used with the ALT key. - - - Comprobando actualizaciones... - The caption for the "Check for updates" button when it's searching for updates. - - - Colores - The title for the "Colours" group box - - - &Salir - Used in the context menu of the CLI tray icon. - - - &Mostrar - Used in the context menu of the CLI tray icon. - - - &Descartar - The caption for the "Dismiss" button. The character after the "&" is the hotkey that is used with the ALT key. - - - Mostrar tiempo - The title for the "Display time" group box - - - Descargar &manualmente - The caption for the "Download manually" button. The character after the "&" is the hotkey that is used with the ALT key. - - - Descargar más traducciones... - The last dropdown item in the locale dropdown. - - - &Cerrar aplicación - The caption for the button that exits the application. The character after the "&" is the hotkey that is used with the ALT key. - - - Saliendo de la aplicación, los iconos y notificaciones no se mostrarán. ¿Salir de todas maneras?. - The message to display on application exit - - - Fuente - The title for the "Font" group box - - - Color de texto activado - The caption for the "Text colour activated" button. - - - Color de texto desactivado - The caption for the "Text colour deactivated" button. - - - Puedes mostrar el indicador de Bloq mayús nuevamente haciendo doble clic en este icono. - The text that is shown in the icon balloon tip when CLI is being hidden. - - - Esconder al inicio - Used for the hide on startup checkbox - - - &Esconder ventana - The caption for the button that hides the window. The character after the "&" is the hotkey that is used with the ALT key. - - - {0} cambiado - Used for the check boxes in the "Show notification when..." group box. "{0}" will be replaced with the key name - - - {0} desactivado - The text to display in the notification when a key is off. "{0}" will be replaced with the key name - - - {0} activado - The text to display in the notification when a key is on. "{0}" will be replaced with the key name - - - &Ajuste de notificaciones - The caption for the button that opens the notification settings. The character after the "&" is the hotkey that is used with the ALT key. - - - Ajuste de notificaciones - The caption of the notification settings window - - - Bloq Núm - The name of the num lock key - - - Opacidad - The title for the "Opacity" group box - - - Posición sobre la pantalla - The title for the "Overlay position" group box - - - Permanente - Text to display instead of the time if indicator overlay display is set to permanently. - - - &Guardar && cerrar - The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character - - - Bloq Despl - The name of the scroll lock key - - - Mostrar iconos para... - The title for the "Show icons for..." group box - - - No mostrar iconos - The label for the check box that enables or disables all icons - - - No mostrar notificación - The label for the check box that enables or disables all notifications - - - Mostrar notificación cuando... - The title for the "Show notification when..." group box - - - Activar al iniciar sesión - The label for the check box that enables or disabled the auto start. - - - ¡Actualización de CapsLock Indicator disponible! - The title for the update window. - - - Versión {0}, lanzada {1} - Displayed in the "Update Available" dialog. {0} is the version, {1} is the release date and time. - - - &Actualizar ahora - The caption for the "Update now" button. The character after the "&" is the hotkey that is used with the ALT key. - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Ajustes avanzados + Label of the hyperlink that opens the settings file + + + Color de fondo activado + The caption for the "Background colour activated" button. + + + Color de fondo desactivado + The caption for the "Background colour deactivated" button. + + + Color del borde activado + The caption for the "Border colour activated" button. + + + Color del borde desactivado + The caption for the "Border colour deactivated" button. + + + Grosor del borde + Label of the border thickness groupbox + + + Bloq. Mayúsculas + The name of the caps lock key + + + Comprobar &actualizaciones + The caption for the button that manually checks for updates. The character after the "&" is the hotkey that is used with the ALT key. + + + Comprobando actualizaciones... + The caption for the "Check for updates" button when it's searching for updates. + + + Colores + The title for the "Colours" group box + + + &Salir + Used in the context menu of the CLI tray icon. + + + &Mostrar + Used in the context menu of the CLI tray icon. + + + &Descartar + The caption for the "Dismiss" button. The character after the "&" is the hotkey that is used with the ALT key. + + + Mostrar tiempo + The title for the "Display time" group box + + + Descargar &manualmente + The caption for the "Download manually" button. The character after the "&" is the hotkey that is used with the ALT key. + + + Descargar más traducciones... + The last dropdown item in the locale dropdown. + + + &Cerrar aplicación + The caption for the button that exits the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Saliendo de la aplicación, íconos y notificaciones no se mostrarán. ¿Salir de todas formas? + The message to display on application exit + + + Permitir que CapsLock Indicator verifique periódicamente si hay actualizaciones en línea (se puede cambiar después). + Label of the checkbox that determines whether or not CLI should search for updates + + + Contribuir + Label of the hyperlink that takes you to CLI's GitHub page + + + &Salir + Button that exists the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Bienvenido a CapsLock Indicator + The heading of the first-run dialog + + + ¡Gracias por elegir CapsLock Indicator! Este programa es de código abierto y gratuito, ¡siempre lo ha sido y siempre lo será! ¿Tienes interes en contribuir a CapsLock Indicator? Visita el siguiente enlace para obtener más información. ¡También, tómese un momento para revisar la configuración de abajo! + The message of the first-run dialog + + + ¿Qué información se enviará? + The label of the hyperlink that shows which information will be sent on each update check + + + ¡&Vamos! + Button that starts the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Fuente + The title for the "Font" group box + + + Color de texto activado + The caption for the "Text colour activated" button. + + + Color de texto desactivado + The caption for the "Text colour deactivated" button. + + + Puedes mostrar CapsLock Indicator nuevamente dando doble clic en este ícono. + The text that is shown in the icon balloon tip when CLI is being hidden. + + + Ocultar al iniciar + Used for the hide on startup checkbox + + + &Ocultar ventana + The caption for the button that hides the window. The character after the "&" is the hotkey that is used with the ALT key. + + + {0} cambiado + Used for the check boxes in the "Show notification when..." group box. "{0}" will be replaced with the key name + + + {0} desactivado + The text to display in the notification when a key is off. "{0}" will be replaced with the key name + + + {0} activado + The text to display in the notification when a key is on. "{0}" will be replaced with the key name + + + &Ajustes de notificaciones + The caption for the button that opens the notification settings. The character after the "&" is the hotkey that is used with the ALT key. + + + Ajustes de notificaciones + The caption of the notification settings window + + + Bloq Núm + The name of the num lock key + + + Opacidad + The title for the "Opacity" group box + + + Posición sobre la pantalla + The title for the "Overlay position" group box + + + Permanente + Text to display instead of the time if indicator overlay display is set to permanently. + + + &Guardar && cerrar + The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character + + + Bloq Despl + The name of the scroll lock key + + + Ver íconos de + The title for the "Show icons for..." group box + + + Sin íconos + The label for the check box that enables or disables all icons + + + Sin notificaciones + The label for the check box that enables or disables all notifications + + + Ver notificaciones de + The title for the "Show notification when..." group box + + + Mostrar siempre la superposición cuando se active + The label for the check box that indicates whether overlay should only be shown when active + + + Activar tras iniciar + The label for the check box that enables or disabled the auto start. + + + ¡Actualización de CapsLock Indicator disponible! + The title for the update window. + + + Versión {0}, lanzada {1} + Displayed in the "Update Available" dialog. {0} is the version, {1} is the release date and time. + + + &Actualizar ahora + The caption for the "Update now" button. The character after the "&" is the hotkey that is used with the ALT key. + + \ No newline at end of file diff --git a/CapsLockIndicatorV3/strings.fr.resx b/CapsLockIndicatorV3/strings.fr.resx index d22b914..0808996 100644 --- a/CapsLockIndicatorV3/strings.fr.resx +++ b/CapsLockIndicatorV3/strings.fr.resx @@ -1,284 +1,355 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Couleur de fond activée - The caption for the "Background colour activated" button. - - - Couleur de fond désactivée - The caption for the "Background colour deactivated" button. - - - Couleur de bord activée - The caption for the "Border colour activated" button. - - - Couleur de bord désactivée - The caption for the "Border colour deactivated" button. - - - Verrouillage majuscules - The name of the caps lock key - - - Mettre à &jour - The caption for the button that manually checks for updates. The character after the "&" is the hotkey that is used with the ALT key. - - - Recherche de mises à jour... - The caption for the "Check for updates" button when it's searching for updates. - - - Couleurs - The title for the "Colours" group box - - - &Quitter - Used in the context menu of the CLI tray icon. - - - &Afficher - Used in the context menu of the CLI tray icon. - - - &Annuler - The caption for the "Dismiss" button. The character after the "&" is the hotkey that is used with the ALT key. - - - Durée d'affichage - The title for the "Display time" group box - - - Télécharger &manuellement - The caption for the "Download manually" button. The character after the "&" is the hotkey that is used with the ALT key. - - - Télécharger plus de traductions.... - The last dropdown item in the locale dropdown. - - - &Quitter l'application - The caption for the button that exits the application. The character after the "&" is the hotkey that is used with the ALT key. - - - Quitter l'application signifie que les icônes et notifications ne seront plus affichées. Quitter quand même ? - The message to display on application exit - - - Police - The title for the "Font" group box - - - Couleur de texte activée - The caption for the "Text colour activated" button. - - - Couleur de texte désactivée - The caption for the "Text colour deactivated" button. - - - Vous pouvez afficher CapsLock Indicator à nouveau en double cliquant sur cette icône. - The text that is shown in the icon balloon tip when CLI is being hidden. - - - Cacher au démarrage - Used for the hide on startup checkbox - - - &Cacher la fenêtre - The caption for the button that hides the window. The character after the "&" is the hotkey that is used with the ALT key. - - - {0} mis à jour - Used for the check boxes in the "Show notification when..." group box. "{0}" will be replaced with the key name - - - {0} inactif - The text to display in the notification when a key is off. "{0}" will be replaced with the key name - - - {0} actif - The text to display in the notification when a key is on. "{0}" will be replaced with the key name - - - &Paramètres de notifications - The caption for the button that opens the notification settings. The character after the "&" is the hotkey that is used with the ALT key. - - - Paramètres de notifications - The caption of the notification settings window - - - Verrouillage Numérique - The name of the num lock key - - - Transparence - The title for the "Opacity" group box - - - Position de la notification - The title for the "Overlay position" group box - - - En permanence - Text to display instead of the time if indicator overlay display is set to permanently. - - - &Sauvegarder && et quitter - The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character - - - Arrêt défil. - The name of the scroll lock key - - - Afficher les icônes pour... - The title for the "Show icons for..." group box - - - Ne pas afficher d'icônes - The label for the check box that enables or disables all icons - - - Ne pas afficher de notifications - The label for the check box that enables or disables all notifications - - - Afficher les notifications quand... - The title for the "Show notification when..." group box - - - Lancer à l'ouverture de la session - The label for the check box that enables or disabled the auto start. - - - Une mise à jour de CapsLock Indicator est disponible ! - The title for the update window. - - - Version {0}, publiée le {1} - Displayed in the "Update Available" dialog. {0} is the version, {1} is the release date and time. - - - &Mettre à jour maintenant - The caption for the "Update now" button. The character after the "&" is the hotkey that is used with the ALT key. - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + Couleur de fond activée + The caption for the "Background colour activated" button. + + + Couleur de fond désactivée + The caption for the "Background colour deactivated" button. + + + Couleur de bord activée + The caption for the "Border colour activated" button. + + + Couleur de bord désactivée + The caption for the "Border colour deactivated" button. + + + + + Verrouillage majuscules + The name of the caps lock key + + + Mettre à &jour + The caption for the button that manually checks for updates. The character after the "&" is the hotkey that is used with the ALT key. + + + Recherche de mises à jour... + The caption for the "Check for updates" button when it's searching for updates. + + + Couleurs + The title for the "Colours" group box + + + &Quitter + Used in the context menu of the CLI tray icon. + + + &Afficher + Used in the context menu of the CLI tray icon. + + + &Annuler + The caption for the "Dismiss" button. The character after the "&" is the hotkey that is used with the ALT key. + + + Durée d'affichage + The title for the "Display time" group box + + + Télécharger &manuellement + The caption for the "Download manually" button. The character after the "&" is the hotkey that is used with the ALT key. + + + Télécharger plus de traductions.... + The last dropdown item in the locale dropdown. + + + &Quitter l'application + The caption for the button that exits the application. The character after the "&" is the hotkey that is used with the ALT key. + + + En quittant l'application, les icônes et notifications ne seront plus affichées. Quitter quand même ? + The message to display on application exit + + + + + + + + + + + + + + + + + Police + The title for the "Font" group box + + + Couleur de texte activée + The caption for the "Text colour activated" button. + + + Couleur de texte désactivée + The caption for the "Text colour deactivated" button. + + + Vous pouvez afficher CapsLock Indicator à nouveau en double cliquant sur cette icône. + The text that is shown in the icon balloon tip when CLI is being hidden. + + + Cacher au démarrage + Used for the hide on startup checkbox + + + &Cacher la fenêtre + The caption for the button that hides the window. The character after the "&" is the hotkey that is used with the ALT key. + + + {0} mis à jour + Used for the check boxes in the "Show notification when..." group box. "{0}" will be replaced with the key name + + + {0} inactif + The text to display in the notification when a key is off. "{0}" will be replaced with the key name + + + {0} actif + The text to display in the notification when a key is on. "{0}" will be replaced with the key name + + + &Paramètres de notifications + The caption for the button that opens the notification settings. The character after the "&" is the hotkey that is used with the ALT key. + + + Paramètres de notifications + The caption of the notification settings window + + + Verrouillage Numérique + The name of the num lock key + + + Transparence + The title for the "Opacity" group box + + + Position de la notification + The title for the "Overlay position" group box + + + En permanence + Text to display instead of the time if indicator overlay display is set to permanently. + + + &Sauvegarder && et quitter + The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character + + + Arrêt défil. + The name of the scroll lock key + + + Afficher les icônes pour... + The title for the "Show icons for..." group box + + + Ne pas afficher d'icônes + The label for the check box that enables or disables all icons + + + Ne pas afficher de notifications + The label for the check box that enables or disables all notifications + + + Afficher les notifications quand... + The title for the "Show notification when..." group box + + + + + Démarrer à l'ouverture de session + The label for the check box that enables or disabled the auto start. + + + Une mise à jour de CapsLock Indicator est disponible ! + The title for the update window. + + + Version {0}, publiée le {1} + Displayed in the "Update Available" dialog. {0} is the version, {1} is the release date and time. + + + &Mettre à jour maintenant + The caption for the "Update now" button. The character after the "&" is the hotkey that is used with the ALT key. + + \ No newline at end of file diff --git a/CapsLockIndicatorV3/strings.it.resx b/CapsLockIndicatorV3/strings.it.resx index a1ad455..760aba8 100644 --- a/CapsLockIndicatorV3/strings.it.resx +++ b/CapsLockIndicatorV3/strings.it.resx @@ -1,284 +1,330 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Colore sfondo attivato - The caption for the "Background colour activated" button. - - - Colore sfondo disattivato - The caption for the "Background colour deactivated" button. - - - Colore bordo attivato - The caption for the "Border colour activated" button. - - - Colore bordo disattivato - The caption for the "Border colour deactivated" button. - - - Blocco maiuscole - The name of the caps lock key - - - Controllo a&ggiornamenti - The caption for the button that manually checks for updates. The character after the "&" is the hotkey that is used with the ALT key. - - - Sto controllando gli aggiornamenti... - The caption for the "Check for updates" button when it's searching for updates. - - - Colori - The title for the "Colours" group box - - - &Uscita - Used in the context menu of the CLI tray icon. - - - &Mostra - Used in the context menu of the CLI tray icon. - - - A&nnulla - The caption for the "Dismiss" button. The character after the "&" is the hotkey that is used with the ALT key. - - - Tempo di visualizzazione - The title for the "Display time" group box - - - Scarica manua&lmente - The caption for the "Download manually" button. The character after the "&" is the hotkey that is used with the ALT key. - - - Scarica altre lingue... - The last dropdown item in the locale dropdown. - - - &Chiudi il programma - The caption for the button that exits the application. The character after the "&" is the hotkey that is used with the ALT key. - - - Chiudendo il programma le icone e le notifiche non verranno più mostrate. Uscire comunque? - The message to display on application exit - - - Carattere - The title for the "Font" group box - - - Colore testo attivato - The caption for the "Text colour activated" button. - - - Colore testo disattivato - The caption for the "Text colour deactivated" button. - - - Potrai vedere ancora l'indicatore del blocco maiuscole facendo doppio click su questa icona - The text that is shown in the icon balloon tip when CLI is being hidden. - - - Nascondi all'avvio - Used for the hide on startup checkbox - - - Na&scondi finestra - The caption for the button that hides the window. The character after the "&" is the hotkey that is used with the ALT key. - - - {0} modificato - Used for the check boxes in the "Show notification when..." group box. "{0}" will be replaced with the key name - - - {0} è spento - The text to display in the notification when a key is off. "{0}" will be replaced with the key name - - - {0} è acceso - The text to display in the notification when a key is on. "{0}" will be replaced with the key name - - - Impostazioni no&tifiche - The caption for the button that opens the notification settings. The character after the "&" is the hotkey that is used with the ALT key. - - - Impostazioni notifiche - The caption of the notification settings window - - - Tastierino numerico - The name of the num lock key - - - Opacita - The title for the "Opacity" group box - - - Posizione - The title for the "Overlay position" group box - - - Permanente - Text to display instead of the time if indicator overlay display is set to permanently. - - - Sal&va e chiudi - The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character - - - Blocco scorrimento - The name of the scroll lock key - - - Mostra icone per... - The title for the "Show icons for..." group box - - - Non mostrare icone - The label for the check box that enables or disables all icons - - - Non mostrare notifiche - The label for the check box that enables or disables all notifications - - - Mostra notifiche quando... - The title for the "Show notification when..." group box - - - Avvia all'accesso (esegui automaticamente all'avvio) - The label for the check box that enables or disabled the auto start. - - - Aggiornamento disponibile per CapsLock Indicator! - The title for the update window. - - - Versione {0}, rilasciata il {1} - Displayed in the "Update Available" dialog. {0} is the version, {1} is the release date and time. - - - &Aggiorna adesso - The caption for the "Update now" button. The character after the "&" is the hotkey that is used with the ALT key. - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Impostazioni avanzate + Label of the hyperlink that opens the settings file + + + Colore sfondo attivato + The caption for the "Background colour activated" button. + + + Colore sfondo disattivato + The caption for the "Background colour deactivated" button. + + + Colore bordo attivato + The caption for the "Border colour activated" button. + + + Colore bordo disattivato + The caption for the "Border colour deactivated" button. + + + Spessore bordo + Label of the border thickness groupbox + + + Blocco maiuscole + The name of the caps lock key + + + Controllo a&ggiornamenti + The caption for the button that manually checks for updates. The character after the "&" is the hotkey that is used with the ALT key. + + + Controllo aggiornamenti... + The caption for the "Check for updates" button when it's searching for updates. + + + Colori + The title for the "Colours" group box + + + &Esci + Used in the context menu of the CLI tray icon. + + + Vi&sualizza + Used in the context menu of the CLI tray icon. + + + A&nnulla + The caption for the "Dismiss" button. The character after the "&" is the hotkey that is used with the ALT key. + + + Tempo visualizzazione + The title for the "Display time" group box + + + Scarica &manualmente + The caption for the "Download manually" button. The character after the "&" is the hotkey that is used with the ALT key. + + + Scarica altre lingue... + The last dropdown item in the locale dropdown. + + + &Esci dall'applicazione + The caption for the button that exits the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Chiudendo il programma le icone e le notifiche non verranno più visualizzate. +Vuoi uscire comunque? + The message to display on application exit + + + Consenti a CapsLock Indicator di verificare periodicamente la presenza di aggiornamenti online (può essere modificato in seguito) + Label of the checkbox that determines whether or not CLI should search for updates + + + Contribuisci + Label of the hyperlink that takes you to CLI's GitHub page + + + &Esci + Button that exists the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Benvenuto in CapsLock Indicator + The heading of the first-run dialog + + + Grazie per aver scelto CapsLock Indicator! +Questo programma è open-source e gratuito, lo è sempre stato, lo sarà sempre! +Sei interessato a contribuire personalmente a CapsLock Indicator? +Visita il link sottostante per maggiori informazioni! +Inoltre, prenditi un momento per rivedere le impostazioni di seguito! + The message of the first-run dialog + + + Quali informazioni verranno inviate? + The label of the hyperlink that shows which information will be sent on each update check + + + &Cominciamo! + Button that starts the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Font + The title for the "Font" group box + + + Colore testo attivato + The caption for the "Text colour activated" button. + + + Colore testo disattivato + The caption for the "Text colour deactivated" button. + + + Potrai visualizzare l'indicatore del blocco maiuscole facendo doppio clic su questa icona + The text that is shown in the icon balloon tip when CLI is being hidden. + + + Nascondi all'avvio + Used for the hide on startup checkbox + + + Na&scondi finestra + The caption for the button that hides the window. The character after the "&" is the hotkey that is used with the ALT key. + + + {0} modificato + Used for the check boxes in the "Show notification when..." group box. "{0}" will be replaced with the key name + + + {0} è disattivato + The text to display in the notification when a key is off. "{0}" will be replaced with the key name + + + {0} è attivato + The text to display in the notification when a key is on. "{0}" will be replaced with the key name + + + Impostazioni &notifiche + The caption for the button that opens the notification settings. The character after the "&" is the hotkey that is used with the ALT key. + + + Impostazioni notifiche + The caption of the notification settings window + + + Blocco numerico + The name of the num lock key + + + Opacità + The title for the "Opacity" group box + + + Posizione overlay + The title for the "Overlay position" group box + + + Permanentemente + Text to display instead of the time if indicator overlay display is set to permanently. + + + &Salva e chiudi + The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character + + + Blocco scorrimento + The name of the scroll lock key + + + Visualizza icone per... + The title for the "Show icons for..." group box + + + Non visualizzare icone + The label for the check box that enables or disables all icons + + + Non visualizzare notifiche + The label for the check box that enables or disables all notifications + + + Visualizza notifiche quando... + The title for the "Show notification when..." group box + + + Visualizza sempre l'overlay quando è attiva + The label for the check box that indicates whether overlay should only be shown when active + + + Esegui automaticamente all'avvio + The label for the check box that enables or disabled the auto start. + + + Aggiornamento disponibile per CapsLock Indicator! + The title for the update window. + + + Versione {0}, rilasciata il {1} + Displayed in the "Update Available" dialog. {0} is the version, {1} is the release date and time. + + + &Aggiorna adesso + The caption for the "Update now" button. The character after the "&" is the hotkey that is used with the ALT key. + + \ No newline at end of file diff --git a/CapsLockIndicatorV3/strings.ko.resx b/CapsLockIndicatorV3/strings.ko.resx new file mode 100644 index 0000000..85f8c71 --- /dev/null +++ b/CapsLockIndicatorV3/strings.ko.resx @@ -0,0 +1,325 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 고급 설정 + Label of the hyperlink that opens the settings file + + + 활성화시 배경 색 + The caption for the "Background colour activated" button. + + + 비활성화시 배경 색 + The caption for the "Background colour deactivated" button. + + + 활성화시 테두리 색 + The caption for the "Border colour activated" button. + + + 비활성화시 테두리 색 + The caption for the "Border colour deactivated" button. + + + 경계선 두께 + Label of the border thickness groupbox + + + Caps lock + The name of the caps lock key + + + 업데이트 확인(&u) + The caption for the button that manually checks for updates. The character after the "&" is the hotkey that is used with the ALT key. + + + 업데이트 확인중... + The caption for the "Check for updates" button when it's searching for updates. + + + 색상 + The title for the "Colours" group box + + + 종료(&E) + Used in the context menu of the CLI tray icon. + + + 창 보이기(&S) + Used in the context menu of the CLI tray icon. + + + 창 숨기기(&D) + The caption for the "Dismiss" button. The character after the "&" is the hotkey that is used with the ALT key. + + + 노출 시간 + The title for the "Display time" group box + + + 수동 다운로드(&m) + The caption for the "Download manually" button. The character after the "&" is the hotkey that is used with the ALT key. + + + 다른 언어 다운로드... + The last dropdown item in the locale dropdown. + + + 프로그램 종료(&E) + The caption for the button that exits the application. The character after the "&" is the hotkey that is used with the ALT key. + + + 프로그램을 종료하면 트레이 아이콘과 알림이 표시되지 않습니다. 그래도 종료 하시겠습니까? + The message to display on application exit + + + 주기적인 업데이트 확인을 허용합니다. (설정 변경 가능) + Label of the checkbox that determines whether or not CLI should search for updates + + + 기여하기 + Label of the hyperlink that takes you to CLI's GitHub page + + + 종료(&E) + Button that exists the application. The character after the "&" is the hotkey that is used with the ALT key. + + + CapsLock Indicator 사용을 환영합니다. + The heading of the first-run dialog + + + CapsLock Indicator를 사용해 주셔서 고맙습니다! 이 프로그램은 지금까지 그랬듯이 오픈소스이며 무료입니다. 앞으로도 그럴 것입니다. 만약 CapsLock Indicator에 기여하고 싶다면 아래 링크를 눌러 정보를 얻기 바랍니다. 그리고 사용 전에 아래 설정들을 확인하기 바랍니다. + The message of the first-run dialog + + + 어떤 정보가 보내지나요? + The label of the hyperlink that shows which information will be sent on each update check + + + 시작(&L) + Button that starts the application. The character after the "&" is the hotkey that is used with the ALT key. + + + 글꼴 + The title for the "Font" group box + + + 활성화시 글자색 + The caption for the "Text colour activated" button. + + + 비활성화시 글자색 + The caption for the "Text colour deactivated" button. + + + 이 아이콘을 더블클릭하면 CapsLock Indicator를 볼 수 있습니다. + The text that is shown in the icon balloon tip when CLI is being hidden. + + + 시작시 창 숨기기 + Used for the hide on startup checkbox + + + 창 숨기기(&H) + The caption for the button that hides the window. The character after the "&" is the hotkey that is used with the ALT key. + + + {0} 변경됨 + Used for the check boxes in the "Show notification when..." group box. "{0}" will be replaced with the key name + + + {0} 꺼짐 + The text to display in the notification when a key is off. "{0}" will be replaced with the key name + + + {0} 켜짐 + The text to display in the notification when a key is on. "{0}" will be replaced with the key name + + + 알림 설정(&N) + The caption for the button that opens the notification settings. The character after the "&" is the hotkey that is used with the ALT key. + + + 알림 설정 + The caption of the notification settings window + + + Num lock + The name of the num lock key + + + 투명도 + The title for the "Opacity" group box + + + 알림 표시 위치 + The title for the "Overlay position" group box + + + 계속 유지 + Text to display instead of the time if indicator overlay display is set to permanently. + + + 저장 후 종료(&S) + The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character + + + Scroll lock + The name of the scroll lock key + + + 아이콘 설정 + The title for the "Show icons for..." group box + + + 모든 아이콘 숨기기 + The label for the check box that enables or disables all icons + + + 모든 알림 숨기기 + The label for the check box that enables or disables all notifications + + + 알림 설정 + The title for the "Show notification when..." group box + + + 활성시 항상 오버레이 보이기 + The label for the check box that indicates whether overlay should only be shown when active + + + 시작시 자동 시작 + The label for the check box that enables or disabled the auto start. + + + CapsLock Indicator 업데이트가 있습니다. + The title for the update window. + + + 버전 {0} , 배포일 {1} + Displayed in the "Update Available" dialog. {0} is the version, {1} is the release date and time. + + + 지금 업데이트(&U) + The caption for the "Update now" button. The character after the "&" is the hotkey that is used with the ALT key. + + + \ No newline at end of file diff --git a/CapsLockIndicatorV3/strings.nl.resx b/CapsLockIndicatorV3/strings.nl.resx new file mode 100644 index 0000000..3debfd2 --- /dev/null +++ b/CapsLockIndicatorV3/strings.nl.resx @@ -0,0 +1,325 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Geavanceerde instellingen + Label of the hyperlink that opens the settings file + + + Achtergrondkleur geactiveerd + The caption for the "Background colour activated" button. + + + Achtergrondkleur gedeactiveerd + The caption for the "Background colour deactivated" button. + + + Randkleur geactiveerd + The caption for the "Border colour activated" button. + + + Randkleur gedeactiveerd + The caption for the "Border colour deactivated" button. + + + Randdikte + Label of the border thickness groupbox + + + Caps lock + The name of the caps lock key + + + Controleer op &updates + The caption for the button that manually checks for updates. The character after the "&" is the hotkey that is used with the ALT key. + + + Controleren op updates... + The caption for the "Check for updates" button when it's searching for updates. + + + Kleuren + The title for the "Colours" group box + + + &Afsluiten + Used in the context menu of the CLI tray icon. + + + &Toon + Used in the context menu of the CLI tray icon. + + + &Annuleren + The caption for the "Dismiss" button. The character after the "&" is the hotkey that is used with the ALT key. + + + Toon tijd + The title for the "Display time" group box + + + Download &handmatig + The caption for the "Download manually" button. The character after the "&" is the hotkey that is used with the ALT key. + + + Download meer vertalingen... + The last dropdown item in the locale dropdown. + + + &Programma sluiten + The caption for the button that exits the application. The character after the "&" is the hotkey that is used with the ALT key. + + + De pictogrammen en notificaties zullen niet meer worden getoond als het programma wordt afgesloten. Toch afsluiten? + The message to display on application exit + + + Sta CapsLock Indicator toe om periodiek op updates te controleren (kan later aangepast worden) + Label of the checkbox that determines whether or not CLI should search for updates + + + Bijdragen + Label of the hyperlink that takes you to CLI's GitHub page + + + &Afsluiten + Button that exists the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Welkom bij CapsLock indicator + The heading of the first-run dialog + + + Bedankt dat je gekozen hebt voor CapsLock Indicator! Dit programma is open-source en gratis, is dit altijd geweest en zal ook zo blijven! Wil je bijdragen aan CapsLock Indicator? Bezoek dan de onderstaande link voor meer informatie. Neem ook even de tijd om onderstaande instellingen door te controleren. + The message of the first-run dialog + + + Welke informatie zal verzonden worden? + The label of the hyperlink that shows which information will be sent on each update check + + + &Start! + Button that starts the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Lettertype + The title for the "Font" group box + + + Tekst kleur geactiveerd + The caption for the "Text colour activated" button. + + + Tekstkleur gedeactiveerd + The caption for the "Text colour deactivated" button. + + + Activeer de CapsLock indicator opnieuw door te dubbelklikken op het pictogram. + The text that is shown in the icon balloon tip when CLI is being hidden. + + + Verberg bij opstarten + Used for the hide on startup checkbox + + + &Verberg scherm + The caption for the button that hides the window. The character after the "&" is the hotkey that is used with the ALT key. + + + {0} gewijzigd + Used for the check boxes in the "Show notification when..." group box. "{0}" will be replaced with the key name + + + {0} is uit + The text to display in the notification when a key is off. "{0}" will be replaced with the key name + + + {0} is aan + The text to display in the notification when a key is on. "{0}" will be replaced with the key name + + + &Notificatie instellingen + The caption for the button that opens the notification settings. The character after the "&" is the hotkey that is used with the ALT key. + + + Notificatie Instellingen + The caption of the notification settings window + + + Num lock + The name of the num lock key + + + Ondoorzichtigheid + The title for the "Opacity" group box + + + Overlay positie + The title for the "Overlay position" group box + + + Permanent + Text to display instead of the time if indicator overlay display is set to permanently. + + + &Bewaar && sluit + The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character + + + Scrol lock + The name of the scroll lock key + + + Toon pictogrammen voor... + The title for the "Show icons for..." group box + + + Toon geen pictogrammen + The label for the check box that enables or disables all icons + + + Toon geen notificaties + The label for the check box that enables or disables all notifications + + + Toon notificaties als ... + The title for the "Show notification when..." group box + + + Overlays is altijd zichtbaar als programma actief is + The label for the check box that indicates whether overlay should only be shown when active + + + Start bij aanloggen + The label for the check box that enables or disabled the auto start. + + + CapsLock Indicator Update beschikbaar! + The title for the update window. + + + Versie {0}, vrijgegeven {1} + Displayed in the "Update Available" dialog. {0} is the version, {1} is the release date and time. + + + &Update nu + The caption for the "Update now" button. The character after the "&" is the hotkey that is used with the ALT key. + + + \ No newline at end of file diff --git a/CapsLockIndicatorV3/strings.pt-BR.resx b/CapsLockIndicatorV3/strings.pt-BR.resx index 8099f95..e39cd15 100644 --- a/CapsLockIndicatorV3/strings.pt-BR.resx +++ b/CapsLockIndicatorV3/strings.pt-BR.resx @@ -117,6 +117,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Configurações Avançadas + Label of the hyperlink that opens the settings file + Cor de fundo ativada The caption for the "Background colour activated" button. @@ -133,6 +137,10 @@ Cor de borda desativada The caption for the "Border colour deactivated" button. + + Espessura da borda + Label of the border thickness groupbox + Caps lock The name of the caps lock key @@ -181,6 +189,34 @@ Sair da aplicação implica que os ícones e notificações não serão mais mostrados. Sair mesmo assim? The message to display on application exit + + Permitir que CapsLock Indicator procure por versões atualizadas periodicamente (pode ser modificado depois) + Label of the checkbox that determines whether or not CLI should search for updates + + + Contribua + Label of the hyperlink that takes you to CLI's GitHub page + + + &Sair + Button that exists the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Bem-vindo ao CapsLock Indicator + The heading of the first-run dialog + + + Obrigado por escolher CapsLock Indicator! Esse programa possui código-fonte aberto e é grátis. Sempre foi e sempre será! Tem interesse em contribuir com o CapsLock Indicator? Visite o link abaixo para mais informações! Além disso, reserve um momento para revisar as configurações abaixo! + The message of the first-run dialog + + + Quais informações serão enviadas? + The label of the hyperlink that shows which information will be sent on each update check + + + &Vamos lá! + Button that starts the application. The character after the "&" is the hotkey that is used with the ALT key. + Fonte The title for the "Font" group box @@ -265,6 +301,10 @@ Mostrar notificação quando... The title for the "Show notification when..." group box + + Sempre mostrar sobreposição quando ativo + The label for the check box that indicates whether overlay should only be shown when active + Inicializar automaticamente The label for the check box that enables or disabled the auto start. diff --git a/CapsLockIndicatorV3/strings.pt-PT.resx b/CapsLockIndicatorV3/strings.pt-PT.resx index d088dfe..eedd7f4 100644 --- a/CapsLockIndicatorV3/strings.pt-PT.resx +++ b/CapsLockIndicatorV3/strings.pt-PT.resx @@ -1,284 +1,355 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fundo de cor ativado - The caption for the "Background colour activated" button. - - - Fundo de cor desativado - The caption for the "Background colour deactivated" button. - - - Contorno de cor ativado - The caption for the "Border colour activated" button. - - - Contorno de cor desativado - The caption for the "Border colour deactivated" button. - - - Caps lock - The name of the caps lock key - - - Procurar por atualizações - The caption for the button that manually checks for updates. The character after the "&" is the hotkey that is used with the ALT key. - - - A procurar por atualizações... - The caption for the "Check for updates" button when it's searching for updates. - - - Cores - The title for the "Colours" group box - - - &Sair - Used in the context menu of the CLI tray icon. - - - &Mostrar - Used in the context menu of the CLI tray icon. - - - &Descartar - The caption for the "Dismiss" button. The character after the "&" is the hotkey that is used with the ALT key. - - - Mostar tempo - The title for the "Display time" group box - - - transferir &manualmente - The caption for the "Download manually" button. The character after the "&" is the hotkey that is used with the ALT key. - - - transferir mais traduções... - The last dropdown item in the locale dropdown. - - - &Sair da aplicação - The caption for the button that exits the application. The character after the "&" is the hotkey that is used with the ALT key. - - - Sair da aplicação significa que os ícones e as notificações vão deixar de aparecer. Sair na mesma? - The message to display on application exit - - - Fonte - The title for the "Font" group box - - - Texto com cor ativado - The caption for the "Text colour activated" button. - - - Texto com cor desativado - The caption for the "Text colour deactivated" button. - - - Pode abrir o CapsLock Indicator novamente, carregando neste ícone duas vezes - The text that is shown in the icon balloon tip when CLI is being hidden. - - - Esconder no arranque do Windows - Used for the hide on startup checkbox - - - &Esconder janela - The caption for the button that hides the window. The character after the "&" is the hotkey that is used with the ALT key. - - - {0} alterado - Used for the check boxes in the "Show notification when..." group box. "{0}" will be replaced with the key name - - - {0} desligado - The text to display in the notification when a key is off. "{0}" will be replaced with the key name - - - {0} ligado - The text to display in the notification when a key is on. "{0}" will be replaced with the key name - - - &definições das notificações - The caption for the button that opens the notification settings. The character after the "&" is the hotkey that is used with the ALT key. - - - definições das notificações - The caption of the notification settings window - - - Num lock - The name of the num lock key - - - Transparência - The title for the "Opacity" group box - - - posição da sobreposição - The title for the "Overlay position" group box - - - Permanente - Text to display instead of the time if indicator overlay display is set to permanently. - - - &Guardar && Sair - The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character - - - Scroll lock - The name of the scroll lock key - - - Mostrar ícones para... - The title for the "Show icons for..." group box - - - Não mostar ícones - The label for the check box that enables or disables all icons - - - Não mostrar notificações - The label for the check box that enables or disables all notifications - - - Mostar notificações quando... - The title for the "Show notification when..." group box - - - Iniciar aplicação no arranque do Windows - The label for the check box that enables or disabled the auto start. - - - atualização do CapsLock Indicator disponível!! - The title for the update window. - - - Versão {0}, lançada a {1} - Displayed in the "Update Available" dialog. {0} is the version, {1} is the release date and time. - - - &Atualizar agora - The caption for the "Update now" button. The character after the "&" is the hotkey that is used with the ALT key. - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + Fundo de cor ativado + The caption for the "Background colour activated" button. + + + Fundo de cor desativado + The caption for the "Background colour deactivated" button. + + + Contorno de cor ativado + The caption for the "Border colour activated" button. + + + Contorno de cor desativado + The caption for the "Border colour deactivated" button. + + + + + Caps lock + The name of the caps lock key + + + Procurar por atualizações + The caption for the button that manually checks for updates. The character after the "&" is the hotkey that is used with the ALT key. + + + A procurar por atualizações... + The caption for the "Check for updates" button when it's searching for updates. + + + Cores + The title for the "Colours" group box + + + &Sair + Used in the context menu of the CLI tray icon. + + + &Mostrar + Used in the context menu of the CLI tray icon. + + + &Descartar + The caption for the "Dismiss" button. The character after the "&" is the hotkey that is used with the ALT key. + + + Mostar tempo + The title for the "Display time" group box + + + transferir &manualmente + The caption for the "Download manually" button. The character after the "&" is the hotkey that is used with the ALT key. + + + transferir mais traduções... + The last dropdown item in the locale dropdown. + + + &Sair da aplicação + The caption for the button that exits the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Sair da aplicação significa que os ícones e as notificações vão deixar de aparecer. Sair na mesma? + The message to display on application exit + + + + + + + + + + + + + + + + + Fonte + The title for the "Font" group box + + + Texto com cor ativado + The caption for the "Text colour activated" button. + + + Texto com cor desativado + The caption for the "Text colour deactivated" button. + + + Pode abrir o CapsLock Indicator novamente, carregando neste ícone duas vezes + The text that is shown in the icon balloon tip when CLI is being hidden. + + + Esconder no arranque do Windows + Used for the hide on startup checkbox + + + &Esconder janela + The caption for the button that hides the window. The character after the "&" is the hotkey that is used with the ALT key. + + + {0} alterado + Used for the check boxes in the "Show notification when..." group box. "{0}" will be replaced with the key name + + + {0} desligado + The text to display in the notification when a key is off. "{0}" will be replaced with the key name + + + {0} ligado + The text to display in the notification when a key is on. "{0}" will be replaced with the key name + + + &definições das notificações + The caption for the button that opens the notification settings. The character after the "&" is the hotkey that is used with the ALT key. + + + definições das notificações + The caption of the notification settings window + + + Num lock + The name of the num lock key + + + Transparência + The title for the "Opacity" group box + + + posição da sobreposição + The title for the "Overlay position" group box + + + Permanente + Text to display instead of the time if indicator overlay display is set to permanently. + + + &Guardar && Sair + The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character + + + Scroll lock + The name of the scroll lock key + + + Mostrar ícones para... + The title for the "Show icons for..." group box + + + Não mostar ícones + The label for the check box that enables or disables all icons + + + Não mostrar notificações + The label for the check box that enables or disables all notifications + + + Mostar notificações quando... + The title for the "Show notification when..." group box + + + + + Iniciar aplicação no arranque do Windows + The label for the check box that enables or disabled the auto start. + + + atualização do CapsLock Indicator disponível!! + The title for the update window. + + + Versão {0}, lançada a {1} + Displayed in the "Update Available" dialog. {0} is the version, {1} is the release date and time. + + + &Atualizar agora + The caption for the "Update now" button. The character after the "&" is the hotkey that is used with the ALT key. + + \ No newline at end of file diff --git a/CapsLockIndicatorV3/strings.resx b/CapsLockIndicatorV3/strings.resx index 89a02ce..ee23ba3 100644 --- a/CapsLockIndicatorV3/strings.resx +++ b/CapsLockIndicatorV3/strings.resx @@ -190,9 +190,25 @@ The message to display on application exit - Allow CapsLock Indicator to periodically check for updates online (can be changed later) + &Allow CapsLock Indicator to periodically check for updates online (can be changed later) Label of the checkbox that determines whether or not CLI should search for updates + + &Dark + Button for selecting dark color scheme + + + L&ight + Button for selecting light color scheme + + + Which color scheme do you prefer? + Label for selecting color scheme + + + Only available on Windows 10 + Added to dark button if not running on Windows 10 + Contribute Label of the hyperlink that takes you to CLI's GitHub page @@ -277,6 +293,10 @@ Permanently Text to display instead of the time if indicator overlay display is set to permanently. + + Reloaded icons + Shown in a notification when hot-reloading icons. + &Save && close The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character diff --git a/CapsLockIndicatorV3/strings.ru.resx b/CapsLockIndicatorV3/strings.ru.resx index 68b9b0d..c38fef6 100644 --- a/CapsLockIndicatorV3/strings.ru.resx +++ b/CapsLockIndicatorV3/strings.ru.resx @@ -1,284 +1,325 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Цвет фона активированного - The caption for the "Background colour activated" button. - - - Цвет фона деактивированного - The caption for the "Background colour deactivated" button. - - - Цвет границы активированного - The caption for the "Border colour activated" button. - - - Цвет границы деактивированного - The caption for the "Border colour deactivated" button. - - - Caps lock - The name of the caps lock key - - - Проверить &обновления - The caption for the button that manually checks for updates. The character after the "&" is the hotkey that is used with the ALT key. - - - Проверка обновлений... - The caption for the "Check for updates" button when it's searching for updates. - - - Цвета - The title for the "Colours" group box - - - &Выход - Used in the context menu of the CLI tray icon. - - - &Показать - Used in the context menu of the CLI tray icon. - - - &Отклонить - The caption for the "Dismiss" button. The character after the "&" is the hotkey that is used with the ALT key. - - - Отображать время - The title for the "Display time" group box - - - Скачать &вручную - The caption for the "Download manually" button. The character after the "&" is the hotkey that is used with the ALT key. - - - Загрузить другие языки... - The last dropdown item in the locale dropdown. - - - &Выход - The caption for the button that exits the application. The character after the "&" is the hotkey that is used with the ALT key. - - - Выход из приложения означает, что значки и уведомления больше не отображаются. Выйти все-равно? - The message to display on application exit - - - Шрифт - The title for the "Font" group box - - - Цвет текста активированного - The caption for the "Text colour activated" button. - - - Цвет текста деактивированного - The caption for the "Text colour deactivated" button. - - - Вы можете снова показать индикатор CapsLock, дважды щелкнув по этому значку. - The text that is shown in the icon balloon tip when CLI is being hidden. - - - Скрыть при запуске - Used for the hide on startup checkbox - - - &Скрыть окно - The caption for the button that hides the window. The character after the "&" is the hotkey that is used with the ALT key. - - - {0} изменено - Used for the check boxes in the "Show notification when..." group box. "{0}" will be replaced with the key name - - - {0} выключен - The text to display in the notification when a key is off. "{0}" will be replaced with the key name - - - {0} включен - The text to display in the notification when a key is on. "{0}" will be replaced with the key name - - - &Настройка уведомлений - The caption for the button that opens the notification settings. The character after the "&" is the hotkey that is used with the ALT key. - - - Настройка уведомлений - The caption of the notification settings window - - - Num Lock - The name of the num lock key - - - Непрозрачность - The title for the "Opacity" group box - - - Позиция - The title for the "Overlay position" group box - - - Постоянно - Text to display instead of the time if indicator overlay display is set to permanently. - - - &Сохранить &и выйти - The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character - - - Scroll lock - The name of the scroll lock key - - - Показать иконки для... - The title for the "Show icons for..." group box - - - Не показывать иконки - The label for the check box that enables or disables all icons - - - Не показывать уведомления - The label for the check box that enables or disables all notifications - - - Показывать уведомления когда... - The title for the "Show notification when..." group box - - - Запускать при загрузке - The label for the check box that enables or disabled the auto start. - - - Доступно обновление CapsLock Indicator - The title for the update window. - - - Версия {0}, релиз {1} - Displayed in the "Update Available" dialog. {0} is the version, {1} is the release date and time. - - - &Обновить сейчас - The caption for the "Update now" button. The character after the "&" is the hotkey that is used with the ALT key. - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Расш. настройки + Label of the hyperlink that opens the settings file + + + Фон при включении + The caption for the "Background colour activated" button. + + + Фон при отключении + The caption for the "Background colour deactivated" button. + + + Рамка при включении + The caption for the "Border colour activated" button. + + + Рамка при отключении + The caption for the "Border colour deactivated" button. + + + Толщина границы + Label of the border thickness groupbox + + + Caps lock + The name of the caps lock key + + + Проверить &обновления + The caption for the button that manually checks for updates. The character after the "&" is the hotkey that is used with the ALT key. + + + Проверка обновлений... + The caption for the "Check for updates" button when it's searching for updates. + + + Цвета + The title for the "Colours" group box + + + &Выход + Used in the context menu of the CLI tray icon. + + + &Показать + Used in the context menu of the CLI tray icon. + + + &Отмена + The caption for the "Dismiss" button. The character after the "&" is the hotkey that is used with the ALT key. + + + Время отображения + The title for the "Display time" group box + + + Скачать &вручную + The caption for the "Download manually" button. The character after the "&" is the hotkey that is used with the ALT key. + + + Загрузить больше переводов… + The last dropdown item in the locale dropdown. + + + &Выйти из CLI + The caption for the button that exits the application. The character after the "&" is the hotkey that is used with the ALT key. + + + После выхода значки и уведомления не будут отображаться. Вы уверены? + The message to display on application exit + + + Разрешить CapsLock Indicator периодически проверять наличие обновлений в Интернете (параметр можно изменить потом) + Label of the checkbox that determines whether or not CLI should search for updates + + + Помочь проекту + Label of the hyperlink that takes you to CLI's GitHub page + + + &Выйти + Button that exists the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Приветствуем в CapsLock Indicator + The heading of the first-run dialog + + + Спасибо, что выбрали CapsLock Indicator! Эта программа с открытым исходным кодом всегда была, есть и останется бесплатной! Хотите внести свой вклад в CapsLock Indicator? Перейдите по ссылке ниже для подробностей! Кроме того, уделите минутку времени, чтобы ознакомиться с нижеприведенными настройками! + The message of the first-run dialog + + + Какие данные будет отправляться? + The label of the hyperlink that shows which information will be sent on each update check + + + &Погнали! + Button that starts the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Шрифт + The title for the "Font" group box + + + Текст при включении + The caption for the "Text colour activated" button. + + + Текст при отключении + The caption for the "Text colour deactivated" button. + + + По двойному нажатию на этот значок можно снова вернуться к CapsLock Indicator. + The text that is shown in the icon balloon tip when CLI is being hidden. + + + Скрыть окно при запуске + Used for the hide on startup checkbox + + + &Скрыть окно + The caption for the button that hides the window. The character after the "&" is the hotkey that is used with the ALT key. + + + переключении {0} + Used for the check boxes in the "Show notification when..." group box. "{0}" will be replaced with the key name + + + {0} выключен + The text to display in the notification when a key is off. "{0}" will be replaced with the key name + + + {0} включен + The text to display in the notification when a key is on. "{0}" will be replaced with the key name + + + &Настройка уведомлений + The caption for the button that opens the notification settings. The character after the "&" is the hotkey that is used with the ALT key. + + + Настройка уведомлений + The caption of the notification settings window + + + Num lock + The name of the num lock key + + + Непрозрачность + The title for the "Opacity" group box + + + Расположение на экране + The title for the "Overlay position" group box + + + Постоянно + Text to display instead of the time if indicator overlay display is set to permanently. + + + &Сохранить &и выйти + The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character + + + Scroll lock + The name of the scroll lock key + + + Показать значки + The title for the "Show icons for..." group box + + + Без значков в трее + The label for the check box that enables or disables all icons + + + Без уведомлений + The label for the check box that enables or disables all notifications + + + Уведомлять при + The title for the "Show notification when..." group box + + + Оставлять на экране, пока работает + The label for the check box that indicates whether overlay should only be shown when active + + + Автозагрузка + The label for the check box that enables or disabled the auto start. + + + Доступна новая версия CapsLock Indicator! + The title for the update window. + + + Версия {0}, вышла {1} + Displayed in the "Update Available" dialog. {0} is the version, {1} is the release date and time. + + + &Обновиться + The caption for the "Update now" button. The character after the "&" is the hotkey that is used with the ALT key. + + \ No newline at end of file diff --git a/CapsLockIndicatorV3/strings.tr-TR.resx b/CapsLockIndicatorV3/strings.tr-TR.resx new file mode 100644 index 0000000..e45ca26 --- /dev/null +++ b/CapsLockIndicatorV3/strings.tr-TR.resx @@ -0,0 +1,325 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Gelişmiş Seçenekler + Label of the hyperlink that opens the settings file + + + Etkin arkaplan rengi + The caption for the "Background colour activated" button. + + + Devre dışı arkaplan rengi + The caption for the "Background colour deactivated" button. + + + Etkin kenarlık rengi + The caption for the "Border colour activated" button. + + + Devre dışı kenarlık rengi + The caption for the "Border colour deactivated" button. + + + Kenar kalınlığı + Label of the border thickness groupbox + + + Caps lock + The name of the caps lock key + + + Güncellemelere gözat + The caption for the button that manually checks for updates. The character after the "&" is the hotkey that is used with the ALT key. + + + Güncellemeler denetleniyor... + The caption for the "Check for updates" button when it's searching for updates. + + + Renkler + The title for the "Colours" group box + + + &Çıkış + Used in the context menu of the CLI tray icon. + + + &Göster + Used in the context menu of the CLI tray icon. + + + Reddet + The caption for the "Dismiss" button. The character after the "&" is the hotkey that is used with the ALT key. + + + Görüntüleme süresi + The title for the "Display time" group box + + + Manuel olarak indir + The caption for the "Download manually" button. The character after the "&" is the hotkey that is used with the ALT key. + + + Daha fazla çeviri indir + The last dropdown item in the locale dropdown. + + + &Uygulamadan çık + The caption for the button that exits the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Eğer uygulamadan çıkarsanız simgeler ve bildirimler görüntülenemeyecek. Yine de çıkmak istiyor musunuz? + The message to display on application exit + + + CapsLock Indicator'a belirli aralıklarla çevrimiçi güncellenmesi için izin verin (bu izin daha sonra değiştirilebilir) + Label of the checkbox that determines whether or not CLI should search for updates + + + Katkıda bulun + Label of the hyperlink that takes you to CLI's GitHub page + + + &Çıkış + Button that exists the application. The character after the "&" is the hotkey that is used with the ALT key. + + + CapsLock Indicator'e Hoşgeldiniz + The heading of the first-run dialog + + + CapsLock Indicator'ı tercih ettiğiniz için Teşekkürler! Bu program açık-kaynak ve ücretsiz, her zaman öyleydi, her zaman öyle olacak! CapsLock Indicator'a katkıda bulunmak mı istiyorsunuz? Bilgi için linki kullanın! Ayrıca, aşağıdaki ayarlara lütfen gözatın! + The message of the first-run dialog + + + Hangi bilgiler gönderilecek? + The label of the hyperlink that shows which information will be sent on each update check + + + &Hadi gidelim! + Button that starts the application. The character after the "&" is the hotkey that is used with the ALT key. + + + Yazı tipi + The title for the "Font" group box + + + Etkin metin rengi + The caption for the "Text colour activated" button. + + + Devre dışı metin rengi + The caption for the "Text colour deactivated" button. + + + Simgeye çift tıklayarak CapsLock Indicator'u tekrar görebilirsiniz. + The text that is shown in the icon balloon tip when CLI is being hidden. + + + Başlarken gizle + Used for the hide on startup checkbox + + + &Pencereyi gizle + The caption for the button that hides the window. The character after the "&" is the hotkey that is used with the ALT key. + + + {0} değişmiş + Used for the check boxes in the "Show notification when..." group box. "{0}" will be replaced with the key name + + + {0} kapalı + The text to display in the notification when a key is off. "{0}" will be replaced with the key name + + + {0} açık + The text to display in the notification when a key is on. "{0}" will be replaced with the key name + + + Bildirim ayarları + The caption for the button that opens the notification settings. The character after the "&" is the hotkey that is used with the ALT key. + + + Bildirim seçenekleri + The caption of the notification settings window + + + Num lock + The name of the num lock key + + + Opaklık + The title for the "Opacity" group box + + + Kaplama konumu + The title for the "Overlay position" group box + + + Kalıcı + Text to display instead of the time if indicator overlay display is set to permanently. + + + Kaydet ve çık + The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character + + + Scroll lock + The name of the scroll lock key + + + Simgeleri şunun için göster... + The title for the "Show icons for..." group box + + + Simgeleri gösterme + The label for the check box that enables or disables all icons + + + Bildirimleri gösterme + The label for the check box that enables or disables all notifications + + + Bildirim şu zaman göster... + The title for the "Show notification when..." group box + + + Katmanı yalnızca etkin iken göster + The label for the check box that indicates whether overlay should only be shown when active + + + Oturum açta başlat + The label for the check box that enables or disabled the auto start. + + + CapsLock Indicator güncelleme mevcut! + The title for the update window. + + + Versiyon {0}, yayınlandı {1} + Displayed in the "Update Available" dialog. {0} is the version, {1} is the release date and time. + + + &Şimdi güncelle + The caption for the "Update now" button. The character after the "&" is the hotkey that is used with the ALT key. + + + \ No newline at end of file diff --git a/CapsLockIndicatorV3/strings.zh-CN.resx b/CapsLockIndicatorV3/strings.zh-CN.resx index a78c4e4..2f35852 100644 --- a/CapsLockIndicatorV3/strings.zh-CN.resx +++ b/CapsLockIndicatorV3/strings.zh-CN.resx @@ -1,284 +1,355 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 背景色-激活 - The caption for the "Background colour activated" button. - - - 背景色-未激活 - The caption for the "Background colour deactivated" button. - - - 边框-激活 - The caption for the "Border colour activated" button. - - - 边框-未激活 - The caption for the "Border colour deactivated" button. - - - Caps lock - The name of the caps lock key - - - 检查更新 - The caption for the button that manually checks for updates. The character after the "&" is the hotkey that is used with the ALT key. - - - 正在检查更新... - The caption for the "Check for updates" button when it's searching for updates. - - - 颜色 - The title for the "Colours" group box - - - 退出 - Used in the context menu of the CLI tray icon. - - - 显示主界面 - Used in the context menu of the CLI tray icon. - - - 消除 - The caption for the "Dismiss" button. The character after the "&" is the hotkey that is used with the ALT key. - - - 展示时间 - The title for the "Display time" group box - - - 手动下载 - The caption for the "Download manually" button. The character after the "&" is the hotkey that is used with the ALT key. - - - 下载更多语言... - The last dropdown item in the locale dropdown. - - - 退出程序 - The caption for the button that exits the application. The character after the "&" is the hotkey that is used with the ALT key. - - - 退出程序后,托盘指示器图标和切换通知将不再显示,确定要退出么? - The message to display on application exit - - - 字体 - The title for the "Font" group box - - - 文字颜色-激活 - The caption for the "Text colour activated" button. - - - 文字颜色 - 不活跃 - The caption for the "Text colour deactivated" button. - - - 双击图标显示软件主界面 - The text that is shown in the icon balloon tip when CLI is being hidden. - - - 启动时隐藏 - Used for the hide on startup checkbox - - - 隐藏窗口 - The caption for the button that hides the window. The character after the "&" is the hotkey that is used with the ALT key. - - - 切换{0}状态时 - Used for the check boxes in the "Show notification when..." group box. "{0}" will be replaced with the key name - - - {0}已关闭 - The text to display in the notification when a key is off. "{0}" will be replaced with the key name - - - {0}已打开 - The text to display in the notification when a key is on. "{0}" will be replaced with the key name - - - 通知设置 - The caption for the button that opens the notification settings. The character after the "&" is the hotkey that is used with the ALT key. - - - 通知设置 - The caption of the notification settings window - - - Num lock - The name of the num lock key - - - 透明度 - The title for the "Opacity" group box - - - 通知出现位置 - The title for the "Overlay position" group box - - - 一直显示 - Text to display instead of the time if indicator overlay display is set to permanently. - - - 保存并关闭 - The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character - - - Scroll lock - The name of the scroll lock key - - - 在系统托盘中展示以下指示器 - The title for the "Show icons for..." group box - - - 不展示托盘指示器 - The label for the check box that enables or disables all icons - - - 不显示通知 - The label for the check box that enables or disables all notifications - - - 显示通知: - The title for the "Show notification when..." group box - - - 开机启动 - The label for the check box that enables or disabled the auto start. - - - CapsLock Indicator 有可用升级! - The title for the update window. - - - Version {0}, released {1} - Displayed in the "Update Available" dialog. {0} is the version, {1} is the release date and time. - - - 立即升级 - The caption for the "Update now" button. The character after the "&" is the hotkey that is used with the ALT key. - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 打开 - 背景颜色 + The caption for the "Background colour activated" button. + + + 关闭 - 背景颜色 + The caption for the "Background colour deactivated" button. + + + 打开 - 边框颜色 + The caption for the "Border colour activated" button. + + + 关闭 - 边框颜色 + The caption for the "Border colour deactivated" button. + + + + + Caps lock + The name of the caps lock key + + + 检查更新 (&U) + The caption for the button that manually checks for updates. The character after the "&" is the hotkey that is used with the ALT key. + + + 正在检查更新… + The caption for the "Check for updates" button when it's searching for updates. + + + 颜色 + The title for the "Colours" group box + + + 退出 (&E) + Used in the context menu of the CLI tray icon. + + + 显示主界面 (&S) + Used in the context menu of the CLI tray icon. + + + 忽略 (&D) + The caption for the "Dismiss" button. The character after the "&" is the hotkey that is used with the ALT key. + + + 展示时长 + The title for the "Display time" group box + + + 手动下载 (&M) + The caption for the "Download manually" button. The character after the "&" is the hotkey that is used with the ALT key. + + + 下载更多翻译… + The last dropdown item in the locale dropdown. + + + 退出程序 (&E) + The caption for the button that exits the application. The character after the "&" is the hotkey that is used with the ALT key. + + + 退出程序后,托盘指示器图标和切换通知将不再显示,确定要退出吗? + The message to display on application exit + + + + + + + + + + + + + + + + + 字体 + The title for the "Font" group box + + + 打开 - 文本颜色 + The caption for the "Text colour activated" button. + + + 关闭 - 文字颜色 + The caption for the "Text colour deactivated" button. + + + 双击此图标即可显示 CapsLock 指示器主界面 + The text that is shown in the icon balloon tip when CLI is being hidden. + + + 启动时隐藏 + Used for the hide on startup checkbox + + + 隐藏窗口 (&H) + The caption for the button that hides the window. The character after the "&" is the hotkey that is used with the ALT key. + + + 切换 {0} 时 + Used for the check boxes in the "Show notification when..." group box. "{0}" will be replaced with the key name + + + {0} 已关闭 + The text to display in the notification when a key is off. "{0}" will be replaced with the key name + + + {0} 已打开 + The text to display in the notification when a key is on. "{0}" will be replaced with the key name + + + 通知设置 (&N) + The caption for the button that opens the notification settings. The character after the "&" is the hotkey that is used with the ALT key. + + + 通知设置 + The caption of the notification settings window + + + Num lock + The name of the num lock key + + + 透明度 + The title for the "Opacity" group box + + + 通知位置 + The title for the "Overlay position" group box + + + 一直显示 + Text to display instead of the time if indicator overlay display is set to permanently. + + + 保存并关闭 (&S) + The caption for the "Save & Close" button. The character after the "&" is the hotkey that is used with the ALT key. Use two "&" to display a "&" character + + + Scroll lock + The name of the scroll lock key + + + 显示托盘图标: + The title for the "Show icons for..." group box + + + 不显示托盘图标 + The label for the check box that enables or disables all icons + + + 不显示通知 + The label for the check box that enables or disables all notifications + + + 显示通知: + The title for the "Show notification when..." group box + + + + + 开机自启动 + The label for the check box that enables or disabled the auto start. + + + CapsLock 指示器有可用更新了! + The title for the update window. + + + 版本 {0},发布于 {1} + Displayed in the "Update Available" dialog. {0} is the version, {1} is the release date and time. + + + 立即更新 (&U) + The caption for the "Update now" button. The character after the "&" is the hotkey that is used with the ALT key. + + \ No newline at end of file diff --git a/README.md b/README.md index f6da728..cf22366 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,36 @@ -| | -| --- | -| ⚠ **HEADS UP**: CapsLock Indicator 4 is on the way. Completely rewritten with many new features and a new UI using WPF! However, it may still take some time until that version releases. | +

+ CapsLock Indicator +

----- +

+ Visit project page + License + Version + Build Status +

-![CapsLock Indicator](https://cli.jonaskohl.de/capslock-indicator-logo.png) +

+ CapsLock Indicator is a small utility that indicates the state of the Num lock, Caps lock and Scroll lock key. +

-[![Visit project page](https://static.jonaskohl.de/q50c4wp6/cli-project-page_vlecvcbtz80tqvtt.svg)](https://cli.jonaskohl.de/) -[![License](https://img.shields.io/badge/License-Apache%202.0-red.svg)](https://opensource.org/licenses/Apache-2.0) -[![Version](https://cli.jonaskohl.de/version.php?shield=true&_=2)](https://cli.jonaskohl.de/!/download#latest) -[![Build Status](https://travis-ci.org/jonaskohl/CapsLockIndicator.svg?branch=master)](https://travis-ci.org/jonaskohl/CapsLockIndicator) +


-CapsLock Indicator is a small utility that indicates the state of the Num lock, Caps lock and Scroll lock key. +

+ + Download now + +

-# [Download](https://cli.jonaskohl.de/!/download) +


+ +

+ Screenshot +

+ +


# Edit & compile source code -You need at least SharpDevelop 5.1 or Microsoft Visual Studio 2010 to edit and compile the source code, however Microsoft Visual Studio 2017 is recommended. CapsLock Indicator has no other dependencies other than the Microsoft .NET SDK 4.5. +You need Microsoft Visual Studio 2019 to edit and compile the source code. CapsLock Indicator has no other dependencies other than the Microsoft .NET SDK 4.5. # Contributing If you have a feature suggestion or a bug to file **and you are able to implement this in the code**, feel free to [open a pull request](https://github.com/jonaskohl/CapsLockIndicator/pulls). If you only want to report a bug or suggest a feature, [open a new issue](https://github.com/jonaskohl/CapsLockIndicator/issues/new).