# HG changeset patch
# User sl
# Date 1419416265 -3600
# Node ID 219e9a4184563e0d3e51b993dd7d15067ee32b31
# Parent  dd603eba46ca6c7dcd7949da8f6e402e6acae98f
Fixing stray event issues.
diff -r dd603eba46ca -r 219e9a418456 HidEvent.cs
--- a/HidEvent.cs	Tue Dec 23 23:05:23 2014 +0100
+++ b/HidEvent.cs	Wed Dec 24 11:17:45 2014 +0100
@@ -17,13 +17,14 @@
     public class HidEvent: IDisposable
     {
         public bool IsValid { get; private set; }
-        public bool IsForeground { get; private set; }
+        public bool IsForeground { get; private set; }        
         public bool IsBackground { get{return !IsForeground;} }
         public bool IsMouse { get; private set; }
         public bool IsKeyboard { get; private set; }
         public bool IsGeneric { get; private set; }
         public bool IsButtonDown { get { return Usages.Count == 1 && Usages[0] != 0; } }
         public bool IsButtonUp { get { return Usages.Count == 1 && Usages[0] == 0; } }
+        public bool IsRepeat { get; private set; }
 
         public HidDevice Device { get; private set; }
 
@@ -36,6 +37,12 @@
 
         private System.Timers.Timer Timer { get; set; }
 
+        /// 
+        /// Tells whether this event has already been disposed of.
+        /// 
+        public bool IsStray { get { return Timer == null; } }
+
+
 
         public void Dispose()
         {
@@ -50,6 +57,7 @@
         /// Device Handle as provided by RAWINPUTHEADER.hDevice, typically accessed as rawinput.header.hDevice
         public HidEvent(Message aMessage, HidEventRepeatDelegate aRepeatDelegate)
         {
+            IsRepeat = false;
             IsValid = false;
             IsKeyboard = false;
             IsGeneric = false;
@@ -220,31 +228,6 @@
             }
         }
 
-
-        public ListViewItem ListViewItem
-        {
-            get
-                {
-                //TODO: What to do with multiple usage
-                string usage="";
-                UsagePage usagePage=(UsagePage)UsagePage;
-                switch (usagePage)
-                {
-                    case Hid.UsagePage.Consumer:
-                        usage= ((Hid.UsageTables.ConsumerControl)Usages[0]).ToString();
-                        break;
-
-                    case Hid.UsagePage.WindowsMediaCenterRemoteControl:
-                        usage= ((Hid.UsageTables.WindowsMediaCenterRemoteControl)Usages[0]).ToString();
-                        break;
-                        
-                }
-
-                ListViewItem item = new ListViewItem(new[] { usage, UsagePage.ToString("X2"), UsageCollection.ToString("X2") });
-                return item;
-                }
-        }
-
         public void StartRepeatTimer(double aInterval)
         {
             if (Timer == null)
@@ -260,10 +243,37 @@
 
         private void OnRepeatTimerElapsed(object sender, ElapsedEventArgs e, HidEvent aHidEvent)
         {
+            if (aHidEvent.IsStray)
+            {
+                //Skip events if canceled
+                return;
+            }
+            aHidEvent.IsRepeat = true;
             StartRepeatTimer(1000/(SystemInformation.KeyboardSpeed+2.5));            
             OnHidEventRepeat(aHidEvent);
         }
 
+        public ListViewItem ToListViewItem()
+        {
+            //TODO: What to do with multiple usage
+            string usage = "";
+            UsagePage usagePage = (UsagePage)UsagePage;
+            switch (usagePage)
+            {
+                case Hid.UsagePage.Consumer:
+                    usage = ((Hid.UsageTables.ConsumerControl)Usages[0]).ToString();
+                    break;
+
+                case Hid.UsagePage.WindowsMediaCenterRemoteControl:
+                    usage = ((Hid.UsageTables.WindowsMediaCenterRemoteControl)Usages[0]).ToString();
+                    break;
+
+            }
+
+            ListViewItem item = new ListViewItem(new[] { usage, UsagePage.ToString("X2"), UsageCollection.ToString("X2"), IsRepeat.ToString() });
+            return item;
+        }
+
     }
 
 }
\ No newline at end of file
diff -r dd603eba46ca -r 219e9a418456 MainForm.cs
--- a/MainForm.cs	Tue Dec 23 23:05:23 2014 +0100
+++ b/MainForm.cs	Wed Dec 24 11:17:45 2014 +0100
@@ -24,6 +24,7 @@
         private ColumnHeader columnHeaderUsage;
         private ColumnHeader columnHeaderUsagePage;
         private ColumnHeader columnHeaderUsageCollection;
+        private ColumnHeader columnHeaderRepeat;
 		private Timer _timer;
 
         public delegate void OnHidEventDelegate(object aSender, Hid.HidEvent aHidEvent);
@@ -69,6 +70,7 @@
             this.columnHeaderUsage = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
             this.columnHeaderUsagePage = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
             this.columnHeaderUsageCollection = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.columnHeaderRepeat = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
             this.SuspendLayout();
             // 
             // labelButtonName
@@ -100,7 +102,8 @@
             this.listViewEvents.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
             this.columnHeaderUsage,
             this.columnHeaderUsagePage,
-            this.columnHeaderUsageCollection});
+            this.columnHeaderUsageCollection,
+            this.columnHeaderRepeat});
             this.listViewEvents.GridLines = true;
             this.listViewEvents.Location = new System.Drawing.Point(12, 12);
             this.listViewEvents.Name = "listViewEvents";
@@ -124,6 +127,10 @@
             this.columnHeaderUsageCollection.Text = "Usage Collection";
             this.columnHeaderUsageCollection.Width = 120;
             // 
+            // columnHeaderRepeat
+            // 
+            this.columnHeaderRepeat.Text = "Repeat";
+            // 
             // MainForm
             // 
             this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
@@ -159,6 +166,12 @@
 
         public void HandleHidEventThreadSafe(object aSender, Hid.HidEvent aHidEvent)
         {
+            if (aHidEvent.IsStray)
+            {
+                //Stray event just ignore it
+                return;
+            }
+
             if (this.InvokeRequired)
             {
                 //Not in the proper thread, invoke ourselves
@@ -168,7 +181,7 @@
             else
             {
                 //We are in the proper thread
-                listViewEvents.Items.Insert(0, aHidEvent.ListViewItem);
+                listViewEvents.Items.Insert(0, aHidEvent.ToListViewItem());
             }
         }