| @@ -7,38 +7,20 @@ var conf = { | |||
| location_change_check_timeout: 2000 | |||
| } | |||
| var keys = { | |||
| scroll_up: {code: "T"}, | |||
| scroll_down: {code: "N"}, | |||
| scroll_up_fast: {code: 219, shiftKey: true}, | |||
| scroll_down_fast: {code: 221, shiftKey: true}, | |||
| var keys = {}; | |||
| blobs_show: {code: "D"}, | |||
| blobs_hide: {code: 27}, | |||
| blobs_click: {code: 13}, | |||
| blobs_click_new_tab: {code: 13, shiftKey: true}, | |||
| blobs_backspace: {code: 8}, | |||
| elem_deselect: {code: 27}, | |||
| change_tab_left: {code: "H"}, | |||
| change_tab_right: {code: "S"}, | |||
| move_tab_left: {code: "H", shiftKey: true}, | |||
| move_tab_right: {code: "S", shiftKey: true}, | |||
| history_back: {code: "H", ctrlKey: true}, | |||
| history_forward: {code: "S", ctrlKey: true} | |||
| } | |||
| for (var i in keys) { | |||
| if (typeof keys[i].code === "string") { | |||
| keys[i].code = keys[i].code.charCodeAt(0); | |||
| self.port.on("conf", function(c) { | |||
| for (var i in c) { | |||
| conf[i] = c[i]; | |||
| } | |||
| } | |||
| }); | |||
| self.port.on("keys", function(k) { | |||
| keys = k; | |||
| }); | |||
| function isMatch(k, evt) { | |||
| if ((k.code === evt.keyCode) | |||
| if ((k.code === evt.key) | |||
| && (!!k.ctrlKey == evt.ctrlKey) | |||
| && (!!k.shiftKey == evt.shiftKey) | |||
| && (!!k.altKey == evt.altKey) | |||
| @@ -49,7 +31,6 @@ function isMatch(k, evt) { | |||
| return false; | |||
| } | |||
| //There's a lot we don't want to do if we're not on an actual webpage, but on | |||
| //the "speed dial"-ish pages. | |||
| var onWebPage = (document.body !== undefined); | |||
| @@ -332,7 +313,7 @@ window.addEventListener("keydown", function(evt) { | |||
| return; | |||
| } | |||
| var c = String.fromCharCode(evt.keyCode); | |||
| var c = evt.key; | |||
| if (conf.chars.indexOf(c) !== -1) { | |||
| blobList.appendKey(c); | |||
| evt.preventDefault(); | |||
| @@ -1,11 +1,62 @@ | |||
| var tabs = require("sdk/tabs"); | |||
| var self = require("sdk/self"); | |||
| var simple_prefs = require("sdk/simple-prefs"); | |||
| var conf = {}; | |||
| var keys = {}; | |||
| function contains(arr, val) { | |||
| if (typeof arr !== "object") | |||
| return false; | |||
| return (arr.indexOf(val) !== -1); | |||
| } | |||
| function prepareConf(prefs) { | |||
| var keys = {}; | |||
| var conf = {}; | |||
| for (var i in prefs) { | |||
| var pref = prefs[i]; | |||
| if (i === "chars") { | |||
| conf[i] = pref; | |||
| continue; | |||
| } | |||
| var modifiers = pref.match(/<[^>]+>/g) || []; | |||
| var key = pref.replace(/<.+>/g, ""); | |||
| if (/^[A-Z]$/.test(key)) | |||
| modifiers.push("<Shift>"); | |||
| keys[i] = { | |||
| code: key, | |||
| shiftKey: contains(modifiers, "<Shift>"), | |||
| ctrlKey: contains(modifiers, "<Control>") | |||
| } | |||
| } | |||
| return {keys: keys, conf: conf}; | |||
| } | |||
| var res = prepareConf(simple_prefs.prefs); | |||
| conf = res.conf; | |||
| keys = res.keys; | |||
| simple_prefs.on("", function() { | |||
| var res = prepareConf(simple_prefs.prefs); | |||
| conf = res.conf; | |||
| keys = res.keys; | |||
| }); | |||
| tabs.on("ready", function(tab) { | |||
| var worker = tab.attach({ | |||
| contentScriptFile: self.data.url("onload.js") | |||
| }); | |||
| worker.port.emit("conf", conf); | |||
| worker.port.emit("keys", keys); | |||
| function selectRelativeTab(n) { | |||
| var tabList = []; | |||
| var currentTabIndex; | |||
| @@ -1,7 +1,7 @@ | |||
| { | |||
| "title": "Mouseless", | |||
| "name": "mouseless", | |||
| "version": "0.3.2", | |||
| "version": "0.4.0", | |||
| "description": "For a mouseless future.", | |||
| "main": "index.js", | |||
| "author": "Martin Dørum Nygaard", | |||
| @@ -9,5 +9,78 @@ | |||
| "firefox": ">=38.0a1", | |||
| "fennec": ">=38.0a1" | |||
| }, | |||
| "license": "MIT" | |||
| "license": "MIT", | |||
| "preferences": [ | |||
| { | |||
| "name": "chars", "title": "Characters", | |||
| "type": "string", | |||
| "value": "sanotehucp" | |||
| }, { | |||
| "name": "scroll_up", "title": "Scroll Up", | |||
| "type": "string", | |||
| "value": "t" | |||
| }, { | |||
| "name": "scroll_down", "title": "Scroll Down", | |||
| "type": "string", | |||
| "value": "n" | |||
| }, { | |||
| "name": "scroll_up_fast", "title": "Scroll Up Fast", | |||
| "type": "string", | |||
| "value": "<Shift>{" | |||
| }, { | |||
| "name": "scroll_down_fast", "title": "Scroll Down Fast", | |||
| "type": "string", | |||
| "value": "<Shift>}" | |||
| }, { | |||
| "name": "blobs_show", "title": "Show Blobs", | |||
| "type": "string", | |||
| "value": "d" | |||
| }, { | |||
| "name": "blobs_hide", "title": "Hide Blobs", | |||
| "type": "string", | |||
| "value": "Escape" | |||
| }, { | |||
| "name": "blobs_click", "title": "Click", | |||
| "type": "string", | |||
| "value": "Enter" | |||
| }, { | |||
| "name": "blobs_click_new_tab", "title": "Open in New Tab", | |||
| "type": "string", | |||
| "value": "<Shift>Enter" | |||
| }, { | |||
| "name": "blobs_backspace", "title": "Blobs Backspace", | |||
| "type": "string", | |||
| "value": "Backspace", | |||
| "hidden": true | |||
| }, { | |||
| "name": "elem_deselect", "title": "Deselect Element", | |||
| "type": "string", | |||
| "value": "Escape", | |||
| "hidden": true | |||
| }, { | |||
| "name": "change_tab_left", "title": "Previous Tab", | |||
| "type": "string", | |||
| "value": "h" | |||
| }, { | |||
| "name": "change_tab_right", "title": "Next Tab", | |||
| "type": "string", | |||
| "value": "s" | |||
| }, { | |||
| "name": "move_tab_left", "title": "Move Tab Left", | |||
| "type": "string", | |||
| "value": "H" | |||
| }, { | |||
| "name": "move_tab_right", "title": "Move Tab Right", | |||
| "type": "string", | |||
| "value": "S" | |||
| }, { | |||
| "name": "history_back", "title": "Back", | |||
| "type": "string", | |||
| "value": "<Control>h" | |||
| }, { | |||
| "name": "history_forward", "title": "Forwards", | |||
| "type": "string", | |||
| "value": "<Control>s" | |||
| } | |||
| ] | |||
| } | |||