diff --git a/app.js b/app.js index 7d6ada3..87cd989 100644 --- a/app.js +++ b/app.js @@ -15,6 +15,7 @@ var FM_HOME = process.env.FM_HOME || '/config'; var KEYBOARD = process.env.KEYBOARD || 'en-us-qwerty'; //// Application Variables //// +var package_info = require('./package.json'); var socketIO = require('socket.io'); var crypto = require('crypto'); var ejs = require('ejs'); @@ -78,6 +79,11 @@ baseRouter.get('/', function (req, res) { res.render(__dirname + '/rdp.ejs', {token : encrypt(connectString), title: TITLE, keyboard: KEYBOARD}); }); +//// Web app manifest //// +baseRouter.get('/manifest.json', function (req, res) { + res.render(__dirname + '/manifest.ejs', {version: package_info.version, title: TITLE}); +}); + //// Web File Browser //// // Send landing page baseRouter.get('/files', function (req, res) { diff --git a/public/manifest.json b/manifest.ejs similarity index 64% rename from public/manifest.json rename to manifest.ejs index 120c2ba..e1f29bc 100644 --- a/public/manifest.json +++ b/manifest.ejs @@ -1,9 +1,9 @@ { - "name": "LinuxServer Guacamole Client", - "short_name": "RDP Client", + "name": "<%- title -%>", + "short_name": "<%- title -%>", "manifest_version": 2, - "version": "0.2.0", - "display": "standalone", + "version": "<%- version -%>", + "display": "fullscreen", "background_color": "#000000", "theme_color": "#000000", "icons": [ diff --git a/package.json b/package.json index 7d0743a..f1541d2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "GClient", - "version": "1.1.0", + "version": "1.1.1", "description": "LinuxServer Guacamole Client", "main": "app.js", "scripts": { diff --git a/public/css/files.svg b/public/css/files.svg new file mode 100644 index 0000000..6dc8302 --- /dev/null +++ b/public/css/files.svg @@ -0,0 +1,2 @@ + + diff --git a/public/css/fit.svg b/public/css/fit.svg new file mode 100644 index 0000000..0e72055 --- /dev/null +++ b/public/css/fit.svg @@ -0,0 +1 @@ + diff --git a/public/css/fullscreen.svg b/public/css/fullscreen.svg new file mode 100644 index 0000000..40810fb --- /dev/null +++ b/public/css/fullscreen.svg @@ -0,0 +1 @@ + diff --git a/public/css/keyboard.svg b/public/css/keyboard.svg new file mode 100644 index 0000000..4be8d63 --- /dev/null +++ b/public/css/keyboard.svg @@ -0,0 +1 @@ + diff --git a/public/css/vdi.css b/public/css/vdi.css index 57b3fb9..a50d1b8 100644 --- a/public/css/vdi.css +++ b/public/css/vdi.css @@ -39,26 +39,40 @@ button { position: absolute; top: 50%; transform: translateY(-50%); - color: white; z-index: 2; - background: rgba(0, 0, 0, 0.3); - text-decoration: none; - font-size: 1.2em; - border-radius: 5px; - border:1px solid white; + width: 20vw; + height: 30vh; } -.sidenav { - width: 100%; +.menu { + white-space: nowrap; +} + +.icons { + margin-right: 1px; + margin-left: 1px; + padding: 4px; + height: 6vh; + width: 3.7vw; cursor: pointer; - text-align: center; - padding-top: 10px; - padding-bottom: 10px; - border-radius: 5px; + border-radius: 3px; + background: rgba(255, 255, 255, 0.3); + filter: invert(100%) sepia(0%) saturate(0%) hue-rotate(82deg) brightness(105%) contrast(105%); } -.sidenav:hover { +.menu-vert { +} + +.icons-vert { + margin-right: 1px; + margin-left: 1px; + padding: 4px; + height: 6vh; + width: 20vw; + cursor: pointer; + border-radius: 3px; background: rgba(255, 255, 255, 0.3); + filter: invert(100%) sepia(0%) saturate(0%) hue-rotate(82deg) brightness(105%) contrast(105%); } #sideopen { @@ -68,9 +82,9 @@ button { top: 50%; transform: translateY(-50%); border-radius:50%; - width: 20px; - height: 20px; - border:1px solid white; + width: 18px; + height: 18px; + border: 2px solid white; } .close { @@ -82,11 +96,14 @@ button { border-radius:50%; width: 20px; height: 20px; - border:1px solid white; + border: 2px solid white; } #clipboard { border-radius: 5px; + height: 20vh; + width: 19.55vw; + resize: none; } /* On Screen Keyboard */ @@ -97,7 +114,7 @@ button { bottom: 0; left: 0; width: 100vw; - opacity: 0.5; + opacity: 0.8; z-index: 2; background: rgba(0, 0, 0, 0.1); } diff --git a/public/js/rdp.js b/public/js/rdp.js index a58ddb8..cc556f6 100644 --- a/public/js/rdp.js +++ b/public/js/rdp.js @@ -26,6 +26,7 @@ if (protocol == 'http:') { } var path = window.location.pathname; // Guac logic loop +var touchState = {down:false,left:false,middle:false,right:false,up:false,x:0,y:0}; function runGuac(reset) { guac = new Guacamole.Client( new Guacamole.WebSocketTunnel(wsproto + '//' + host + ':' + port + path + 'guaclite?token=' + connectionstring + '&width=' + $(document).width() + '&height=' + $(document).height()) @@ -61,17 +62,56 @@ function runGuac(reset) { guac.sendMouseState(mouseState); }; // Touchscreen + var timeOut = 1000; + var timer; + var timerFired; + var startX; + var startY; $('#display').bind('touchmove', function(e) { e.preventDefault(); let touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]; - guac.sendMouseState({'x': Math.round(touch.pageX),"y": Math.round(touch.pageY)}) + let xPos = Math.round(touch.pageX); + let yPos = Math.round(touch.pageY); + if ((Math.abs(yPos - startY) > 1) || (Math.abs(xPos - startX) > 1)) { + startX = 0; + startY = 0; + clearTimeout(timer); + touchState.left = true; + touchState.x = xPos; + touchState.y = yPos; + guac.sendMouseState(touchState); + } + }); + $('#display').bind('touchstart', function(e) { + e.preventDefault(); + let touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]; + startX = Math.round(touch.pageX); + startY = Math.round(touch.pagey); + touchState.x = Math.round(touch.pageX); + touchState.y = Math.round(touch.pageY); + guac.sendMouseState(touchState); + timer = setTimeout(function() { + touchState.left = false; + touchState.right = true; + guac.sendMouseState(touchState); + touchState.right = false; + guac.sendMouseState(touchState); + timerFired = true; + }, timeOut); + }); + $('#display').bind('touchend', function(e) { + e.preventDefault(); + clearTimeout(timer); + if (timerFired) { + timerFired = false; + } else { + touchState.left = true; + } + guac.sendMouseState(touchState); + touchState.left = false; + touchState.right = false; + guac.sendMouseState(touchState); }); - var touch = new Guacamole.Mouse.Touchscreen(guac.getDisplay().getElement()); - touch.onmousedown = - touch.onmouseup = - touch.onmousemove = function(mouseState) { - guac.sendMouseState(mouseState); - }; // Audio guac.onaudio = function clientAudio(stream, mimetype) { let context = Guacamole.AudioContextFactory.getAudioContext(); @@ -174,10 +214,28 @@ async function fullscreen() { } // Run main logic on load -window.onload = function() { +window.onload = function() { + if ($(window).width() < 700) { + $('.menu').addClass('menu-vert').removeClass('menu'); + $('.icons').addClass('icons-vert').removeClass('icons'); + } else { + $('.menu-vert').addClass('menu').removeClass('menu-vert'); + $('.icons-vert').addClass('icons').removeClass('icons-vert'); + } runGuac(false); } +// Handle style changes for vertical menu +$(window).resize(function() { + if ($(window).width() < 700) { + $('.menu').addClass('menu-vert').removeClass('menu'); + $('.icons').addClass('icons-vert').removeClass('icons'); + } else { + $('.menu-vert').addClass('menu').removeClass('menu-vert'); + $('.icons-vert').addClass('icons').removeClass('icons-vert'); + } +}); + //// On Screen keyboards //// var en_us_qwerty = {"language":"en_US","type":"qwerty","width":22,"keys":{"0":[{"title":"0","requires":[]},{"title":")","requires":["shift"]}],"1":[{"title":"1","requires":[]},{"title":"!","requires":["shift"]}],"2":[{"title":"2","requires":[]},{"title":"@","requires":["shift"]}],"3":[{"title":"3","requires":[]},{"title":"#","requires":["shift"]}],"4":[{"title":"4","requires":[]},{"title":"$","requires":["shift"]}],"5":[{"title":"5","requires":[]},{"title":"%","requires":["shift"]}],"6":[{"title":"6","requires":[]},{"title":"^","requires":["shift"]}],"7":[{"title":"7","requires":[]},{"title":"&","requires":["shift"]}],"8":[{"title":"8","requires":[]},{"title":"*","requires":["shift"]}],"9":[{"title":"9","requires":[]},{"title":"(","requires":["shift"]}],"Back":65288,"Tab":65289,"Enter":65293,"Esc":65307,"Home":65360,"PgUp":65365,"PgDn":65366,"End":65367,"Ins":65379,"F1":65470,"F2":65471,"F3":65472,"F4":65473,"F5":65474,"F6":65475,"F7":65476,"F8":65477,"F9":65478,"F10":65479,"F11":65480,"F12":65481,"Del":65535,"Space":" ","Left":[{"title":"←","keysym":65361}],"Up":[{"title":"↑","keysym":65362}],"Right":[{"title":"→","keysym":65363}],"Down":[{"title":"↓","keysym":65364}],"Menu":[{"title":"Menu","keysym":65383}],"LShift":[{"title":"Shift","modifier":"shift","keysym":65505}],"RShift":[{"title":"Shift","modifier":"shift","keysym":65506}],"LCtrl":[{"title":"Ctrl","modifier":"control","keysym":65507}],"RCtrl":[{"title":"Ctrl","modifier":"control","keysym":65508}],"Caps":[{"title":"Caps","modifier":"caps","keysym":65509}],"LAlt":[{"title":"Alt","modifier":"alt","keysym":65513}],"RAlt":[{"title":"Alt","modifier":"alt","keysym":65514}],"Super":[{"title":"Super","modifier":"super","keysym":65515}],"`":[{"title":"`","requires":[]},{"title":"~","requires":["shift"]}],"-":[{"title":"-","requires":[]},{"title":"_","requires":["shift"]}],"=":[{"title":"=","requires":[]},{"title":"+","requires":["shift"]}],",":[{"title":",","requires":[]},{"title":"<","requires":["shift"]}],".":[{"title":".","requires":[]},{"title":">","requires":["shift"]}],"/":[{"title":"/","requires":[]},{"title":"?","requires":["shift"]}],"[":[{"title":"[","requires":[]},{"title":"{","requires":["shift"]}],"]":[{"title":"]","requires":[]},{"title":"}","requires":["shift"]}],"\\":[{"title":"\\","requires":[]},{"title":"|","requires":["shift"]}],";":[{"title":";","requires":[]},{"title":":","requires":["shift"]}],"'":[{"title":"'","requires":[]},{"title":"\"","requires":["shift"]}],"q":[{"title":"q","requires":[]},{"title":"Q","requires":["caps"]},{"title":"Q","requires":["shift"]},{"title":"q","requires":["caps","shift"]}],"w":[{"title":"w","requires":[]},{"title":"W","requires":["caps"]},{"title":"W","requires":["shift"]},{"title":"w","requires":["caps","shift"]}],"e":[{"title":"e","requires":[]},{"title":"E","requires":["caps"]},{"title":"E","requires":["shift"]},{"title":"e","requires":["caps","shift"]}],"r":[{"title":"r","requires":[]},{"title":"R","requires":["caps"]},{"title":"R","requires":["shift"]},{"title":"r","requires":["caps","shift"]}],"t":[{"title":"t","requires":[]},{"title":"T","requires":["caps"]},{"title":"T","requires":["shift"]},{"title":"t","requires":["caps","shift"]}],"y":[{"title":"y","requires":[]},{"title":"Y","requires":["caps"]},{"title":"Y","requires":["shift"]},{"title":"y","requires":["caps","shift"]}],"u":[{"title":"u","requires":[]},{"title":"U","requires":["caps"]},{"title":"U","requires":["shift"]},{"title":"u","requires":["caps","shift"]}],"i":[{"title":"i","requires":[]},{"title":"I","requires":["caps"]},{"title":"I","requires":["shift"]},{"title":"i","requires":["caps","shift"]}],"o":[{"title":"o","requires":[]},{"title":"O","requires":["caps"]},{"title":"O","requires":["shift"]},{"title":"o","requires":["caps","shift"]}],"p":[{"title":"p","requires":[]},{"title":"P","requires":["caps"]},{"title":"P","requires":["shift"]},{"title":"p","requires":["caps","shift"]}],"a":[{"title":"a","requires":[]},{"title":"A","requires":["caps"]},{"title":"A","requires":["shift"]},{"title":"a","requires":["caps","shift"]}],"s":[{"title":"s","requires":[]},{"title":"S","requires":["caps"]},{"title":"S","requires":["shift"]},{"title":"s","requires":["caps","shift"]}],"d":[{"title":"d","requires":[]},{"title":"D","requires":["caps"]},{"title":"D","requires":["shift"]},{"title":"d","requires":["caps","shift"]}],"f":[{"title":"f","requires":[]},{"title":"F","requires":["caps"]},{"title":"F","requires":["shift"]},{"title":"f","requires":["caps","shift"]}],"g":[{"title":"g","requires":[]},{"title":"G","requires":["caps"]},{"title":"G","requires":["shift"]},{"title":"g","requires":["caps","shift"]}],"h":[{"title":"h","requires":[]},{"title":"H","requires":["caps"]},{"title":"H","requires":["shift"]},{"title":"h","requires":["caps","shift"]}],"j":[{"title":"j","requires":[]},{"title":"J","requires":["caps"]},{"title":"J","requires":["shift"]},{"title":"j","requires":["caps","shift"]}],"k":[{"title":"k","requires":[]},{"title":"K","requires":["caps"]},{"title":"K","requires":["shift"]},{"title":"k","requires":["caps","shift"]}],"l":[{"title":"l","requires":[]},{"title":"L","requires":["caps"]},{"title":"L","requires":["shift"]},{"title":"l","requires":["caps","shift"]}],"z":[{"title":"z","requires":[]},{"title":"Z","requires":["caps"]},{"title":"Z","requires":["shift"]},{"title":"z","requires":["caps","shift"]}],"x":[{"title":"x","requires":[]},{"title":"X","requires":["caps"]},{"title":"X","requires":["shift"]},{"title":"x","requires":["caps","shift"]}],"c":[{"title":"c","requires":[]},{"title":"C","requires":["caps"]},{"title":"C","requires":["shift"]},{"title":"c","requires":["caps","shift"]}],"v":[{"title":"v","requires":[]},{"title":"V","requires":["caps"]},{"title":"V","requires":["shift"]},{"title":"v","requires":["caps","shift"]}],"b":[{"title":"b","requires":[]},{"title":"B","requires":["caps"]},{"title":"B","requires":["shift"]},{"title":"b","requires":["caps","shift"]}],"n":[{"title":"n","requires":[]},{"title":"N","requires":["caps"]},{"title":"N","requires":["shift"]},{"title":"n","requires":["caps","shift"]}],"m":[{"title":"m","requires":[]},{"title":"M","requires":["caps"]},{"title":"M","requires":["shift"]},{"title":"m","requires":["caps","shift"]}]},"layout":[["Esc",0.7,"F1","F2","F3","F4",0.7,"F5","F6","F7","F8",0.7,"F9","F10","F11","F12"],[0.1],{"main":{"alpha":[["`","1","2","3","4","5","6","7","8","9","0","-","=","Back"],["Tab","q","w","e","r","t","y","u","i","o","p","[","]","\\"],["Caps","a","s","d","f","g","h","j","k","l",";","'","Enter"],["LShift","z","x","c","v","b","n","m",",",".","/","RShift"],["LCtrl","Super","LAlt","Space","RAlt","Menu","RCtrl"]],"movement":[["Ins","Home","PgUp"],["Del","End","PgDn"],[1],["Up"],["Left","Down","Right"]]}}],"keyWidths":{"Back":2,"Tab":1.5,"\\":1.5,"Caps":1.85,"Enter":2.25,"LShift":2.1,"RShift":3.1,"LCtrl":1.6,"Super":1.6,"LAlt":1.6,"Space":6.1,"RAlt":1.6,"Menu":1.6,"RCtrl":1.6,"Ins":1.6,"Home":1.6,"PgUp":1.6,"Del":1.6,"End":1.6,"PgDn":1.6}}; var de_de_qwertz = {"language":"de_DE","type":"qwertz","width":23,"keys":{"0":[{"title":"0","requires":[]},{"title":"=","requires":["shift"]},{"title":"}","requires":["alt-gr"]}],"1":[{"title":"1","requires":[]},{"title":"!","requires":["shift"]}],"2":[{"title":"2","requires":[]},{"title":"\"","requires":["shift"]},{"title":"²","requires":["alt-gr"]}],"3":[{"title":"3","requires":[]},{"title":"§","requires":["shift"]},{"title":"³","requires":["alt-gr"]}],"4":[{"title":"4","requires":[]},{"title":"$","requires":["shift"]}],"5":[{"title":"5","requires":[]},{"title":"%","requires":["shift"]}],"6":[{"title":"6","requires":[]},{"title":"&","requires":["shift"]}],"7":[{"title":"7","requires":[]},{"title":"/","requires":["shift"]},{"title":"{","requires":["alt-gr"]}],"8":[{"title":"8","requires":[]},{"title":"(","requires":["shift"]},{"title":"[","requires":["alt-gr"]}],"9":[{"title":"9","requires":[]},{"title":")","requires":["shift"]},{"title":"]","requires":["alt-gr"]}],"Esc":65307,"F1":65470,"F2":65471,"F3":65472,"F4":65473,"F5":65474,"F6":65475,"F7":65476,"F8":65477,"F9":65478,"F10":65479,"F11":65480,"F12":65481,"Space":" ","Back":[{"title":"⟵","keysym":65288}],"Tab":[{"title":"Tab ↹","keysym":65289}],"Enter":[{"title":"↵","keysym":65293}],"Home":[{"title":"Pos 1","keysym":65360}],"PgUp":[{"title":"Bild ↑","keysym":65365}],"PgDn":[{"title":"Bild ↓","keysym":65366}],"End":[{"title":"Ende","keysym":65367}],"Ins":[{"title":"Einfg","keysym":65379}],"Del":[{"title":"Entf","keysym":65535}],"Left":[{"title":"←","keysym":65361}],"Up":[{"title":"↑","keysym":65362}],"Right":[{"title":"→","keysym":65363}],"Down":[{"title":"↓","keysym":65364}],"Menu":[{"title":"Menu","keysym":65383}],"LShift":[{"title":"Shift","modifier":"shift","keysym":65505}],"RShift":[{"title":"Shift","modifier":"shift","keysym":65506}],"LCtrl":[{"title":"Strg","modifier":"control","keysym":65507}],"RCtrl":[{"title":"Strg","modifier":"control","keysym":65508}],"Caps":[{"title":"Caps","modifier":"caps","keysym":65509}],"LAlt":[{"title":"Alt","modifier":"alt","keysym":65513}],"AltGr":[{"title":"AltGr","modifier":"alt-gr","keysym":65027}],"Meta":[{"title":"Meta","modifier":"meta","keysym":65511}],"^":[{"title":"^","requires":[]},{"title":"°","requires":["shift"]}],"ß":[{"title":"ß","requires":[]},{"title":"?","requires":["shift"]},{"title":"\\","requires":["alt-gr"]}],"´":[{"title":"´","requires":[]},{"title":"`","requires":["shift"]}],"+":[{"title":"+","requires":[]},{"title":"*","requires":["shift"]},{"title":"~","requires":["alt-gr"]}],"#":[{"title":"#","requires":[]},{"title":"'","requires":["shift"]}],"<":[{"title":"<","requires":[]},{"title":">","requires":["shift"]},{"title":"|","requires":["alt-gr"]}],",":[{"title":",","requires":[]},{"title":";","requires":["shift"]}],".":[{"title":".","requires":[]},{"title":":","requires":["shift"]}],"-":[{"title":"-","requires":[]},{"title":"_","requires":["shift"]}],"q":[{"title":"q","requires":[]},{"title":"Q","requires":["caps"]},{"title":"Q","requires":["shift"]},{"title":"q","requires":["caps","shift"]},{"title":"@","requires":["alt-gr"]}],"w":[{"title":"w","requires":[]},{"title":"W","requires":["caps"]},{"title":"W","requires":["shift"]},{"title":"w","requires":["caps","shift"]}],"e":[{"title":"e","requires":[]},{"title":"E","requires":["caps"]},{"title":"E","requires":["shift"]},{"title":"e","requires":["caps","shift"]},{"title":"€","requires":["alt-gr"]}],"r":[{"title":"r","requires":[]},{"title":"R","requires":["caps"]},{"title":"R","requires":["shift"]},{"title":"r","requires":["caps","shift"]}],"t":[{"title":"t","requires":[]},{"title":"T","requires":["caps"]},{"title":"T","requires":["shift"]},{"title":"t","requires":["caps","shift"]}],"z":[{"title":"z","requires":[]},{"title":"Z","requires":["caps"]},{"title":"Z","requires":["shift"]},{"title":"z","requires":["caps","shift"]}],"u":[{"title":"u","requires":[]},{"title":"U","requires":["caps"]},{"title":"U","requires":["shift"]},{"title":"u","requires":["caps","shift"]}],"i":[{"title":"i","requires":[]},{"title":"I","requires":["caps"]},{"title":"I","requires":["shift"]},{"title":"i","requires":["caps","shift"]}],"o":[{"title":"o","requires":[]},{"title":"O","requires":["caps"]},{"title":"O","requires":["shift"]},{"title":"o","requires":["caps","shift"]}],"p":[{"title":"p","requires":[]},{"title":"P","requires":["caps"]},{"title":"P","requires":["shift"]},{"title":"p","requires":["caps","shift"]}],"ü":[{"title":"ü","requires":[]},{"title":"Ü","requires":["caps"]},{"title":"Ü","requires":["shift"]},{"title":"ü","requires":["caps","shift"]}],"a":[{"title":"a","requires":[]},{"title":"A","requires":["caps"]},{"title":"A","requires":["shift"]},{"title":"a","requires":["caps","shift"]}],"s":[{"title":"s","requires":[]},{"title":"S","requires":["caps"]},{"title":"S","requires":["shift"]},{"title":"s","requires":["caps","shift"]}],"d":[{"title":"d","requires":[]},{"title":"D","requires":["caps"]},{"title":"D","requires":["shift"]},{"title":"d","requires":["caps","shift"]}],"f":[{"title":"f","requires":[]},{"title":"F","requires":["caps"]},{"title":"F","requires":["shift"]},{"title":"f","requires":["caps","shift"]}],"g":[{"title":"g","requires":[]},{"title":"G","requires":["caps"]},{"title":"G","requires":["shift"]},{"title":"g","requires":["caps","shift"]}],"h":[{"title":"h","requires":[]},{"title":"H","requires":["caps"]},{"title":"H","requires":["shift"]},{"title":"h","requires":["caps","shift"]}],"j":[{"title":"j","requires":[]},{"title":"J","requires":["caps"]},{"title":"J","requires":["shift"]},{"title":"j","requires":["caps","shift"]}],"k":[{"title":"k","requires":[]},{"title":"K","requires":["caps"]},{"title":"K","requires":["shift"]},{"title":"k","requires":["caps","shift"]}],"l":[{"title":"l","requires":[]},{"title":"L","requires":["caps"]},{"title":"L","requires":["shift"]},{"title":"l","requires":["caps","shift"]}],"ö":[{"title":"ö","requires":[]},{"title":"Ö","requires":["caps"]},{"title":"Ö","requires":["shift"]},{"title":"ö","requires":["caps","shift"]}],"ä":[{"title":"ä","requires":[]},{"title":"Ä","requires":["caps"]},{"title":"Ä","requires":["shift"]},{"title":"ä","requires":["caps","shift"]}],"y":[{"title":"y","requires":[]},{"title":"Y","requires":["caps"]},{"title":"Y","requires":["shift"]},{"title":"y","requires":["caps","shift"]}],"x":[{"title":"x","requires":[]},{"title":"X","requires":["caps"]},{"title":"X","requires":["shift"]},{"title":"x","requires":["caps","shift"]}],"c":[{"title":"c","requires":[]},{"title":"C","requires":["caps"]},{"title":"C","requires":["shift"]},{"title":"c","requires":["caps","shift"]}],"v":[{"title":"v","requires":[]},{"title":"V","requires":["caps"]},{"title":"V","requires":["shift"]},{"title":"v","requires":["caps","shift"]}],"b":[{"title":"b","requires":[]},{"title":"B","requires":["caps"]},{"title":"B","requires":["shift"]},{"title":"b","requires":["caps","shift"]}],"n":[{"title":"n","requires":[]},{"title":"N","requires":["caps"]},{"title":"N","requires":["shift"]},{"title":"n","requires":["caps","shift"]}],"m":[{"title":"m","requires":[]},{"title":"M","requires":["caps"]},{"title":"M","requires":["shift"]},{"title":"m","requires":["caps","shift"]},{"title":"µ","requires":["alt-gr"]}]},"layout":[["Esc",0.7,"F1","F2","F3","F4",0.7,"F5","F6","F7","F8",0.7,"F9","F10","F11","F12"],[0.1],{"main":{"alpha":[["^","1","2","3","4","5","6","7","8","9","0","ß","´","Back"],["Tab","q","w","e","r","t","z","u","i","o","p","ü","+",1,0.6],["Caps","a","s","d","f","g","h","j","k","l","ö","ä","#","Enter"],["LShift","<","y","x","c","v","b","n","m",",",".","-","RShift"],["LCtrl","Meta","LAlt","Space","AltGr","Menu","RCtrl"]],"movement":[["Ins","Home","PgUp"],["Del","End","PgDn"],[1],["Up"],["Left","Down","Right"]]}}],"keyWidths":{"Back":2,"Tab":1.5,"\\":1.5,"Caps":1.75,"Enter":1.25,"LShift":2,"RShift":2.1,"LCtrl":1.6,"Meta":1.6,"LAlt":1.6,"Space":6.1,"AltGr":1.6,"Menu":1.6,"RCtrl":1.6,"Ins":1.6,"Home":1.6,"PgUp":1.6,"Del":1.6,"End":1.6,"PgDn":1.6}}; diff --git a/rdp.ejs b/rdp.ejs index 2590daf..0085216 100644 --- a/rdp.ejs +++ b/rdp.ejs @@ -25,11 +25,13 @@