diff --git a/LogiLockLED/App.config b/LogiLockLED/App.config
index 497b367..a0b92cc 100644
--- a/LogiLockLED/App.config
+++ b/LogiLockLED/App.config
@@ -40,6 +40,33 @@
True
+
+ Arial, 48pt, style=Bold, Italic
+
+
+ Centre
+
+
+ 8
+
+
+ 8
+
+
+ True
+
+
+ True
+
+
+ White
+
+
+ 3, 3, 3
+
+
+ 75
+
\ No newline at end of file
diff --git a/LogiLockLED/ConfigurationForm.Designer.cs b/LogiLockLED/ConfigurationForm.Designer.cs
index 369b691..268d03b 100644
--- a/LogiLockLED/ConfigurationForm.Designer.cs
+++ b/LogiLockLED/ConfigurationForm.Designer.cs
@@ -28,6 +28,7 @@ protected override void Dispose(bool disposing)
///
private void InitializeComponent()
{
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ConfigurationForm));
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.cbEnableCaps = new System.Windows.Forms.CheckBox();
this.btnCapsOffColour = new System.Windows.Forms.Button();
@@ -53,10 +54,32 @@ private void InitializeComponent()
this.cbAutoStartApp = new System.Windows.Forms.CheckBox();
this.btnCancel = new System.Windows.Forms.Button();
this.btnApply = new System.Windows.Forms.Button();
+ this.groupBox5 = new System.Windows.Forms.GroupBox();
+ this.cbOsdEnabled = new System.Windows.Forms.CheckBox();
+ this.label7 = new System.Windows.Forms.Label();
+ this.cbOSDPosition = new System.Windows.Forms.ComboBox();
+ this.label8 = new System.Windows.Forms.Label();
+ this.fontDialog = new System.Windows.Forms.FontDialog();
+ this.btnOsdFont = new System.Windows.Forms.Button();
+ this.cbOsdPadding = new System.Windows.Forms.NumericUpDown();
+ this.label9 = new System.Windows.Forms.Label();
+ this.label10 = new System.Windows.Forms.Label();
+ this.cbOsdMargin = new System.Windows.Forms.NumericUpDown();
+ this.cbOsdRoundedCorners = new System.Windows.Forms.CheckBox();
+ this.btnOsdTxtColour = new System.Windows.Forms.Button();
+ this.label11 = new System.Windows.Forms.Label();
+ this.btnOsdBkColour = new System.Windows.Forms.Button();
+ this.label12 = new System.Windows.Forms.Label();
+ this.label13 = new System.Windows.Forms.Label();
+ this.cbOsdOpacity = new System.Windows.Forms.NumericUpDown();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.groupBox3.SuspendLayout();
this.groupBox4.SuspendLayout();
+ this.groupBox5.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.cbOsdPadding)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.cbOsdMargin)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.cbOsdOpacity)).BeginInit();
this.SuspendLayout();
//
// groupBox1
@@ -68,7 +91,7 @@ private void InitializeComponent()
this.groupBox1.Controls.Add(this.label1);
this.groupBox1.Location = new System.Drawing.Point(14, 178);
this.groupBox1.Name = "groupBox1";
- this.groupBox1.Size = new System.Drawing.Size(290, 81);
+ this.groupBox1.Size = new System.Drawing.Size(271, 81);
this.groupBox1.TabIndex = 2;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Caps Lock";
@@ -123,7 +146,7 @@ private void InitializeComponent()
// btnClose
//
this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.btnClose.Location = new System.Drawing.Point(201, 385);
+ this.btnClose.Location = new System.Drawing.Point(403, 385);
this.btnClose.Name = "btnClose";
this.btnClose.Size = new System.Drawing.Size(103, 23);
this.btnClose.TabIndex = 3;
@@ -140,7 +163,7 @@ private void InitializeComponent()
this.groupBox2.Controls.Add(this.label4);
this.groupBox2.Location = new System.Drawing.Point(14, 91);
this.groupBox2.Name = "groupBox2";
- this.groupBox2.Size = new System.Drawing.Size(290, 81);
+ this.groupBox2.Size = new System.Drawing.Size(271, 81);
this.groupBox2.TabIndex = 5;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Num Lock";
@@ -201,7 +224,7 @@ private void InitializeComponent()
this.groupBox3.Controls.Add(this.label6);
this.groupBox3.Location = new System.Drawing.Point(13, 265);
this.groupBox3.Name = "groupBox3";
- this.groupBox3.Size = new System.Drawing.Size(290, 79);
+ this.groupBox3.Size = new System.Drawing.Size(272, 79);
this.groupBox3.TabIndex = 6;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "Scroll Lock";
@@ -259,7 +282,7 @@ private void InitializeComponent()
this.groupBox4.Controls.Add(this.cbAutoStartApp);
this.groupBox4.Location = new System.Drawing.Point(13, 13);
this.groupBox4.Name = "groupBox4";
- this.groupBox4.Size = new System.Drawing.Size(289, 72);
+ this.groupBox4.Size = new System.Drawing.Size(272, 72);
this.groupBox4.TabIndex = 7;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "General Settings";
@@ -299,7 +322,7 @@ private void InitializeComponent()
// btnApply
//
this.btnApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.btnApply.Location = new System.Drawing.Point(102, 385);
+ this.btnApply.Location = new System.Drawing.Point(304, 385);
this.btnApply.Name = "btnApply";
this.btnApply.Size = new System.Drawing.Size(93, 23);
this.btnApply.TabIndex = 9;
@@ -307,11 +330,204 @@ private void InitializeComponent()
this.btnApply.UseVisualStyleBackColor = true;
this.btnApply.Click += new System.EventHandler(this.btnApply_Click);
//
+ // groupBox5
+ //
+ this.groupBox5.Controls.Add(this.label13);
+ this.groupBox5.Controls.Add(this.cbOsdOpacity);
+ this.groupBox5.Controls.Add(this.btnOsdBkColour);
+ this.groupBox5.Controls.Add(this.label12);
+ this.groupBox5.Controls.Add(this.btnOsdTxtColour);
+ this.groupBox5.Controls.Add(this.label11);
+ this.groupBox5.Controls.Add(this.cbOsdRoundedCorners);
+ this.groupBox5.Controls.Add(this.label10);
+ this.groupBox5.Controls.Add(this.cbOsdMargin);
+ this.groupBox5.Controls.Add(this.label9);
+ this.groupBox5.Controls.Add(this.cbOsdPadding);
+ this.groupBox5.Controls.Add(this.btnOsdFont);
+ this.groupBox5.Controls.Add(this.label8);
+ this.groupBox5.Controls.Add(this.cbOSDPosition);
+ this.groupBox5.Controls.Add(this.label7);
+ this.groupBox5.Controls.Add(this.cbOsdEnabled);
+ this.groupBox5.Location = new System.Drawing.Point(301, 13);
+ this.groupBox5.Name = "groupBox5";
+ this.groupBox5.Size = new System.Drawing.Size(200, 266);
+ this.groupBox5.TabIndex = 10;
+ this.groupBox5.TabStop = false;
+ this.groupBox5.Text = "On-Screen Display";
+ //
+ // cbOsdEnabled
+ //
+ this.cbOsdEnabled.AutoSize = true;
+ this.cbOsdEnabled.Location = new System.Drawing.Point(7, 20);
+ this.cbOsdEnabled.Name = "cbOsdEnabled";
+ this.cbOsdEnabled.Size = new System.Drawing.Size(85, 17);
+ this.cbOsdEnabled.TabIndex = 0;
+ this.cbOsdEnabled.Text = "Enable OSD";
+ this.cbOsdEnabled.UseVisualStyleBackColor = true;
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.Location = new System.Drawing.Point(4, 43);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(47, 13);
+ this.label7.TabIndex = 1;
+ this.label7.Text = "Position:";
+ //
+ // cbOSDPosition
+ //
+ this.cbOSDPosition.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cbOSDPosition.FormattingEnabled = true;
+ this.cbOSDPosition.Items.AddRange(new object[] {
+ "Center",
+ "Top Left",
+ "Top Right",
+ "Bottom Left",
+ "Bottom Right"});
+ this.cbOSDPosition.Location = new System.Drawing.Point(60, 40);
+ this.cbOSDPosition.Name = "cbOSDPosition";
+ this.cbOSDPosition.Size = new System.Drawing.Size(121, 21);
+ this.cbOSDPosition.TabIndex = 2;
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.Location = new System.Drawing.Point(4, 150);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(31, 13);
+ this.label8.TabIndex = 3;
+ this.label8.Text = "Font:";
+ //
+ // btnOsdFont
+ //
+ this.btnOsdFont.Location = new System.Drawing.Point(60, 145);
+ this.btnOsdFont.Name = "btnOsdFont";
+ this.btnOsdFont.Size = new System.Drawing.Size(121, 23);
+ this.btnOsdFont.TabIndex = 4;
+ this.btnOsdFont.Text = "Font";
+ this.btnOsdFont.UseVisualStyleBackColor = true;
+ this.btnOsdFont.Click += new System.EventHandler(this.btnFont_Click);
+ //
+ // cbOsdPadding
+ //
+ this.cbOsdPadding.Location = new System.Drawing.Point(60, 67);
+ this.cbOsdPadding.Maximum = new decimal(new int[] {
+ -727379969,
+ 232,
+ 0,
+ 0});
+ this.cbOsdPadding.Minimum = new decimal(new int[] {
+ -727379969,
+ 232,
+ 0,
+ -2147483648});
+ this.cbOsdPadding.Name = "cbOsdPadding";
+ this.cbOsdPadding.Size = new System.Drawing.Size(120, 20);
+ this.cbOsdPadding.TabIndex = 5;
+ //
+ // label9
+ //
+ this.label9.AutoSize = true;
+ this.label9.Location = new System.Drawing.Point(3, 69);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(49, 13);
+ this.label9.TabIndex = 6;
+ this.label9.Text = "Padding:";
+ //
+ // label10
+ //
+ this.label10.AutoSize = true;
+ this.label10.Location = new System.Drawing.Point(3, 95);
+ this.label10.Name = "label10";
+ this.label10.Size = new System.Drawing.Size(42, 13);
+ this.label10.TabIndex = 8;
+ this.label10.Text = "Margin:";
+ //
+ // cbOsdMargin
+ //
+ this.cbOsdMargin.Location = new System.Drawing.Point(60, 93);
+ this.cbOsdMargin.Maximum = new decimal(new int[] {
+ -727379969,
+ 232,
+ 0,
+ 0});
+ this.cbOsdMargin.Minimum = new decimal(new int[] {
+ -727379969,
+ 232,
+ 0,
+ -2147483648});
+ this.cbOsdMargin.Name = "cbOsdMargin";
+ this.cbOsdMargin.Size = new System.Drawing.Size(120, 20);
+ this.cbOsdMargin.TabIndex = 7;
+ //
+ // cbOsdRoundedCorners
+ //
+ this.cbOsdRoundedCorners.AutoSize = true;
+ this.cbOsdRoundedCorners.Location = new System.Drawing.Point(7, 122);
+ this.cbOsdRoundedCorners.Name = "cbOsdRoundedCorners";
+ this.cbOsdRoundedCorners.Size = new System.Drawing.Size(109, 17);
+ this.cbOsdRoundedCorners.TabIndex = 9;
+ this.cbOsdRoundedCorners.Text = "Rounded Corners";
+ this.cbOsdRoundedCorners.UseVisualStyleBackColor = true;
+ //
+ // btnOsdTxtColour
+ //
+ this.btnOsdTxtColour.Location = new System.Drawing.Point(96, 174);
+ this.btnOsdTxtColour.Name = "btnOsdTxtColour";
+ this.btnOsdTxtColour.Size = new System.Drawing.Size(44, 23);
+ this.btnOsdTxtColour.TabIndex = 11;
+ this.btnOsdTxtColour.UseVisualStyleBackColor = true;
+ this.btnOsdTxtColour.Click += new System.EventHandler(this.btnColour_Click);
+ //
+ // label11
+ //
+ this.label11.AutoSize = true;
+ this.label11.Location = new System.Drawing.Point(4, 179);
+ this.label11.Name = "label11";
+ this.label11.Size = new System.Drawing.Size(64, 13);
+ this.label11.TabIndex = 10;
+ this.label11.Text = "Text Colour:";
+ //
+ // btnOsdBkColour
+ //
+ this.btnOsdBkColour.Location = new System.Drawing.Point(96, 203);
+ this.btnOsdBkColour.Name = "btnOsdBkColour";
+ this.btnOsdBkColour.Size = new System.Drawing.Size(44, 23);
+ this.btnOsdBkColour.TabIndex = 13;
+ this.btnOsdBkColour.UseVisualStyleBackColor = true;
+ this.btnOsdBkColour.Click += new System.EventHandler(this.btnColour_Click);
+ //
+ // label12
+ //
+ this.label12.AutoSize = true;
+ this.label12.Location = new System.Drawing.Point(4, 208);
+ this.label12.Name = "label12";
+ this.label12.Size = new System.Drawing.Size(68, 13);
+ this.label12.TabIndex = 12;
+ this.label12.Text = "Back Colour:";
+ //
+ // label13
+ //
+ this.label13.AutoSize = true;
+ this.label13.Location = new System.Drawing.Point(3, 234);
+ this.label13.Name = "label13";
+ this.label13.Size = new System.Drawing.Size(46, 13);
+ this.label13.TabIndex = 15;
+ this.label13.Text = "Opacity:";
+ //
+ // cbOsdOpacity
+ //
+ this.cbOsdOpacity.Location = new System.Drawing.Point(61, 232);
+ this.cbOsdOpacity.Name = "cbOsdOpacity";
+ this.cbOsdOpacity.Size = new System.Drawing.Size(119, 20);
+ this.cbOsdOpacity.TabIndex = 14;
+ //
// ConfigurationForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(311, 414);
+ this.ClientSize = new System.Drawing.Size(513, 414);
+ this.Controls.Add(this.groupBox5);
this.Controls.Add(this.btnApply);
this.Controls.Add(this.btnCancel);
this.Controls.Add(this.groupBox4);
@@ -320,6 +536,7 @@ private void InitializeComponent()
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.btnClose);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "ConfigurationForm";
this.Text = "LogiLockLED Configuration";
this.groupBox1.ResumeLayout(false);
@@ -330,6 +547,11 @@ private void InitializeComponent()
this.groupBox3.PerformLayout();
this.groupBox4.ResumeLayout(false);
this.groupBox4.PerformLayout();
+ this.groupBox5.ResumeLayout(false);
+ this.groupBox5.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.cbOsdPadding)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.cbOsdMargin)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.cbOsdOpacity)).EndInit();
this.ResumeLayout(false);
}
@@ -361,6 +583,24 @@ private void InitializeComponent()
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.CheckBox cbEnable;
private System.Windows.Forms.Button btnApply;
+ private System.Windows.Forms.GroupBox groupBox5;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.CheckBox cbOsdEnabled;
+ private System.Windows.Forms.ComboBox cbOSDPosition;
+ private System.Windows.Forms.Button btnOsdFont;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.FontDialog fontDialog;
+ private System.Windows.Forms.CheckBox cbOsdRoundedCorners;
+ private System.Windows.Forms.Label label10;
+ private System.Windows.Forms.NumericUpDown cbOsdMargin;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.NumericUpDown cbOsdPadding;
+ private System.Windows.Forms.Button btnOsdBkColour;
+ private System.Windows.Forms.Label label12;
+ private System.Windows.Forms.Button btnOsdTxtColour;
+ private System.Windows.Forms.Label label11;
+ private System.Windows.Forms.Label label13;
+ private System.Windows.Forms.NumericUpDown cbOsdOpacity;
}
}
diff --git a/LogiLockLED/ConfigurationForm.cs b/LogiLockLED/ConfigurationForm.cs
index f2867d6..df97ea7 100644
--- a/LogiLockLED/ConfigurationForm.cs
+++ b/LogiLockLED/ConfigurationForm.cs
@@ -1,19 +1,26 @@
using Microsoft.Win32;
using System;
+using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace LogiLockLED
{
+ public enum OSDPosition { Centre = 1, Top_Left, Top_Right, Bottom_Left, Bottom_Right }
public partial class ConfigurationForm : Form
{
private readonly LedSettings ledSettings;
public event EventHandler SettingsUpdated;
+
+
public ConfigurationForm(ref LedSettings settings)
{
InitializeComponent();
ledSettings = settings;
+ cbOSDPosition.DataSource = Enum.GetValues(typeof(OSDPosition));
+ cbOSDPosition.SelectedIndex = 0;
+
PopulateSettingsToUI();
}
@@ -44,6 +51,12 @@ private void SetSettingValue(object sender, Color color)
ledSettings.ScrollOffColour = color;
if (sender == btnScrollOnColour)
ledSettings.ScrollOnColour = color;
+
+ if (sender == btnOsdTxtColour)
+ ledSettings.OsdTextColour = color == Color.Black ? Color.FromArgb(3, 3, 3) : color;
+ if (sender == btnOsdBkColour)
+ ledSettings.OsdBackColour = color == Color.Black ? Color.FromArgb(3, 3, 3) : color;
+
}
private void PopulateSettingsToUI()
@@ -63,11 +76,28 @@ private void PopulateSettingsToUI()
btnScrollOnColour.BackColor = ledSettings.ScrollOnColour;
cbAutoStartApp.Checked = ledSettings.AutoStartApp;
-
+
+ cbOsdEnabled.Checked = ledSettings.OsdEnabled;
+ cbOSDPosition.SelectedItem = ledSettings.OsdPosition;
+ btnOsdFont.Text = ledSettings.OsdFont.SizeInPoints.ToString() + ", " + ledSettings.OsdFont.FontFamily.Name;
+ fontDialog.Font = ledSettings.OsdFont;
+ cbOsdPadding.Value = ledSettings.OsdPadding;
+ cbOsdMargin.Value = ledSettings.OsdMargin;
+ cbOsdRoundedCorners.Checked = ledSettings.OsdRoundedCorners;
+ btnOsdTxtColour.BackColor = ledSettings.OsdTextColour;
+ btnOsdBkColour.BackColor = ledSettings.OsdBackColour;
+ cbOsdOpacity.Value = ledSettings.OsdOpacity;
}
private void ApplySettings()
{
+ ledSettings.OsdEnabled = cbOsdEnabled.Checked;
+ ledSettings.OsdPosition = (OSDPosition)cbOSDPosition.SelectedItem;
+ ledSettings.OsdPadding = (int)cbOsdPadding.Value;
+ ledSettings.OsdMargin = (int)cbOsdMargin.Value;
+ ledSettings.OsdRoundedCorners = cbOsdRoundedCorners.Checked;
+ ledSettings.OsdOpacity = (int)cbOsdOpacity.Value;
+
ledSettings.SaveSettings();
SettingsUpdated?.Invoke(this, new EventArgs());
}
@@ -114,5 +144,14 @@ private void cbAutoStartApp_CheckedChanged(object sender, EventArgs e)
{
ledSettings.AutoStartApp = cbAutoStartApp.Checked;
}
+
+ private void btnFont_Click(object sender, EventArgs e)
+ {
+ if( fontDialog.ShowDialog(this) == DialogResult.OK)
+ {
+ ledSettings.OsdFont = fontDialog.Font;
+ btnOsdFont.Text = ledSettings.OsdFont.SizeInPoints.ToString() + ", " + ledSettings.OsdFont.FontFamily.Name;
+ }
+ }
}
}
diff --git a/LogiLockLED/ConfigurationForm.resx b/LogiLockLED/ConfigurationForm.resx
index d2071e0..d8fc87a 100644
--- a/LogiLockLED/ConfigurationForm.resx
+++ b/LogiLockLED/ConfigurationForm.resx
@@ -120,4 +120,763 @@
17, 17
+
+ 131, 17
+
+
+
+
+ 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
+
+
\ No newline at end of file
diff --git a/LogiLockLED/IndicatorPopup.Designer.cs b/LogiLockLED/IndicatorPopup.Designer.cs
new file mode 100644
index 0000000..f78c4b1
--- /dev/null
+++ b/LogiLockLED/IndicatorPopup.Designer.cs
@@ -0,0 +1,157 @@
+namespace LogiLockLED
+{
+ partial class IndicatorPopup
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(IndicatorPopup));
+ this.lblLockText = new System.Windows.Forms.Label();
+ this.hideTimer = new System.Windows.Forms.Timer(this.components);
+ this.cornerTL = new System.Windows.Forms.PictureBox();
+ this.cornerBR = new System.Windows.Forms.PictureBox();
+ this.cornerTR = new System.Windows.Forms.PictureBox();
+ this.cornerBL = new System.Windows.Forms.PictureBox();
+ ((System.ComponentModel.ISupportInitialize)(this.cornerTL)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.cornerBR)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.cornerTR)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.cornerBL)).BeginInit();
+ this.SuspendLayout();
+ //
+ // lblLockText
+ //
+ this.lblLockText.AutoSize = true;
+ this.lblLockText.BackColor = System.Drawing.Color.Transparent;
+ this.lblLockText.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.lblLockText.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.lblLockText.Font = new System.Drawing.Font("Arial", 48F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblLockText.ForeColor = System.Drawing.Color.White;
+ this.lblLockText.Location = new System.Drawing.Point(8, 8);
+ this.lblLockText.Margin = new System.Windows.Forms.Padding(3);
+ this.lblLockText.Name = "lblLockText";
+ this.lblLockText.Size = new System.Drawing.Size(289, 72);
+ this.lblLockText.TabIndex = 0;
+ this.lblLockText.Text = "Num: On";
+ this.lblLockText.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ //
+ // hideTimer
+ //
+ this.hideTimer.Enabled = true;
+ this.hideTimer.Interval = 1000;
+ this.hideTimer.Tick += new System.EventHandler(this.hideTimer_Tick);
+ //
+ // cornerTL
+ //
+ this.cornerTL.BackColor = System.Drawing.Color.Transparent;
+ this.cornerTL.Image = ((System.Drawing.Image)(resources.GetObject("cornerTL.Image")));
+ this.cornerTL.Location = new System.Drawing.Point(8, 8);
+ this.cornerTL.Name = "cornerTL";
+ this.cornerTL.Size = new System.Drawing.Size(17, 17);
+ this.cornerTL.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
+ this.cornerTL.TabIndex = 1;
+ this.cornerTL.TabStop = false;
+ //
+ // cornerBR
+ //
+ this.cornerBR.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.cornerBR.BackColor = System.Drawing.Color.Transparent;
+ this.cornerBR.Image = ((System.Drawing.Image)(resources.GetObject("cornerBR.Image")));
+ this.cornerBR.Location = new System.Drawing.Point(221, 108);
+ this.cornerBR.Name = "cornerBR";
+ this.cornerBR.Size = new System.Drawing.Size(17, 17);
+ this.cornerBR.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
+ this.cornerBR.TabIndex = 2;
+ this.cornerBR.TabStop = false;
+ //
+ // cornerTR
+ //
+ this.cornerTR.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.cornerTR.BackColor = System.Drawing.Color.Transparent;
+ this.cornerTR.Image = ((System.Drawing.Image)(resources.GetObject("cornerTR.Image")));
+ this.cornerTR.Location = new System.Drawing.Point(221, 8);
+ this.cornerTR.Name = "cornerTR";
+ this.cornerTR.Size = new System.Drawing.Size(17, 17);
+ this.cornerTR.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
+ this.cornerTR.TabIndex = 3;
+ this.cornerTR.TabStop = false;
+ //
+ // cornerBL
+ //
+ this.cornerBL.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.cornerBL.BackColor = System.Drawing.Color.Transparent;
+ this.cornerBL.Image = ((System.Drawing.Image)(resources.GetObject("cornerBL.Image")));
+ this.cornerBL.Location = new System.Drawing.Point(8, 108);
+ this.cornerBL.Name = "cornerBL";
+ this.cornerBL.Size = new System.Drawing.Size(17, 17);
+ this.cornerBL.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
+ this.cornerBL.TabIndex = 4;
+ this.cornerBL.TabStop = false;
+ //
+ // IndicatorPopup
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.AutoSize = true;
+ this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+ this.AutoValidate = System.Windows.Forms.AutoValidate.Disable;
+ this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(4)))), ((int)(((byte)(4)))), ((int)(((byte)(4)))));
+ this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
+ this.CausesValidation = false;
+ this.ClientSize = new System.Drawing.Size(249, 127);
+ this.Controls.Add(this.cornerBL);
+ this.Controls.Add(this.cornerTR);
+ this.Controls.Add(this.cornerBR);
+ this.Controls.Add(this.cornerTL);
+ this.Controls.Add(this.lblLockText);
+ this.DoubleBuffered = true;
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+ this.Name = "IndicatorPopup";
+ this.Opacity = 0.75D;
+ this.Padding = new System.Windows.Forms.Padding(8);
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "IndicatorPopup";
+ this.TransparencyKey = System.Drawing.Color.Black;
+ ((System.ComponentModel.ISupportInitialize)(this.cornerTL)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.cornerBR)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.cornerTR)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.cornerBL)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label lblLockText;
+ private System.Windows.Forms.Timer hideTimer;
+ private System.Windows.Forms.PictureBox cornerTL;
+ private System.Windows.Forms.PictureBox cornerBR;
+ private System.Windows.Forms.PictureBox cornerTR;
+ private System.Windows.Forms.PictureBox cornerBL;
+ }
+}
\ No newline at end of file
diff --git a/LogiLockLED/IndicatorPopup.cs b/LogiLockLED/IndicatorPopup.cs
new file mode 100644
index 0000000..02798bd
--- /dev/null
+++ b/LogiLockLED/IndicatorPopup.cs
@@ -0,0 +1,143 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace LogiLockLED
+{
+ public partial class IndicatorPopup : Form
+ {
+ public OSDPosition Position { get; private set; }
+ public int OuterMargin { get; private set; }
+
+ protected override bool ShowWithoutActivation
+ {
+ get { return true; }
+ }
+
+
+ public IndicatorPopup()
+ {
+ InitializeComponent();
+ IntPtr dummy = this.Handle; //Force form to load without showing
+ }
+
+ private void hideTimer_Tick(object sender, EventArgs e)
+ {
+ if (this.Visible)
+ {
+ lblLockText.Text = " ";
+ this.Hide();
+ hideTimer.Stop();
+ }
+ }
+
+ public void ShowLockState(LockKey lockKey, bool state)
+ {
+ //cornerTR.Location = new Point(0, 0);
+ //cornerBR.Location = new Point(0, 0);
+
+ lblLockText.Text = lockKey.ToString() + ": " + (state ? "On" : "Off");
+ //lblLockText.AutoSize = false;
+ //lblLockText.Width = 50;
+ //this.Width = 50;
+ //lblLockText.AutoSize = true;
+
+
+ cornerTL.Location = new Point(0, 0);
+ cornerBL.Location = new Point(0, this.Height-cornerBL.Height);
+ cornerTR.Location = new Point(this.Width - cornerTR.Width, 0);
+ cornerBR.Location = new Point(this.Width - cornerBR.Width, this.Height - cornerBR.Height);
+
+
+ MoveIntoPosition();
+
+ ShowInactiveTopmost(this);
+ hideTimer.Stop();
+ hideTimer.Start();
+ }
+
+ private void MoveIntoPosition()
+ {
+ var area = Screen.PrimaryScreen.WorkingArea;
+
+ if (Position == OSDPosition.Centre)
+ {
+ this.Left = (area.X + area.Width - this.Width) / 2;
+ this.Top = (area.Y + area.Height - this.Height) / 2;
+ }
+ else
+ {
+ if (Position == OSDPosition.Bottom_Right || Position == OSDPosition.Bottom_Left)
+ this.Top = area.Y + area.Height - this.Height - OuterMargin;
+ else
+ this.Top = OuterMargin;
+
+ if(Position == OSDPosition.Bottom_Right || Position == OSDPosition.Top_Right)
+ this.Left = area.X + area.Width - this.Width - OuterMargin;
+ else
+ this.Left = OuterMargin;
+
+ }
+ }
+
+ public void Configure(LedSettings settings)
+ {
+ lblLockText.Font = settings.OsdFont;
+
+ cornerTL.Visible = settings.OsdRoundedCorners;
+ cornerTR.Visible = settings.OsdRoundedCorners;
+ cornerBL.Visible = settings.OsdRoundedCorners;
+ cornerBR.Visible = settings.OsdRoundedCorners;
+
+ Position = settings.OsdPosition;
+ this.Padding = new Padding(settings.OsdPadding, settings.OsdPadding, settings.OsdPadding, (int)(settings.OsdPadding)+4);
+ this.OuterMargin = settings.OsdMargin;
+
+ lblLockText.ForeColor = settings.OsdTextColour;
+ this.BackColor = settings.OsdBackColour;
+ this.Opacity = settings.OsdOpacity / 100d;
+ }
+
+ ///
+ /// Hide Show method. Consumer should use ShowLockState.
+ ///
+ new protected void Show()
+ {
+ base.Show();
+ }
+
+ #region DLLImports
+ private const int SW_SHOWNOACTIVATE = 4;
+ private const int HWND_TOPMOST = -1;
+ private const uint SWP_NOACTIVATE = 0x0010;
+
+ [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
+ static extern bool SetWindowPos(
+ int hWnd, // Window handle
+ int hWndInsertAfter, // Placement-order handle
+ int X, // Horizontal position
+ int Y, // Vertical position
+ int cx, // Width
+ int cy, // Height
+ uint uFlags); // Window positioning flags
+
+ [DllImport("user32.dll")]
+ static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
+
+ static void ShowInactiveTopmost(Form frm)
+ {
+ ShowWindow(frm.Handle, SW_SHOWNOACTIVATE);
+ SetWindowPos(frm.Handle.ToInt32(), HWND_TOPMOST,
+ frm.Left, frm.Top, frm.Width, frm.Height,
+ SWP_NOACTIVATE);
+ }
+ #endregion
+ }
+}
diff --git a/LogiLockLED/IndicatorPopup.resx b/LogiLockLED/IndicatorPopup.resx
new file mode 100644
index 0000000..bd6ea23
--- /dev/null
+++ b/LogiLockLED/IndicatorPopup.resx
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ 17, 17
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAABg2lDQ1BJQ0MgcHJvZmlsZQAAKM+VkTlI
+ A0EYhb9ExRsLU6hYbBGtFERFLCWKIihIEiEehbsbEwPZNexGbCwFW8HCo/EqbKy1tbAVBMEDxMrSStFG
+ ZP1nIyQIERwY5uPNvMfMGwgeZE3LrewBy8470bGIlpiZ1aqfqaWVeroJ6aabm4yNxik7Pm4JqPWmW2Xx
+ v9GYXHRNCGjCQ2bOyQsvCA+s5nOKd4RD5pKeFD4V7nLkgsL3SjcK/KI47XNQZYaceHRYOCSspUvYKGFz
+ ybGE+4XDScuW/GCiwEnFa4qt7Ir5c0/1woZFezqmdJntjDHOJFNoGKyQIUte+spgi+ISlf1IGX+b758S
+ lyGuDKY4RljGQvf9qD/43a2b6ustJDVEoOrJ8946oHoLvjY97/PQ876OoOIRLuyif/kABt9F3yxq4X1o
+ Woezy6JmbMP5BrQ85HRH96UKmcFUCl5P5JtmoPka6uYKvf3sc3wHcelq4gp296AzLdnzZd5dU9rbn2f8
+ /oh8A51KcrgVxRv9AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AkZDToMRceIUQAAABl0RVh0
+ Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAACQSURBVDhPYwCC/0Tiz0C8HIjTgdgMiEWAmBmK
+ sWpAxleBOB+IhYEYJ8CmEYR/AnEzEAsCMUGAzYALQBwMxEQDdAMOAbETEJMEkA24BsTOQEwyQDYkGiRA
+ DoAZMAHMIxOADHgGxApgHpkAZEgThEk+ABmiBmGSD3ZDaYpAFZSmCLhBaYoARbECA5xQeiABAwMAbe04
+ h5tuLHkAAAAASUVORK5CYII=
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAABg2lDQ1BJQ0MgcHJvZmlsZQAAKM+VkTlI
+ A0EYhb9ExRsLU6hYbBGtFERFLCWKIihIEiEehbsbEwPZNexGbCwFW8HCo/EqbKy1tbAVBMEDxMrSStFG
+ ZP1nIyQIERwY5uPNvMfMGwgeZE3LrewBy8470bGIlpiZ1aqfqaWVeroJ6aabm4yNxik7Pm4JqPWmW2Xx
+ v9GYXHRNCGjCQ2bOyQsvCA+s5nOKd4RD5pKeFD4V7nLkgsL3SjcK/KI47XNQZYaceHRYOCSspUvYKGFz
+ ybGE+4XDScuW/GCiwEnFa4qt7Ir5c0/1woZFezqmdJntjDHOJFNoGKyQIUte+spgi+ISlf1IGX+b758S
+ lyGuDKY4RljGQvf9qD/43a2b6ustJDVEoOrJ8946oHoLvjY97/PQ876OoOIRLuyif/kABt9F3yxq4X1o
+ Woezy6JmbMP5BrQ85HRH96UKmcFUCl5P5JtmoPka6uYKvf3sc3wHcelq4gp296AzLdnzZd5dU9rbn2f8
+ /oh8A51KcrgVxRv9AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AkZDgcLsw3rFQAAABl0RVh0
+ Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAACOSURBVDhPYxgsgBNKUwQUoDRFwA1KUwSqoDRF
+ YDeUJhuoAfF/CJN80ATEFBkCipVnQEyRIROAGGQA2YZEAzHMALIMcQbia0BMtiFOQHwIiJENIMmQYCC+
+ AMToBhBliCAQNwPxTyDGZgAI4wTCQJwPxFeBGJtGZMzADMUiQGwGxOlAvByIPwMxNg1omOE/AP64OIdb
+ XwznAAAAAElFTkSuQmCC
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAABg2lDQ1BJQ0MgcHJvZmlsZQAAKM+VkTlI
+ A0EYhb9ExRsLU6hYbBGtFERFLCWKIihIEiEehbsbEwPZNexGbCwFW8HCo/EqbKy1tbAVBMEDxMrSStFG
+ ZP1nIyQIERwY5uPNvMfMGwgeZE3LrewBy8470bGIlpiZ1aqfqaWVeroJ6aabm4yNxik7Pm4JqPWmW2Xx
+ v9GYXHRNCGjCQ2bOyQsvCA+s5nOKd4RD5pKeFD4V7nLkgsL3SjcK/KI47XNQZYaceHRYOCSspUvYKGFz
+ ybGE+4XDScuW/GCiwEnFa4qt7Ir5c0/1woZFezqmdJntjDHOJFNoGKyQIUte+spgi+ISlf1IGX+b758S
+ lyGuDKY4RljGQvf9qD/43a2b6ustJDVEoOrJ8946oHoLvjY97/PQ876OoOIRLuyif/kABt9F3yxq4X1o
+ Woezy6JmbMP5BrQ85HRH96UKmcFUCl5P5JtmoPka6uYKvf3sc3wHcelq4gp296AzLdnzZd5dU9rbn2f8
+ /oh8A51KcrgVxRv9AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AkZDgY28n6WRQAAABl0RVh0
+ Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAACJSURBVDhPpdGxDYJQFIXhl1hZGh3AihEcQBIW
+ oHQASnpKXYAtGMKOCWxkBBagopL/JLewwEhy/uTLrd5pXqJdOOGCCh0mfDb62RE13lh7+O1vBzwwY21A
+ NlfiBWtEXdHDGlE5Blgj6gZ7RLWwR84YYY2oO+yRDPaIesa1auJaFXGt9Et2+7hOKS3HBjiHIXCtMQAA
+ AABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAABg2lDQ1BJQ0MgcHJvZmlsZQAAKM+VkTlI
+ A0EYhb9ExRsLU6hYbBGtFERFLCWKIihIEiEehbsbEwPZNexGbCwFW8HCo/EqbKy1tbAVBMEDxMrSStFG
+ ZP1nIyQIERwY5uPNvMfMGwgeZE3LrewBy8470bGIlpiZ1aqfqaWVeroJ6aabm4yNxik7Pm4JqPWmW2Xx
+ v9GYXHRNCGjCQ2bOyQsvCA+s5nOKd4RD5pKeFD4V7nLkgsL3SjcK/KI47XNQZYaceHRYOCSspUvYKGFz
+ ybGE+4XDScuW/GCiwEnFa4qt7Ir5c0/1woZFezqmdJntjDHOJFNoGKyQIUte+spgi+ISlf1IGX+b758S
+ lyGuDKY4RljGQvf9qD/43a2b6ustJDVEoOrJ8946oHoLvjY97/PQ876OoOIRLuyif/kABt9F3yxq4X1o
+ Woezy6JmbMP5BrQ85HRH96UKmcFUCl5P5JtmoPka6uYKvf3sc3wHcelq4gp296AzLdnzZd5dU9rbn2f8
+ /oh8A51KcrgVxRv9AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AkZDgcYN7OqywAAABl0RVh0
+ Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAACXSURBVDhPY6AW4ITSFAEFKE0RcIPSFIEqKE0R
+ 2A2lKQL/gVgNwiQfgAxpgjDJByBDngExRbEEMgSEJ4B5ZAKYISAcDRIgByAbcg2InYGYZIBsCAgfAmIn
+ ICYJoBsCwheAOBiIiQbYDAHhn0DcDMSCQEwQYDMAGV8F4nwgFgZinACbRmz4MxAvB+J0IDYDYhEgZmZg
+ YGAGAKWfOIcmn3/pAAAAAElFTkSuQmCC
+
+
+
\ No newline at end of file
diff --git a/LogiLockLED/LedSettings.cs b/LogiLockLED/LedSettings.cs
index c5e8ad5..ef4b798 100644
--- a/LogiLockLED/LedSettings.cs
+++ b/LogiLockLED/LedSettings.cs
@@ -1,6 +1,7 @@
using System.Windows.Forms;
using System.Drawing;
using Microsoft.Win32;
+using System;
namespace LogiLockLED
{
@@ -19,10 +20,21 @@ public class LedSettings
public Color ScrollOnColour { get; set; }
public Color ScrollOffColour { get; set; }
+ public bool OsdEnabled { get; set; }
+ public Font OsdFont { get; set; }
+ public OSDPosition OsdPosition { get; set; }
+ public int OsdPadding { get; set; }
+ public int OsdMargin { get; set; }
+ public bool OsdRoundedCorners { get; set; }
+ public Color OsdTextColour { get; set; }
+ public Color OsdBackColour { get; set; }
+ public int OsdOpacity { get; set; }
+
private const string appRegKeyName = "LogiLockLED";
public void LoadSettings()
{
+
EnableKeyLockLEDs = Properties.Settings.Default.EnableKeyLockLEDs;
EnableCaps = Properties.Settings.Default.EnableCaps;
EnableNum =Properties.Settings.Default.EnableNum;
@@ -36,7 +48,17 @@ public void LoadSettings()
ScrollOffColour = Properties.Settings.Default.ScrollOffColour;
AutoStartApp = GetAutoStartSetting();
-
+ OsdEnabled = Properties.Settings.Default.OsdEnabled;
+ OsdFont = Properties.Settings.Default.OsdFont;
+ OSDPosition tmpOsdPosition;
+ if (Enum.TryParse(Properties.Settings.Default.OsdPosition, out tmpOsdPosition))
+ OsdPosition = tmpOsdPosition;
+ OsdPadding = Properties.Settings.Default.OsdPadding;
+ OsdMargin = Properties.Settings.Default.OsdMargin;
+ OsdRoundedCorners = Properties.Settings.Default.OsdRoundedCorners;
+ OsdTextColour = Properties.Settings.Default.OsdTextColour;
+ OsdBackColour = Properties.Settings.Default.OsdBackColour;
+ OsdOpacity = Properties.Settings.Default.OsdOpacity;
}
public void SaveSettings()
@@ -52,6 +74,17 @@ public void SaveSettings()
Properties.Settings.Default.NumOffColour = NumOffColour;
Properties.Settings.Default.ScrollOnColour = ScrollOnColour;
Properties.Settings.Default.ScrollOffColour = ScrollOffColour;
+
+ Properties.Settings.Default.OsdEnabled = OsdEnabled;
+ Properties.Settings.Default.OsdFont = OsdFont;
+ Properties.Settings.Default.OsdPosition = OsdPosition.ToString();
+ Properties.Settings.Default.OsdPadding = OsdPadding;
+ Properties.Settings.Default.OsdMargin = OsdMargin;
+ Properties.Settings.Default.OsdRoundedCorners = OsdRoundedCorners;
+ Properties.Settings.Default.OsdTextColour = OsdTextColour;
+ Properties.Settings.Default.OsdBackColour = OsdBackColour;
+ Properties.Settings.Default.OsdOpacity = OsdOpacity;
+
Properties.Settings.Default.Save();
SaveAutoStartSetting();
diff --git a/LogiLockLED/LedThread.cs b/LogiLockLED/LedThread.cs
index 9b5144c..0bc15ee 100644
--- a/LogiLockLED/LedThread.cs
+++ b/LogiLockLED/LedThread.cs
@@ -15,6 +15,7 @@ public class LedThread
private Thread thread;
private bool stopThread;
private bool refreshRequired = false;
+ public event EventHandler KeylockUpdated;
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
public static extern short GetKeyState(int keyCode);
@@ -22,6 +23,7 @@ public class LedThread
public LedThread(ref LedSettings settings)
{
ledSettings = settings;
+
}
public void RestartThread()
@@ -77,6 +79,7 @@ private void ThreadMain()
bool prevCapsLock = (((ushort)GetKeyState(0x14)) & 0xffff) == 0;
bool prevNumLock = (((ushort)GetKeyState(0x90)) & 0xffff) == 0;
bool prevScrollLock = (((ushort)GetKeyState(0x91)) & 0xffff) == 0;
+ bool firstLoop = true;
while (!stopThread)
{
@@ -85,37 +88,59 @@ private void ThreadMain()
bool NumLock = (((ushort)GetKeyState(0x90)) & 0xffff) != 0;
bool ScrollLock = (((ushort)GetKeyState(0x91)) & 0xffff) != 0;
- if ((refreshRequired || prevNumLock != NumLock) && ledSettings.EnableNum)
- {
+ if ((refreshRequired || prevNumLock != NumLock))
+ {
prevNumLock = NumLock;
- if (NumLock)
- LogiLedSetLightingForKeyWithKeyName(keyboardNames.NUM_LOCK, ledSettings.NumOnColour);
- else
- LogiLedSetLightingForKeyWithKeyName(keyboardNames.NUM_LOCK, ledSettings.NumOffColour);
+
+ if(!firstLoop)
+ KeylockUpdated?.Invoke(this, new KeylockChangeArgs(LockKey.Num, NumLock));
+
+ if (ledSettings.EnableNum)
+ {
+ if (NumLock)
+ LogiLedSetLightingForKeyWithKeyName(keyboardNames.NUM_LOCK, ledSettings.NumOnColour);
+ else
+ LogiLedSetLightingForKeyWithKeyName(keyboardNames.NUM_LOCK, ledSettings.NumOffColour);
+ }
}
- if ((refreshRequired || prevCapsLock != CapsLock) && ledSettings.EnableCaps)
+ if ((refreshRequired || prevCapsLock != CapsLock))
{
prevCapsLock = CapsLock;
- if (CapsLock)
- LogiLedSetLightingForKeyWithKeyName(keyboardNames.CAPS_LOCK, ledSettings.CapsOnColour);
- else
- LogiLedSetLightingForKeyWithKeyName(keyboardNames.CAPS_LOCK, ledSettings.CapsOffColour);
+
+ if (!firstLoop)
+ KeylockUpdated?.Invoke(this, new KeylockChangeArgs(LockKey.Caps, CapsLock));
+
+ if (ledSettings.EnableCaps)
+ {
+ if (CapsLock)
+ LogiLedSetLightingForKeyWithKeyName(keyboardNames.CAPS_LOCK, ledSettings.CapsOnColour);
+ else
+ LogiLedSetLightingForKeyWithKeyName(keyboardNames.CAPS_LOCK, ledSettings.CapsOffColour);
+ }
}
- if ((refreshRequired || prevScrollLock != ScrollLock) && ledSettings.EnableScroll)
+ if ((refreshRequired || prevScrollLock != ScrollLock))
{
prevScrollLock = ScrollLock;
- if (ScrollLock)
- LogiLedSetLightingForKeyWithKeyName(keyboardNames.SCROLL_LOCK, ledSettings.ScrollOnColour);
- else
- LogiLedSetLightingForKeyWithKeyName(keyboardNames.SCROLL_LOCK, ledSettings.ScrollOffColour);
+
+ if (!firstLoop)
+ KeylockUpdated?.Invoke(this, new KeylockChangeArgs(LockKey.Scroll, ScrollLock));
+
+ if (ledSettings.EnableScroll)
+ {
+ if (ScrollLock)
+ LogiLedSetLightingForKeyWithKeyName(keyboardNames.SCROLL_LOCK, ledSettings.ScrollOnColour);
+ else
+ LogiLedSetLightingForKeyWithKeyName(keyboardNames.SCROLL_LOCK, ledSettings.ScrollOffColour);
+ }
}
refreshRequired = false;
- Thread.Sleep(100);
+ firstLoop = false;
+ Thread.Sleep(75);
}
- LogitechGSDK.LogiLedShutdown();
+ //LogitechGSDK.LogiLedShutdown();
}
private static bool LogiLedSetLightingForKeyWithKeyName(keyboardNames keyCode, System.Drawing.Color color)
@@ -123,4 +148,20 @@ private static bool LogiLedSetLightingForKeyWithKeyName(keyboardNames keyCode, S
return LogitechGSDK.LogiLedSetLightingForKeyWithKeyName(keyCode, color.R * 100 / 255, color.G * 100 / 255, color.B * 100 / 255);
}
}
+
+ public enum LockKey { Caps, Num, Scroll};
+
+ public class KeylockChangeArgs : EventArgs
+ {
+ public LockKey LockKey { get; set; }
+ public bool IsOn { get; set; }
+
+ public KeylockChangeArgs(LockKey lockKey, bool isOn)
+ {
+ this.LockKey = lockKey;
+ this.IsOn = isOn;
+ }
+
+ }
+
}
diff --git a/LogiLockLED/LogiLockLED.csproj b/LogiLockLED/LogiLockLED.csproj
index 2c39e86..0f428eb 100644
--- a/LogiLockLED/LogiLockLED.csproj
+++ b/LogiLockLED/LogiLockLED.csproj
@@ -53,8 +53,7 @@
false
-
-
+ LogiLockLED.ico
DB700B4E29B3FC7EB40F17534E91D085E9467935
@@ -88,6 +87,12 @@
+
+ Form
+
+
+ IndicatorPopup.cs
+
Form
@@ -103,6 +108,9 @@
ConfigurationForm.cs
+
+ IndicatorPopup.cs
+
ResXFileCodeGenerator
Designer
@@ -144,6 +152,7 @@
+
Always
diff --git a/LogiLockLED/LogiLockLED.ico b/LogiLockLED/LogiLockLED.ico
new file mode 100644
index 0000000..bc11646
Binary files /dev/null and b/LogiLockLED/LogiLockLED.ico differ
diff --git a/LogiLockLED/LogiLockLED.xcf b/LogiLockLED/LogiLockLED.xcf
new file mode 100644
index 0000000..b6d7cd9
Binary files /dev/null and b/LogiLockLED/LogiLockLED.xcf differ
diff --git a/LogiLockLED/LogiLockLEDApp.cs b/LogiLockLED/LogiLockLEDApp.cs
index b659df6..d71b84a 100644
--- a/LogiLockLED/LogiLockLEDApp.cs
+++ b/LogiLockLED/LogiLockLEDApp.cs
@@ -9,8 +9,8 @@ class LogiLockLEDApp : ApplicationContext
private readonly LedThread ledThread;
private readonly NotifyIcon notifyIcon;
private readonly ConfigurationForm configWindow;
- private readonly LedSettings ledSettings;
-
+ private readonly IndicatorPopup popupWindow;
+ private readonly LedSettings ledSettings;
private readonly MenuItem configEnableItem;
public LogiLockLEDApp()
@@ -18,32 +18,49 @@ public LogiLockLEDApp()
ledSettings = new LedSettings();
ledSettings.LoadSettings();
- ledThread = new LedThread(ref ledSettings);
- ledThread.StartThread();
-
configWindow = new ConfigurationForm(ref ledSettings);
configWindow.SettingsUpdated += ConfigWindow_OnSettingsUpdated;
+ popupWindow = new IndicatorPopup();
+ popupWindow.Configure(ledSettings);
+ //popupWindow.LoadForm();
- configEnableItem = new MenuItem("Enabled", new EventHandler(ToggleEnabled));
- configEnableItem.Checked = ledSettings.EnableKeyLockLEDs;
- MenuItem configMenuItem = new MenuItem("Configuration", new EventHandler(ShowConfig));
- MenuItem exitMenuItem = new MenuItem("Exit", new EventHandler(Exit));
+ ledThread = new LedThread(ref ledSettings);
+ ledThread.KeylockUpdated += ledThread_OnKeylockUpdated;
+ ledThread.StartThread();
+ configEnableItem = new MenuItem("Enabled", new EventHandler(ToggleEnabled)) {
+ Checked = ledSettings.EnableKeyLockLEDs };
+
notifyIcon = new NotifyIcon();
notifyIcon.Icon = Properties.Resources.appicon;
- notifyIcon.ContextMenu = new ContextMenu(new MenuItem[]
- { configEnableItem, configMenuItem, exitMenuItem });
+ notifyIcon.ContextMenu = new ContextMenu(new MenuItem[]{
+ new MenuItem("LogiLockLED") { Enabled = false},
+ new MenuItem("-"),
+ configEnableItem,
+ new MenuItem("Configuration", new EventHandler(ShowConfig)),
+ new MenuItem("Exit", new EventHandler(Exit))
+ });
notifyIcon.DoubleClick += ShowConfig;
notifyIcon.Visible = true;
- SystemEvents.PowerModeChanged += OnPowerModeChange;
- }
-
+ SystemEvents.PowerModeChanged += OnPowerModeChange;
+ }
+
+ private void ledThread_OnKeylockUpdated(object sender, EventArgs e)
+ {
+ var args = (e as KeylockChangeArgs);
+ if (ledSettings.OsdEnabled)
+ {
+ popupWindow.Invoke(new Action(popupWindow.ShowLockState), args.LockKey, args.IsOn);
+ }
+ }
private void ConfigWindow_OnSettingsUpdated(object sender, EventArgs e)
{
+ popupWindow.Configure(ledSettings);
ledThread.UpdateSettings(ledSettings);
- }
+
+ }
private void ShowConfig(object sender, EventArgs e)
{
@@ -76,7 +93,7 @@ private void Exit(object sender, EventArgs e)
this.ExitThread();
Application.Exit();
- }
+ }
private void OnPowerModeChange(object s, PowerModeChangedEventArgs e)
{
diff --git a/LogiLockLED/Properties/Settings.Designer.cs b/LogiLockLED/Properties/Settings.Designer.cs
index c313c0c..169226b 100644
--- a/LogiLockLED/Properties/Settings.Designer.cs
+++ b/LogiLockLED/Properties/Settings.Designer.cs
@@ -142,5 +142,113 @@ public bool EnableKeyLockLEDs {
this["EnableKeyLockLEDs"] = value;
}
}
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Arial, 48pt, style=Bold, Italic")]
+ public global::System.Drawing.Font OsdFont {
+ get {
+ return ((global::System.Drawing.Font)(this["OsdFont"]));
+ }
+ set {
+ this["OsdFont"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Centre")]
+ public string OsdPosition {
+ get {
+ return ((string)(this["OsdPosition"]));
+ }
+ set {
+ this["OsdPosition"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("8")]
+ public int OsdPadding {
+ get {
+ return ((int)(this["OsdPadding"]));
+ }
+ set {
+ this["OsdPadding"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("8")]
+ public int OsdMargin {
+ get {
+ return ((int)(this["OsdMargin"]));
+ }
+ set {
+ this["OsdMargin"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool OsdRoundedCorners {
+ get {
+ return ((bool)(this["OsdRoundedCorners"]));
+ }
+ set {
+ this["OsdRoundedCorners"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool OsdEnabled {
+ get {
+ return ((bool)(this["OsdEnabled"]));
+ }
+ set {
+ this["OsdEnabled"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("White")]
+ public global::System.Drawing.Color OsdTextColour {
+ get {
+ return ((global::System.Drawing.Color)(this["OsdTextColour"]));
+ }
+ set {
+ this["OsdTextColour"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("3, 3, 3")]
+ public global::System.Drawing.Color OsdBackColour {
+ get {
+ return ((global::System.Drawing.Color)(this["OsdBackColour"]));
+ }
+ set {
+ this["OsdBackColour"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("75")]
+ public int OsdOpacity {
+ get {
+ return ((int)(this["OsdOpacity"]));
+ }
+ set {
+ this["OsdOpacity"] = value;
+ }
+ }
}
}
diff --git a/LogiLockLED/Properties/Settings.settings b/LogiLockLED/Properties/Settings.settings
index 2225389..6f4b5cd 100644
--- a/LogiLockLED/Properties/Settings.settings
+++ b/LogiLockLED/Properties/Settings.settings
@@ -32,5 +32,32 @@
True
+
+ Arial, 48pt, style=Bold, Italic
+
+
+ Centre
+
+
+ 8
+
+
+ 8
+
+
+ True
+
+
+ True
+
+
+ White
+
+
+ 3, 3, 3
+
+
+ 75
+
\ No newline at end of file
diff --git a/LogiLockLED/Resources/appicon.ico b/LogiLockLED/Resources/appicon.ico
index 8aa98e5..fc28d0f 100644
Binary files a/LogiLockLED/Resources/appicon.ico and b/LogiLockLED/Resources/appicon.ico differ
diff --git a/Setup LogiLockLED/Setup LogiLockLED.vdproj b/Setup LogiLockLED/Setup LogiLockLED.vdproj
index 97dadf4..e1d2a5b 100644
--- a/Setup LogiLockLED/Setup LogiLockLED.vdproj
+++ b/Setup LogiLockLED/Setup LogiLockLED.vdproj
@@ -220,7 +220,7 @@
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:LogiLockLED"
"ProductCode" = "8:{9D536C35-D614-42F1-8D8B-B6CD604EBF6A}"
- "PackageCode" = "8:{01E03ACB-62FF-4EE2-9BA2-0C2940FC1895}"
+ "PackageCode" = "8:{EB25EC29-C4A5-4B5F-89ED-568735D0C0F8}"
"UpgradeCode" = "8:{78AFA0F5-6764-47BF-AB9E-B70F753BFF36}"
"AspNetVersion" = "8:4.0.30319.0"
"RestartWWWService" = "11:FALSE"
@@ -819,7 +819,7 @@
{
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_07E4DEC6E9E3405884DB88A2424013E6"
{
- "SourcePath" = "8:..\\LogiLockLED\\obj\\Release\\LogiLockLED.exe"
+ "SourcePath" = "8:..\\LogiLockLED\\obj\\Debug\\LogiLockLED.exe"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_36D160D8655A4CDC84075D1F1CDB81FE"