[Spice-devel] [PATCH][spice-html5] prevent out of sync modifier keys

Aric Stewart aric at codeweavers.com
Thu Aug 16 05:07:05 PDT 2012


Signed-off-by: Aric Stewart <aric at codeweavers.com>
---
 inputs.js |   86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 86 insertions(+), 0 deletions(-)

diff --git a/inputs.js b/inputs.js
index ce1d15e..57ee626 100644
--- a/inputs.js
+++ b/inputs.js
@@ -18,6 +18,15 @@
    along with spice-html5.  If not, see <http://www.gnu.org/licenses/>.
 */
+ /*----------------------------------------------------------------------------
+ ** Modifier Keystates
+ **     These need to be tracked because focus in and out can get the keyboard
+ **     out of sync.
+ **------------------------------------------------------------------------*/
+var Shift_state = -1;
+var Ctrl_state = -1;
+var Alt_state = -1;
+var Meta_state = -1;
  /*----------------------------------------------------------------------------
  **  SpiceInputsConn
@@ -146,6 +155,7 @@ function handle_keydown(e)
 {
     var key = new SpiceMsgcKeyDown(e)
     var msg = new SpiceMiniData();
+    check_and_update_modifiers(e, key.code, this.sc);
     msg.build_msg(SPICE_MSGC_INPUTS_KEY_DOWN, key);
     if (this.sc && this.sc.inputs)
         this.sc.inputs.send_msg(msg);
@@ -157,9 +167,85 @@ function handle_keyup(e)
 {
     var key = new SpiceMsgcKeyUp(e)
     var msg = new SpiceMiniData();
+    check_and_update_modifiers(e, key.code, this.sc);
     msg.build_msg(SPICE_MSGC_INPUTS_KEY_UP, key);
     if (this.sc && this.sc.inputs)
         this.sc.inputs.send_msg(msg);
      e.preventDefault();
 }
+
+function update_modifier(state, code, sc)
+{
+    var msg = new SpiceMiniData();
+    if (!state)
+    {
+        var key = new SpiceMsgcKeyUp()
+        key.code =(0x80|code);
+        msg.build_msg(SPICE_MSGC_INPUTS_KEY_UP, key);
+    }
+    else
+    {
+        var key = new SpiceMsgcKeyDown()
+        key.code = code;
+        msg.build_msg(SPICE_MSGC_INPUTS_KEY_DOWN, key);
+    }
+
+    sc.inputs.send_msg(msg);
+}
+
+function check_and_update_modifiers(e, code, sc)
+{
+    if (Shift_state === -1)
+    {
+        Shift_state = e.shiftKey;
+        Ctrl_state = e.ctrlKey;
+        Alt_state = e.altKey;
+        Meta_state = e.metaKey;
+    }
+
+    if (code === KEY_ShiftL)
+        Shift_state = true;
+    else if (code === KEY_Alt)
+        Alt_state = true;
+    else if (code === KEY_LCtrl)
+        Ctrl_state = true;
+    else if (code === 0xE0B5)
+        Meta_state = true;
+    else if (code === (0x80|KEY_ShiftL))
+        Shift_state = false;
+    else if (code === (0x80|KEY_Alt))
+        Alt_state = false;
+    else if (code === (0x80|KEY_LCtrl))
+        Ctrl_state = false;
+    else if (code === (0x80|0xE0B5))
+        Meta_state = false;
+
+    if (sc && sc.inputs)
+    {
+        if (Shift_state != e.shiftKey)
+        {
+            console.log("Shift state out of sync");
+            update_modifier(e.shiftKey, KEY_ShiftL, sc);
+            Shift_state = e.shiftKey;
+        }
+        if (Alt_state != e.altKey)
+        {
+            console.log("Alt state out of sync");
+            update_modifier(e.altKey, KEY_Alt, sc);
+            Alt_state = e.altKey;
+        }
+        if (Ctrl_state != e.ctrlKey)
+        {
+            console.log("Ctrl state out of sync");
+            update_modifier(e.ctrlKey, KEY_LCtrl, sc);
+            Ctrl_state = e.ctrlKey;
+        }
+        if (Meta_state != e.metaKey)
+        {
+            console.log("Meta state out of sync");
+            update_modifier(e.metaKey, 0xE0B5, sc);
+            Meta_state = e.metaKey;
+        }
+    }
+}
-- 
1.7.7.5 (Apple Git-26)



More information about the Spice-devel mailing list