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) {