From a4cb1430b5286f2dd8a1fd1dc15d7c12fd0382fd Mon Sep 17 00:00:00 2001
From: Ian C <ianc@noddybox.co.uk>
Date: Wed, 2 May 2012 22:19:34 +0000
Subject: Improved event handling and added event to propagate touches the
 keyboard is not interested in.

---
 .../KeyboardDriver.cs                              | 76 ++++++++++++++++------
 1 file changed, 56 insertions(+), 20 deletions(-)

(limited to 'src')

diff --git a/src/Noddybox.Emulation.Xna.Keyboard/KeyboardDriver.cs b/src/Noddybox.Emulation.Xna.Keyboard/KeyboardDriver.cs
index b0671b8..1b6f61c 100644
--- a/src/Noddybox.Emulation.Xna.Keyboard/KeyboardDriver.cs
+++ b/src/Noddybox.Emulation.Xna.Keyboard/KeyboardDriver.cs
@@ -37,7 +37,7 @@ namespace Noddybox.Emulation.Xna.Keyboard
         /// <summary>
         /// Event data when a key is pressed or released.
         /// </summary>
-        public class KeyPress : EventArgs
+        public class KeyPressEventArgs : EventArgs
         {
             /// <summary>
             /// The key that was pressed.
@@ -50,6 +50,17 @@ namespace Noddybox.Emulation.Xna.Keyboard
             public bool Pressed {get; set;}
         }
 
+        /// <summary>
+        /// Event data when the screen is touched away from a key.
+        /// </summary>
+        public class TouchLocationEventArgs : EventArgs
+        {
+            /// <summary>
+            /// The touch.
+            /// </summary>
+            public TouchLocation Location {get; set;}
+        }
+
         #endregion
 
         #region Private data
@@ -59,6 +70,7 @@ namespace Noddybox.Emulation.Xna.Keyboard
             public T Symbol {get;set;}
             public bool IsPressed {get; set;}
             public bool IsSticky {get; set;}
+            public int TouchId {get; set;}
         }
 
         private Rectangle[] keymapPos;
@@ -73,14 +85,6 @@ namespace Noddybox.Emulation.Xna.Keyboard
 
         #region Private members
 
-        private void RaiseKeyChange(KeyState state)
-        {
-            if (KeyEvent != null)
-            {
-                KeyEvent(this, new KeyPress() {Key = state.Symbol, Pressed = state.IsPressed});
-            }
-        }
-
         #endregion
 
         #region Public members
@@ -97,18 +101,21 @@ namespace Noddybox.Emulation.Xna.Keyboard
                 int f = 0;
                 KeyState key = null;
 
-                for(f = 0; f < keymapSize && key == null; f++)
+
+                if (t.State == TouchLocationState.Pressed)
                 {
-                    if (keymapPos[f].Contains(x, y))
+                    for(f = 0; f < keymapSize && key == null; f++)
                     {
-                        key = keymapState[f];
+                        if (keymapPos[f].Contains(x, y))
+                        {
+                            key = keymapState[f];
+                        }
                     }
-                }
 
-                if (key != null)
-                {
-                    if (t.State == TouchLocationState.Pressed)
+                    if (key != null)
                     {
+                        key.TouchId = t.Id;
+
                         if (key.IsSticky)
                         {
                             key.IsPressed = !key.IsPressed;
@@ -118,17 +125,45 @@ namespace Noddybox.Emulation.Xna.Keyboard
                             key.IsPressed = true;
                         }
 
-                        RaiseKeyChange(key);
+                        if (KeyEvent != null)
+                        {
+                            KeyEvent(this, new KeyPressEventArgs() {Key = key.Symbol, Pressed = key.IsPressed});
+                        }
+                    }
+                }
+                else if (t.State == TouchLocationState.Released)
+                {
+                    for(f = 0; f < keymapSize && key == null; f++)
+                    {
+                        if (keymapState[f].TouchId == t.Id)
+                        {
+                            key = keymapState[f];
+                        }
                     }
-                    else if (t.State == TouchLocationState.Released)
+
+                    if (key != null)
                     {
                         if (!key.IsSticky)
                         {
                             key.IsPressed = false;
-                            RaiseKeyChange(key);
+
+                            if (KeyEvent != null)
+                            {
+                                KeyEvent(this, new KeyPressEventArgs() {Key = key.Symbol, Pressed = key.IsPressed});
+                            }
                         }
                     }
                 }
+
+                // If no key handled, pass on the event
+                //
+                if (key == null && keymapState.Where(r => r.TouchId == t.Id).Count() == 0)
+                {
+                    if (TouchEvent != null)
+                    {
+                        TouchEvent(this, new TouchLocationEventArgs() {Location = t});
+                    }
+                }
             }
         }
 
@@ -153,7 +188,8 @@ namespace Noddybox.Emulation.Xna.Keyboard
 
         #region Events
 
-        public EventHandler<KeyPress> KeyEvent;
+        public EventHandler<KeyPressEventArgs> KeyEvent;
+        public EventHandler<TouchLocationEventArgs> TouchEvent;
 
         #endregion
 
-- 
cgit v1.2.3