refactoring

This commit is contained in:
Maxim Devaev 2024-11-02 18:47:59 +02:00
parent 0fd1174bc5
commit 5aef0a2193
6 changed files with 127 additions and 102 deletions

View File

@ -71,21 +71,6 @@ export function Hid(__getGeometry, __recorder) {
window.addEventListener("pagehide", __releaseAll); window.addEventListener("pagehide", __releaseAll);
window.addEventListener("blur", __releaseAll); window.addEventListener("blur", __releaseAll);
tools.storage.bindSimpleSwitch($("hid-pak-ask-switch"), "hid.pak.ask", true);
tools.storage.bindSimpleSwitch($("hid-pak-secure-switch"), "hid.pak.secure", false, function(value) {
$("hid-pak-text").style.setProperty("-webkit-text-security", (value ? "disc" : "none"));
});
tools.feature.setEnabled($("hid-pak-secure"), (
tools.browser.is_chrome
|| tools.browser.is_safari
|| tools.browser.is_opera
));
$("hid-pak-keymap-selector").addEventListener("change", function() {
tools.storage.set("hid.pak.keymap", $("hid-pak-keymap-selector").value);
});
tools.el.setOnClick($("hid-pak-button"), __clickPasteAsKeysButton);
tools.el.setOnClick($("hid-connect-switch"), __clickConnectSwitch); tools.el.setOnClick($("hid-connect-switch"), __clickConnectSwitch);
tools.el.setOnClick($("hid-reset-button"), __clickResetButton); tools.el.setOnClick($("hid-reset-button"), __clickResetButton);
@ -117,8 +102,6 @@ export function Hid(__getGeometry, __recorder) {
/************************************************************************/ /************************************************************************/
self.setSocket = function(ws) { self.setSocket = function(ws) {
tools.el.setEnabled($("hid-pak-text"), ws);
tools.el.setEnabled($("hid-pak-button"), ws);
tools.el.setEnabled($("hid-reset-button"), ws); tools.el.setEnabled($("hid-reset-button"), ws);
tools.el.setEnabled($("hid-jiggler-switch"), ws); tools.el.setEnabled($("hid-jiggler-switch"), ws);
if (!ws) { if (!ws) {
@ -198,17 +181,11 @@ export function Hid(__getGeometry, __recorder) {
tools.el.setEnabled($("hid-connect-switch"), (state && state.online && !state.busy)); tools.el.setEnabled($("hid-connect-switch"), (state && state.online && !state.busy));
if (state) { if (state) {
__keyboard.setState(state.keyboard, state.online, state.busy); __keyboard.setState(state.keyboard.online, state.keyboard.leds, state.online, state.busy);
__mouse.setState(state.mouse, state.online, state.busy); __mouse.setState(state.mouse.online, state.mouse.absolute, state.online, state.busy);
} }
}; };
self.setKeymaps = function(state) {
let el = $("hid-pak-keymap-selector");
tools.selector.setValues(el, state.keymaps.available);
tools.selector.setSelectedValue(el, tools.storage.get("hid.pak.keymap", state.keymaps["default"]));
};
var __releaseAll = function() { var __releaseAll = function() {
__keyboard.releaseAll(); __keyboard.releaseAll();
__mouse.releaseAll(); __mouse.releaseAll();
@ -240,50 +217,6 @@ export function Hid(__getGeometry, __recorder) {
}); });
}; };
var __clickPasteAsKeysButton = function() {
let text = $("hid-pak-text").value;
if (text) {
let paste_as_keys = function() {
tools.el.setEnabled($("hid-pak-text"), false);
tools.el.setEnabled($("hid-pak-button"), false);
tools.el.setEnabled($("hid-pak-keymap-selector"), false);
let keymap = $("hid-pak-keymap-selector").value;
tools.debug(`HID: paste-as-keys ${keymap}: ${text}`);
tools.httpPost("/api/hid/print", {"limit": 0, "keymap": keymap}, function(http) {
tools.el.setEnabled($("hid-pak-text"), true);
tools.el.setEnabled($("hid-pak-button"), true);
tools.el.setEnabled($("hid-pak-keymap-selector"), true);
$("hid-pak-text").value = "";
if (http.status === 413) {
wm.error("Too many text for paste!");
} else if (http.status !== 200) {
wm.error("HID paste error", http.responseText);
} else if (http.status === 200) {
__recorder.recordPrintEvent(text, keymap);
}
}, text, "text/plain");
};
if ($("hid-pak-ask-switch").checked) {
wm.confirm(`
You're going to paste ${text.length} character${text.length ? "s" : ""}.<br>
Are you sure you want to continue?
`).then(function(ok) {
if (ok) {
paste_as_keys();
} else {
$("hid-pak-text").value = "";
}
});
} else {
paste_as_keys();
}
}
};
var __clickOutputsRadio = function(hid) { var __clickOutputsRadio = function(hid) {
let output = tools.radio.getValue(`hid-outputs-${hid}-radio`); let output = tools.radio.getValue(`hid-outputs-${hid}-radio`);
tools.httpPost("/api/hid/set_params", {[`${hid}_output`]: output}, function(http) { tools.httpPost("/api/hid/set_params", {[`${hid}_output`]: output}, function(http) {

View File

@ -65,17 +65,17 @@ export function Keyboard(__recordWsEvent) {
__updateOnlineLeds(); __updateOnlineLeds();
}; };
self.setState = function(state, hid_online, hid_busy) { self.setState = function(online, leds, hid_online, hid_busy) {
if (!hid_online) { if (!hid_online) {
__online = null; __online = null;
} else { } else {
__online = (state.online && !hid_busy); __online = (online && !hid_busy);
} }
__updateOnlineLeds(); __updateOnlineLeds();
for (let led of ["caps", "scroll", "num"]) { for (let led of ["caps", "scroll", "num"]) {
for (let el of $$$(`.hid-keyboard-${led}-led`)) { for (let el of $$$(`.hid-keyboard-${led}-led`)) {
if (state.leds[led]) { if (leds[led]) {
el.classList.add("led-green"); el.classList.add("led-green");
el.classList.remove("led-gray"); el.classList.remove("led-gray");
} else { } else {

View File

@ -90,20 +90,20 @@ export function Mouse(__getGeometry, __recordWsEvent) {
__updateOnlineLeds(); __updateOnlineLeds();
}; };
self.setState = function(state, hid_online, hid_busy) { self.setState = function(online, absolute, hid_online, hid_busy) {
if (!hid_online) { if (!hid_online) {
__online = null; __online = null;
} else { } else {
__online = (state.online && !hid_busy); __online = (online && !hid_busy);
} }
if (!__absolute && state.absolute && __isRelativeCaptured()) { if (!__absolute && absolute && __isRelativeCaptured()) {
document.exitPointerLock(); document.exitPointerLock();
} }
if (__absolute && !state.absolute) { if (__absolute && !absolute) {
__relative_deltas = []; __relative_deltas = [];
__relative_touch_pos = null; __relative_touch_pos = null;
} }
__absolute = state.absolute; __absolute = absolute;
__updateOnlineLeds(); __updateOnlineLeds();
}; };

112
web/share/js/kvm/paste.js Normal file
View File

@ -0,0 +1,112 @@
/*****************************************************************************
# #
# KVMD - The main PiKVM daemon. #
# #
# Copyright (C) 2018-2024 Maxim Devaev <mdevaev@gmail.com> #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
# #
*****************************************************************************/
"use strict";
import {tools, $} from "../tools.js";
import {wm} from "../wm.js";
export function Paste(__recorder) {
var self = this;
/************************************************************************/
var __init__ = function() {
tools.storage.bindSimpleSwitch($("hid-pak-ask-switch"), "hid.pak.ask", true);
tools.storage.bindSimpleSwitch($("hid-pak-secure-switch"), "hid.pak.secure", false, function(value) {
$("hid-pak-text").style.setProperty("-webkit-text-security", (value ? "disc" : "none"));
});
tools.feature.setEnabled($("hid-pak-secure"), (
tools.browser.is_chrome
|| tools.browser.is_safari
|| tools.browser.is_opera
));
$("hid-pak-keymap-selector").addEventListener("change", function() {
tools.storage.set("hid.pak.keymap", $("hid-pak-keymap-selector").value);
});
tools.el.setOnClick($("hid-pak-button"), __clickPasteAsKeysButton);
};
/************************************************************************/
self.setState = function(state) {
tools.el.setEnabled($("hid-pak-text"), state);
tools.el.setEnabled($("hid-pak-button"), state);
if (state) {
let el = $("hid-pak-keymap-selector");
let sel = tools.storage.get("hid.pak.keymap", state.keymaps["default"]);
el.options.length = 0;
for (let keymap of state.keymaps.available) {
tools.selector.addOption(el, keymap, keymap, (keymap === sel));
}
}
};
var __clickPasteAsKeysButton = function() {
let text = $("hid-pak-text").value;
if (text) {
let paste_as_keys = function() {
tools.el.setEnabled($("hid-pak-text"), false);
tools.el.setEnabled($("hid-pak-button"), false);
tools.el.setEnabled($("hid-pak-keymap-selector"), false);
let keymap = $("hid-pak-keymap-selector").value;
tools.debug(`HID: paste-as-keys ${keymap}: ${text}`);
tools.httpPost("/api/hid/print", {"limit": 0, "keymap": keymap}, function(http) {
tools.el.setEnabled($("hid-pak-text"), true);
tools.el.setEnabled($("hid-pak-button"), true);
tools.el.setEnabled($("hid-pak-keymap-selector"), true);
$("hid-pak-text").value = "";
if (http.status === 413) {
wm.error("Too many text for paste!");
} else if (http.status !== 200) {
wm.error("HID paste error", http.responseText);
} else if (http.status === 200) {
__recorder.recordPrintEvent(text, keymap);
}
}, text, "text/plain");
};
if ($("hid-pak-ask-switch").checked) {
wm.confirm(`
You're going to paste ${text.length} character${text.length ? "s" : ""}.<br>
Are you sure you want to continue?
`).then(function(ok) {
if (ok) {
paste_as_keys();
} else {
$("hid-pak-text").value = "";
}
});
} else {
paste_as_keys();
}
}
};
__init__();
}

View File

@ -28,6 +28,7 @@ import {wm} from "../wm.js";
import {Recorder} from "./recorder.js"; import {Recorder} from "./recorder.js";
import {Hid} from "./hid.js"; import {Hid} from "./hid.js";
import {Paste} from "./paste.js";
import {Atx} from "./atx.js"; import {Atx} from "./atx.js";
import {Msd} from "./msd.js"; import {Msd} from "./msd.js";
import {Streamer} from "./stream.js"; import {Streamer} from "./stream.js";
@ -48,6 +49,7 @@ export function Session() {
var __streamer = new Streamer(); var __streamer = new Streamer();
var __recorder = new Recorder(); var __recorder = new Recorder();
var __hid = new Hid(__streamer.getGeometry, __recorder); var __hid = new Hid(__streamer.getGeometry, __recorder);
var __paste = new Paste(__recorder);
var __atx = new Atx(__recorder); var __atx = new Atx(__recorder);
var __msd = new Msd(); var __msd = new Msd();
var __gpio = new Gpio(__recorder); var __gpio = new Gpio(__recorder);
@ -363,8 +365,8 @@ export function Session() {
case "pong": __missed_heartbeats = 0; break; case "pong": __missed_heartbeats = 0; break;
case "info_state": __setInfoState(data.event); break; case "info_state": __setInfoState(data.event); break;
case "gpio_state": __gpio.setState(data.event); break; case "gpio_state": __gpio.setState(data.event); break;
case "hid_keymaps_state": __hid.setKeymaps(data.event); break;
case "hid_state": __hid.setState(data.event); break; case "hid_state": __hid.setState(data.event); break;
case "hid_keymaps_state": __paste.setState(data.event); break;
case "atx_state": __atx.setState(data.event); break; case "atx_state": __atx.setState(data.event); break;
case "msd_state": __msd.setState(data.event); break; case "msd_state": __msd.setState(data.event); break;
case "streamer_state": __streamer.setState(data.event); break; case "streamer_state": __streamer.setState(data.event); break;
@ -395,6 +397,8 @@ export function Session() {
__gpio.setState(null); __gpio.setState(null);
__hid.setSocket(null); __hid.setSocket(null);
__recorder.setSocket(null); __recorder.setSocket(null);
__paste.setState(null);
__atx.setState(null); __atx.setState(null);
__msd.setState(null); __msd.setState(null);
__streamer.setState(null); __streamer.setState(null);

View File

@ -317,30 +317,6 @@ export var tools = new function() {
} }
return false; return false;
}, },
"setValues": function(el, values, empty_title=null) {
if (values.constructor == Object) {
values = Object.keys(values).sort();
}
let values_json = JSON.stringify(values);
if (el.__values_json !== values_json) {
el.options.length = 0;
for (let value of values) {
let title = value;
if (title.length === 0 && empty_title !== null) {
title = empty_title;
}
self.selector.addOption(el, title, value);
}
el.__values_json = values_json;
el.__values = values;
}
},
"setSelectedValue": function(el, value) {
if (el.__values && el.__values.includes(value)) {
el.value = value;
}
},
}; };
}; };