This allows using the Windows-logo key as a modifier. It used to
trigger meta modifier, but changed to os modifier in recent xulrunner
versions (probably from 12).

See http://bugs.conkeror.org/issue410
---
 modules/commands.js |    1 +
 modules/input.js    |    2 ++
 modules/keymap.js   |   23 ++++++++++++++++++++++-
 3 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/modules/commands.js b/modules/commands.js
index 379b50f..d1921a6 100644
--- a/modules/commands.js
+++ b/modules/commands.js
@@ -336,6 +336,7 @@ function send_key_as_event (window, element, combo) {
         split.metaKey,
         split.keyCode,
         split.charCode);
+    event.osKey = split.osKey;
     if (element) {
         return element.dispatchEvent(event);
     } else {
diff --git a/modules/input.js b/modules/input.js
index 6adbec1..327917e 100644
--- a/modules/input.js
+++ b/modules/input.js
@@ -42,6 +42,8 @@ function event_clone (event) {
     this.altKey = event.altKey;
     this.shiftKey = event.shiftKey;
     this.sticky_modifiers = event.sticky_modifiers;
+
+    this.osKey = osKey(event);
 }
 
 
diff --git a/modules/keymap.js b/modules/keymap.js
index ee02f22..2b0b9d4 100644
--- a/modules/keymap.js
+++ b/modules/keymap.js
@@ -33,6 +33,18 @@ function modifier (in_event_p, set_in_event) {
     this.set_in_event = set_in_event;
 }
 
+// xulrunner os-key modifier (version >= 15)
+function osKey (event) {
+    // For events cloned by event_clone, or faked by
+    // send_key_as_event
+    if (event.osKey)
+        return true;
+    // For original/real events
+    if (typeof event.getModifierState == "function")
+        return event.getModifierState("OS");
+    return false;
+}
+
 var modifiers = {
     A: new modifier(function (event) { return event.altKey; },
                     function (event) { event.altKey = true; }),
@@ -75,6 +87,10 @@ if (get_os() == 'Darwin') {
     modifier_order = ['C', 'M', 'A', 'S'];
 } else {
     modifiers.M = modifiers.A;
+    // 
https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent#getModifierState()
+    modifiers.s = new modifier(function(event) { return osKey(event); },
+                               function(event) { event.osKey = true; });
+    modifier_order = ['C', 'M', 'S', 's'];
 }
 
 
@@ -117,7 +133,8 @@ function unformat_key_combo (combo) {
         altKey: false,
         ctrlKey: false,
         metaKey: false,
-        shiftKey: false
+        shiftKey: false,
+        osKey: false
     };
     var M;
     var i = 0;
@@ -199,6 +216,7 @@ 
define_key_match_predicate('match_any_unmodified_character', 'any unmodified cha
                     || event.keyCode > 31)
                 && !modifiers.A.in_event_p(event)
                 && !event.metaKey
+                && !osKey(event)
                 && !event.ctrlKey
                 && !event.sticky_modifiers;
         } catch (e) { return false; }
@@ -209,6 +227,7 @@ define_key_match_predicate('match_checkbox_keys', 'checkbox 
keys',
         return event.keyCode == 32
             && !event.shiftKey
             && !event.metaKey
+            && !osKey(event)
             && !event.altKey
             && !event.ctrlKey;
         //XXX: keycode fallthroughs don't support sticky modifiers
@@ -220,6 +239,7 @@ define_key_match_predicate('match_text_keys', 'text editing 
keys',
                 || event.keyCode == 13 || event.keyCode > 31)
             && !event.ctrlKey
             && !event.metaKey
+            && !osKey(event)
             && !modifiers.A.in_event_p(event);
         //XXX: keycode fallthroughs don't support sticky modifiers
     });
@@ -229,6 +249,7 @@ define_key_match_predicate('match_not_escape_key', 'any key 
but escape',
         return event.keyCode != 27 ||
              event.shiftKey ||
              event.altKey ||
+             osKey(event) ||
              event.metaKey || // M-escape can also leave this mode, so we
                               // need to use an accurate determination of
                               // whether the "M" modifier was pressed,
-- 
1.7.9.5

_______________________________________________
Conkeror mailing list
Conkeror@mozdev.org
https://www.mozdev.org/mailman/listinfo/conkeror

Reply via email to