diff options
author | Devaev Maxim <[email protected]> | 2018-12-15 04:29:40 +0300 |
---|---|---|
committer | Devaev Maxim <[email protected]> | 2018-12-15 04:29:40 +0300 |
commit | 3c33bd37190772a783369894e209bcfe0858177a (patch) | |
tree | e095f08f37371a3182f6ced0b280c4bcaa06983b /web/share/js/kvm/hid.js | |
parent | 3445766a50eab16a96d969397a6fe0422f7cfcd2 (diff) |
own auth
Diffstat (limited to 'web/share/js/kvm/hid.js')
-rw-r--r-- | web/share/js/kvm/hid.js | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/web/share/js/kvm/hid.js b/web/share/js/kvm/hid.js new file mode 100644 index 00000000..49d659ab --- /dev/null +++ b/web/share/js/kvm/hid.js @@ -0,0 +1,198 @@ +function Hid() { + var self = this; + + /********************************************************************************/ + + var __ws = null; + + var __chars_to_codes = {}; + var __codes_delay = 50; + + var __keyboard = new Keyboard(); + var __mouse = new Mouse(); + + var __init__ = function() { + var __hidden_attr = null; + var __visibility_change_attr = null; + + if (typeof document.hidden !== "undefined") { + __hidden_attr = "hidden"; + __visibility_change_attr = "visibilitychange"; + } else if (typeof document.webkitHidden !== "undefined") { + __hidden_attr = "webkitHidden"; + __visibility_change_attr = "webkitvisibilitychange"; + } else if (typeof document.mozHidden !== "undefined") { + __hidden_attr = "mozHidden"; + __visibility_change_attr = "mozvisibilitychange"; + } + + if (__visibility_change_attr) { + document.addEventListener( + __visibility_change_attr, + function() { + if (document[__hidden_attr]) { + __releaseAll(); + } + }, + false + ); + } + + window.addEventListener("pagehide", __releaseAll); + window.addEventListener("blur", __releaseAll); + + __chars_to_codes = __buildCharsToCodes(); + + tools.setOnClick($("hid-pak-button"), __clickPasteAsKeysButton); + tools.setOnClick($("hid-reset-button"), __clickResetButton); + + Array.prototype.forEach.call(document.querySelectorAll("[data-shortcut]"), function(el_shortcut) { + tools.setOnClick(el_shortcut, () => __emitShortcut(el_shortcut.getAttribute("data-shortcut").split(" "))); + }); + }; + + /********************************************************************************/ + + self.setSocket = function(ws) { + wm.switchDisabled($("hid-pak-text"), !ws); + wm.switchDisabled($("hid-pak-button"), !ws); + wm.switchDisabled($("hid-reset-button"), !ws); + __ws = ws; + __keyboard.setSocket(ws); + __mouse.setSocket(ws); + }; + + var __releaseAll = function() { + __keyboard.releaseAll(); + }; + + var __emitShortcut = function(codes) { + return new Promise(function(resolve) { + tools.debug("HID: emitting keys:", codes); + + var raw_events = []; + [[codes, true], [codes.slice().reverse(), false]].forEach(function(op) { + var [op_codes, state] = op; + op_codes.forEach(function(code) { + raw_events.push({code: code, state: state}); + }); + }); + + var index = 0; + var iterate = () => setTimeout(function() { + __keyboard.fireEvent(raw_events[index].code, raw_events[index].state); + ++index; + if (index < raw_events.length) { + iterate(); + } else { + resolve(null); + } + }, __codes_delay); + iterate(); + }); + }; + + var __buildCharsToCodes = function() { + var chars_to_codes = { + "\n": ["Enter"], + "\t": ["Tab"], + " ": ["Space"], + "`": ["Backquote"], "~": ["ShiftLeft", "Backquote"], + "\\": ["Backslash"], "|": ["ShiftLeft", "Backslash"], + "[": ["BracketLeft"], "{": ["ShiftLeft", "BracketLeft"], + "]": ["BracketLeft"], "}": ["ShiftLeft", "BracketRight"], + ",": ["Comma"], "<": ["ShiftLeft", "Comma"], + ".": ["Period"], ">": ["ShiftLeft", "Period"], + "1": ["Digit1"], "!": ["ShiftLeft", "Digit1"], + "2": ["Digit2"], "@": ["ShiftLeft", "Digit2"], + "3": ["Digit3"], "#": ["ShiftLeft", "Digit3"], + "4": ["Digit4"], "$": ["ShiftLeft", "Digit4"], + "5": ["Digit5"], "%": ["ShiftLeft", "Digit5"], + "6": ["Digit6"], "^": ["ShiftLeft", "Digit6"], + "7": ["Digit7"], "&": ["ShiftLeft", "Digit7"], + "8": ["Digit8"], "*": ["ShiftLeft", "Digit8"], + "9": ["Digit9"], "(": ["ShiftLeft", "Digit9"], + "0": ["Digit0"], ")": ["ShiftLeft", "Digit0"], + "-": ["Minus"], "_": ["ShiftLeft", "Minus"], + "'": ["Quote"], "\"": ["ShiftLeft", "Quote"], + ";": ["Semicolon"], ":": ["ShiftLeft", "Semicolon"], + "/": ["Slash"], "?": ["ShiftLeft", "Slash"], + "=": ["Equal"], "+": ["ShiftLeft", "Equal"], + }; + + for (var ch = "a".charCodeAt(0); ch <= "z".charCodeAt(0); ++ch) { + var low = String.fromCharCode(ch); + var up = low.toUpperCase(); + var code = "Key" + up; + chars_to_codes[low] = [code]; + chars_to_codes[up] = ["ShiftLeft", code]; + } + + return chars_to_codes; + }; + + var __clickPasteAsKeysButton = function() { + var text = $("hid-pak-text").value.replace(/[^\x00-\x7F]/g, ""); // eslint-disable-line no-control-regex + if (text) { + var clipboard_codes = []; + var codes_count = 0; + [...text].forEach(function(ch) { + var codes = __chars_to_codes[ch]; + if (codes) { + codes_count += codes.length; + clipboard_codes.push(codes); + } + }); + var time = __codes_delay * codes_count * 2 / 1000; + + var confirm_msg = ` + You are going to automatically type ${codes_count} characters from the system clipboard. + It will take ${time} seconds.<br> + <br> + Are you sure you want to continue? + `; + + wm.confirm(confirm_msg).then(function(ok) { + if (ok) { + wm.switchDisabled($("hid-pak-text"), true); + wm.switchDisabled($("hid-pak-button"), true); + $("hid-pak-led").className = "led-yellow-rotating-fast"; + $("hid-pak-led").title = "Autotyping..."; + + tools.debug("HID: paste-as-keys:", text); + + var index = 0; + var iterate = function() { + __emitShortcut(clipboard_codes[index]).then(function() { + ++index; + if (index < clipboard_codes.length && __ws) { + iterate(); + } else { + $("hid-pak-text").value = ""; + wm.switchDisabled($("hid-pak-text"), false); + wm.switchDisabled($("hid-pak-button"), false); + $("hid-pak-led").className = "led-gray"; + $("hid-pak-led").title = ""; + } + }); + }; + iterate(); + } else { + $("hid-pak-text").value = ""; + } + }); + } + }; + + var __clickResetButton = function() { + var http = tools.makeRequest("POST", "/kvmd/hid/reset", function() { + if (http.readyState === 4) { + if (http.status !== 200) { + wm.error("HID reset error:<br>", http.responseText); + } + } + }); + }; + + __init__(); +} |