remove duplicated code from hotkey actions handler
more xhrPost() refactoring
This commit is contained in:
parent
24c618dd6f
commit
7e8be97b66
|
@ -175,7 +175,7 @@ function feedlist_init() {
|
||||||
loading_set_progress(50);
|
loading_set_progress(50);
|
||||||
|
|
||||||
document.onkeydown = hotkey_handler;
|
document.onkeydown = hotkey_handler;
|
||||||
setTimeout(hotkey_prefix_timeout, 5*1000);
|
setInterval(hotkey_prefix_timeout, 5*1000);
|
||||||
|
|
||||||
if (!getActiveFeedId()) {
|
if (!getActiveFeedId()) {
|
||||||
viewfeed({feed: -3});
|
viewfeed({feed: -3});
|
||||||
|
|
|
@ -5,6 +5,9 @@ let _label_base_index = -1024;
|
||||||
let loading_progress = 0;
|
let loading_progress = 0;
|
||||||
let notify_hide_timerid = false;
|
let notify_hide_timerid = false;
|
||||||
|
|
||||||
|
let hotkey_prefix = 0;
|
||||||
|
let hotkey_prefix_pressed = false;
|
||||||
|
|
||||||
Ajax.Base.prototype.initialize = Ajax.Base.prototype.initialize.wrap(
|
Ajax.Base.prototype.initialize = Ajax.Base.prototype.initialize.wrap(
|
||||||
function (callOriginal, options) {
|
function (callOriginal, options) {
|
||||||
|
|
||||||
|
@ -27,14 +30,14 @@ Ajax.Base.prototype.initialize = Ajax.Base.prototype.initialize.wrap(
|
||||||
|
|
||||||
function xhrPost(url, params, complete) {
|
function xhrPost(url, params, complete) {
|
||||||
console.log("xhrPost:", params);
|
console.log("xhrPost:", params);
|
||||||
new Ajax.Request(url, {
|
return new Ajax.Request(url, {
|
||||||
parameters: params,
|
parameters: params,
|
||||||
onComplete: complete
|
onComplete: complete
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function xhrJson(url, params, complete) {
|
function xhrJson(url, params, complete) {
|
||||||
xhrPost(url, params, (reply) => {
|
return xhrPost(url, params, (reply) => {
|
||||||
try {
|
try {
|
||||||
const obj = JSON.parse(reply.responseText);
|
const obj = JSON.parse(reply.responseText);
|
||||||
complete(obj);
|
complete(obj);
|
||||||
|
@ -498,9 +501,6 @@ function hotkey_prefix_timeout() {
|
||||||
hotkey_prefix = false;
|
hotkey_prefix = false;
|
||||||
Element.hide('cmdline');
|
Element.hide('cmdline');
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(hotkey_prefix_timeout, 1000);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function uploadIconHandler(rc) {
|
function uploadIconHandler(rc) {
|
||||||
|
@ -1087,8 +1087,25 @@ function backend_sanity_check_callback(transport) {
|
||||||
console.log('reading init-params...');
|
console.log('reading init-params...');
|
||||||
|
|
||||||
for (const k in params) {
|
for (const k in params) {
|
||||||
console.log("IP:", k, "=>", params[k]);
|
switch (k) {
|
||||||
if (k == "label_base_index") _label_base_index = parseInt(params[k]);
|
case "label_base_index":
|
||||||
|
_label_base_index = parseInt(params[k])
|
||||||
|
break;
|
||||||
|
case "hotkeys":
|
||||||
|
// filter mnemonic definitions (used for help panel) from hotkeys map
|
||||||
|
// i.e. *(191)|Ctrl-/ -> *(191)
|
||||||
|
|
||||||
|
const tmp = [];
|
||||||
|
for (const sequence in params[k][1]) {
|
||||||
|
const filtered = sequence.replace(/\|.*$/, "");
|
||||||
|
tmp[filtered] = params[k][1][sequence];
|
||||||
|
}
|
||||||
|
|
||||||
|
params[k][1] = tmp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("IP:", k, "=>", params[k]);
|
||||||
}
|
}
|
||||||
|
|
||||||
init_params = params;
|
init_params = params;
|
||||||
|
@ -1537,3 +1554,58 @@ function openArticlePopup(id) {
|
||||||
w.opener = null;
|
w.opener = null;
|
||||||
w.location = "backend.php?op=article&method=view&mode=raw&html=1&zoom=1&id=" + id + "&csrf_token=" + getInitParam("csrf_token");
|
w.location = "backend.php?op=article&method=view&mode=raw&html=1&zoom=1&id=" + id + "&csrf_token=" + getInitParam("csrf_token");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function keyevent_to_action(e) {
|
||||||
|
|
||||||
|
const hotkeys_map = getInitParam("hotkeys");
|
||||||
|
const keycode = e.which;
|
||||||
|
const keychar = String.fromCharCode(keycode).toLowerCase();
|
||||||
|
|
||||||
|
if (keycode == 27) { // escape and drop prefix
|
||||||
|
hotkey_prefix = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keycode == 16 || keycode == 17) return; // ignore lone shift / ctrl
|
||||||
|
|
||||||
|
if (!hotkey_prefix && hotkeys_map[0].indexOf(keychar) != -1) {
|
||||||
|
|
||||||
|
const date = new Date();
|
||||||
|
const ts = Math.round(date.getTime() / 1000);
|
||||||
|
|
||||||
|
hotkey_prefix = keychar;
|
||||||
|
hotkey_prefix_pressed = ts;
|
||||||
|
|
||||||
|
$("cmdline").innerHTML = keychar;
|
||||||
|
Element.show("cmdline");
|
||||||
|
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Element.hide("cmdline");
|
||||||
|
|
||||||
|
let hotkey_name = keychar.search(/[a-zA-Z0-9]/) != -1 ? keychar : "(" + keycode + ")";
|
||||||
|
|
||||||
|
// ensure ^*char notation
|
||||||
|
if (e.shiftKey) hotkey_name = "*" + hotkey_name;
|
||||||
|
if (e.ctrlKey) hotkey_name = "^" + hotkey_name;
|
||||||
|
if (e.altKey) hotkey_name = "+" + hotkey_name;
|
||||||
|
if (e.metaKey) hotkey_name = "%" + hotkey_name;
|
||||||
|
|
||||||
|
const hotkey_full = hotkey_prefix ? hotkey_prefix + " " + hotkey_name : hotkey_name;
|
||||||
|
hotkey_prefix = false;
|
||||||
|
|
||||||
|
let action_name = false;
|
||||||
|
|
||||||
|
for (const sequence in hotkeys_map[1]) {
|
||||||
|
if (sequence == hotkey_full) {
|
||||||
|
action_name = hotkeys_map[1][sequence];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('keyevent_to_action', hotkey_full, '=>', action_name);
|
||||||
|
|
||||||
|
return action_name;
|
||||||
|
}
|
288
js/prefs.js
288
js/prefs.js
|
@ -1,8 +1,5 @@
|
||||||
/* global dijit, __ */
|
/* global dijit, __ */
|
||||||
|
|
||||||
let hotkey_prefix = false;
|
|
||||||
let hotkey_prefix_pressed = false;
|
|
||||||
|
|
||||||
let seq = "";
|
let seq = "";
|
||||||
|
|
||||||
function notify_callback2(transport, sticky) {
|
function notify_callback2(transport, sticky) {
|
||||||
|
@ -494,72 +491,62 @@ function editSelectedFeeds() {
|
||||||
|
|
||||||
notify_progress("Loading, please wait...");
|
notify_progress("Loading, please wait...");
|
||||||
|
|
||||||
const query = "backend.php?op=pref-feeds&method=editfeeds&ids=" +
|
|
||||||
param_escape(rows.toString());
|
|
||||||
|
|
||||||
console.log(query);
|
|
||||||
|
|
||||||
if (dijit.byId("feedEditDlg"))
|
if (dijit.byId("feedEditDlg"))
|
||||||
dijit.byId("feedEditDlg").destroyRecursive();
|
dijit.byId("feedEditDlg").destroyRecursive();
|
||||||
|
|
||||||
new Ajax.Request("backend.php", {
|
xhrPost("backend.php", { op: "pref-feeds", method: "editfeeds", ids: rows.toString() }, (transport) => {
|
||||||
parameters: query,
|
notify("");
|
||||||
onComplete: function (transport) {
|
|
||||||
|
|
||||||
notify("");
|
const dialog = new dijit.Dialog({
|
||||||
|
id: "feedEditDlg",
|
||||||
|
title: __("Edit Multiple Feeds"),
|
||||||
|
style: "width: 600px",
|
||||||
|
getChildByName: function (name) {
|
||||||
|
let rv = null;
|
||||||
|
this.getChildren().each(
|
||||||
|
function (child) {
|
||||||
|
if (child.name == name) {
|
||||||
|
rv = child;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return rv;
|
||||||
|
},
|
||||||
|
toggleField: function (checkbox, elem, label) {
|
||||||
|
this.getChildByName(elem).attr('disabled', !checkbox.checked);
|
||||||
|
|
||||||
const dialog = new dijit.Dialog({
|
if ($(label))
|
||||||
id: "feedEditDlg",
|
if (checkbox.checked)
|
||||||
title: __("Edit Multiple Feeds"),
|
$(label).removeClassName('insensitive');
|
||||||
style: "width: 600px",
|
else
|
||||||
getChildByName: function (name) {
|
$(label).addClassName('insensitive');
|
||||||
let rv = null;
|
|
||||||
this.getChildren().each(
|
|
||||||
function (child) {
|
|
||||||
if (child.name == name) {
|
|
||||||
rv = child;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return rv;
|
|
||||||
},
|
|
||||||
toggleField: function (checkbox, elem, label) {
|
|
||||||
this.getChildByName(elem).attr('disabled', !checkbox.checked);
|
|
||||||
|
|
||||||
if ($(label))
|
},
|
||||||
if (checkbox.checked)
|
execute: function () {
|
||||||
$(label).removeClassName('insensitive');
|
if (this.validate() && confirm(__("Save changes to selected feeds?"))) {
|
||||||
else
|
const query = this.attr('value');
|
||||||
$(label).addClassName('insensitive');
|
|
||||||
|
|
||||||
},
|
/* normalize unchecked checkboxes because [] is not serialized */
|
||||||
execute: function () {
|
|
||||||
if (this.validate() && confirm(__("Save changes to selected feeds?"))) {
|
|
||||||
const query = this.attr('value');
|
|
||||||
|
|
||||||
/* normalize unchecked checkboxes because [] is not serialized */
|
Object.keys(query).each((key) => {
|
||||||
|
let val = query[key];
|
||||||
|
|
||||||
Object.keys(query).each((key) => {
|
if (typeof val == "object" && val.length == 0)
|
||||||
let val = query[key];
|
query[key] = ["off"];
|
||||||
|
});
|
||||||
|
|
||||||
if (typeof val == "object" && val.length == 0)
|
notify_progress("Saving data...", true);
|
||||||
query[key] = ["off"];
|
|
||||||
});
|
|
||||||
|
|
||||||
notify_progress("Saving data...", true);
|
xhrPost("backend.php", query, () => {
|
||||||
|
dialog.hide();
|
||||||
|
updateFeedList();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
content: transport.responseText
|
||||||
|
});
|
||||||
|
|
||||||
xhrPost("backend.php", query, () => {
|
dialog.show();
|
||||||
dialog.hide();
|
|
||||||
updateFeedList();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
content: transport.responseText
|
|
||||||
});
|
|
||||||
|
|
||||||
dialog.show();
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -613,57 +600,58 @@ function updateFilterList() {
|
||||||
let search = "";
|
let search = "";
|
||||||
if (user_search) { search = user_search.value; }
|
if (user_search) { search = user_search.value; }
|
||||||
|
|
||||||
new Ajax.Request("backend.php", {
|
xhrPost("backend.php", { op: "pref-filters", search: search }, (transport) => {
|
||||||
parameters: "?op=pref-filters&search=" + param_escape(search),
|
dijit.byId('filterConfigTab').attr('content', transport.responseText);
|
||||||
onComplete: function(transport) {
|
notify("");
|
||||||
dijit.byId('filterConfigTab').attr('content', transport.responseText);
|
});
|
||||||
notify("");
|
|
||||||
} });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateLabelList() {
|
function updateLabelList() {
|
||||||
new Ajax.Request("backend.php", {
|
xhrPost("backend.php", { op: "pref-labels" }, (transport) => {
|
||||||
parameters: "?op=pref-labels",
|
dijit.byId('labelConfigTab').attr('content', transport.responseText);
|
||||||
onComplete: function(transport) {
|
notify("");
|
||||||
dijit.byId('labelConfigTab').attr('content', transport.responseText);
|
});
|
||||||
notify("");
|
|
||||||
} });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updatePrefsList() {
|
function updatePrefsList() {
|
||||||
new Ajax.Request("backend.php", {
|
xhrPost("backend.php", { op: "pref-prefs" }, (transport) => {
|
||||||
parameters: "?op=pref-prefs",
|
dijit.byId('genConfigTab').attr('content', transport.responseText);
|
||||||
onComplete: function(transport) {
|
notify("");
|
||||||
dijit.byId('genConfigTab').attr('content', transport.responseText);
|
});
|
||||||
notify("");
|
|
||||||
} });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateSystemList() {
|
function updateSystemList() {
|
||||||
new Ajax.Request("backend.php", {
|
xhrPost("backend.php", { op: "pref-system" }, (transport) => {
|
||||||
parameters: "?op=pref-system",
|
dijit.byId('systemConfigTab').attr('content', transport.responseText);
|
||||||
onComplete: function(transport) {
|
notify("");
|
||||||
dijit.byId('systemConfigTab').attr('content', transport.responseText);
|
});
|
||||||
notify("");
|
|
||||||
} });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function selectTab(id, noupdate) {
|
function selectTab(id, noupdate) {
|
||||||
if (!noupdate) {
|
if (!noupdate) {
|
||||||
notify_progress("Loading, please wait...");
|
notify_progress("Loading, please wait...");
|
||||||
|
|
||||||
if (id == "feedConfig") {
|
switch (id) {
|
||||||
updateFeedList();
|
case "feedConfig":
|
||||||
} else if (id == "filterConfig") {
|
updateFeedList();
|
||||||
updateFilterList();
|
break;
|
||||||
} else if (id == "labelConfig") {
|
case "filterConfig":
|
||||||
updateLabelList();
|
updateFilterList();
|
||||||
} else if (id == "genConfig") {
|
break;
|
||||||
updatePrefsList();
|
case "labelConfig":
|
||||||
} else if (id == "userConfig") {
|
updateLabelList();
|
||||||
updateUsersList();
|
break;
|
||||||
} else if (id == "systemConfig") {
|
case "genConfig":
|
||||||
updateSystemList();
|
updatePrefsList();
|
||||||
|
break;
|
||||||
|
case "userConfig":
|
||||||
|
updateUsersList();
|
||||||
|
break;
|
||||||
|
case "systemConfig":
|
||||||
|
updateSystemList();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
console.warn("unknown tab", id);
|
||||||
}
|
}
|
||||||
|
|
||||||
const tab = dijit.byId(id + "Tab");
|
const tab = dijit.byId(id + "Tab");
|
||||||
|
@ -692,7 +680,7 @@ function init_second_stage() {
|
||||||
window.setTimeout(function() { editFeed(param) }, 100);
|
window.setTimeout(function() { editFeed(param) }, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(hotkey_prefix_timeout, 5*1000);
|
setInterval(hotkey_prefix_timeout, 5*1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
|
@ -765,105 +753,41 @@ function init() {
|
||||||
|
|
||||||
|
|
||||||
function validatePrefsReset() {
|
function validatePrefsReset() {
|
||||||
const ok = confirm(__("Reset to defaults?"));
|
if (confirm(__("Reset to defaults?"))) {
|
||||||
|
|
||||||
if (ok) {
|
|
||||||
|
|
||||||
const query = "?op=pref-prefs&method=resetconfig";
|
const query = "?op=pref-prefs&method=resetconfig";
|
||||||
console.log(query);
|
|
||||||
|
|
||||||
new Ajax.Request("backend.php", {
|
|
||||||
parameters: query,
|
|
||||||
onComplete: function(transport) {
|
|
||||||
updatePrefsList();
|
|
||||||
notify_info(transport.responseText);
|
|
||||||
} });
|
|
||||||
|
|
||||||
|
xhrPost("backend.php", { op: "pref-prefs", method: "resetconfig" }, (transport) => {
|
||||||
|
updatePrefsList();
|
||||||
|
notify_info(transport.responseText);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function pref_hotkey_handler(e) {
|
function pref_hotkey_handler(e) {
|
||||||
|
if (e.target.nodeName == "INPUT" || e.target.nodeName == "TEXTAREA") return;
|
||||||
|
|
||||||
if (e.target.nodeName == "INPUT" || e.target.nodeName == "TEXTAREA") return;
|
const action_name = keyevent_to_action(e);
|
||||||
|
|
||||||
let keycode = false;
|
if (action_name) {
|
||||||
let shift_key = false;
|
switch (action_name) {
|
||||||
|
case "feed_subscribe":
|
||||||
const cmdline = $('cmdline');
|
quickAddFeed();
|
||||||
|
return false;
|
||||||
try {
|
case "create_label":
|
||||||
shift_key = e.shiftKey;
|
addLabel();
|
||||||
} catch (e) {
|
return false;
|
||||||
|
case "create_filter":
|
||||||
}
|
quickAddFilter();
|
||||||
|
return false;
|
||||||
if (window.event) {
|
case "help_dialog":
|
||||||
keycode = window.event.keyCode;
|
helpDialog("main");
|
||||||
} else if (e) {
|
return false;
|
||||||
keycode = e.which;
|
default:
|
||||||
}
|
console.log("unhandled action: " + action_name + "; keycode: " + e.which);
|
||||||
|
}
|
||||||
let keychar = String.fromCharCode(keycode);
|
|
||||||
|
|
||||||
if (keycode == 27) { // escape
|
|
||||||
hotkey_prefix = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (keycode == 16) return; // ignore lone shift
|
|
||||||
if (keycode == 17) return; // ignore lone ctrl
|
|
||||||
|
|
||||||
if (!shift_key) keychar = keychar.toLowerCase();
|
|
||||||
|
|
||||||
var hotkeys = getInitParam("hotkeys");
|
|
||||||
|
|
||||||
if (!hotkey_prefix && hotkeys[0].indexOf(keychar) != -1) {
|
|
||||||
|
|
||||||
const date = new Date();
|
|
||||||
const ts = Math.round(date.getTime() / 1000);
|
|
||||||
|
|
||||||
hotkey_prefix = keychar;
|
|
||||||
hotkey_prefix_pressed = ts;
|
|
||||||
|
|
||||||
cmdline.innerHTML = keychar;
|
|
||||||
Element.show(cmdline);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Element.hide(cmdline);
|
|
||||||
|
|
||||||
let hotkey = keychar.search(/[a-zA-Z0-9]/) != -1 ? keychar : "(" + keycode + ")";
|
|
||||||
hotkey = hotkey_prefix ? hotkey_prefix + " " + hotkey : hotkey;
|
|
||||||
hotkey_prefix = false;
|
|
||||||
|
|
||||||
let hotkey_action = false;
|
|
||||||
var hotkeys = getInitParam("hotkeys");
|
|
||||||
|
|
||||||
for (const sequence in hotkeys[1]) {
|
|
||||||
if (sequence == hotkey) {
|
|
||||||
hotkey_action = hotkeys[1][sequence];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (hotkey_action) {
|
|
||||||
case "feed_subscribe":
|
|
||||||
quickAddFeed();
|
|
||||||
return false;
|
|
||||||
case "create_label":
|
|
||||||
addLabel();
|
|
||||||
return false;
|
|
||||||
case "create_filter":
|
|
||||||
quickAddFilter();
|
|
||||||
return false;
|
|
||||||
case "help_dialog":
|
|
||||||
//helpDialog("prefs");
|
|
||||||
return false;
|
|
||||||
default:
|
|
||||||
console.log("unhandled action: " + hotkey_action + "; hotkey: " + hotkey);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
71
js/tt-rss.js
71
js/tt-rss.js
|
@ -1,13 +1,11 @@
|
||||||
/* global dijit, __ */
|
/* global dijit, __ */
|
||||||
|
|
||||||
let global_unread = -1;
|
let global_unread = -1;
|
||||||
let hotkey_prefix = false;
|
|
||||||
let hotkey_prefix_pressed = false;
|
|
||||||
let hotkey_actions = {};
|
|
||||||
let _widescreen_mode = false;
|
let _widescreen_mode = false;
|
||||||
let _rpc_seq = 0;
|
let _rpc_seq = 0;
|
||||||
let _active_feed_id = 0;
|
let _active_feed_id = 0;
|
||||||
let _active_feed_is_cat = false;
|
let _active_feed_is_cat = false;
|
||||||
|
let hotkey_actions = {};
|
||||||
|
|
||||||
function next_seq() {
|
function next_seq() {
|
||||||
_rpc_seq += 1;
|
_rpc_seq += 1;
|
||||||
|
@ -596,7 +594,7 @@ function init_second_stage() {
|
||||||
if ('sessionStorage' in window && window['sessionStorage'] !== null)
|
if ('sessionStorage' in window && window['sessionStorage'] !== null)
|
||||||
sessionStorage.clear();
|
sessionStorage.clear();
|
||||||
|
|
||||||
const hotkeys = getInitParam("hotkeys");
|
/*const hotkeys = getInitParam("hotkeys");
|
||||||
const tmp = [];
|
const tmp = [];
|
||||||
|
|
||||||
for (const sequence in hotkeys[1]) {
|
for (const sequence in hotkeys[1]) {
|
||||||
|
@ -605,7 +603,7 @@ function init_second_stage() {
|
||||||
}
|
}
|
||||||
|
|
||||||
hotkeys[1] = tmp;
|
hotkeys[1] = tmp;
|
||||||
setInitParam("hotkeys", hotkeys);
|
setInitParam("hotkeys", hotkeys);*/
|
||||||
|
|
||||||
_widescreen_mode = getInitParam("widescreen");
|
_widescreen_mode = getInitParam("widescreen");
|
||||||
switchPanelMode(_widescreen_mode);
|
switchPanelMode(_widescreen_mode);
|
||||||
|
@ -767,65 +765,18 @@ function viewModeChanged() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function hotkey_handler(e) {
|
function hotkey_handler(e) {
|
||||||
|
|
||||||
if (e.target.nodeName == "INPUT" || e.target.nodeName == "TEXTAREA") return;
|
if (e.target.nodeName == "INPUT" || e.target.nodeName == "TEXTAREA") return;
|
||||||
|
|
||||||
let keycode = e.which;
|
const action_name = keyevent_to_action(e);
|
||||||
|
|
||||||
if (keycode == 27) { // escape and drop prefix
|
if (action_name) {
|
||||||
hotkey_prefix = false;
|
const action_func = hotkey_actions[action_name];
|
||||||
}
|
|
||||||
|
|
||||||
if (keycode == 16 || keycode == 17) return; // ignore lone shift / ctrl
|
if (action_func != null) {
|
||||||
|
action_func();
|
||||||
const hotkeys = getInitParam("hotkeys");
|
e.stopPropagation();
|
||||||
const keychar = String.fromCharCode(keycode).toLowerCase();
|
return false;
|
||||||
|
}
|
||||||
if (!hotkey_prefix && hotkeys[0].indexOf(keychar) != -1) {
|
|
||||||
|
|
||||||
const date = new Date();
|
|
||||||
const ts = Math.round(date.getTime() / 1000);
|
|
||||||
|
|
||||||
hotkey_prefix = keychar;
|
|
||||||
hotkey_prefix_pressed = ts;
|
|
||||||
|
|
||||||
$("cmdline").innerHTML = keychar;
|
|
||||||
Element.show("cmdline");
|
|
||||||
|
|
||||||
e.stopPropagation();
|
|
||||||
|
|
||||||
// returning false here literally disables ctrl-c in browser lol (because C is a valid prefix)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Element.hide("cmdline");
|
|
||||||
|
|
||||||
let hotkey = keychar.search(/[a-zA-Z0-9]/) != -1 ? keychar : "(" + keycode + ")";
|
|
||||||
|
|
||||||
// ensure ^*char notation
|
|
||||||
if (e.shiftKey) hotkey = "*" + hotkey;
|
|
||||||
if (e.ctrlKey) hotkey = "^" + hotkey;
|
|
||||||
if (e.altKey) hotkey = "+" + hotkey;
|
|
||||||
if (e.metaKey) hotkey = "%" + hotkey;
|
|
||||||
|
|
||||||
hotkey = hotkey_prefix ? hotkey_prefix + " " + hotkey : hotkey;
|
|
||||||
hotkey_prefix = false;
|
|
||||||
|
|
||||||
let hotkey_action = false;
|
|
||||||
|
|
||||||
for (const sequence in hotkeys[1]) {
|
|
||||||
if (sequence == hotkey) {
|
|
||||||
hotkey_action = hotkeys[1][sequence];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const action = hotkey_actions[hotkey_action];
|
|
||||||
|
|
||||||
if (action != null) {
|
|
||||||
action();
|
|
||||||
e.stopPropagation();
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue