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