Upload files to 'k3os/utilities'
parent
0e312a44b5
commit
e13c1a742e
@ -0,0 +1,108 @@
|
||||
// ==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);
|
||||
})();
|
||||
Loading…
Reference in New Issue