mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-20 08:27:59 +01:00
Also add events groups for the use of plugins.
--HG-- branch : groups
This commit is contained in:
@@ -17,16 +17,12 @@ update(AutoCommand.prototype, {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var AutoCmdHive = Class("AutoCmdHive", {
|
var AutoCmdHive = Class("AutoCmdHive", Group.Hive, {
|
||||||
init: function init(group) {
|
init: function init(group) {
|
||||||
this.group = group;
|
init.supercall(this, group);
|
||||||
this._store = [];
|
this._store = [];
|
||||||
},
|
},
|
||||||
|
|
||||||
get toStringParams() [this.group.name],
|
|
||||||
|
|
||||||
get builtin() this.group.builtin,
|
|
||||||
|
|
||||||
__iterator__: function () array.iterValues(this._store),
|
__iterator__: function () array.iterValues(this._store),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -111,7 +107,7 @@ var AutoCommands = Module("autocommands", {
|
|||||||
{
|
{
|
||||||
template.map(this.activeHives, function (hive)
|
template.map(this.activeHives, function (hive)
|
||||||
<tr highlight="Title">
|
<tr highlight="Title">
|
||||||
<td colspan="3">{hive.group.name}</td>
|
<td colspan="3">{hive.name}</td>
|
||||||
</tr> +
|
</tr> +
|
||||||
<tr style="height: .5ex;"/> +
|
<tr style="height: .5ex;"/> +
|
||||||
template.map(cmds(hive), function ([event, items])
|
template.map(cmds(hive), function ([event, items])
|
||||||
@@ -148,7 +144,7 @@ var AutoCommands = Module("autocommands", {
|
|||||||
event = event.toLowerCase();
|
event = event.toLowerCase();
|
||||||
for (let hive in this.hives.iterValues()) {
|
for (let hive in this.hives.iterValues()) {
|
||||||
let args = update({},
|
let args = update({},
|
||||||
hive.group.argsExtra(arguments[1]),
|
hive.argsExtra(arguments[1]),
|
||||||
arguments[1]);
|
arguments[1]);
|
||||||
|
|
||||||
for (let autoCmd in values(hive._store))
|
for (let autoCmd in values(hive._store))
|
||||||
|
|||||||
@@ -1644,9 +1644,9 @@ var Buffer = Module("buffer", {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
events: function () {
|
events: function () {
|
||||||
events.addSessionListener(config.browser, "DOMContentLoaded", buffer.closure.onDOMContentLoaded, true);
|
events.listen(config.browser, "DOMContentLoaded", buffer.closure.onDOMContentLoaded, true);
|
||||||
events.addSessionListener(config.browser, "load", buffer.closure.onPageLoad, true);
|
events.listen(config.browser, "load", buffer.closure.onPageLoad, true);
|
||||||
events.addSessionListener(config.browser, "scroll", buffer.closure._updateBufferPosition, false);
|
events.listen(config.browser, "scroll", buffer.closure._updateBufferPosition, false);
|
||||||
},
|
},
|
||||||
mappings: function () {
|
mappings: function () {
|
||||||
var myModes = config.browserModes;
|
var myModes = config.browserModes;
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ var Command = Class("Command", {
|
|||||||
this.options = this.options.map(CommandOption.fromArray, CommandOption);
|
this.options = this.options.map(CommandOption.fromArray, CommandOption);
|
||||||
},
|
},
|
||||||
|
|
||||||
get toStringParams() [this.name, this.hive.group.name],
|
get toStringParams() [this.name, this.hive.name],
|
||||||
|
|
||||||
get helpTag() ":" + this.name,
|
get helpTag() ":" + this.name,
|
||||||
|
|
||||||
@@ -155,8 +155,8 @@ var Command = Class("Command", {
|
|||||||
if (args.bang && !this.bang)
|
if (args.bang && !this.bang)
|
||||||
throw FailedAssertion("E477: No ! allowed");
|
throw FailedAssertion("E477: No ! allowed");
|
||||||
|
|
||||||
return !dactyl.trapErrors(function exec(command) {
|
return !dactyl.trapErrors(function exec() {
|
||||||
// update({}, command.hive.group.argsExtra(args), args);
|
update({}, this.hive.argsExtra(args), args);
|
||||||
|
|
||||||
if (this.always)
|
if (this.always)
|
||||||
this.always(args, modifiers);
|
this.always(args, modifiers);
|
||||||
@@ -397,17 +397,13 @@ var ex = {
|
|||||||
__noSuchMethod__: function (meth, args) this._run(meth).apply(this, args)
|
__noSuchMethod__: function (meth, args) this._run(meth).apply(this, args)
|
||||||
};
|
};
|
||||||
|
|
||||||
var CommandHive = Class("CommandHive", {
|
var CommandHive = Class("CommandHive", Group.Hive, {
|
||||||
init: function init(group) {
|
init: function init(group) {
|
||||||
this.group = group;
|
init.supercall(this, group);
|
||||||
this._map = {};
|
this._map = {};
|
||||||
this._list = [];
|
this._list = [];
|
||||||
},
|
},
|
||||||
|
|
||||||
get toStringParams() [this.group.name],
|
|
||||||
|
|
||||||
get builtin() this.group.builtin,
|
|
||||||
|
|
||||||
/** @property {Iterator(Command)} @private */
|
/** @property {Iterator(Command)} @private */
|
||||||
__iterator__: function () array.iterValues(this._list.sort(function (a, b) a.name > b.name)),
|
__iterator__: function () array.iterValues(this._list.sort(function (a, b) a.name > b.name)),
|
||||||
|
|
||||||
@@ -610,7 +606,7 @@ var Commands = Module("commands", {
|
|||||||
template.map(hive, function (cmd)
|
template.map(hive, function (cmd)
|
||||||
template.map(cmd.names, function (name)
|
template.map(cmd.names, function (name)
|
||||||
<tr>
|
<tr>
|
||||||
<td highlight="Title">{!i++ ? hive.group.name : ""}</td>
|
<td highlight="Title">{!i++ ? hive.name : ""}</td>
|
||||||
<td>{cmd.bang ? "!" : " "}</td>
|
<td>{cmd.bang ? "!" : " "}</td>
|
||||||
<td>{cmd.name}</td>
|
<td>{cmd.name}</td>
|
||||||
<td>{cmd.argCount}</td>
|
<td>{cmd.argCount}</td>
|
||||||
@@ -1425,7 +1421,7 @@ var Commands = Module("commands", {
|
|||||||
literal: 1,
|
literal: 1,
|
||||||
|
|
||||||
serialize: function () array(commands.userHives)
|
serialize: function () array(commands.userHives)
|
||||||
.filter(function (h) h.group.persist)
|
.filter(function (h) h.persist)
|
||||||
.map(function (hive) [
|
.map(function (hive) [
|
||||||
{
|
{
|
||||||
command: this.name,
|
command: this.name,
|
||||||
@@ -1485,7 +1481,7 @@ var Commands = Module("commands", {
|
|||||||
iterate: function (args) commands.iterator().map(function (cmd) ({
|
iterate: function (args) commands.iterator().map(function (cmd) ({
|
||||||
__proto__: cmd,
|
__proto__: cmd,
|
||||||
columns: [
|
columns: [
|
||||||
cmd.hive == commands.builtin ? "" : <span highlight="Object" style="padding-right: 1em;">{cmd.hive.group.name}</span>
|
cmd.hive == commands.builtin ? "" : <span highlight="Object" style="padding-right: 1em;">{cmd.hive.name}</span>
|
||||||
]
|
]
|
||||||
})),
|
})),
|
||||||
format: {
|
format: {
|
||||||
|
|||||||
@@ -16,8 +16,11 @@ var Group = Class("Group", {
|
|||||||
|
|
||||||
cleanup: function cleanup() {
|
cleanup: function cleanup() {
|
||||||
for (let hive in values(this.hives))
|
for (let hive in values(this.hives))
|
||||||
if (hive.cleanup)
|
dactyl.trapErrors("cleanup", hive);
|
||||||
hive.cleanup();
|
},
|
||||||
|
destroy: function destroy() {
|
||||||
|
for (let hive in values(this.hives))
|
||||||
|
dactyl.trapErrors("destroy", hive);
|
||||||
},
|
},
|
||||||
|
|
||||||
argsExtra: function argsExtra() ({}),
|
argsExtra: function argsExtra() ({}),
|
||||||
@@ -58,6 +61,32 @@ var Group = Class("Group", {
|
|||||||
|
|
||||||
hiveMap: {},
|
hiveMap: {},
|
||||||
|
|
||||||
|
Hive: Class("Hive", {
|
||||||
|
init: function init(group) {
|
||||||
|
this.group = group;
|
||||||
|
},
|
||||||
|
|
||||||
|
cleanup: function cleanup() {},
|
||||||
|
destroy: function destroy() {},
|
||||||
|
|
||||||
|
get argsExtra() this.group.argsExtra,
|
||||||
|
get builtin() this.group.builtin,
|
||||||
|
|
||||||
|
get name() this.group.name,
|
||||||
|
set name(val) this.group.name = val,
|
||||||
|
|
||||||
|
get description() this.group.description,
|
||||||
|
set description(val) this.group.description = val,
|
||||||
|
|
||||||
|
get filter() this.group.filter,
|
||||||
|
set filter(val) this.group.filter = val,
|
||||||
|
|
||||||
|
get persist() this.group.persist,
|
||||||
|
set persist(val) this.group.persist = val,
|
||||||
|
|
||||||
|
get toStringParams() [this.name]
|
||||||
|
}),
|
||||||
|
|
||||||
Hives: Class("Hives", Class.Property, {
|
Hives: Class("Hives", Class.Property, {
|
||||||
init: function init(name, constructor) {
|
init: function init(name, constructor) {
|
||||||
const self = this;
|
const self = this;
|
||||||
@@ -100,6 +129,13 @@ var Contexts = Module("contexts", {
|
|||||||
this.builtinGroups = [this.system, this.user];
|
this.builtinGroups = [this.system, this.user];
|
||||||
},
|
},
|
||||||
|
|
||||||
|
destroy: function () {
|
||||||
|
for (let hive in values(this.groupList)) {
|
||||||
|
dactyl.trapErrors("cleanup", hive);
|
||||||
|
dactyl.trapErrors("destroy", hive);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
context: null,
|
context: null,
|
||||||
|
|
||||||
groups: Class.memoize(function () Object.create(Group.groupsProto, {
|
groups: Class.memoize(function () Object.create(Group.groupsProto, {
|
||||||
@@ -145,6 +181,7 @@ var Contexts = Module("contexts", {
|
|||||||
if (group) {
|
if (group) {
|
||||||
this.groupList.splice(this.groupList.indexOf(group), 1);
|
this.groupList.splice(this.groupList.indexOf(group), 1);
|
||||||
group.cleanup();
|
group.cleanup();
|
||||||
|
group.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.context && this.context.group === group)
|
if (this.context && this.context.group === group)
|
||||||
|
|||||||
@@ -1459,8 +1459,8 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), {
|
|||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
events: function () {
|
events: function () {
|
||||||
events.addSessionListener(window, "click", dactyl.closure.onClick, true);
|
events.listen(window, "click", dactyl.closure.onClick, true);
|
||||||
events.addSessionListener(window, "dactyl.execute", dactyl.closure.onExecute, true);
|
events.listen(window, "dactyl.execute", dactyl.closure.onExecute, true);
|
||||||
},
|
},
|
||||||
// Only general options are added here, which are valid for all Dactyl extensions
|
// Only general options are added here, which are valid for all Dactyl extensions
|
||||||
options: function () {
|
options: function () {
|
||||||
|
|||||||
@@ -255,6 +255,54 @@ var KeyArgProcessor = Class("KeyArgProcessor", KeyProcessor, {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var EventHive = Class("EventHive", Group.Hive, {
|
||||||
|
init: function init(group) {
|
||||||
|
init.supercall(this, group);
|
||||||
|
this.sessionListeners = [];
|
||||||
|
},
|
||||||
|
|
||||||
|
cleanup: function cleanup() {
|
||||||
|
this.unlisten(null);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an event listener for this session and removes it on
|
||||||
|
* dactyl shutdown.
|
||||||
|
*
|
||||||
|
* @param {Element} target The element on which to listen.
|
||||||
|
* @param {string} event The event to listen for.
|
||||||
|
* @param {function} callback The function to call when the event is received.
|
||||||
|
* @param {boolean} capture When true, listen during the capture
|
||||||
|
* phase, otherwise during the bubbling phase.
|
||||||
|
*/
|
||||||
|
listen: function (target, event, callback, capture) {
|
||||||
|
let args = Array.slice(arguments, 0);
|
||||||
|
args[2] = this.wrapListener(callback);
|
||||||
|
args[0].addEventListener.apply(args[0], args.slice(1));
|
||||||
|
args[0] = Cu.getWeakReference(args[0]);
|
||||||
|
this.sessionListeners.push(args);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove an event listener.
|
||||||
|
*
|
||||||
|
* @param {Element} target The element on which to listen.
|
||||||
|
* @param {string} event The event to listen for.
|
||||||
|
* @param {function} callback The function to call when the event is received.
|
||||||
|
* @param {boolean} capture When true, listen during the capture
|
||||||
|
* phase, otherwise during the bubbling phase.
|
||||||
|
*/
|
||||||
|
unlisten: function (target, event, callback, capture) {
|
||||||
|
this.sessionListeners = this.sessionListeners.filter(function (args) {
|
||||||
|
if (target == null || args[0].get() == target && args[1] == event && args[2] == callback && args[3] == capture) {
|
||||||
|
args[0].get().removeEventListener.apply(args[0].get(), args.slice(1));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return !args[0].get();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @instance events
|
* @instance events
|
||||||
*/
|
*/
|
||||||
@@ -283,7 +331,9 @@ var Events = Module("events", {
|
|||||||
this._macroKeys = [];
|
this._macroKeys = [];
|
||||||
this._lastMacro = "";
|
this._lastMacro = "";
|
||||||
|
|
||||||
this.sessionListeners = [];
|
EventHive.prototype.wrapListener = this.closure.wrapListener;
|
||||||
|
this.user = contexts.hives.events.user;
|
||||||
|
this.builtin = contexts.hives.events.builtin;
|
||||||
|
|
||||||
this._macros = storage.newMap("macros", { privateData: true, store: true });
|
this._macros = storage.newMap("macros", { privateData: true, store: true });
|
||||||
for (let [k, m] in this._macros)
|
for (let [k, m] in this._macros)
|
||||||
@@ -344,19 +394,14 @@ var Events = Module("events", {
|
|||||||
|
|
||||||
this._activeMenubar = false;
|
this._activeMenubar = false;
|
||||||
for (let [event, callback] in Iterator(this.events))
|
for (let [event, callback] in Iterator(this.events))
|
||||||
this.addSessionListener(window, event, callback, true);
|
this.listen(window, event, callback, true);
|
||||||
|
|
||||||
dactyl.registerObserver("modeChange", function () {
|
dactyl.registerObserver("modeChange", function () {
|
||||||
delete self.processor;
|
delete self.processor;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function () {
|
hives: Group.Hives("events", EventHive),
|
||||||
util.dump("Removing all event listeners");
|
|
||||||
for (let args in values(this.sessionListeners))
|
|
||||||
if (args[0].get())
|
|
||||||
args[0].get().removeEventListener.apply(args[0].get(), args.slice(1));
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds an event listener for this session and removes it on
|
* Adds an event listener for this session and removes it on
|
||||||
@@ -368,13 +413,8 @@ var Events = Module("events", {
|
|||||||
* @param {boolean} capture When true, listen during the capture
|
* @param {boolean} capture When true, listen during the capture
|
||||||
* phase, otherwise during the bubbling phase.
|
* phase, otherwise during the bubbling phase.
|
||||||
*/
|
*/
|
||||||
addSessionListener: function (target, event, callback, capture) {
|
get addSessionListener() this.builtin.closure.listen,
|
||||||
let args = Array.slice(arguments, 0);
|
get listen() this.builtin.closure.listen,
|
||||||
args[2] = this.wrapListener(callback);
|
|
||||||
args[0].addEventListener.apply(args[0], args.slice(1));
|
|
||||||
args[0] = Cu.getWeakReference(args[0]);
|
|
||||||
this.sessionListeners.push(args);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wraps an event listener to ensure that errors are reported.
|
* Wraps an event listener to ensure that errors are reported.
|
||||||
|
|||||||
@@ -677,7 +677,7 @@ var Hints = Module("hints", {
|
|||||||
|
|
||||||
let appContent = document.getElementById("appcontent");
|
let appContent = document.getElementById("appcontent");
|
||||||
if (appContent)
|
if (appContent)
|
||||||
events.addSessionListener(appContent, "scroll", this.resizeTimer.closure.tell, false);
|
events.listen(appContent, "scroll", this.resizeTimer.closure.tell, false);
|
||||||
|
|
||||||
const Mode = Hints.Mode;
|
const Mode = Hints.Mode;
|
||||||
Mode.defaultValue("tags", function () function () options["hinttags"]);
|
Mode.defaultValue("tags", function () function () options["hinttags"]);
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ var Map = Class("Map", {
|
|||||||
.toObject();
|
.toObject();
|
||||||
|
|
||||||
args = update({ context: contexts.context },
|
args = update({ context: contexts.context },
|
||||||
this.hive.group.argsExtra(args),
|
this.hive.argsExtra(args),
|
||||||
args);
|
args);
|
||||||
|
|
||||||
let self = this;
|
let self = this;
|
||||||
@@ -138,16 +138,12 @@ var Map = Class("Map", {
|
|||||||
id: 0
|
id: 0
|
||||||
});
|
});
|
||||||
|
|
||||||
var MapHive = Class("MapHive", {
|
var MapHive = Class("MapHive", Group.Hive, {
|
||||||
init: function init(group) {
|
init: function init(group) {
|
||||||
this.group = group;
|
init.supercall(this, group);
|
||||||
this.stacks = {};
|
this.stacks = {};
|
||||||
},
|
},
|
||||||
|
|
||||||
get toStringParams() [this.group.name],
|
|
||||||
|
|
||||||
get builtin() this.group.builtin,
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Iterates over all mappings present in all of the given *modes*.
|
* Iterates over all mappings present in all of the given *modes*.
|
||||||
*
|
*
|
||||||
@@ -423,7 +419,7 @@ var Mappings = Module("mappings", {
|
|||||||
template.map(maps(hive), function (map)
|
template.map(maps(hive), function (map)
|
||||||
template.map(map.names, function (name, i)
|
template.map(map.names, function (name, i)
|
||||||
<tr>
|
<tr>
|
||||||
<td highlight="Title">{!i ? hive.group.name : ""}</td>
|
<td highlight="Title">{!i ? hive.name : ""}</td>
|
||||||
<td>{modeSign}</td>
|
<td>{modeSign}</td>
|
||||||
<td>{name}</td>
|
<td>{name}</td>
|
||||||
<td>{map.rhs || map.action.toSource()}</td>
|
<td>{map.rhs || map.action.toSource()}</td>
|
||||||
@@ -532,12 +528,12 @@ var Mappings = Module("mappings", {
|
|||||||
serialize: function () {
|
serialize: function () {
|
||||||
return this.name != "map" ? [] :
|
return this.name != "map" ? [] :
|
||||||
array(mappings.userHives)
|
array(mappings.userHives)
|
||||||
.filter(function (h) h.group.persist)
|
.filter(function (h) h.persist)
|
||||||
.map(function (hive) [
|
.map(function (hive) [
|
||||||
{
|
{
|
||||||
command: "map",
|
command: "map",
|
||||||
options: array([
|
options: array([
|
||||||
hive !== mappings.user && ["-group", hive.group.name],
|
hive !== mappings.user && ["-group", hive.name],
|
||||||
["-modes", uniqueModes(map.modes)],
|
["-modes", uniqueModes(map.modes)],
|
||||||
["-description", map.description],
|
["-description", map.description],
|
||||||
map.silent && ["-silent"]])
|
map.silent && ["-silent"]])
|
||||||
@@ -678,7 +674,7 @@ var Mappings = Module("mappings", {
|
|||||||
name: name,
|
name: name,
|
||||||
columns: [
|
columns: [
|
||||||
mode == mainMode ? "" : <span highlight="Object" style="padding-right: 1em;">{mode.name}</span>,
|
mode == mainMode ? "" : <span highlight="Object" style="padding-right: 1em;">{mode.name}</span>,
|
||||||
hive == mappings.builtin ? "" : <span highlight="Object" style="padding-right: 1em;">{hive.group.name}</span>
|
hive == mappings.builtin ? "" : <span highlight="Object" style="padding-right: 1em;">{hive.name}</span>
|
||||||
],
|
],
|
||||||
__proto__: map
|
__proto__: map
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ var Marks = Module("marks", {
|
|||||||
events: function () {
|
events: function () {
|
||||||
let appContent = document.getElementById("appcontent");
|
let appContent = document.getElementById("appcontent");
|
||||||
if (appContent)
|
if (appContent)
|
||||||
events.addSessionListener(appContent, "load", marks.closure._onPageLoad, true);
|
events.listen(appContent, "load", marks.closure._onPageLoad, true);
|
||||||
},
|
},
|
||||||
mappings: function () {
|
mappings: function () {
|
||||||
var myModes = config.browserModes;
|
var myModes = config.browserModes;
|
||||||
|
|||||||
@@ -874,8 +874,8 @@ var Tabs = Module("tabs", {
|
|||||||
tabs.timeout(function () { this.updateTabCount(); });
|
tabs.timeout(function () { this.updateTabCount(); });
|
||||||
}
|
}
|
||||||
for (let event in values(["TabMove", "TabOpen", "TabClose"]))
|
for (let event in values(["TabMove", "TabOpen", "TabClose"]))
|
||||||
events.addSessionListener(tabContainer, event, callback, false);
|
events.listen(tabContainer, event, callback, false);
|
||||||
events.addSessionListener(tabContainer, "TabSelect", tabs.closure._onTabSelect, false);
|
events.listen(tabContainer, "TabSelect", tabs.closure._onTabSelect, false);
|
||||||
},
|
},
|
||||||
mappings: function () {
|
mappings: function () {
|
||||||
mappings.add([modes.NORMAL], ["g0", "g^"],
|
mappings.add([modes.NORMAL], ["g0", "g^"],
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ var Hive = Class("Hive", {
|
|||||||
for (let sheet in values(this.sheets))
|
for (let sheet in values(this.sheets))
|
||||||
sheet.enabled = false;
|
sheet.enabled = false;
|
||||||
},
|
},
|
||||||
|
destroy: function destroy() {},
|
||||||
|
|
||||||
__iterator__: function () Iterator(this.sheets),
|
__iterator__: function () Iterator(this.sheets),
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user