You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.6 KiB
JavaScript
108 lines
3.6 KiB
JavaScript
// ==UserScript==
|
|
// @name noVNC Paste for Proxmox
|
|
// @namespace http://tampermonkey.net/
|
|
// @version 0.2a
|
|
// @description Pastes text into a noVNC window (for use with Proxmox specifically)
|
|
// @author Chester Enright
|
|
// @match https://*
|
|
// @include /^.*novnc.*/
|
|
// @require http://code.jquery.com/jquery-3.3.1.min.js
|
|
// @grant none
|
|
// ==/UserScript==
|
|
const delay = 1
|
|
;
|
|
(function () {
|
|
'use strict';
|
|
|
|
let capsLockOn = false;
|
|
const KEY_DELAY = 50;
|
|
const SHIFT_NEEDED = /[A-Z!@#$%^&*()_+{}:"<>?~|]/;
|
|
|
|
function simulateKeyEvent(el, eventType, key, options = {}) {
|
|
const evt = new KeyboardEvent(eventType, { key, ...options });
|
|
el.dispatchEvent(evt);
|
|
}
|
|
|
|
window.sendString = function(text) {
|
|
const el = document.getElementById("novnc-canvas");
|
|
if (!el) {
|
|
console.error("Canvas element not found");
|
|
return;
|
|
}
|
|
|
|
text.split('').forEach((char, index) => {
|
|
setTimeout(() => {
|
|
if (char === '\n') {
|
|
// Simulate "Enter" key press for line breaks
|
|
simulateKeyEvent(el, "keydown", "Enter");
|
|
simulateKeyEvent(el, "keyup", "Enter");
|
|
} else {
|
|
const needsShift = SHIFT_NEEDED.test(char);
|
|
const isUpperCase = char >= 'A' && char <= 'Z';
|
|
|
|
if (needsShift) {
|
|
simulateKeyEvent(el, "keydown", "Shift", { keyCode: 16 });
|
|
}
|
|
|
|
if (isUpperCase && capsLockOn) {
|
|
simulateKeyEvent(el, "keydown", char.toLowerCase());
|
|
simulateKeyEvent(el, "keyup", char.toLowerCase());
|
|
} else {
|
|
simulateKeyEvent(el, "keydown", char);
|
|
simulateKeyEvent(el, "keyup", char);
|
|
}
|
|
|
|
if (needsShift) {
|
|
simulateKeyEvent(el, "keyup", "Shift", { keyCode: 16 });
|
|
}
|
|
|
|
if (char === "CapsLock") {
|
|
capsLockOn = !capsLockOn;
|
|
console.log("Caps Lock state changed:", capsLockOn);
|
|
}
|
|
}
|
|
}, index * KEY_DELAY);
|
|
});
|
|
};
|
|
|
|
function waitForCanvas() {
|
|
return new Promise((resolve) => {
|
|
const checkCanvas = () => {
|
|
const canvas = $("canvas");
|
|
if (canvas.length > 0) {
|
|
canvas.attr("id", "novnc-canvas");
|
|
resolve(canvas);
|
|
} else {
|
|
setTimeout(checkCanvas, 500);
|
|
}
|
|
};
|
|
checkCanvas();
|
|
});
|
|
}
|
|
|
|
async function setupNoVNCPaste() {
|
|
try {
|
|
console.log("Starting up noVNC Copy/Paste (for Proxmox) - Improved Version with Line Breaks");
|
|
|
|
const canvas = await waitForCanvas();
|
|
|
|
canvas.on("mousedown", (e) => {
|
|
if (e.button == 2) { // Right Click
|
|
navigator.clipboard.readText()
|
|
.then(text => {
|
|
window.sendString(text);
|
|
})
|
|
.catch(err => {
|
|
console.error("Failed to read clipboard:", err);
|
|
});
|
|
}
|
|
});
|
|
|
|
console.log("noVNC Copy/Paste setup completed");
|
|
} catch (error) {
|
|
console.error("Error setting up noVNC Copy/Paste:", error);
|
|
}
|
|
}
|
|
|
|
$(document).ready(setupNoVNCPaste);
|
|
})(); |