From 1caf0d1f454dc9f3289304917adc1fe54c97de51 Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Wed, 3 Nov 2010 03:35:31 -0400 Subject: [PATCH] Allow key names. --HG-- extra : rebase_source : 659bc3b0faab56e52c584e514411fa7cacd8af77 --- common/content/dactyl.js | 3 ++- common/content/events.js | 45 +++++++++++++++++++++---------------- common/locale/en-US/map.xml | 7 +++++- common/modules/services.jsm | 3 +-- 4 files changed, 35 insertions(+), 23 deletions(-) diff --git a/common/content/dactyl.js b/common/content/dactyl.js index ce55fa14..cf441ce1 100644 --- a/common/content/dactyl.js +++ b/common/content/dactyl.js @@ -1978,7 +1978,8 @@ const Dactyl = Module("dactyl", { dactyl.version = addon.version + " (created: @DATE@)"; }); - services.add("commandLineHandler", "@mozilla.org/commandlinehandler/general-startup;1?type=" + config.name); + if (!services.get("commandLineHandler")) + services.add("commandLineHandler", "@mozilla.org/commandlinehandler/general-startup;1?type=" + config.name); let commandline = services.get("commandLineHandler").optionValue; if (commandline) { diff --git a/common/content/events.js b/common/content/events.js index 94c7a312..38d5d9a2 100644 --- a/common/content/events.js +++ b/common/content/events.js @@ -250,25 +250,28 @@ const Events = Module("events", { util.threadYield(1, true); for (let [, evt_obj] in Iterator(events.fromString(keys))) { - let elem = dactyl.focus || window.content; - let evt = events.create(doc, "keypress", evt_obj); + delete evt_obj.type; + for (let type in values(["keydown", "keyup", "keypress"])) { + let elem = dactyl.focus || buffer.focusedFrame; + let evt = events.create(doc, type, evt_obj); - if (typeof noremap == "object") - for (let [k, v] in Iterator(noremap)) - evt[k] = v; - else - evt.noremap = !!noremap; - evt.isMacro = true; - // A special hack for dactyl-specific key names. - if (evt_obj.dactylString || evt_obj.dactylShift) { - evt.dactylString = evt_obj.dactylString; // for key-less keypress events e.g. - evt.dactylShift = evt_obj.dactylShift; // for untypeable shift keys e.g. - events.onKeyPress(evt); + if (isObject(noremap)) + update(evt, noremap); + else + evt.noremap = !!noremap; + evt.isMacro = true; + + // A special hack for dactyl-specific key names. + if (!evt_obj.dactylString && !evt_obj.dactylShift) + elem.dispatchEvent(evt); + else { + evt.dactylString = evt_obj.dactylString; // for key-less keypress events e.g. + evt.dactylShift = evt_obj.dactylShift; // for untypeable shift keys e.g. + events.onKeyPress(evt); + break; + } } - else - elem.dispatchEvent(evt); - if (!this.feedingKeys) break; @@ -387,9 +390,11 @@ const Events = Module("events", { modifier = modifier.toUpperCase(); keyname = keyname.toLowerCase(); evt_obj.dactylKeyname = keyname; + if (/^u[0-9a-f]+$/.test(keyname)) + keyname = String.fromCharCode(parseInt(keyname.substr(1), 16)); - if (keyname && !(keyname.length == 1 && modifier.length == 0 || // disallow <> and - !(unknownOk || keyname.length == 1 || this._key_code[keyname] || keyname == "nop" || /mouse$/.test(keyname)))) { // disallow + if (keyname && (unknownOk || keyname.length == 1 || /mouse$/.test(keyname) || + this._key_code[keyname] || keyname == "nop")) { evt_obj.ctrlKey = /C-/.test(modifier); evt_obj.altKey = /A-/.test(modifier); evt_obj.shiftKey = /S-/.test(modifier); @@ -448,7 +453,7 @@ const Events = Module("events", { */ toString: function toString(event) { if (!event) - return "[instance events]"; + return toString.supercall(this); if (event.dactylString) return event.dactylString; @@ -515,6 +520,8 @@ const Events = Module("events", { // or if the shift has been forced for a non-alphabetical character by the user while :map-ping if ((key != key.toLowerCase() && (event.ctrlKey || event.altKey || event.metaKey)) || event.dactylShift) modifier += "S-"; + if (/^\s$/.test(key)) + key = let (s = charCode.toString(16)) "U" + "0000".substr(4 - s.length) + s; else if (modifier.length == 0) return key; } diff --git a/common/locale/en-US/map.xml b/common/locale/en-US/map.xml index 2b02e50f..8e7bf7f9 100644 --- a/common/locale/en-US/map.xml +++ b/common/locale/en-US/map.xml @@ -283,6 +283,11 @@ through represent keys on the numeric keypad. +
  • + , where xxxx is any 4 hexadecimal + digits, represents the character at that Unicode codepoint. + For instance, represents ☺. +
  • @@ -298,7 +303,7 @@

    - These prefixes can be combined however you see fit, though you + These prefixes man be combined however you see fit, though you should note that within angle brackets all alphabetic characters are read as lowercase. Uppercase characters can only be specified with the S- modifier. The following key diff --git a/common/modules/services.jsm b/common/modules/services.jsm index 7452d405..07bc9ea3 100644 --- a/common/modules/services.jsm +++ b/common/modules/services.jsm @@ -73,8 +73,7 @@ const Services = Module("Services", { let res = Cc[classes][meth || "getService"](); if (!ifaces) return res.wrappedJSObject; - ifaces = Array.concat(ifaces); - ifaces.forEach(function (iface) res.QueryInterface(iface)); + Array.concat(ifaces).forEach(function (iface) res.QueryInterface(iface)); return res; } catch (e) {