novnc is updated to 1.0.0 and add console views: lite,full option
|  | @ -84,7 +84,7 @@ | |||
|                       <li onclick='sendCtrlAltFN(11);'><a href='#'>Ctrl+Alt+F12</a></li> | ||||
|                   </ul> | ||||
|                 </li> | ||||
|                 <li onclick='fullscreen()'><a href='#'>{% trans "Fullscreen" %}</a></li> | ||||
|                 <li id="fullscreen_button"><a href='#'>{% trans "Fullscreen" %}</a></li> | ||||
| {% block navbarmenu %}{% endblock %} | ||||
|             </ul> | ||||
|         </div> | ||||
|  |  | |||
							
								
								
									
										242
									
								
								console/templates/console-spice-full.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,242 @@ | |||
| <!-- | ||||
|    Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com> | ||||
| 
 | ||||
|    This file is part of spice-html5. | ||||
| 
 | ||||
|    spice-html5 is free software: you can redistribute it and/or modify | ||||
|    it under the terms of the GNU Lesser General Public License as published by | ||||
|    the Free Software Foundation, either version 3 of the License, or | ||||
|    (at your option) any later version. | ||||
| 
 | ||||
|    spice-html5 is distributed in the hope that it will be useful, | ||||
|    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|    GNU Lesser General Public License for more details. | ||||
| 
 | ||||
|    You should have received a copy of the GNU Lesser General Public License | ||||
|    along with spice-html5.  If not, see <http://www.gnu.org/licenses/>. | ||||
| 
 | ||||
|    -------------------------------------------------- | ||||
|     Spice Javascript client template. | ||||
|     Refer to main.js for more detailed information | ||||
|    -------------------------------------------------- | ||||
| 
 | ||||
| --> | ||||
| {% extends "console-base.html" %} | ||||
| {% load i18n %} | ||||
| {% load staticfiles %} | ||||
| {% block head %} | ||||
| 
 | ||||
|         <title>WebVirtCloud - Spice Client - Full</title> | ||||
|         <script src="{% static "js/spice-html5/spicearraybuffer.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/enums.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/atKeynames.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/utils.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/png.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/lz.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/quic.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/bitmap.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/spicedataview.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/spicetype.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/spicemsg.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/wire.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/spiceconn.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/display.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/port.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/main.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/inputs.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/webm.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/playback.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/simulatecursor.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/cursor.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/thirdparty/jsbn.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/thirdparty/rsa.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/thirdparty/prng4.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/thirdparty/rng.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/thirdparty/sha1.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/ticket.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/resize.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/filexfer.js" %}"></script> | ||||
|         <link rel="stylesheet" type="text/css" href="{% static "js/spice-html5/spice.css" %}" /> | ||||
| 
 | ||||
| {% endblock %} | ||||
| 
 | ||||
| {% block content %} | ||||
| 
 | ||||
|         <div id="login"> | ||||
|             <span class="logo">SPICE</span> | ||||
|             <label for="host">Host:</label> <input type='text' id='host' value='{{ ws_host }}'> <!-- localhost --> | ||||
|             <label for="port">Port:</label> <input type='text' id='port' value='{{ ws_port }}'> | ||||
|             <label for="password">Password:</label> <input type='password' id='password' value='{{ console_passwd }}'> | ||||
|             <label for="show_console">Show console </label><input type="checkbox" id="show_console" value="1" onchange="toggle_console()" checked> | ||||
|             <button id="connectButton" onclick="connect();">Start</button> | ||||
|         </div> | ||||
| 
 | ||||
|         <div id="spice-area"> | ||||
|             <div id="spice-screen" class="spice-screen"></div> | ||||
|         </div> | ||||
| 
 | ||||
|         <div id="message-div" class="spice-message"></div> | ||||
| 
 | ||||
|         <div id="debug-div"> | ||||
|         <!-- If DUMPXXX is turned on, dumped images will go here --> | ||||
|         </div> | ||||
| {% endblock %} | ||||
| 
 | ||||
| {% block foot %} | ||||
| 
 | ||||
|         <script> | ||||
|             var host = null, port = null; | ||||
|             var sc; | ||||
| 
 | ||||
|             function spice_error(e) | ||||
|             { | ||||
|                 disconnect(); | ||||
|             } | ||||
| 
 | ||||
|             function connect() | ||||
|             { | ||||
|                 var host, port, password, scheme = "ws://", uri; | ||||
| 
 | ||||
|                 host = document.getElementById("host").value; | ||||
|                 port = document.getElementById("port").value; | ||||
|                 password = document.getElementById("password").value; | ||||
| 
 | ||||
| 
 | ||||
|                 if ((!host) || (!port)) { | ||||
|                     console.log("must set host and port"); | ||||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|                 if (sc) { | ||||
|                     sc.stop(); | ||||
|                 } | ||||
| 
 | ||||
|                 uri = scheme + host + ":" + port; | ||||
| 
 | ||||
|                 document.getElementById('connectButton').innerHTML = "Stop"; | ||||
|                 document.getElementById('connectButton').onclick = disconnect; | ||||
| 
 | ||||
|                 try | ||||
|                 { | ||||
|                     sc = new SpiceMainConn({uri: uri, screen_id: "spice-screen", dump_id: "debug-div", | ||||
|                                 message_id: "message-div", password: password, onerror: spice_error, onagent: agent_connected }); | ||||
|                 } | ||||
|                 catch (e) | ||||
|                 { | ||||
|                     alert(e.toString()); | ||||
|                     disconnect(); | ||||
|                 } | ||||
| 
 | ||||
| 
 | ||||
|             } | ||||
| 
 | ||||
|             function disconnect() | ||||
|             { | ||||
|                 console.log(">> disconnect"); | ||||
|                 if (sc) { | ||||
|                     sc.stop(); | ||||
|                 } | ||||
|                 document.getElementById('connectButton').innerHTML = "Start"; | ||||
|                 document.getElementById('connectButton').onclick = connect; | ||||
|                 if (window.File && window.FileReader && window.FileList && window.Blob) | ||||
|                 { | ||||
|                     var spice_xfer_area = document.getElementById('spice-xfer-area'); | ||||
|                     document.getElementById('spice-area').removeChild(spice_xfer_area); | ||||
|                     document.getElementById('spice-area').removeEventListener('dragover', handle_file_dragover, false); | ||||
|                     document.getElementById('spice-area').removeEventListener('drop', handle_file_drop, false); | ||||
|                 } | ||||
|                 console.log("<< disconnect"); | ||||
|             } | ||||
| 
 | ||||
|             function agent_connected(sc) | ||||
|             { | ||||
|                 window.addEventListener('resize', handle_resize); | ||||
|                 window.spice_connection = this; | ||||
| 
 | ||||
|                 resize_helper(this); | ||||
| 
 | ||||
|                 if (window.File && window.FileReader && window.FileList && window.Blob) | ||||
|                 { | ||||
|                     var spice_xfer_area = document.createElement("div"); | ||||
|                     spice_xfer_area.setAttribute('id', 'spice-xfer-area'); | ||||
|                     document.getElementById('spice-area').appendChild(spice_xfer_area); | ||||
|                     document.getElementById('spice-area').addEventListener('dragover', handle_file_dragover, false); | ||||
|                     document.getElementById('spice-area').addEventListener('drop', handle_file_drop, false); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     console.log("File API is not supported"); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             function toggle_console() | ||||
|             { | ||||
|                 var checkbox = document.getElementById('show_console'); | ||||
|                 var m = document.getElementById('message-div'); | ||||
| 
 | ||||
|                 if (checkbox.checked) | ||||
|                 { | ||||
|                     m.style.display = 'block'; | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     m.style.display = 'none'; | ||||
|                 } | ||||
| 
 | ||||
|                 window.addEventListener('resize', handle_resize); | ||||
|                 resize_helper(sc); | ||||
|             } | ||||
| 
 | ||||
|             function sendCtrlAltFN(f) { | ||||
|                 if (sc && sc.inputs && sc.inputs.state === "ready"){ | ||||
|                     var keys_code=[KEY_F1,KEY_F2,KEY_F3,KEY_F4,KEY_F5,KEY_F6,KEY_F7,KEY_F8,KEY_F9,KEY_F10,KEY_F11,KEY_F12]; | ||||
| 
 | ||||
|                     if (keys_code[f]==undefined) { | ||||
|                         return; | ||||
|                     } | ||||
|                     var key = new SpiceMsgcKeyDown(); | ||||
|                     var msg = new SpiceMiniData(); | ||||
| 
 | ||||
|                     update_modifier(true, KEY_LCtrl, sc); | ||||
|                     update_modifier(true, KEY_Alt, sc); | ||||
| 
 | ||||
|                     key.code = keys_code[f]; | ||||
|                     msg.build_msg(SPICE_MSGC_INPUTS_KEY_DOWN, key); | ||||
|                     sc.inputs.send_msg(msg); | ||||
|                     msg.build_msg(SPICE_MSGC_INPUTS_KEY_UP, key); | ||||
|                     sc.inputs.send_msg(msg); | ||||
| 
 | ||||
|                     if(Ctrl_state == false) update_modifier(false, KEY_LCtrl, sc); | ||||
|                     if(Alt_state == false) update_modifier(false, KEY_Alt, sc); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|              function fullscreen() { | ||||
|                 var screen=document.getElementById('spice-area'); | ||||
|                 if(screen.requestFullscreen) { | ||||
|                     screen.requestFullscreen(); | ||||
|                 } else if(screen.mozRequestFullScreen) { | ||||
|                     screen.mozRequestFullScreen(); | ||||
|                 } else if(screen.webkitRequestFullscreen) { | ||||
|                     screen.webkitRequestFullscreen(); | ||||
|                 } else if(screen.msRequestFullscreen) { | ||||
|                     screen.msRequestFullscreen(); | ||||
|                 } | ||||
|             } | ||||
|             /* SPICE port event listeners | ||||
|             window.addEventListener('spice-port-data', function(event) { | ||||
|                 // Here we convert data to text, but really we can obtain binary data also | ||||
|                 var msg_text = arraybuffer_to_str(new Uint8Array(event.detail.data)); | ||||
|                 DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'message text:', msg_text); | ||||
|             }); | ||||
| 
 | ||||
|             window.addEventListener('spice-port-event', function(event) { | ||||
|                 DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'event data:', event.detail.spiceEvent); | ||||
|             }); | ||||
|             */ | ||||
|             document.getElementById("fullscreen_button").addEventListener('click', fullscreen; | ||||
| 
 | ||||
|             connect(); | ||||
|         </script> | ||||
| {% endblock %} | ||||
							
								
								
									
										262
									
								
								console/templates/console-spice-lite.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						|  | @ -0,0 +1,262 @@ | |||
| <!-- | ||||
|    Copyright (C) 2012 by Jeremy P. White <jwhite@codeweavers.com> | ||||
| 
 | ||||
|    This file is part of spice-html5. | ||||
| 
 | ||||
|    spice-html5 is free software: you can redistribute it and/or modify | ||||
|    it under the terms of the GNU Lesser General Public License as published by | ||||
|    the Free Software Foundation, either version 3 of the License, or | ||||
|    (at your option) any later version. | ||||
| 
 | ||||
|    spice-html5 is distributed in the hope that it will be useful, | ||||
|    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|    GNU Lesser General Public License for more details. | ||||
| 
 | ||||
|    You should have received a copy of the GNU Lesser General Public License | ||||
|    along with spice-html5.  If not, see <http://www.gnu.org/licenses/>. | ||||
| 
 | ||||
|    -------------------------------------------------- | ||||
|     Spice Javascript client template. | ||||
|     Refer to main.js for more detailed information | ||||
|    -------------------------------------------------- | ||||
| 
 | ||||
| --> | ||||
| {% extends "console-base.html" %} | ||||
| {% load i18n %} | ||||
| {% load staticfiles %} | ||||
| {% block head %} | ||||
| 
 | ||||
|         <title>Spice Javascript client</title> | ||||
|         <script src="{% static "js/spice-html5/spicearraybuffer.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/enums.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/atKeynames.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/utils.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/png.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/lz.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/quic.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/bitmap.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/spicedataview.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/spicetype.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/spicemsg.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/wire.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/spiceconn.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/display.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/main.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/inputs.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/webm.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/playback.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/simulatecursor.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/cursor.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/thirdparty/jsbn.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/thirdparty/rsa.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/thirdparty/prng4.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/thirdparty/rng.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/thirdparty/sha1.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/ticket.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/resize.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/filexfer.js" %}"></script> | ||||
|         <script src="{% static "js/spice-html5/port.js" %}"></script> | ||||
| 
 | ||||
|         <link rel="stylesheet" type="text/css" href="{% static "js/spice-html5/spice.css" %}" /> | ||||
| 
 | ||||
| {% endblock %} | ||||
| 
 | ||||
| 
 | ||||
| {% block content %} | ||||
|         <div id="spice-area"> | ||||
|             <div id="spice-screen" class="spice-screen"></div> | ||||
|         </div> | ||||
| 
 | ||||
|         <div id="message-div" class="spice-message"></div> | ||||
| 
 | ||||
|         <div id="debug-div"> | ||||
|         <!-- If DUMPXXX is turned on, dumped images will go here --> | ||||
|         </div> | ||||
| {% endblock %} | ||||
| 
 | ||||
| {% block foot %} | ||||
|     <script> | ||||
|             var host = null, port = null; | ||||
|             var sc; | ||||
| 
 | ||||
|             function spice_set_cookie(name, value, days) { | ||||
|                 var date, expires; | ||||
|                 date = new Date(); | ||||
|                 date.setTime(date.getTime() + (days*24*60*60*1000)); | ||||
|                 expires = "; expires=" + date.toGMTString(); | ||||
|                 document.cookie = name + "=" + value + expires + "; path=/"; | ||||
|             }; | ||||
| 
 | ||||
|             function spice_query_var(name, defvalue) { | ||||
|                 var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search); | ||||
|                 return match ? decodeURIComponent(match[1].replace(/\+/g, ' ')) : defvalue; | ||||
|             } | ||||
| 
 | ||||
|             function spice_error(e) | ||||
|             { | ||||
|                 console.log(e); | ||||
|                 disconnect(); | ||||
|                 if (e.message !== undefined) { | ||||
|                     log_error(e.message); | ||||
|                 } | ||||
|                 else { | ||||
|                     log_error('Unknown error'); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             function connect() | ||||
|             { | ||||
|                 var host, port, password, scheme = "ws://", uri; | ||||
| 
 | ||||
|                 // By default, use the host and port of server that served this file | ||||
|                 //host = spice_query_var('host', window.location.hostname); | ||||
|                 host = '{{ ws_host| safe }}'| spice_query_var('host', window.location.hostname); | ||||
| 
 | ||||
|                 // Note that using the web server port only makes sense | ||||
|                 //  if your web server has a reverse proxy to relay the WebSocket | ||||
|                 //  traffic to the correct destination port. | ||||
|                 var default_port = window.location.port; | ||||
|                 if (!default_port) { | ||||
|                     if (window.location.protocol == 'http:') { | ||||
|                         default_port = 80; | ||||
|                     } | ||||
|                     else if (window.location.protocol == 'https:') { | ||||
|                         default_port = 443; | ||||
|                     } | ||||
|                 } | ||||
|                 //port = spice_query_var('port', default_port); | ||||
|                 port = '{{ ws_port| safe }}' | spice_query_var('port', default_port); | ||||
|                 if (window.location.protocol == 'https:') { | ||||
|                     scheme = "wss://"; | ||||
|                 } | ||||
| 
 | ||||
|                 // If a token variable is passed in, set the parameter in a cookie. | ||||
|                 // This is used by nova-spiceproxy. | ||||
|                 token = spice_query_var('token', null); | ||||
|                 if (token) { | ||||
|                     spice_set_cookie('token', token, 1) | ||||
|                 } | ||||
| 
 | ||||
|                 //password = spice_query_var('password', ''); | ||||
|                 password = '{{ console_passwd | safe }}' | spice_query_var('password', ''); | ||||
|                 path = spice_query_var('path', 'websockify'); | ||||
| 
 | ||||
|                 if ((!host) || (!port)) { | ||||
|                     console.log("must specify host and port in URL"); | ||||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|                 if (sc) { | ||||
|                     sc.stop(); | ||||
|                 } | ||||
| 
 | ||||
|                 uri = scheme + host + ":" + port; | ||||
| 
 | ||||
|                 if (path) { | ||||
|                   uri += path[0] == '/' ? path : ('/' + path); | ||||
|                 } | ||||
| 
 | ||||
|                 try | ||||
|                 { | ||||
|                     sc = new SpiceMainConn({uri: uri, screen_id: "spice-screen", dump_id: "debug-div", | ||||
|                                 message_id: "message-div", password: password, onerror: spice_error, onagent: agent_connected }); | ||||
|                 } | ||||
|                 catch (e) | ||||
|                 { | ||||
|                     alert(e.toString()); | ||||
|                     disconnect(); | ||||
|                 } | ||||
| 
 | ||||
| 
 | ||||
|             } | ||||
| 
 | ||||
|             function disconnect() | ||||
|             { | ||||
|                 console.log(">> disconnect"); | ||||
|                 if (sc) { | ||||
|                     sc.stop(); | ||||
|                 } | ||||
|                 if (window.File && window.FileReader && window.FileList && window.Blob) | ||||
|                 { | ||||
|                     var spice_xfer_area = document.getElementById('spice-xfer-area'); | ||||
|                     document.getElementById('spice-area').removeChild(spice_xfer_area); | ||||
|                     document.getElementById('spice-area').removeEventListener('dragover', handle_file_dragover, false); | ||||
|                     document.getElementById('spice-area').removeEventListener('drop', handle_file_drop, false); | ||||
|                 } | ||||
|                 console.log("<< disconnect"); | ||||
|             } | ||||
| 
 | ||||
|             function agent_connected(sc) | ||||
|             { | ||||
|                 window.addEventListener('resize', handle_resize); | ||||
|                 window.spice_connection = this; | ||||
| 
 | ||||
|                 resize_helper(this); | ||||
| 
 | ||||
|                 if (window.File && window.FileReader && window.FileList && window.Blob) | ||||
|                 { | ||||
|                     var spice_xfer_area = document.createElement("div"); | ||||
|                     spice_xfer_area.setAttribute('id', 'spice-xfer-area'); | ||||
|                     document.getElementById('spice-area').appendChild(spice_xfer_area); | ||||
|                     document.getElementById('spice-area').addEventListener('dragover', handle_file_dragover, false); | ||||
|                     document.getElementById('spice-area').addEventListener('drop', handle_file_drop, false); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     console.log("File API is not supported"); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             function sendCtrlAltFN(f) { | ||||
|                 if (sc && sc.inputs && sc.inputs.state === "ready"){ | ||||
|                     var keys_code=[KEY_F1,KEY_F2,KEY_F3,KEY_F4,KEY_F5,KEY_F6,KEY_F7,KEY_F8,KEY_F9,KEY_F10,KEY_F11,KEY_F12]; | ||||
| 
 | ||||
|                     if (keys_code[f]==undefined) { | ||||
|                         return; | ||||
|                     } | ||||
|                     var key = new SpiceMsgcKeyDown(); | ||||
|                     var msg = new SpiceMiniData(); | ||||
| 
 | ||||
|                     update_modifier(true, KEY_LCtrl, sc); | ||||
|                     update_modifier(true, KEY_Alt, sc); | ||||
| 
 | ||||
|                     key.code = keys_code[f]; | ||||
|                     msg.build_msg(SPICE_MSGC_INPUTS_KEY_DOWN, key); | ||||
|                     sc.inputs.send_msg(msg); | ||||
|                     msg.build_msg(SPICE_MSGC_INPUTS_KEY_UP, key); | ||||
|                     sc.inputs.send_msg(msg); | ||||
| 
 | ||||
|                     if(Ctrl_state == false) update_modifier(false, KEY_LCtrl, sc); | ||||
|                     if(Alt_state == false) update_modifier(false, KEY_Alt, sc); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             function fullscreen() { | ||||
|                 var screen=document.getElementById('spice-area'); | ||||
|                 if(screen.requestFullscreen) { | ||||
|                     screen.requestFullscreen(); | ||||
|                 } else if(screen.mozRequestFullScreen) { | ||||
|                     screen.mozRequestFullScreen(); | ||||
|                 } else if(screen.webkitRequestFullscreen) { | ||||
|                     screen.webkitRequestFullscreen(); | ||||
|                 } else if(screen.msRequestFullscreen) { | ||||
|                     screen.msRequestFullscreen(); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             /* SPICE port event listeners | ||||
|             window.addEventListener('spice-port-data', function(event) { | ||||
|                 // Here we convert data to text, but really we can obtain binary data also | ||||
|                 var msg_text = arraybuffer_to_str(new Uint8Array(event.detail.data)); | ||||
|                 DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'message text:', msg_text); | ||||
|             }); | ||||
| 
 | ||||
|             window.addEventListener('spice-port-event', function(event) { | ||||
|                 DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'event data:', event.detail.spiceEvent); | ||||
|             }); | ||||
|             */ | ||||
|             document.getElementById("fullscreen_button").addEventListener('click', fullscreen); | ||||
|             connect(); | ||||
|         </script> | ||||
| {% endblock %} | ||||
|  | @ -1,199 +0,0 @@ | |||
| {% extends "console-base.html" %} | ||||
| {% load i18n %} | ||||
| {% load staticfiles %} | ||||
| {% block head %} | ||||
|     <script src="{% static "js/spice-html5/spicearraybuffer.js" %}"></script>  | ||||
|     <script src="{% static "js/spice-html5/enums.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/atKeynames.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/utils.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/png.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/lz.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/quic.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/bitmap.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/spicedataview.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/spicetype.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/spicemsg.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/wire.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/spiceconn.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/display.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/main.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/inputs.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/webm.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/playback.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/simulatecursor.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/cursor.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/thirdparty/jsbn.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/thirdparty/rsa.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/thirdparty/prng4.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/thirdparty/rng.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/thirdparty/sha1.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/ticket.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/resize.js" %}"></script> | ||||
|     <script src="{% static "js/spice-html5/filexfer.js" %}"></script> | ||||
| 
 | ||||
|     <link rel="stylesheet" type="text/css" href="{% static "js/spice-html5/spice.css" %}" /> | ||||
|     <script src="{% static "js/spice-html5/port.js" %}"></script> | ||||
| 
 | ||||
| {% endblock %} | ||||
| 
 | ||||
| {% block content %} | ||||
| <div id='spice_container'></div> | ||||
| {% endblock %} | ||||
| 
 | ||||
| {% block foot %} | ||||
| <script> | ||||
|     var sc; | ||||
| 
 | ||||
|     function spice_set_cookie(name, value, days) { | ||||
|         var date, expires; | ||||
|         date = new Date(); | ||||
|         date.setTime(date.getTime() + (days*24*60*60*1000)); | ||||
|         expires = "; expires=" + date.toGMTString(); | ||||
|         document.cookie = name + "=" + value + expires + "; path=/"; | ||||
|     }; | ||||
| 
 | ||||
|     function spice_query_var(name, defvalue) { | ||||
|         var match = RegExp('[?&]' + name + '=([^&]*)') | ||||
|                           .exec(window.location.search); | ||||
|         return match ? | ||||
|             decodeURIComponent(match[1].replace(/\+/g, ' ')) | ||||
|             : defvalue; | ||||
|     } | ||||
| 
 | ||||
|     function spice_error(e) | ||||
|     { | ||||
|         console.log(e); | ||||
|         disconnect(); | ||||
|         if (e.message !== undefined) { | ||||
|             log_error(e.message); | ||||
|         } | ||||
|         else { | ||||
|             log_error('Unknown error'); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     function spice_success(msg) { | ||||
|         log_info(msg); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     function connect(uri,password) | ||||
|     { | ||||
|         // If a token variable is passed in, set the parameter in a cookie. | ||||
|         // This is used by nova-spiceproxy. | ||||
|         token = spice_query_var('token', null); | ||||
|         if (token) { | ||||
|             spice_set_cookie('token', token, 1) | ||||
|         } | ||||
| 
 | ||||
|         if (sc) { | ||||
|             sc.stop(); | ||||
|         } | ||||
| 
 | ||||
|         try | ||||
|         { | ||||
|             sc = new SpiceMainConn({uri: uri, password: password, screen_id: "spice_container", | ||||
|                         onsuccess: spice_success, onerror: spice_error, onagent: agent_connected }); | ||||
| 
 | ||||
|         } | ||||
|         catch (e) | ||||
|         { | ||||
|             console.log(e); | ||||
|             log_error(e.toString()); | ||||
|             disconnect(); | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     function disconnect() | ||||
|     { | ||||
|         console.log(">> disconnect"); | ||||
|         if (sc) { | ||||
|             sc.stop(); | ||||
|         } | ||||
|         if (window.File && window.FileReader && window.FileList && window.Blob) | ||||
|         { | ||||
|             console.log(" -> Disable drag/drop transfer"); | ||||
|             var spice_xfer_area = document.getElementById('spice-xfer-area'); | ||||
|             try { | ||||
|                 document.getElementById('spice-area').removeChild(spice_xfer_area); | ||||
|                 document.getElementById('spice-area').removeEventListener('dragover', handle_file_dragover, false); | ||||
|                 document.getElementById('spice-area').removeEventListener('drop', handle_file_drop, false); | ||||
|             } | ||||
|             catch(e) { | ||||
|                 console.log(' -> Error disabling drag/drop transfer'); | ||||
|             } | ||||
|         } | ||||
|         console.log("<< disconnect"); | ||||
|     } | ||||
| 
 | ||||
|     function agent_connected(sc) { | ||||
|         window.addEventListener('resize', handle_resize); | ||||
|         window.spice_connection = this; | ||||
| 
 | ||||
|         resize_helper(this); | ||||
| 
 | ||||
|         if (window.File && window.FileReader && window.FileList && window.Blob) | ||||
|         { | ||||
|             var spice_xfer_area = document.createElement("div"); | ||||
|             spice_xfer_area.setAttribute('id', 'spice-xfer-area'); | ||||
|             document.getElementById('spice-area').addEventListener('dragover', handle_file_dragover, false); | ||||
|             document.getElementById('spice-area').addEventListener('drop', handle_file_drop, false); | ||||
|             log_info('Drag and drop transfer enabled.'); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             console.log("File API is not supported"); | ||||
|             log_info('Drag and drop transfer not supported.'); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     function sendCtrlAltFN(f) { | ||||
|         if (sc && sc.inputs && sc.inputs.state === "ready"){ | ||||
|             var keys_code=[KEY_F1,KEY_F2,KEY_F3,KEY_F4,KEY_F5,KEY_F6,KEY_F7,KEY_F8,KEY_F9,KEY_F10,KEY_F11,KEY_F12]; | ||||
| 
 | ||||
|             if (keys_code[f]==undefined) { | ||||
|                 return; | ||||
|             } | ||||
|             var key = new SpiceMsgcKeyDown(); | ||||
|             var msg = new SpiceMiniData(); | ||||
| 
 | ||||
|             update_modifier(true, KEY_LCtrl, sc); | ||||
|             update_modifier(true, KEY_Alt, sc); | ||||
| 
 | ||||
|             key.code = keys_code[f]; | ||||
|             msg.build_msg(SPICE_MSGC_INPUTS_KEY_DOWN, key); | ||||
|             sc.inputs.send_msg(msg); | ||||
|             msg.build_msg(SPICE_MSGC_INPUTS_KEY_UP, key); | ||||
|             sc.inputs.send_msg(msg); | ||||
| 
 | ||||
|             if(Ctrl_state == false) update_modifier(false, KEY_LCtrl, sc); | ||||
|             if(Alt_state == false) update_modifier(false, KEY_Alt, sc); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     function fullscreen() { | ||||
|         var screen=document.getElementById('spice_container'); | ||||
|         if(screen.requestFullscreen) { | ||||
|             screen.requestFullscreen(); | ||||
|         } else if(screen.mozRequestFullScreen) { | ||||
|             screen.mozRequestFullScreen(); | ||||
|         } else if(screen.webkitRequestFullscreen) { | ||||
|             screen.webkitRequestFullscreen(); | ||||
|         } else if(screen.msRequestFullscreen) { | ||||
|             screen.msRequestFullscreen(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     var uri; | ||||
|     if (window.location.protocol === "https:") { | ||||
|         uri = 'wss://{{ ws_host }}:{{ ws_port }}'; | ||||
|     } else { | ||||
|         uri = 'ws://{{ ws_host }}:{{ ws_port }}'; | ||||
|     } | ||||
| 
 | ||||
|     var password = '{{ console_passwd }}'; | ||||
|     log_info('Connecting ...'); | ||||
|     connect(uri,password); | ||||
| </script> | ||||
| {% endblock %} | ||||
							
								
								
									
										323
									
								
								console/templates/console-vnc-full.html
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,323 @@ | |||
| {% extends "console-base.html" %} | ||||
| {% load i18n %} | ||||
| {% load staticfiles %} | ||||
| 
 | ||||
| {% block head %} | ||||
|     <!-- | ||||
|     noVNC example: simple example using default UI | ||||
|     Copyright (C) 2012 Joel Martin | ||||
|     Copyright (C) 2016 Samuel Mannehed for Cendio AB | ||||
|     Copyright (C) 2016 Pierre Ossman for Cendio AB | ||||
|     noVNC is licensed under the MPL 2.0 (see LICENSE.txt) | ||||
|     This file is licensed under the 2-Clause BSD license (see LICENSE.txt). | ||||
| 
 | ||||
|     Connect parameters are provided in query string: | ||||
|         http://example.com/?host=HOST&port=PORT&encrypt=1 | ||||
|     or the fragment: | ||||
|         http://example.com/#host=HOST&port=PORT&encrypt=1 | ||||
|     --> | ||||
|     <title xmlns="http://www.w3.org/1999/html">WebVirtCloud - noVNC</title> | ||||
| 
 | ||||
|     <meta charset="utf-8" /> | ||||
| 
 | ||||
|     <!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame | ||||
|                 Remove this if you use the .htaccess --> | ||||
|     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> | ||||
| 
 | ||||
|     <!-- Icons (see Makefile for what the sizes are for) --> | ||||
|     <link rel="icon" sizes="16x16" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-16x16.png" %}"> | ||||
|     <link rel="icon" sizes="24x24" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-24x24.png" %}"> | ||||
|     <link rel="icon" sizes="32x32" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-32x32.png" %}"> | ||||
|     <link rel="icon" sizes="48x48" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-48x48.png" %}"> | ||||
|     <link rel="icon" sizes="60x60" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-60x60.png" %}"> | ||||
|     <link rel="icon" sizes="64x64" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-64x64.png" %}"> | ||||
|     <link rel="icon" sizes="72x72" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-72x72.png" %}"> | ||||
|     <link rel="icon" sizes="76x76" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-76x76.png" %}"> | ||||
|     <link rel="icon" sizes="96x96" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-96x96.png" %}"> | ||||
|     <link rel="icon" sizes="120x120" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-120x120.png" %}"> | ||||
|     <link rel="icon" sizes="144x144" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-144x144.png" %}"> | ||||
|     <link rel="icon" sizes="152x152" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-152x152.png" %}"> | ||||
|     <link rel="icon" sizes="192x192" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-192x192.png" %}"> | ||||
|     <!-- Firefox currently mishandles SVG, see #1419039 | ||||
|     <link rel="icon" sizes="any" type="image/svg+xml" href="{% static "js/novnc/app/images/icons/novnc-icon.svg" %}"> | ||||
|     --> | ||||
|     <!-- Repeated last so that legacy handling will pick this --> | ||||
|     <link rel="icon" sizes="16x16" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-16x16.png" %}"> | ||||
| 
 | ||||
|     <!-- Apple iOS Safari settings --> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> | ||||
|     <meta name="apple-mobile-web-app-capable" content="yes" /> | ||||
|     <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> | ||||
|     <!-- Home Screen Icons (favourites and bookmarks use the normal icons) --> | ||||
|     <link rel="apple-touch-icon" sizes="60x60" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-60x60.png" %}"> | ||||
|     <link rel="apple-touch-icon" sizes="76x76" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-76x76.png" %}"> | ||||
|     <link rel="apple-touch-icon" sizes="120x120" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-120x120.png" %}"> | ||||
|     <link rel="apple-touch-icon" sizes="152x152" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-152x152.png" %}"> | ||||
| 
 | ||||
|     <!-- Stylesheets --> | ||||
|     <link rel="stylesheet" href="{% static "js/novnc/app/styles/base.css" %}"/> | ||||
| 
 | ||||
|     <!-- | ||||
|     <script type='text/javascript' src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script> | ||||
|     --> | ||||
| 
 | ||||
|     <!-- this is included as a normal file in order to catch script-loading errors as well --> | ||||
|     <script type="text/javascript" src="{% static "js/novnc/app/error-handler.js" %}"></script> | ||||
| 
 | ||||
|     <!-- begin scripts --> | ||||
|     <script src="{% static "js/novnc/app.js" %}"></script> | ||||
|     <!-- end scripts --> | ||||
| {% endblock %} | ||||
| 
 | ||||
| {% block content %} | ||||
| 
 | ||||
|     <div id="noVNC_fallback_error" class="noVNC_center"> | ||||
|         <div> | ||||
|             <div>noVNC encountered an error:</div> | ||||
|             <br> | ||||
|             <div id="noVNC_fallback_errormsg"></div> | ||||
|         </div> | ||||
|     </div> | ||||
| 
 | ||||
|     <!-- noVNC Control Bar --> | ||||
|     <div id="noVNC_control_bar_anchor" class="noVNC_vcenter"> | ||||
| 
 | ||||
|         <div id="noVNC_control_bar"> | ||||
|             <div id="noVNC_control_bar_handle" title="Hide/Show the control bar"><div></div></div> | ||||
| 
 | ||||
|             <div class="noVNC_scroll"> | ||||
| 
 | ||||
|             <h1 class="noVNC_logo" translate="no"><span>no</span><br />VNC</h1> | ||||
| 
 | ||||
|             <!-- Drag/Pan the viewport --> | ||||
|             <input type="image" alt="viewport drag" src="{% static "js/novnc/app/images/drag.svg" %}" | ||||
|                 id="noVNC_view_drag_button" class="noVNC_button noVNC_hidden" | ||||
|                 title="Move/Drag Viewport" /> | ||||
| 
 | ||||
|             <!--noVNC Touch Device only buttons--> | ||||
|             <div id="noVNC_mobile_buttons"> | ||||
|                 <input type="image" alt="No mousebutton" src="{% static "js/novnc/app/images/mouse_none.svg" %}" | ||||
|                     id="noVNC_mouse_button0" class="noVNC_button" | ||||
|                     title="Active Mouse Button"/> | ||||
|                 <input type="image" alt="Left mousebutton" src="{% static "js/novnc/app/images/mouse_left.svg" %}" | ||||
|                     id="noVNC_mouse_button1" class="noVNC_button" | ||||
|                     title="Active Mouse Button"/> | ||||
|                 <input type="image" alt="Middle mousebutton" src="{% static "js/novnc/app/images/mouse_middle.svg" %}" | ||||
|                     id="noVNC_mouse_button2" class="noVNC_button" | ||||
|                     title="Active Mouse Button"/> | ||||
|                 <input type="image" alt="Right mousebutton" src="{% static "js/novnc/app/images/mouse_right.svg" %}" | ||||
|                     id="noVNC_mouse_button4" class="noVNC_button" | ||||
|                     title="Active Mouse Button"/> | ||||
|                 <input type="image" alt="Keyboard" src="{% static "js/novnc/app/images/keyboard.svg" %}" | ||||
|                     id="noVNC_keyboard_button" class="noVNC_button" | ||||
|                     value="Keyboard" title="Show Keyboard" /> | ||||
|             </div> | ||||
| 
 | ||||
|             <!-- Extra manual keys --> | ||||
|             <div id="noVNC_extra_keys"> | ||||
|                 <input type="image" alt="Extra keys" src="{% static "js/novnc/app/images/toggleextrakeys.svg" %}" | ||||
|                     id="noVNC_toggle_extra_keys_button" class="noVNC_button" | ||||
|                     title="Show Extra Keys"/> | ||||
|                 <div class="noVNC_vcenter"> | ||||
|                 <div id="noVNC_modifiers" class="noVNC_panel"> | ||||
|                     <input type="image" alt="Ctrl" src="{% static "js/novnc/app/images/ctrl.svg" %}" | ||||
|                         id="noVNC_toggle_ctrl_button" class="noVNC_button" | ||||
|                         title="Toggle Ctrl"/> | ||||
|                     <input type="image" alt="Alt" src="{% static "js/novnc/app/images/alt.svg" %}" | ||||
|                         id="noVNC_toggle_alt_button" class="noVNC_button" | ||||
|                         title="Toggle Alt"/> | ||||
|                     <input type="image" alt="Tab" src="{% static "js/novnc/app/images/tab.svg" %}" | ||||
|                         id="noVNC_send_tab_button" class="noVNC_button" | ||||
|                         title="Send Tab"/> | ||||
|                     <input type="image" alt="Esc" src="{% static "js/novnc/app/images/esc.svg" %}" | ||||
|                         id="noVNC_send_esc_button" class="noVNC_button" | ||||
|                         title="Send Escape"/> | ||||
|                     <input type="image" alt="Ctrl+Alt+Del" src="{% static "js/novnc/app/images/ctrlaltdel.svg" %}" | ||||
|                         id="noVNC_send_ctrl_alt_del_button" class="noVNC_button" | ||||
|                         title="Send Ctrl-Alt-Del" /> | ||||
|                 </div> | ||||
|                 </div> | ||||
|             </div> | ||||
| 
 | ||||
|             <!-- Shutdown/Reboot --> | ||||
|             <input type="image" alt="Shutdown/Reboot" src="{% static "js/novnc/app/images/power.svg" %}" | ||||
|                 id="noVNC_power_button" class="noVNC_button" | ||||
|                 title="Shutdown/Reboot..." /> | ||||
|             <div class="noVNC_vcenter"> | ||||
|             <div id="noVNC_power" class="noVNC_panel"> | ||||
|                 <div class="noVNC_heading"> | ||||
|                     <img src="{% static "js/novnc/app/images/power.svg" %}"> Power | ||||
|                 </div> | ||||
|                 <input type="button" id="noVNC_shutdown_button" value="Shutdown" /> | ||||
|                 <input type="button" id="noVNC_reboot_button" value="Reboot" /> | ||||
|                 <input type="button" id="noVNC_reset_button" value="Reset" /> | ||||
|             </div> | ||||
|             </div> | ||||
| 
 | ||||
|             <!-- Clipboard --> | ||||
|             <input type="image" alt="Clipboard" src="{% static "js/novnc/app/images/clipboard.svg" %}" | ||||
|                 id="noVNC_clipboard_button" class="noVNC_button" | ||||
|                 title="Clipboard" /> | ||||
|             <div class="noVNC_vcenter"> | ||||
|             <div id="noVNC_clipboard" class="noVNC_panel"> | ||||
|                 <div class="noVNC_heading"> | ||||
|                     <img src="{% static "js/novnc/app/images/clipboard.svg" %}"> Clipboard | ||||
|                 </div> | ||||
|                 <textarea id="noVNC_clipboard_text" rows=5></textarea> | ||||
|                 <br /> | ||||
|                 <input id="noVNC_clipboard_clear_button" type="button" | ||||
|                     value="Clear" class="noVNC_submit" /> | ||||
|             </div> | ||||
|             </div> | ||||
| 
 | ||||
|             <!-- Toggle fullscreen --> | ||||
|             <input type="image" alt="Fullscreen" src="{% static "js/novnc/app/images/fullscreen.svg" %}" | ||||
|                 id="noVNC_fullscreen_button" class="noVNC_button noVNC_hidden" | ||||
|                 title="Fullscreen" /> | ||||
| 
 | ||||
|             <!-- Settings --> | ||||
|             <input type="image" alt="Settings" src="{% static "js/novnc/app/images/settings.svg" %}" | ||||
|                 id="noVNC_settings_button" class="noVNC_button" | ||||
|                 title="Settings" /> | ||||
|             <div class="noVNC_vcenter"> | ||||
|             <div id="noVNC_settings" class="noVNC_panel"> | ||||
|                 <ul> | ||||
|                     <li class="noVNC_heading"> | ||||
|                         <img src="{% static "js/novnc/app/images/settings.svg" %}"> Settings | ||||
|                     </li> | ||||
|                     <li> | ||||
|                         <label><input id="noVNC_setting_shared" type="checkbox" /> Shared Mode</label> | ||||
|                     </li> | ||||
|                     <li> | ||||
|                         <label><input id="noVNC_setting_view_only" type="checkbox" /> View Only</label> | ||||
|                     </li> | ||||
|                     <li><hr></li> | ||||
|                     <li> | ||||
|                         <label><input id="noVNC_setting_view_clip" type="checkbox" /> Clip to Window</label> | ||||
|                     </li> | ||||
|                     <li> | ||||
|                         <label for="noVNC_setting_resize">Scaling Mode:</label> | ||||
|                         <select id="noVNC_setting_resize" name="vncResize"> | ||||
|                             <option value="off">None</option> | ||||
|                             <option value="scale">Local Scaling</option> | ||||
|                             <option value="remote">Remote Resizing</option> | ||||
|                         </select> | ||||
|                     </li> | ||||
|                     <li><hr></li> | ||||
|                     <li> | ||||
|                         <div class="noVNC_expander">Advanced</div> | ||||
|                         <div><ul> | ||||
|                             <li> | ||||
|                                 <label for="noVNC_setting_repeaterID">Repeater ID:</label> | ||||
|                                 <input id="noVNC_setting_repeaterID" type="input" value="" /> | ||||
|                             </li> | ||||
|                             <li> | ||||
|                                 <div class="noVNC_expander">WebSocket</div> | ||||
|                                 <div><ul> | ||||
|                                     <li> | ||||
|                                         <label><input id="noVNC_setting_encrypt" type="checkbox" /> Encrypt</label> | ||||
|                                     </li> | ||||
|                                     <li> | ||||
|                                         <label for="noVNC_setting_host">Host:</label> | ||||
|                                         <input id="noVNC_setting_host" value="{{ ws_host }}"/> | ||||
|                                     </li> | ||||
|                                     <li> | ||||
|                                         <label for="noVNC_setting_port">Port:</label> | ||||
|                                         <input id="noVNC_setting_port" value="{{ ws_port }}" type="number" /> | ||||
|                                     </li> | ||||
|                                     <li> | ||||
|                                         <label for="noVNC_setting_path">Path:</label> | ||||
|                                         <input id="noVNC_setting_path" type="input" value="websockify" /> | ||||
|                                     </li> | ||||
|                                 </ul></div> | ||||
|                             </li> | ||||
|                             <li><hr></li> | ||||
|                             <li> | ||||
|                                 <label><input id="noVNC_setting_reconnect" type="checkbox" /> Automatic Reconnect</label> | ||||
|                                 <input id="noVNC_setting_autoconnect" type="checkbox" value="true" hidden/> | ||||
|                             </li> | ||||
|                             <li> | ||||
|                                 <label for="noVNC_setting_reconnect_delay">Reconnect Delay (ms):</label> | ||||
|                                 <input id="noVNC_setting_reconnect_delay" type="number" /> | ||||
|                             </li> | ||||
|                             <li><hr></li> | ||||
|                             <!-- Logging selection dropdown --> | ||||
|                             <li> | ||||
|                                 <label>Logging: | ||||
|                                     <select id="noVNC_setting_logging" name="vncLogging"> | ||||
|                                     </select> | ||||
|                                 </label> | ||||
|                             </li> | ||||
|                         </ul></div> | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|             </div> | ||||
| 
 | ||||
|             <!-- Connection Controls --> | ||||
|             <input type="image" alt="Disconnect" src="{% static "js/novnc/app/images/disconnect.svg" %}" | ||||
|                 id="noVNC_disconnect_button" class="noVNC_button" | ||||
|                 title="Disconnect" /> | ||||
| 
 | ||||
|             </div> | ||||
|         </div> | ||||
| 
 | ||||
|         <div id="noVNC_control_bar_hint"></div> | ||||
| 
 | ||||
|     </div> <!-- End of noVNC_control_bar --> | ||||
| 
 | ||||
|     <!-- Status Dialog --> | ||||
|     <div id="noVNC_status"></div> | ||||
| 
 | ||||
|     <!-- Connect button --> | ||||
|     <div class="noVNC_center"> | ||||
|         <div id="noVNC_connect_dlg"> | ||||
|             <div class="noVNC_logo" translate="no"><span>no</span>VNC</div> | ||||
|             <div id="noVNC_connect_button"> | ||||
|                 <div> | ||||
|                 <img src="{% static "js/novnc/app/images/connect.svg" %}"> Connect | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
| 
 | ||||
|     <!-- Password Dialog --> | ||||
|     <div class="noVNC_center noVNC_connect_layer"> | ||||
|     <div id="noVNC_password_dlg" class="noVNC_panel"><form> | ||||
|         <ul> | ||||
|             <li> | ||||
|                 <label>Password:</label> | ||||
|                 <input id="noVNC_password_input" type="password" /> | ||||
|             </li> | ||||
|             <li> | ||||
|                 <input id="noVNC_password_button" type="submit" value="Send Password" class="noVNC_submit" /> | ||||
|             </li> | ||||
|         </ul> | ||||
|     </form></div> | ||||
|     </div> | ||||
| 
 | ||||
|     <!-- Transition Screens --> | ||||
|     <div id="noVNC_transition"> | ||||
|         <div id="noVNC_transition_text"></div> | ||||
|         <div> | ||||
|         <input type="button" id="noVNC_cancel_reconnect_button" value="Cancel" class="noVNC_submit" /> | ||||
|         </div> | ||||
|         <div class="noVNC_spinner"></div> | ||||
|     </div> | ||||
| 
 | ||||
|     <!-- This is where the RFB elements will attach --> | ||||
|     <div id="noVNC_container"> | ||||
|         <!-- Note that Google Chrome on Android doesn't respect any of these, | ||||
|              html attributes which attempt to disable text suggestions on the | ||||
|              on-screen keyboard. Let's hope Chrome implements the ime-mode | ||||
|              style for example --> | ||||
|         <textarea id="noVNC_keyboardinput" autocapitalize="off" | ||||
|             autocorrect="off" autocomplete="off" spellcheck="false" | ||||
|             mozactionhint="Enter" tabindex="-1"></textarea> | ||||
|     </div> | ||||
| 
 | ||||
|     <audio id="noVNC_bell"> | ||||
|         <source src="{% static "js/novnc/app/sounds/bell.oga" %}" type="audio/ogg"> | ||||
|         <source src="{% static "js/novnc/app/sounds/bell.mp3" %}" type="audio/mpeg"> | ||||
|     </audio> | ||||
| {% endblock %} | ||||
							
								
								
									
										266
									
								
								console/templates/console-vnc-lite.html
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,266 @@ | |||
| {% extends "console-base.html" %} | ||||
| {% load i18n %} | ||||
| {% load staticfiles %} | ||||
| {% block head %} | ||||
|     <!-- | ||||
|     noVNC example: lightweight example using minimal UI and features | ||||
|     Copyright (C) 2012 Joel Martin | ||||
|     Copyright (C) 2017 Samuel Mannehed for Cendio AB | ||||
|     noVNC is licensed under the MPL 2.0 (see LICENSE.txt) | ||||
|     This file is licensed under the 2-Clause BSD license (see LICENSE.txt). | ||||
| 
 | ||||
|     Connect parameters are provided in query string: | ||||
|         http://example.com/?host=HOST&port=PORT&encrypt=1 | ||||
|     or the fragment: | ||||
|         http://example.com/#host=HOST&port=PORT&encrypt=1 | ||||
|     --> | ||||
|     <title>noVNC</title> | ||||
| 
 | ||||
|     <meta charset="utf-8"> | ||||
| 
 | ||||
|     <!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame | ||||
|                 Remove this if you use the .htaccess --> | ||||
|     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> | ||||
| 
 | ||||
|     <!-- Icons (see Makefile for what the sizes are for) --> | ||||
|     <link rel="icon" sizes="16x16" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-16x16.png" %}"> | ||||
|     <link rel="icon" sizes="24x24" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-24x24.png" %}"> | ||||
|     <link rel="icon" sizes="32x32" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-32x32.png" %}"> | ||||
|     <link rel="icon" sizes="48x48" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-48x48.png" %}"> | ||||
|     <link rel="icon" sizes="60x60" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-60x60.png" %}"> | ||||
|     <link rel="icon" sizes="64x64" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-64x64.png" %}"> | ||||
|     <link rel="icon" sizes="72x72" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-72x72.png" %}"> | ||||
|     <link rel="icon" sizes="76x76" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-76x76.png" %}"> | ||||
|     <link rel="icon" sizes="96x96" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-96x96.png" %}"> | ||||
|     <link rel="icon" sizes="120x120" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-120x120.png" %}"> | ||||
|     <link rel="icon" sizes="144x144" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-144x144.png" %}"> | ||||
|     <link rel="icon" sizes="152x152" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-152x152.png" %}"> | ||||
|     <link rel="icon" sizes="192x192" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-192x192.png" %}"> | ||||
|     <!-- Firefox currently mishandles SVG, see #1419039 | ||||
|     <link rel="icon" sizes="any" type="image/svg+xml" href="{% static "js/novnc/app/images/icons/novnc-icon.svg" %}"> | ||||
|     --> | ||||
|     <!-- Repeated last so that legacy handling will pick this --> | ||||
|     <link rel="icon" sizes="16x16" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-16x16.png" %}"> | ||||
| 
 | ||||
|     <!-- Apple iOS Safari settings --> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> | ||||
|     <meta name="apple-mobile-web-app-capable" content="yes" /> | ||||
|     <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> | ||||
|     <!-- Home Screen Icons (favourites and bookmarks use the normal icons) --> | ||||
|     <link rel="apple-touch-icon" sizes="60x60" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-60x60.png" %}"> | ||||
|     <link rel="apple-touch-icon" sizes="76x76" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-76x76.png" %}"> | ||||
|     <link rel="apple-touch-icon" sizes="120x120" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-120x120.png" %}"> | ||||
|     <link rel="apple-touch-icon" sizes="152x152" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-152x152.png" %}"> | ||||
| 
 | ||||
|     <!-- Stylesheets --> | ||||
|     <link rel="stylesheet" href="{% static "js/novnc/app/styles/lite.css" %}"> | ||||
| 
 | ||||
|      <!-- | ||||
|     <script type='text/javascript' | ||||
|         src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script> | ||||
|     --> | ||||
| 
 | ||||
|     <!-- promise polyfills promises for IE11 --> | ||||
|     <script src="{% static "js/novnc/vendor/promise.js" %}"></script> | ||||
|     <!-- ES2015/ES6 modules polyfill --> | ||||
|     <script type="module"> | ||||
|         window._noVNC_has_module_support = true; | ||||
|     </script> | ||||
|     <script> | ||||
|         window.addEventListener("load", function() { | ||||
|             if (window._noVNC_has_module_support) return; | ||||
|             var loader = document.createElement("script"); | ||||
|             loader.src = "{% static "js/novnc/vendor/browser-es-module-loader/dist/browser-es-module-loader.js" %}"; | ||||
|             document.head.appendChild(loader); | ||||
|         }); | ||||
|     </script> | ||||
| {% endblock %} | ||||
| 
 | ||||
| {% block content %} | ||||
| 
 | ||||
|     <div id="noVNC_status_bar"> | ||||
|         <div id="noVNC_left_dummy_elem"></div> | ||||
|         <div id="noVNC_status">Loading</div> | ||||
|         <div id="noVNC_buttons"> | ||||
|             <input type=button value="Send CtrlAltDel" id="sendCtrlAltDelButton" class="noVNC_shown"> | ||||
|             <span id="noVNC_power_buttons" class="noVNC_hidden"> | ||||
|                 <input type=button value="Shutdown" id="machineShutdownButton"> | ||||
|                 <input type=button value="Reboot" id="machineRebootButton"> | ||||
|                 <input type=button value="Reset" id="machineResetButton"> | ||||
|             </span> | ||||
|         </div> | ||||
|     </div> | ||||
|     <div id='vnc_container'></div> | ||||
| 
 | ||||
| {% endblock %} | ||||
| 
 | ||||
| {% block foot %} | ||||
|         <!-- actual script modules --> | ||||
|     <script type="module" crossorigin="anonymous"> | ||||
|         // Load supporting scripts | ||||
|         import * as WebUtil from '{% static "js/novnc/app/webutil.js" %}'; | ||||
|         import RFB from '{% static "js/novnc/core/rfb.js" %}'; | ||||
| 
 | ||||
|         var rfb; | ||||
|         var desktopName; | ||||
| 
 | ||||
|         function updateDesktopName(e) { | ||||
|             desktopName = e.detail.name; | ||||
|         } | ||||
|         function credentials(e) { | ||||
|             var html; | ||||
| 
 | ||||
|             var form = document.createElement('form'); | ||||
|             form.innerHTML = '<label></label>'; | ||||
|             form.innerHTML += '<input type=password size=10 id="password_input">'; | ||||
|             form.onsubmit = setPassword; | ||||
| 
 | ||||
|             // bypass status() because it sets text content | ||||
|             document.getElementById('noVNC_status_bar').setAttribute("class", "noVNC_status_warn"); | ||||
|             document.getElementById('noVNC_status').innerHTML = ''; | ||||
|             document.getElementById('noVNC_status').appendChild(form); | ||||
|             document.getElementById('noVNC_status').querySelector('label').textContent = 'Password Required: '; | ||||
|         } | ||||
|         function setPassword() { | ||||
|             rfb.sendCredentials({ password: document.getElementById('password_input').value }); | ||||
|             return false; | ||||
|         } | ||||
|         function sendCtrlAltDel() { | ||||
|             rfb.sendCtrlAltDel(); | ||||
|             return false; | ||||
|         } | ||||
|         function machineShutdown() { | ||||
|             rfb.machineShutdown(); | ||||
|             return false; | ||||
|         } | ||||
|         function machineReboot() { | ||||
|             rfb.machineReboot(); | ||||
|             return false; | ||||
|         } | ||||
|         function machineReset() { | ||||
|             rfb.machineReset(); | ||||
|             return false; | ||||
|         } | ||||
|         function status(text, level) { | ||||
|             switch (level) { | ||||
|                 case 'normal': | ||||
|                 case 'warn': | ||||
|                 case 'error': | ||||
|                     break; | ||||
|                 default: | ||||
|                     level = "warn"; | ||||
|             } | ||||
|             document.getElementById('noVNC_status_bar').className = "noVNC_status_" + level; | ||||
|             document.getElementById('noVNC_status').textContent = text; | ||||
|         } | ||||
| 
 | ||||
|         function connected(e) { | ||||
|             document.getElementById('sendCtrlAltDelButton').disabled = false; | ||||
|             if (WebUtil.getConfigVar('encrypt', (window.location.protocol === "https:"))) { | ||||
|                 status("Connected (encrypted) to " + desktopName, "normal"); | ||||
|             } else { | ||||
|                 status("Connected (unencrypted) to " + desktopName, "normal"); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         function disconnected(e) { | ||||
|             document.getElementById('sendCtrlAltDelButton').disabled = true; | ||||
|             updatePowerButtons(); | ||||
|             if (e.detail.clean) { | ||||
|                 status("Disconnected", "normal"); | ||||
|             } else { | ||||
|                 status("Something went wrong, connection is closed", "error"); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         function updatePowerButtons() { | ||||
|             var powerbuttons; | ||||
|             powerbuttons = document.getElementById('noVNC_power_buttons'); | ||||
|             if (rfb.capabilities.power) { | ||||
|                 powerbuttons.className= "noVNC_shown"; | ||||
|             } else { | ||||
|                 powerbuttons.className = "noVNC_hidden"; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         document.getElementById('sendCtrlAltDelButton').onclick = sendCtrlAltDel; | ||||
|         document.getElementById('machineShutdownButton').onclick = machineShutdown; | ||||
|         document.getElementById('machineRebootButton').onclick = machineReboot; | ||||
|         document.getElementById('machineResetButton').onclick = machineReset; | ||||
| 
 | ||||
|         WebUtil.init_logging(WebUtil.getConfigVar('logging', 'warn')); | ||||
|         document.title = WebUtil.getConfigVar('title', 'noVNC'); | ||||
|         // By default, use the host and port of server that served this file | ||||
|         //var host = WebUtil.getConfigVar('host', window.location.hostname); | ||||
|         //var port = WebUtil.getConfigVar('port', window.location.port); | ||||
|         var host = '{{ ws_host }}'; | ||||
|         var port = '{{ ws_port }}'; | ||||
| 
 | ||||
|         // if port == 80 (or 443) then it won't be present and should be | ||||
|         // set manually | ||||
|         if (!port) { | ||||
|             if (window.location.protocol.substring(0,5) == 'https') { | ||||
|                 port = 443; | ||||
|             } | ||||
|             else if (window.location.protocol.substring(0,4) == 'http') { | ||||
|                 port = 80; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         //var password = WebUtil.getConfigVar('password', ''); | ||||
|         var password = '{{ console_passwd }}'; | ||||
| 
 | ||||
|         var path = WebUtil.getConfigVar('path', 'websockify'); | ||||
| 
 | ||||
|         // If a token variable is passed in, set the parameter in a cookie. | ||||
|         // This is used by nova-novncproxy. | ||||
|         var token = WebUtil.getConfigVar('token', null); | ||||
|         if (token) { | ||||
|             // if token is already present in the path we should use it | ||||
|             path = WebUtil.injectParamIfMissing(path, "token", token); | ||||
| 
 | ||||
|             WebUtil.createCookie('token', token, 1) | ||||
|         } | ||||
| 
 | ||||
|         (function() { | ||||
| 
 | ||||
|             status("Connecting", "normal"); | ||||
| 
 | ||||
|             if ((!host) || (!port)) { | ||||
|                 status('Must specify host and port in URL', 'error'); | ||||
|             } | ||||
| 
 | ||||
|             var url; | ||||
| 
 | ||||
|             if (WebUtil.getConfigVar('encrypt', (window.location.protocol === "https:"))) { | ||||
|                 url = 'wss'; | ||||
|             } else { | ||||
|                 url = 'ws'; | ||||
|             } | ||||
| 
 | ||||
|             url += '://' + host; | ||||
|             if(port) { | ||||
|                 url += ':' + port; | ||||
|             } | ||||
|             url += '/' + path; | ||||
| 
 | ||||
| //            rfb = new RFB(document.body, url, | ||||
|  //                         { repeaterID: WebUtil.getConfigVar('repeaterID', ''), | ||||
|    //                         shared: WebUtil.getConfigVar('shared', true), | ||||
|      //                       credentials: { password: password } }); | ||||
|             rfb = new RFB(document.getElementById('vnc_container'), url, | ||||
|                          { repeaterID: WebUtil.getConfigVar('repeaterID', ''), | ||||
|                            shared: WebUtil.getConfigVar('shared', true), | ||||
|                            credentials: { password: password } }); | ||||
| 
 | ||||
|             rfb.viewOnly = WebUtil.getConfigVar('view_only', false); | ||||
|             rfb.addEventListener("connect",  connected); | ||||
|             rfb.addEventListener("disconnect", disconnected); | ||||
|             rfb.addEventListener("capabilities", function () { updatePowerButtons(); }); | ||||
|             rfb.addEventListener("credentialsrequired", credentials); | ||||
|             rfb.addEventListener("desktopname", updateDesktopName); | ||||
|             rfb.scaleViewport = WebUtil.getConfigVar('scale', false); | ||||
|             rfb.resizeSession = WebUtil.getConfigVar('resize', false); | ||||
|         })(); | ||||
|     </script> | ||||
| {% endblock %} | ||||
|  | @ -29,9 +29,9 @@ | |||
|               style="display: none;"> | ||||
|     </textarea> | ||||
| 
 | ||||
| {% endblock %} | ||||
| 
 | ||||
| {% block foot %} | ||||
| 
 | ||||
| 
 | ||||
| <script> | ||||
|     /*jslint white: false */ | ||||
|     /*global window, $, Util, RFB, */ | ||||
|  |  | |||
|  | @ -20,6 +20,7 @@ def console(request): | |||
| 
 | ||||
|     if request.method == 'GET': | ||||
|         token = request.GET.get('token', '') | ||||
|         view_type = request.GET.get('view', 'lite') | ||||
| 
 | ||||
|     try: | ||||
|         temptoken = token.split('-', 1) | ||||
|  | @ -45,13 +46,12 @@ def console(request): | |||
|     if ':' in ws_host: | ||||
|         ws_host = re.sub(':[0-9]+', '', ws_host) | ||||
| 
 | ||||
|     if console_type == 'vnc': | ||||
|         response = render(request, 'console-vnc.html', locals()) | ||||
|     elif console_type == 'spice': | ||||
|         response = render(request, 'console-spice.html', locals()) | ||||
|     console_page = "console-" + console_type + "-" + view_type + ".html" | ||||
|     if console_type == 'vnc' or console_type == 'spice': | ||||
|         response = render(request, console_page, locals()) | ||||
|     else: | ||||
|         console_error = "Console type: %s no support" % console_type | ||||
|         response = render(request, 'console-vnc.html', locals()) | ||||
|         response = render(request, 'console-vnc-lite.html', locals()) | ||||
| 
 | ||||
|     response.set_cookie('token', token) | ||||
|     return response | ||||
|  |  | |||
|  | @ -249,7 +249,19 @@ | |||
|                                             <div role="tabpanel" class="tab-pane tab-pane-bordered active" id="vnconsole"> | ||||
|                                                 <p>{% trans "This action opens a new window with a VNC connection to the console of the instance." %}</p> | ||||
|                                                 {% ifequal status 1 %} | ||||
|                                                     <a href="#" class="btn btn-lg btn-success pull-right" title="Console port: {{ console_port }}" onclick="open_console()">{% trans "Console" %}</a> | ||||
|                                                     <!-- Split button --> | ||||
|                                                     <div class="btn-group pull-right"> | ||||
|                                                         <button type="button" class="btn btn-lg btn-success " onclick="open_console('lite')">Console</button> | ||||
|                                                         <button type="button" class="btn btn-lg btn-success dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||||
|                                                             <span class="caret"></span> | ||||
|                                                             <span class="sr-only">Toggle Dropdown</span> | ||||
|                                                         </button> | ||||
|                                                         <ul class="dropdown-menu"> | ||||
|                                                             <li><a href="#" title="Console port: {{ console_port }}" onclick="open_console('lite')">{% trans "Console - Lite" %}</a></li> | ||||
|                                                             <li><a href="#" title="Console port: {{ console_port }}" onclick="open_console('full')">{% trans "Console - Full" %}</a></li> | ||||
|                                                         </ul> | ||||
|                                                     </div> | ||||
| 
 | ||||
|                                                 {% else %} | ||||
|                                                     <button class="btn btn-lg btn-success pull-right disabled">{% trans "Console" %}</button> | ||||
|                                                 {% endifequal %} | ||||
|  | @ -1193,8 +1205,8 @@ | |||
|     }); | ||||
| </script> | ||||
| <script> | ||||
|     function open_console() { | ||||
|         window.open('{% url 'console' %}?token={{ compute_id }}-{{ uuid }}', '', 'width=850,height=485') | ||||
|     function open_console(view_style) { | ||||
|         window.open('{% url 'console' %}?token={{ compute_id }}-{{ uuid }}&view=' +view_style +'', '', 'width=850,height=600') | ||||
|     } | ||||
| </script> | ||||
| <script> | ||||
|  |  | |||
							
								
								
									
										12069
									
								
								static/js/novnc/app.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										56
									
								
								static/js/novnc/app/error-handler.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,56 @@ | |||
| // NB: this should *not* be included as a module until we have
 | ||||
| // native support in the browsers, so that our error handler
 | ||||
| // can catch script-loading errors.
 | ||||
| 
 | ||||
| 
 | ||||
| (function(){ | ||||
|     "use strict"; | ||||
| 
 | ||||
|     // Fallback for all uncought errors
 | ||||
|     function handleError (event, err) { | ||||
|         try { | ||||
|             var msg = document.getElementById('noVNC_fallback_errormsg'); | ||||
| 
 | ||||
|             // Only show the initial error
 | ||||
|             if (msg.hasChildNodes()) { | ||||
|                 return false; | ||||
|             } | ||||
| 
 | ||||
|             var div = document.createElement("div"); | ||||
|             div.classList.add('noVNC_message'); | ||||
|             div.appendChild(document.createTextNode(event.message)); | ||||
|             msg.appendChild(div); | ||||
| 
 | ||||
|             if (event.filename) { | ||||
|                 div = document.createElement("div"); | ||||
|                 div.className = 'noVNC_location'; | ||||
|                 var text = event.filename; | ||||
|                 if (event.lineno !== undefined) { | ||||
|                     text += ":" + event.lineno; | ||||
|                     if (event.colno !== undefined) { | ||||
|                         text += ":" + event.colno; | ||||
|                     } | ||||
|                 } | ||||
|                 div.appendChild(document.createTextNode(text)); | ||||
|                 msg.appendChild(div); | ||||
|             } | ||||
| 
 | ||||
|             if (err && (err.stack !== undefined)) { | ||||
|                 div = document.createElement("div"); | ||||
|                 div.className = 'noVNC_stack'; | ||||
|                 div.appendChild(document.createTextNode(err.stack)); | ||||
|                 msg.appendChild(div); | ||||
|             } | ||||
| 
 | ||||
|             document.getElementById('noVNC_fallback_error') | ||||
|                 .classList.add("noVNC_open"); | ||||
|         } catch (exc) { | ||||
|             document.write("noVNC encountered an error."); | ||||
|         } | ||||
|         // Don't return true since this would prevent the error
 | ||||
|         // from being printed to the browser console.
 | ||||
|         return false; | ||||
|     } | ||||
|     window.addEventListener('error', function (evt) { handleError(evt, evt.error); }); | ||||
|     window.addEventListener('unhandledrejection', function (evt) { handleError(evt.reason, evt.reason); }); | ||||
| })(); | ||||
							
								
								
									
										92
									
								
								static/js/novnc/app/images/alt.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,92 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="alt.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="16" | ||||
|      inkscape:cx="18.205425" | ||||
|      inkscape:cy="17.531398" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <g | ||||
|        style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|        id="text5290"> | ||||
|       <path | ||||
|          d="m 9.9560547,1042.3329 -2.9394531,0 -0.4638672,1.3281 -1.8896485,0 2.7001953,-7.29 2.241211,0 2.7001958,7.29 -1.889649,0 -0.4589843,-1.3281 z m -2.4707031,-1.3526 1.9970703,0 -0.9960938,-2.9003 -1.0009765,2.9003 z" | ||||
|          style="font-size:10px;fill:#ffffff;fill-opacity:1" | ||||
|          id="path5340" /> | ||||
|       <path | ||||
|          d="m 13.188477,1036.0634 1.748046,0 0,7.5976 -1.748046,0 0,-7.5976 z" | ||||
|          style="font-size:10px;fill:#ffffff;fill-opacity:1" | ||||
|          id="path5342" /> | ||||
|       <path | ||||
|          d="m 18.535156,1036.6395 0,1.5528 1.801758,0 0,1.25 -1.801758,0 0,2.3193 q 0,0.3809 0.151367,0.5176 0.151368,0.1318 0.600586,0.1318 l 0.898438,0 0,1.25 -1.499024,0 q -1.035156,0 -1.469726,-0.4297 -0.429688,-0.4345 -0.429688,-1.4697 l 0,-2.3193 -0.86914,0 0,-1.25 0.86914,0 0,-1.5528 1.748047,0 z" | ||||
|          style="font-size:10px;fill:#ffffff;fill-opacity:1" | ||||
|          id="path5344" /> | ||||
|     </g> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 3.5 KiB | 
							
								
								
									
										106
									
								
								static/js/novnc/app/images/clipboard.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,106 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="clipboard.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="1" | ||||
|      inkscape:cx="15.366606" | ||||
|      inkscape:cy="16.42981" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <path | ||||
|        style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        d="M 9,6 6,6 C 5.4459889,6 5,6.4459889 5,7 l 0,13 c 0,0.554011 0.4459889,1 1,1 l 13,0 c 0.554011,0 1,-0.445989 1,-1 L 20,7 C 20,6.4459889 19.554011,6 19,6 l -3,0" | ||||
|        transform="translate(0,1027.3622)" | ||||
|        id="rect6083" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cssssssssc" /> | ||||
|     <rect | ||||
|        style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        id="rect6085" | ||||
|        width="7" | ||||
|        height="4" | ||||
|        x="9" | ||||
|        y="1031.3622" | ||||
|        ry="1.00002" /> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196081" | ||||
|        d="m 8.5071212,1038.8622 7.9999998,0" | ||||
|        id="path6087" | ||||
|        inkscape:connector-curvature="0" /> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196081" | ||||
|        d="m 8.5071212,1041.8622 3.9999998,0" | ||||
|        id="path6089" | ||||
|        inkscape:connector-curvature="0" /> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196081" | ||||
|        d="m 8.5071212,1044.8622 5.9999998,0" | ||||
|        id="path6091" | ||||
|        inkscape:connector-curvature="0" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 3.9 KiB | 
							
								
								
									
										96
									
								
								static/js/novnc/app/images/connect.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,96 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="connect.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="1" | ||||
|      inkscape:cx="37.14834" | ||||
|      inkscape:cy="1.9525926" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <g | ||||
|        id="g5103" | ||||
|        transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,-729.15757,315.8823)"> | ||||
|       <path | ||||
|          sodipodi:nodetypes="cssssc" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="rect5096" | ||||
|          d="m 11,1040.3622 -5,0 c -1.108,0 -2,-0.892 -2,-2 l 0,-4 c 0,-1.108 0.892,-2 2,-2 l 5,0" | ||||
|          style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> | ||||
|       <path | ||||
|          style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|          d="m 14,1032.3622 5,0 c 1.108,0 2,0.892 2,2 l 0,4 c 0,1.108 -0.892,2 -2,2 l -5,0" | ||||
|          id="path5099" | ||||
|          inkscape:connector-curvature="0" | ||||
|          sodipodi:nodetypes="cssssc" /> | ||||
|       <path | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path5101" | ||||
|          d="m 9,1036.3622 7,0" | ||||
|          style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> | ||||
|     </g> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 3.3 KiB | 
							
								
								
									
										96
									
								
								static/js/novnc/app/images/ctrl.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,96 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="ctrl.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="16" | ||||
|      inkscape:cx="18.205425" | ||||
|      inkscape:cy="17.531398" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <g | ||||
|        style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|        id="text5290"> | ||||
|       <path | ||||
|          d="m 9.1210938,1043.1898 q -0.5175782,0.2686 -1.0791016,0.4053 -0.5615235,0.1367 -1.171875,0.1367 -1.8212891,0 -2.8857422,-1.0156 -1.0644531,-1.0205 -1.0644531,-2.7637 0,-1.748 1.0644531,-2.7637 1.0644531,-1.0205 2.8857422,-1.0205 0.6103515,0 1.171875,0.1368 0.5615234,0.1367 1.0791016,0.4052 l 0,1.5088 q -0.522461,-0.3564 -1.0302735,-0.5224 -0.5078125,-0.1661 -1.0693359,-0.1661 -1.0058594,0 -1.5820313,0.6446 -0.5761719,0.6445 -0.5761719,1.7773 0,1.1279 0.5761719,1.7725 0.5761719,0.6445 1.5820313,0.6445 0.5615234,0 1.0693359,-0.166 0.5078125,-0.166 1.0302735,-0.5225 l 0,1.5088 z" | ||||
|          style="font-size:10px;fill:#ffffff;fill-opacity:1" | ||||
|          id="path5370" /> | ||||
|       <path | ||||
|          d="m 12.514648,1036.5687 0,1.5528 1.801758,0 0,1.25 -1.801758,0 0,2.3193 q 0,0.3809 0.151368,0.5176 0.151367,0.1318 0.600586,0.1318 l 0.898437,0 0,1.25 -1.499023,0 q -1.035157,0 -1.469727,-0.4297 -0.429687,-0.4345 -0.429687,-1.4697 l 0,-2.3193 -0.8691411,0 0,-1.25 0.8691411,0 0,-1.5528 1.748046,0 z" | ||||
|          style="font-size:10px;fill:#ffffff;fill-opacity:1" | ||||
|          id="path5372" /> | ||||
|       <path | ||||
|          d="m 19.453125,1039.6107 q -0.229492,-0.1074 -0.458984,-0.1562 -0.22461,-0.054 -0.454102,-0.054 -0.673828,0 -1.040039,0.4345 -0.361328,0.4297 -0.361328,1.2354 l 0,2.5195 -1.748047,0 0,-5.4687 1.748047,0 0,0.8984 q 0.336914,-0.5371 0.771484,-0.7813 0.439453,-0.249 1.049805,-0.249 0.08789,0 0.19043,0.01 0.102539,0 0.297851,0.029 l 0.0049,1.582 z" | ||||
|          style="font-size:10px;fill:#ffffff;fill-opacity:1" | ||||
|          id="path5374" /> | ||||
|       <path | ||||
|          d="m 20.332031,1035.9926 1.748047,0 0,7.5976 -1.748047,0 0,-7.5976 z" | ||||
|          style="font-size:10px;fill:#ffffff;fill-opacity:1" | ||||
|          id="path5376" /> | ||||
|     </g> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 4.3 KiB | 
							
								
								
									
										100
									
								
								static/js/novnc/app/images/ctrlaltdel.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,100 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="ctrlaltdel.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="8" | ||||
|      inkscape:cx="11.135667" | ||||
|      inkscape:cy="16.407428" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <rect | ||||
|        style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        id="rect5253" | ||||
|        width="5" | ||||
|        height="5.0000172" | ||||
|        x="16" | ||||
|        y="1031.3622" | ||||
|        ry="1.0000174" /> | ||||
|     <rect | ||||
|        y="1043.3622" | ||||
|        x="4" | ||||
|        height="5.0000172" | ||||
|        width="5" | ||||
|        id="rect5255" | ||||
|        style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        ry="1.0000174" /> | ||||
|     <rect | ||||
|        style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        id="rect5257" | ||||
|        width="5" | ||||
|        height="5.0000172" | ||||
|        x="13" | ||||
|        y="1043.3622" | ||||
|        ry="1.0000174" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 3.2 KiB | 
							
								
								
									
										94
									
								
								static/js/novnc/app/images/disconnect.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,94 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="disconnect.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="16" | ||||
|      inkscape:cx="25.05707" | ||||
|      inkscape:cy="11.594858" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="false"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <g | ||||
|        id="g5171" | ||||
|        transform="translate(-24.062499,-6.15775e-4)"> | ||||
|       <path | ||||
|          id="path5110" | ||||
|          transform="translate(0,1027.3622)" | ||||
|          d="m 39.744141,3.4960938 c -0.769923,0 -1.539607,0.2915468 -2.121094,0.8730468 l -2.566406,2.5664063 1.414062,1.4140625 2.566406,-2.5664063 c 0.403974,-0.404 1.010089,-0.404 1.414063,0 l 2.828125,2.828125 c 0.40398,0.4039 0.403907,1.0101621 0,1.4140629 l -2.566406,2.566406 1.414062,1.414062 2.566406,-2.566406 c 1.163041,-1.1629 1.162968,-3.0791874 0,-4.2421874 L 41.865234,4.3691406 C 41.283747,3.7876406 40.514063,3.4960937 39.744141,3.4960938 Z M 39.017578,9.015625 a 1.0001,1.0001 0 0 0 -0.6875,0.3027344 l -0.445312,0.4453125 1.414062,1.4140621 0.445313,-0.445312 A 1.0001,1.0001 0 0 0 39.017578,9.015625 Z m -6.363281,0.7070312 a 1.0001,1.0001 0 0 0 -0.6875,0.3027348 L 28.431641,13.5625 c -1.163042,1.163 -1.16297,3.079187 0,4.242188 l 2.828125,2.828124 c 1.162974,1.163101 3.079213,1.163101 4.242187,0 l 3.535156,-3.535156 a 1.0001,1.0001 0 1 0 -1.414062,-1.414062 l -3.535156,3.535156 c -0.403974,0.404 -1.010089,0.404 -1.414063,0 l -2.828125,-2.828125 c -0.403981,-0.404 -0.403908,-1.010162 0,-1.414063 l 3.535156,-3.537109 A 1.0001,1.0001 0 0 0 32.654297,9.7226562 Z m 3.109375,2.1621098 -2.382813,2.384765 a 1.0001,1.0001 0 1 0 1.414063,1.414063 l 2.382812,-2.384766 -1.414062,-1.414062 z" | ||||
|          style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|          inkscape:connector-curvature="0" /> | ||||
|       <rect | ||||
|          transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)" | ||||
|          y="752.29541" | ||||
|          x="-712.31262" | ||||
|          height="18.000017" | ||||
|          width="3" | ||||
|          id="rect5116" | ||||
|          style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> | ||||
|     </g> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 4.9 KiB | 
							
								
								
									
										76
									
								
								static/js/novnc/app/images/drag.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,76 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="drag.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="22.627417" | ||||
|      inkscape:cx="9.8789407" | ||||
|      inkscape:cy="9.5008608" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="true" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="false" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <path | ||||
|        style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        d="m 7.039733,1049.3037 c -0.4309106,-0.1233 -0.7932634,-0.4631 -0.9705434,-0.9103 -0.04922,-0.1241 -0.057118,-0.2988 -0.071321,-1.5771 l -0.015972,-1.4375 -0.328125,-0.082 c -0.7668138,-0.1927 -1.1897046,-0.4275 -1.7031253,-0.9457 -0.4586773,-0.4629 -0.6804297,-0.8433 -0.867034,-1.4875 -0.067215,-0.232 -0.068001,-0.2642 -0.078682,-3.2188 -0.012078,-3.341 -0.020337,-3.2012 0.2099452,-3.5555 0.2246623,-0.3458 0.5798271,-0.5892 0.9667343,-0.6626 0.092506,-0.017 0.531898,-0.032 0.9764271,-0.032 l 0.8082347,0 1.157e-4,1.336 c 1.125e-4,1.2779 0.00281,1.3403 0.062214,1.4378 0.091785,0.1505 0.2357707,0.226 0.4314082,0.2261 0.285389,2e-4 0.454884,-0.1352 0.5058962,-0.4042 0.019355,-0.102 0.031616,-0.982 0.031616,-2.269 0,-1.9756 0.00357,-2.1138 0.059205,-2.2926 0.1645475,-0.5287 0.6307616,-0.9246 1.19078,-1.0113 0.8000572,-0.1238 1.5711277,0.4446 1.6860387,1.2429 0.01732,0.1203 0.03177,0.8248 0.03211,1.5657 6.19e-4,1.3449 7.22e-4,1.347 0.07093,1.4499 0.108355,0.1587 0.255268,0.2248 0.46917,0.2108 0.204069,-0.013 0.316116,-0.08 0.413642,-0.2453 0.06028,-0.1024 0.06307,-0.1778 0.07862,-2.1218 0.01462,-1.8283 0.02124,-2.0285 0.07121,-2.1549 0.260673,-0.659 0.934894,-1.0527 1.621129,-0.9465 0.640523,0.099 1.152269,0.6104 1.243187,1.2421 0.01827,0.1269 0.03175,0.9943 0.03211,2.0657 l 6.19e-4,1.8469 0.07031,0.103 c 0.108355,0.1587 0.255267,0.2248 0.46917,0.2108 0.204069,-0.013 0.316115,-0.08 0.413642,-0.2453 0.05951,-0.1011 0.06329,-0.1786 0.07907,-1.6218 0.01469,-1.3438 0.02277,-1.5314 0.07121,-1.6549 0.257975,-0.6576 0.934425,-1.0527 1.620676,-0.9465 0.640522,0.099 1.152269,0.6104 1.243186,1.2421 0.0186,0.1292 0.03179,1.0759 0.03222,2.3125 7.15e-4,2.0335 0.0025,2.0966 0.06283,2.1956 0.09178,0.1505 0.235771,0.226 0.431409,0.2261 0.285388,2e-4 0.454884,-0.1352 0.505897,-0.4042 0.01874,-0.099 0.03161,-0.8192 0.03161,-1.769 0,-1.4848 0.0043,-1.6163 0.0592,-1.7926 0.164548,-0.5287 0.630762,-0.9246 1.19078,-1.0113 0.800057,-0.1238 1.571128,0.4446 1.686039,1.2429 0.04318,0.2999 0.04372,9.1764 5.78e-4,9.4531 -0.04431,0.2841 -0.217814,0.6241 -0.420069,0.8232 -0.320102,0.315 -0.63307,0.4268 -1.194973,0.4268 l -0.35281,0 -2.51e-4,1.2734 c -1.25e-4,0.7046 -0.01439,1.3642 -0.03191,1.4766 -0.06665,0.4274 -0.372966,0.8704 -0.740031,1.0702 -0.349999,0.1905 0.01748,0.18 -6.242199,0.1776 -5.3622439,0 -5.7320152,-0.01 -5.9121592,-0.057 l 1.4e-5,0 z" | ||||
|        id="path4379" | ||||
|        inkscape:connector-curvature="0" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 4.6 KiB | 
							
								
								
									
										81
									
								
								static/js/novnc/app/images/error.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,81 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="error.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="1" | ||||
|      inkscape:cx="14.00357" | ||||
|      inkscape:cy="12.443398" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title /> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <path | ||||
|        style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        d="M 7 3 C 4.7839905 3 3 4.7839905 3 7 L 3 18 C 3 20.21601 4.7839905 22 7 22 L 18 22 C 20.21601 22 22 20.21601 22 18 L 22 7 C 22 4.7839905 20.21601 3 18 3 L 7 3 z M 7.6992188 6 A 1.6916875 1.6924297 0 0 1 8.9121094 6.5117188 L 12.5 10.101562 L 16.087891 6.5117188 A 1.6916875 1.6924297 0 0 1 17.251953 6 A 1.6916875 1.6924297 0 0 1 18.480469 8.90625 L 14.892578 12.496094 L 18.480469 16.085938 A 1.6916875 1.6924297 0 1 1 16.087891 18.478516 L 12.5 14.888672 L 8.9121094 18.478516 A 1.6916875 1.6924297 0 1 1 6.5214844 16.085938 L 10.109375 12.496094 L 6.5214844 8.90625 A 1.6916875 1.6924297 0 0 1 7.6992188 6 z " | ||||
|        transform="translate(0,1027.3622)" | ||||
|        id="rect4135" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 3 KiB | 
							
								
								
									
										92
									
								
								static/js/novnc/app/images/esc.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,92 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="esc.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="16" | ||||
|      inkscape:cx="18.205425" | ||||
|      inkscape:cy="17.531398" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="text5290" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <g | ||||
|        style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|        id="text5290"> | ||||
|       <path | ||||
|          d="m 3.9331055,1036.1464 5.0732422,0 0,1.4209 -3.1933594,0 0,1.3574 3.0029297,0 0,1.4209 -3.0029297,0 0,1.6699 3.3007812,0 0,1.4209 -5.180664,0 0,-7.29 z" | ||||
|          style="font-size:10px;fill:#ffffff;fill-opacity:1" | ||||
|          id="path5314" /> | ||||
|       <path | ||||
|          d="m 14.963379,1038.1385 0,1.3282 q -0.561524,-0.2344 -1.083984,-0.3516 -0.522461,-0.1172 -0.986329,-0.1172 -0.498046,0 -0.742187,0.127 -0.239258,0.122 -0.239258,0.3808 0,0.21 0.180664,0.3223 0.185547,0.1123 0.65918,0.166 l 0.307617,0.044 q 1.342773,0.1709 1.806641,0.5615 0.463867,0.3906 0.463867,1.2256 0,0.874 -0.644531,1.3134 -0.644532,0.4395 -1.923829,0.4395 -0.541992,0 -1.123046,-0.088 -0.576172,-0.083 -1.186524,-0.2539 l 0,-1.3281 q 0.522461,0.2539 1.069336,0.3808 0.551758,0.127 1.118164,0.127 0.512695,0 0.771485,-0.1416 0.258789,-0.1416 0.258789,-0.4199 0,-0.2344 -0.180664,-0.3467 -0.175782,-0.1172 -0.708008,-0.1807 l -0.307617,-0.039 q -1.166993,-0.1465 -1.635743,-0.542 -0.46875,-0.3955 -0.46875,-1.2012 0,-0.8691 0.595703,-1.2891 0.595704,-0.4199 1.826172,-0.4199 0.483399,0 1.015625,0.073 0.532227,0.073 1.157227,0.2294 z" | ||||
|          style="font-size:10px;fill:#ffffff;fill-opacity:1" | ||||
|          id="path5316" /> | ||||
|       <path | ||||
|          d="m 21.066895,1038.1385 0,1.4258 q -0.356446,-0.2441 -0.717774,-0.3613 -0.356445,-0.1172 -0.742187,-0.1172 -0.732422,0 -1.142579,0.4297 -0.405273,0.4248 -0.405273,1.1914 0,0.7666 0.405273,1.1963 0.410157,0.4248 1.142579,0.4248 0.410156,0 0.776367,-0.1221 0.371094,-0.122 0.683594,-0.3613 l 0,1.4307 q -0.410157,0.1513 -0.834961,0.2246 -0.419922,0.078 -0.844727,0.078 -1.479492,0 -2.314453,-0.7568 -0.834961,-0.7618 -0.834961,-2.1143 0,-1.3525 0.834961,-2.1094 0.834961,-0.7617 2.314453,-0.7617 0.429688,0 0.844727,0.078 0.419921,0.073 0.834961,0.2246 z" | ||||
|          style="font-size:10px;fill:#ffffff;fill-opacity:1" | ||||
|          id="path5318" /> | ||||
|     </g> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 4.4 KiB | 
							
								
								
									
										69
									
								
								static/js/novnc/app/images/expander.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,69 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="9" | ||||
|    height="10" | ||||
|    viewBox="0 0 9 10" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="expander.svg"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#ffffff" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0.0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="45.254834" | ||||
|      inkscape:cx="9.8737281" | ||||
|      inkscape:cy="6.4583132" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="true" | ||||
|      units="px" | ||||
|      inkscape:snap-object-midpoints="false" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="0" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1042.3622)"> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="M 2.0800781,1042.3633 A 2.0002,2.0002 0 0 0 0,1044.3613 l 0,6 a 2.0002,2.0002 0 0 0 3.0292969,1.7168 l 5,-3 a 2.0002,2.0002 0 0 0 0,-3.4316 l -5,-3 a 2.0002,2.0002 0 0 0 -0.9492188,-0.2832 z" | ||||
|        id="path4138" | ||||
|        inkscape:connector-curvature="0" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 3 KiB | 
							
								
								
									
										93
									
								
								static/js/novnc/app/images/fullscreen.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,93 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="fullscreen.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="1" | ||||
|      inkscape:cx="16.400723" | ||||
|      inkscape:cy="15.083758" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="false" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="false"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <rect | ||||
|        style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        id="rect5006" | ||||
|        width="17" | ||||
|        height="17.000017" | ||||
|        x="4" | ||||
|        y="1031.3622" | ||||
|        ry="3.0000174" /> | ||||
|     <path | ||||
|        style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" | ||||
|        d="m 7.5,1044.8622 4,0 -1.5,-1.5 1.5,-1.5 -1,-1 -1.5,1.5 -1.5,-1.5 0,4 z" | ||||
|        id="path5017" | ||||
|        inkscape:connector-curvature="0" /> | ||||
|     <path | ||||
|        inkscape:connector-curvature="0" | ||||
|        id="path5025" | ||||
|        d="m 17.5,1034.8622 -4,0 1.5,1.5 -1.5,1.5 1,1 1.5,-1.5 1.5,1.5 0,-4 z" | ||||
|        style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										82
									
								
								static/js/novnc/app/images/handle.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,82 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="5" | ||||
|    height="6" | ||||
|    viewBox="0 0 5 6" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="handle.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="32" | ||||
|      inkscape:cx="1.3551778" | ||||
|      inkscape:cy="8.7800329" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="true" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="false" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1046.3622)"> | ||||
|     <path | ||||
|        style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | ||||
|        d="m 4.0000803,1049.3622 -3,-2 0,4 z" | ||||
|        id="path4247" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cccc" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.5 KiB | 
							
								
								
									
										172
									
								
								static/js/novnc/app/images/handle_bg.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,172 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="15" | ||||
|    height="50" | ||||
|    viewBox="0 0 15 50" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="handle_bg.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="16" | ||||
|      inkscape:cx="-10.001409" | ||||
|      inkscape:cy="24.512566" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="true" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="false" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1002.3622)"> | ||||
|     <rect | ||||
|        style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        id="rect4249" | ||||
|        width="1" | ||||
|        height="1.0000174" | ||||
|        x="9.5" | ||||
|        y="1008.8622" | ||||
|        ry="1.7382812e-05" /> | ||||
|     <rect | ||||
|        ry="1.7382812e-05" | ||||
|        y="1013.8622" | ||||
|        x="9.5" | ||||
|        height="1.0000174" | ||||
|        width="1" | ||||
|        id="rect4255" | ||||
|        style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> | ||||
|     <rect | ||||
|        ry="1.7382812e-05" | ||||
|        y="1008.8622" | ||||
|        x="4.5" | ||||
|        height="1.0000174" | ||||
|        width="1" | ||||
|        id="rect4261" | ||||
|        style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> | ||||
|     <rect | ||||
|        style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        id="rect4263" | ||||
|        width="1" | ||||
|        height="1.0000174" | ||||
|        x="4.5" | ||||
|        y="1013.8622" | ||||
|        ry="1.7382812e-05" /> | ||||
|     <rect | ||||
|        ry="1.7382812e-05" | ||||
|        y="1039.8622" | ||||
|        x="9.5" | ||||
|        height="1.0000174" | ||||
|        width="1" | ||||
|        id="rect4265" | ||||
|        style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> | ||||
|     <rect | ||||
|        style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        id="rect4267" | ||||
|        width="1" | ||||
|        height="1.0000174" | ||||
|        x="9.5" | ||||
|        y="1044.8622" | ||||
|        ry="1.7382812e-05" /> | ||||
|     <rect | ||||
|        style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        id="rect4269" | ||||
|        width="1" | ||||
|        height="1.0000174" | ||||
|        x="4.5" | ||||
|        y="1039.8622" | ||||
|        ry="1.7382812e-05" /> | ||||
|     <rect | ||||
|        ry="1.7382812e-05" | ||||
|        y="1044.8622" | ||||
|        x="4.5" | ||||
|        height="1.0000174" | ||||
|        width="1" | ||||
|        id="rect4271" | ||||
|        style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> | ||||
|     <rect | ||||
|        style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        id="rect4273" | ||||
|        width="1" | ||||
|        height="1.0000174" | ||||
|        x="9.5" | ||||
|        y="1018.8622" | ||||
|        ry="1.7382812e-05" /> | ||||
|     <rect | ||||
|        ry="1.7382812e-05" | ||||
|        y="1018.8622" | ||||
|        x="4.5" | ||||
|        height="1.0000174" | ||||
|        width="1" | ||||
|        id="rect4275" | ||||
|        style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> | ||||
|     <rect | ||||
|        style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        id="rect4277" | ||||
|        width="1" | ||||
|        height="1.0000174" | ||||
|        x="9.5" | ||||
|        y="1034.8622" | ||||
|        ry="1.7382812e-05" /> | ||||
|     <rect | ||||
|        ry="1.7382812e-05" | ||||
|        y="1034.8622" | ||||
|        x="4.5" | ||||
|        height="1.0000174" | ||||
|        width="1" | ||||
|        id="rect4279" | ||||
|        style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 6.2 KiB | 
							
								
								
									
										42
									
								
								static/js/novnc/app/images/icons/Makefile
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,42 @@ | |||
| ICONS := \
 | ||||
| 	novnc-16x16.png \
 | ||||
| 	novnc-24x24.png \
 | ||||
| 	novnc-32x32.png \
 | ||||
| 	novnc-48x48.png \
 | ||||
| 	novnc-64x64.png | ||||
| 
 | ||||
| ANDROID_LAUNCHER := \
 | ||||
| 	novnc-48x48.png \
 | ||||
| 	novnc-72x72.png \
 | ||||
| 	novnc-96x96.png \
 | ||||
| 	novnc-144x144.png \
 | ||||
| 	novnc-192x192.png | ||||
| 
 | ||||
| IPHONE_LAUNCHER := \
 | ||||
| 	novnc-60x60.png \
 | ||||
| 	novnc-120x120.png | ||||
| 
 | ||||
| IPAD_LAUNCHER := \
 | ||||
| 	novnc-76x76.png \
 | ||||
| 	novnc-152x152.png | ||||
| 
 | ||||
| ALL_ICONS := $(ICONS) $(ANDROID_LAUNCHER) $(IPHONE_LAUNCHER) $(IPAD_LAUNCHER) | ||||
| 
 | ||||
| all: $(ALL_ICONS) | ||||
| 
 | ||||
| novnc-16x16.png: novnc-icon-sm.svg | ||||
| 	convert -density 90 \
 | ||||
| 		-background transparent "$<" "$@" | ||||
| novnc-24x24.png: novnc-icon-sm.svg | ||||
| 	convert -density 135 \
 | ||||
| 		-background transparent "$<" "$@" | ||||
| novnc-32x32.png: novnc-icon-sm.svg | ||||
| 	convert -density 180 \
 | ||||
| 		-background transparent "$<" "$@" | ||||
| 
 | ||||
| novnc-%.png: novnc-icon.svg | ||||
| 	convert -density $$[`echo $* | cut -d x -f 1` * 90 / 48] \
 | ||||
| 		-background transparent "$<" "$@" | ||||
| 
 | ||||
| clean: | ||||
| 	rm -f *.png | ||||
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-120x120.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| After Width: | Height: | Size: 3.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-144x144.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| After Width: | Height: | Size: 4.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-152x152.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| After Width: | Height: | Size: 5.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-16x16.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| After Width: | Height: | Size: 675 B | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-192x192.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| After Width: | Height: | Size: 5.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-24x24.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| After Width: | Height: | Size: 1,000 B | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-32x32.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| After Width: | Height: | Size: 1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-48x48.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| After Width: | Height: | Size: 1.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-60x60.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-64x64.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-72x72.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| After Width: | Height: | Size: 2.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-76x76.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| After Width: | Height: | Size: 2.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/images/icons/novnc-96x96.png
									
										
									
									
									
										Executable file
									
								
							
							
						
						| After Width: | Height: | Size: 2.3 KiB | 
							
								
								
									
										163
									
								
								static/js/novnc/app/images/icons/novnc-icon-sm.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,163 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="16" | ||||
|    height="16" | ||||
|    viewBox="0 0 16 16" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="novnc-icon-sm.svg"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#ffffff" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0.0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="45.254834" | ||||
|      inkscape:cx="9.722703" | ||||
|      inkscape:cy="5.5311896" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:snap-midpoints="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4169" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1036.3621)"> | ||||
|     <rect | ||||
|        style="opacity:1;fill:#494949;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        id="rect4167" | ||||
|        width="16" | ||||
|        height="15.999992" | ||||
|        x="0" | ||||
|        y="1036.3622" | ||||
|        ry="2.6666584" /> | ||||
|     <path | ||||
|        style="opacity:1;fill:#313131;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        d="M 2.6666667,1036.3621 C 1.1893373,1036.3621 0,1037.5515 0,1039.0288 l 0,10.6666 c 0,1.4774 1.1893373,2.6667 2.6666667,2.6667 l 4,0 C 11.837333,1052.3621 16,1046.7128 16,1039.6955 l 0,-0.6667 c 0,-1.4773 -1.189337,-2.6667 -2.666667,-2.6667 l -10.6666663,0 z" | ||||
|        id="rect4173" | ||||
|        inkscape:connector-curvature="0" /> | ||||
|     <g | ||||
|        id="g4381"> | ||||
|       <g | ||||
|          transform="translate(0.25,0.25)" | ||||
|          style="fill:#000000;fill-opacity:1" | ||||
|          id="g4365"> | ||||
|         <g | ||||
|            style="fill:#000000;fill-opacity:1" | ||||
|            id="g4367"> | ||||
|           <path | ||||
|              inkscape:connector-curvature="0" | ||||
|              id="path4369" | ||||
|              style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|              d="m 4.3289754,1039.3621 c 0.1846149,0 0.3419956,0.071 0.4716623,0.2121 C 4.933546,1039.7121 5,1039.8793 5,1040.0759 l 0,3.2862 -1,0 0,-2.964 c 0,-0.024 -0.011592,-0.036 -0.034038,-0.036 l -1.931924,0 C 2.011349,1040.3621 2,1040.3741 2,1040.3981 l 0,2.964 -1,0 0,-4 z" | ||||
|              sodipodi:nodetypes="scsccsssscccs" /> | ||||
|           <path | ||||
|              inkscape:connector-curvature="0" | ||||
|              id="path4371" | ||||
|              style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|              d="m 6.6710244,1039.3621 2.6579513,0 c 0.184775,0 0.3419957,0.071 0.471662,0.2121 C 9.933546,1039.7121 10,1039.8793 10,1040.0759 l 0,2.5724 c 0,0.1966 -0.066454,0.3655 -0.1993623,0.5069 -0.1296663,0.1379 -0.286887,0.2069 -0.471662,0.2069 l -2.6579513,0 c -0.184775,0 -0.3436164,-0.069 -0.4765247,-0.2069 C 6.0648334,1043.0138 6,1042.8449 6,1042.6483 l 0,-2.5724 c 0,-0.1966 0.064833,-0.3638 0.1944997,-0.5017 0.1329083,-0.1414 0.2917497,-0.2121 0.4765247,-0.2121 z m 2.2949386,1 -1.931926,0 C 7.011344,1040.3621 7,1040.3741 7,1040.3981 l 0,1.928 c 0,0.024 0.011347,0.036 0.034037,0.036 l 1.931926,0 c 0.02269,0 0.034037,-0.012 0.034037,-0.036 l 0,-1.928 c 0,-0.024 -0.011347,-0.036 -0.034037,-0.036 z" | ||||
|              sodipodi:nodetypes="sscsscsscsscssssssssss" /> | ||||
|         </g> | ||||
|         <g | ||||
|            style="fill:#000000;fill-opacity:1" | ||||
|            id="g4373"> | ||||
|           <path | ||||
|              inkscape:connector-curvature="0" | ||||
|              id="path4375" | ||||
|              style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|              d="m 3,1047.1121 1,-2.75 1,0 -1.5,4 -1,0 -1.5,-4 1,0 z" | ||||
|              sodipodi:nodetypes="cccccccc" /> | ||||
|           <path | ||||
|              inkscape:connector-curvature="0" | ||||
|              id="path4377" | ||||
|              style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|              d="m 9,1046.8621 0,-2.5 1,0 0,4 -1,0 -2,-2.5 0,2.5 -1,0 0,-4 1,0 z" | ||||
|              sodipodi:nodetypes="ccccccccccc" /> | ||||
|           <path | ||||
|              inkscape:connector-curvature="0" | ||||
|              id="path4379" | ||||
|              style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|              d="m 15,1045.3621 -2.96596,0 c -0.02269,0 -0.03404,0.012 -0.03404,0.036 l 0,1.928 c 0,0.024 0.01135,0.036 0.03404,0.036 l 2.96596,0 0,1 -3.324113,0 c -0.188017,0 -0.348479,-0.068 -0.481388,-0.2037 C 11.064833,1048.0192 11,1047.8511 11,1047.6542 l 0,-2.5842 c 0,-0.1969 0.06483,-0.3633 0.194499,-0.4991 0.132909,-0.1392 0.293371,-0.2088 0.481388,-0.2088 l 3.324113,0 z" | ||||
|              sodipodi:nodetypes="cssssccscsscscc" /> | ||||
|         </g> | ||||
|       </g> | ||||
|       <g | ||||
|          id="g4356"> | ||||
|         <g | ||||
|            id="g4347"> | ||||
|           <path | ||||
|              sodipodi:nodetypes="scsccsssscccs" | ||||
|              d="m 4.3289754,1039.3621 c 0.1846149,0 0.3419956,0.071 0.4716623,0.2121 C 4.933546,1039.7121 5,1039.8793 5,1040.0759 l 0,3.2862 -1,0 0,-2.964 c 0,-0.024 -0.011592,-0.036 -0.034038,-0.036 l -1.931924,0 c -0.022689,0 -0.034038,0.012 -0.034038,0.036 l 0,2.964 -1,0 0,-4 z" | ||||
|              style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|              id="path4143" | ||||
|              inkscape:connector-curvature="0" /> | ||||
|           <path | ||||
|              sodipodi:nodetypes="sscsscsscsscssssssssss" | ||||
|              d="m 6.6710244,1039.3621 2.6579513,0 c 0.184775,0 0.3419957,0.071 0.471662,0.2121 C 9.933546,1039.7121 10,1039.8793 10,1040.0759 l 0,2.5724 c 0,0.1966 -0.066454,0.3655 -0.1993623,0.5069 -0.1296663,0.1379 -0.286887,0.2069 -0.471662,0.2069 l -2.6579513,0 c -0.184775,0 -0.3436164,-0.069 -0.4765247,-0.2069 C 6.0648334,1043.0138 6,1042.8449 6,1042.6483 l 0,-2.5724 c 0,-0.1966 0.064833,-0.3638 0.1944997,-0.5017 0.1329083,-0.1414 0.2917497,-0.2121 0.4765247,-0.2121 z m 2.2949386,1 -1.931926,0 C 7.011344,1040.3621 7,1040.3741 7,1040.3981 l 0,1.928 c 0,0.024 0.011347,0.036 0.034037,0.036 l 1.931926,0 c 0.02269,0 0.034037,-0.012 0.034037,-0.036 l 0,-1.928 c 0,-0.024 -0.011347,-0.036 -0.034037,-0.036 z" | ||||
|              style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|              id="path4145" | ||||
|              inkscape:connector-curvature="0" /> | ||||
|         </g> | ||||
|         <g | ||||
|            id="g4351"> | ||||
|           <path | ||||
|              sodipodi:nodetypes="cccccccc" | ||||
|              d="m 3,1047.1121 1,-2.75 1,0 -1.5,4 -1,0 -1.5,-4 1,0 z" | ||||
|              style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|              id="path4147" | ||||
|              inkscape:connector-curvature="0" /> | ||||
|           <path | ||||
|              sodipodi:nodetypes="ccccccccccc" | ||||
|              d="m 9,1046.8621 0,-2.5 1,0 0,4 -1,0 -2,-2.5 0,2.5 -1,0 0,-4 1,0 z" | ||||
|              style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|              id="path4149" | ||||
|              inkscape:connector-curvature="0" /> | ||||
|           <path | ||||
|              sodipodi:nodetypes="cssssccscsscscc" | ||||
|              d="m 15,1045.3621 -2.96596,0 c -0.02269,0 -0.03404,0.012 -0.03404,0.036 l 0,1.928 c 0,0.024 0.01135,0.036 0.03404,0.036 l 2.96596,0 0,1 -3.324113,0 c -0.188017,0 -0.348479,-0.068 -0.481388,-0.2037 C 11.064833,1048.0192 11,1047.8511 11,1047.6542 l 0,-2.5842 c 0,-0.1969 0.06483,-0.3633 0.194499,-0.4991 0.132909,-0.1392 0.293371,-0.2088 0.481388,-0.2088 l 3.324113,0 z" | ||||
|              style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|              id="path4151" | ||||
|              inkscape:connector-curvature="0" /> | ||||
|         </g> | ||||
|       </g> | ||||
|     </g> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 11 KiB | 
							
								
								
									
										163
									
								
								static/js/novnc/app/images/icons/novnc-icon.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,163 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="48" | ||||
|    height="48" | ||||
|    viewBox="0 0 48 48.000001" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="novnc-icon.svg"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#ffffff" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0.0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="11.313708" | ||||
|      inkscape:cx="27.187245" | ||||
|      inkscape:cy="17.700974" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:snap-midpoints="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4169" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title /> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1004.3621)"> | ||||
|     <rect | ||||
|        style="opacity:1;fill:#494949;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        id="rect4167" | ||||
|        width="48" | ||||
|        height="48" | ||||
|        x="0" | ||||
|        y="1004.3621" | ||||
|        ry="7.9999785" /> | ||||
|     <path | ||||
|        style="opacity:1;fill:#313131;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        d="m 8,1004.3621 c -4.4319881,0 -8,3.568 -8,8 l 0,32 c 0,4.432 3.5680119,8 8,8 l 12,0 c 15.512,0 28,-16.948 28,-38 l 0,-2 c 0,-4.432 -3.568012,-8 -8,-8 l -32,0 z" | ||||
|        id="rect4173" | ||||
|        inkscape:connector-curvature="0" /> | ||||
|     <g | ||||
|        id="g4300" | ||||
|        style="fill:#000000;fill-opacity:1;stroke:none" | ||||
|        transform="translate(0.5,0.5)"> | ||||
|       <g | ||||
|          id="g4302" | ||||
|          style="fill:#000000;fill-opacity:1;stroke:none"> | ||||
|         <path | ||||
|            sodipodi:nodetypes="scsccsssscccs" | ||||
|            d="m 11.986926,1016.3621 c 0.554325,0 1.025987,0.2121 1.414987,0.6362 0.398725,0.4138 0.600909,0.9155 0.598087,1.5052 l 0,6.8586 -2,0 0,-6.8914 c 0,-0.072 -0.03404,-0.1086 -0.102113,-0.1086 l -4.7957745,0 C 7.0340375,1018.3621 7,1018.3983 7,1018.4707 l 0,6.8914 -2,0 0,-9 z" | ||||
|            style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|            id="path4304" | ||||
|            inkscape:connector-curvature="0" /> | ||||
|         <path | ||||
|            sodipodi:nodetypes="sscsscsscsscssssssssss" | ||||
|            d="m 17.013073,1016.3621 4.973854,0 c 0.554325,0 1.025987,0.2121 1.414986,0.6362 0.398725,0.4138 0.598087,0.9155 0.598087,1.5052 l 0,4.7172 c 0,0.5897 -0.199362,1.0966 -0.598087,1.5207 -0.388999,0.4138 -0.860661,0.6207 -1.414986,0.6207 l -4.973854,0 c -0.554325,0 -1.030849,-0.2069 -1.429574,-0.6207 C 15.1945,1024.3173 15,1023.8104 15,1023.2207 l 0,-4.7172 c 0,-0.5897 0.1945,-1.0914 0.583499,-1.5052 0.398725,-0.4241 0.875249,-0.6362 1.429574,-0.6362 z m 4.884815,2 -4.795776,0 c -0.06808,0 -0.102112,0.036 -0.102112,0.1086 l 0,4.7828 c 0,0.072 0.03404,0.1086 0.102112,0.1086 l 4.795776,0 c 0.06807,0 0.102112,-0.036 0.102112,-0.1086 l 0,-4.7828 c 0,-0.072 -0.03404,-0.1086 -0.102112,-0.1086 z" | ||||
|            style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|            id="path4306" | ||||
|            inkscape:connector-curvature="0" /> | ||||
|       </g> | ||||
|       <g | ||||
|          id="g4308" | ||||
|          style="fill:#000000;fill-opacity:1;stroke:none"> | ||||
|         <path | ||||
|            sodipodi:nodetypes="cccccccc" | ||||
|            d="m 12,1036.9177 4.768114,-8.5556 2.231886,0 -6,11 -2,0 -6,-11 2.2318854,0 z" | ||||
|            style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|            id="path4310" | ||||
|            inkscape:connector-curvature="0" /> | ||||
|         <path | ||||
|            sodipodi:nodetypes="ccccccccccc" | ||||
|            d="m 29,1036.3621 0,-8 2,0 0,11 -2,0 -7,-8 0,8 -2,0 0,-11 2,0 z" | ||||
|            style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|            id="path4312" | ||||
|            inkscape:connector-curvature="0" /> | ||||
|         <path | ||||
|            sodipodi:nodetypes="cssssccscsscscc" | ||||
|            d="m 43,1030.3621 -8.897887,0 c -0.06808,0 -0.102113,0.036 -0.102113,0.1069 l 0,6.7862 c 0,0.071 0.03404,0.1069 0.102113,0.1069 l 8.897887,0 0,2 -8.972339,0 c -0.56405,0 -1.045437,-0.2037 -1.444162,-0.6111 C 32.1945,1038.3334 32,1037.8292 32,1037.2385 l 0,-6.7528 c 0,-0.5907 0.1945,-1.0898 0.583499,-1.4972 0.398725,-0.4176 0.880112,-0.6264 1.444162,-0.6264 l 8.972339,0 z" | ||||
|            style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|            id="path4314" | ||||
|            inkscape:connector-curvature="0" /> | ||||
|       </g> | ||||
|     </g> | ||||
|     <g | ||||
|        id="g4291" | ||||
|        style="stroke:none"> | ||||
|       <g | ||||
|          id="g4282" | ||||
|          style="stroke:none"> | ||||
|         <path | ||||
|            inkscape:connector-curvature="0" | ||||
|            id="path4143" | ||||
|            style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|            d="m 11.986926,1016.3621 c 0.554325,0 1.025987,0.2121 1.414987,0.6362 0.398725,0.4138 0.600909,0.9155 0.598087,1.5052 l 0,6.8586 -2,0 0,-6.8914 c 0,-0.072 -0.03404,-0.1086 -0.102113,-0.1086 l -4.7957745,0 C 7.0340375,1018.3621 7,1018.3983 7,1018.4707 l 0,6.8914 -2,0 0,-9 z" | ||||
|            sodipodi:nodetypes="scsccsssscccs" /> | ||||
|         <path | ||||
|            inkscape:connector-curvature="0" | ||||
|            id="path4145" | ||||
|            style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|            d="m 17.013073,1016.3621 4.973854,0 c 0.554325,0 1.025987,0.2121 1.414986,0.6362 0.398725,0.4138 0.598087,0.9155 0.598087,1.5052 l 0,4.7172 c 0,0.5897 -0.199362,1.0966 -0.598087,1.5207 -0.388999,0.4138 -0.860661,0.6207 -1.414986,0.6207 l -4.973854,0 c -0.554325,0 -1.030849,-0.2069 -1.429574,-0.6207 C 15.1945,1024.3173 15,1023.8104 15,1023.2207 l 0,-4.7172 c 0,-0.5897 0.1945,-1.0914 0.583499,-1.5052 0.398725,-0.4241 0.875249,-0.6362 1.429574,-0.6362 z m 4.884815,2 -4.795776,0 c -0.06808,0 -0.102112,0.036 -0.102112,0.1086 l 0,4.7828 c 0,0.072 0.03404,0.1086 0.102112,0.1086 l 4.795776,0 c 0.06807,0 0.102112,-0.036 0.102112,-0.1086 l 0,-4.7828 c 0,-0.072 -0.03404,-0.1086 -0.102112,-0.1086 z" | ||||
|            sodipodi:nodetypes="sscsscsscsscssssssssss" /> | ||||
|       </g> | ||||
|       <g | ||||
|          id="g4286" | ||||
|          style="stroke:none"> | ||||
|         <path | ||||
|            inkscape:connector-curvature="0" | ||||
|            id="path4147" | ||||
|            style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|            d="m 12,1036.9177 4.768114,-8.5556 2.231886,0 -6,11 -2,0 -6,-11 2.2318854,0 z" | ||||
|            sodipodi:nodetypes="cccccccc" /> | ||||
|         <path | ||||
|            inkscape:connector-curvature="0" | ||||
|            id="path4149" | ||||
|            style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|            d="m 29,1036.3621 0,-8 2,0 0,11 -2,0 -7,-8 0,8 -2,0 0,-11 2,0 z" | ||||
|            sodipodi:nodetypes="ccccccccccc" /> | ||||
|         <path | ||||
|            inkscape:connector-curvature="0" | ||||
|            id="path4151" | ||||
|            style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|            d="m 43,1030.3621 -8.897887,0 c -0.06808,0 -0.102113,0.036 -0.102113,0.1069 l 0,6.7862 c 0,0.071 0.03404,0.1069 0.102113,0.1069 l 8.897887,0 0,2 -8.972339,0 c -0.56405,0 -1.045437,-0.2037 -1.444162,-0.6111 C 32.1945,1038.3334 32,1037.8292 32,1037.2385 l 0,-6.7528 c 0,-0.5907 0.1945,-1.0898 0.583499,-1.4972 0.398725,-0.4176 0.880112,-0.6264 1.444162,-0.6264 l 8.972339,0 z" | ||||
|            sodipodi:nodetypes="cssssccscsscscc" /> | ||||
|       </g> | ||||
|     </g> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 11 KiB | 
							
								
								
									
										81
									
								
								static/js/novnc/app/images/info.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,81 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="info.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="1" | ||||
|      inkscape:cx="15.720838" | ||||
|      inkscape:cy="8.9111233" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="false" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title /> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <path | ||||
|        style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        d="M 12.5 3 A 9.5 9.4999914 0 0 0 3 12.5 A 9.5 9.4999914 0 0 0 12.5 22 A 9.5 9.4999914 0 0 0 22 12.5 A 9.5 9.4999914 0 0 0 12.5 3 z M 12.5 5 A 1.5 1.5000087 0 0 1 14 6.5 A 1.5 1.5000087 0 0 1 12.5 8 A 1.5 1.5000087 0 0 1 11 6.5 A 1.5 1.5000087 0 0 1 12.5 5 z M 10.521484 8.9785156 L 12.521484 8.9785156 A 1.50015 1.50015 0 0 1 14.021484 10.478516 L 14.021484 15.972656 A 1.50015 1.50015 0 0 1 14.498047 18.894531 C 14.498047 18.894531 13.74301 19.228309 12.789062 18.912109 C 12.312092 18.754109 11.776235 18.366625 11.458984 17.828125 C 11.141734 17.289525 11.021484 16.668469 11.021484 15.980469 L 11.021484 11.980469 L 10.521484 11.980469 A 1.50015 1.50015 0 1 1 10.521484 8.9804688 L 10.521484 8.9785156 z " | ||||
|        transform="translate(0,1027.3622)" | ||||
|        id="path4136" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										88
									
								
								static/js/novnc/app/images/keyboard.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,88 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="keyboard.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/keyboard.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#717171" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="1" | ||||
|      inkscape:cx="31.285341" | ||||
|      inkscape:cy="8.8028469" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:snap-bbox-midpoints="false" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:object-paths="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-midpoints="true" | ||||
|      inkscape:snap-smooth-nodes="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title /> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="M 7,3 C 4.8012876,3 3,4.8013 3,7 3,11.166667 3,15.333333 3,19.5 3,20.8764 4.1236413,22 5.5,22 l 14,0 C 20.876358,22 22,20.8764 22,19.5 22,15.333333 22,11.166667 22,7 22,4.8013 20.198712,3 18,3 Z m 0,2 11,0 c 1.125307,0 2,0.8747 2,2 L 20,12 5,12 5,7 C 5,5.8747 5.8746931,5 7,5 Z M 6.5,14 C 6.777,14 7,14.223 7,14.5 7,14.777 6.777,15 6.5,15 6.223,15 6,14.777 6,14.5 6,14.223 6.223,14 6.5,14 Z m 2,0 C 8.777,14 9,14.223 9,14.5 9,14.777 8.777,15 8.5,15 8.223,15 8,14.777 8,14.5 8,14.223 8.223,14 8.5,14 Z m 2,0 C 10.777,14 11,14.223 11,14.5 11,14.777 10.777,15 10.5,15 10.223,15 10,14.777 10,14.5 10,14.223 10.223,14 10.5,14 Z m 2,0 C 12.777,14 13,14.223 13,14.5 13,14.777 12.777,15 12.5,15 12.223,15 12,14.777 12,14.5 12,14.223 12.223,14 12.5,14 Z m 2,0 C 14.777,14 15,14.223 15,14.5 15,14.777 14.777,15 14.5,15 14.223,15 14,14.777 14,14.5 14,14.223 14.223,14 14.5,14 Z m 2,0 C 16.777,14 17,14.223 17,14.5 17,14.777 16.777,15 16.5,15 16.223,15 16,14.777 16,14.5 16,14.223 16.223,14 16.5,14 Z m 2,0 C 18.777,14 19,14.223 19,14.5 19,14.777 18.777,15 18.5,15 18.223,15 18,14.777 18,14.5 18,14.223 18.223,14 18.5,14 Z m -13,2 C 5.777,16 6,16.223 6,16.5 6,16.777 5.777,17 5.5,17 5.223,17 5,16.777 5,16.5 5,16.223 5.223,16 5.5,16 Z m 2,0 C 7.777,16 8,16.223 8,16.5 8,16.777 7.777,17 7.5,17 7.223,17 7,16.777 7,16.5 7,16.223 7.223,16 7.5,16 Z m 2,0 C 9.777,16 10,16.223 10,16.5 10,16.777 9.777,17 9.5,17 9.223,17 9,16.777 9,16.5 9,16.223 9.223,16 9.5,16 Z m 2,0 C 11.777,16 12,16.223 12,16.5 12,16.777 11.777,17 11.5,17 11.223,17 11,16.777 11,16.5 11,16.223 11.223,16 11.5,16 Z m 2,0 C 13.777,16 14,16.223 14,16.5 14,16.777 13.777,17 13.5,17 13.223,17 13,16.777 13,16.5 13,16.223 13.223,16 13.5,16 Z m 2,0 C 15.777,16 16,16.223 16,16.5 16,16.777 15.777,17 15.5,17 15.223,17 15,16.777 15,16.5 15,16.223 15.223,16 15.5,16 Z m 2,0 C 17.777,16 18,16.223 18,16.5 18,16.777 17.777,17 17.5,17 17.223,17 17,16.777 17,16.5 17,16.223 17.223,16 17.5,16 Z m 2,0 C 19.777,16 20,16.223 20,16.5 20,16.777 19.777,17 19.5,17 19.223,17 19,16.777 19,16.5 19,16.223 19.223,16 19.5,16 Z M 6,18 c 0.554,0 1,0.446 1,1 0,0.554 -0.446,1 -1,1 -0.554,0 -1,-0.446 -1,-1 0,-0.554 0.446,-1 1,-1 z m 2.8261719,0 7.3476561,0 C 16.631643,18 17,18.368372 17,18.826172 l 0,0.347656 C 17,19.631628 16.631643,20 16.173828,20 L 8.8261719,20 C 8.3683573,20 8,19.631628 8,19.173828 L 8,18.826172 C 8,18.368372 8.3683573,18 8.8261719,18 Z m 10.1113281,0 0.125,0 C 19.581551,18 20,18.4184 20,18.9375 l 0,0.125 C 20,19.5816 19.581551,20 19.0625,20 l -0.125,0 C 18.418449,20 18,19.5816 18,19.0625 l 0,-0.125 C 18,18.4184 18.418449,18 18.9375,18 Z" | ||||
|        transform="translate(0,1027.3622)" | ||||
|        id="rect4160" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="sccssccsssssccssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss" /> | ||||
|     <path | ||||
|        style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" | ||||
|        d="m 12.499929,1033.8622 -2,2 1.500071,0 0,2 1,0 0,-2 1.499929,0 z" | ||||
|        id="path4150" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cccccccc" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 6.3 KiB | 
							
								
								
									
										92
									
								
								static/js/novnc/app/images/mouse_left.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,92 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="mouse_left.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="11.313708" | ||||
|      inkscape:cx="15.551515" | ||||
|      inkscape:cy="12.205592" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#0068f6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 8,1030.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,2 5,0 0,-2 c 0,-1.4738 1.090393,-2.7071 2.5,-2.9492 l 0,-1.0508 -3.5,0 z" | ||||
|        id="path6219" /> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 13.5,1030.3622 0,1.0508 c 1.409607,0.2421 2.5,1.4754 2.5,2.9492 l 0,2 5,0 0,-2 c 0,-2.1987 -1.801288,-4 -4,-4 l -3.5,0 z" | ||||
|        id="path6217" /> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 12,1033.3622 c -0.571311,0 -1,0.4287 -1,1 l 0,5 c 0,0.5713 0.428689,1 1,1 l 1,0 c 0.571311,0 1,-0.4287 1,-1 l 0,-5 c 0,-0.5713 -0.428689,-1 -1,-1 l -1,0 z" | ||||
|        id="path6215" /> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 4,1038.3622 0,3.5 c 0,4.1377 3.362302,7.5 7.5,7.5 l 2,0 c 4.137698,0 7.5,-3.3623 7.5,-7.5 l 0,-3.5 -5,0 0,1 c 0,1.6447 -1.355293,3 -3,3 l -1,0 c -1.644707,0 -3,-1.3553 -3,-3 l 0,-1 -5,0 z" | ||||
|        id="rect6178" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 6.8 KiB | 
							
								
								
									
										92
									
								
								static/js/novnc/app/images/mouse_middle.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,92 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="mouse_middle.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="11.313708" | ||||
|      inkscape:cx="15.551515" | ||||
|      inkscape:cy="12.205592" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 8,1030.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,2 5,0 0,-2 c 0,-1.4738 1.090393,-2.7071 2.5,-2.9492 l 0,-1.0508 -3.5,0 z" | ||||
|        id="path6219" /> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 13.5,1030.3622 0,1.0508 c 1.409607,0.2421 2.5,1.4754 2.5,2.9492 l 0,2 5,0 0,-2 c 0,-2.1987 -1.801288,-4 -4,-4 l -3.5,0 z" | ||||
|        id="path6217" /> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#0068f6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 12,1033.3622 c -0.571311,0 -1,0.4287 -1,1 l 0,5 c 0,0.5713 0.428689,1 1,1 l 1,0 c 0.571311,0 1,-0.4287 1,-1 l 0,-5 c 0,-0.5713 -0.428689,-1 -1,-1 l -1,0 z" | ||||
|        id="path6215" /> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 4,1038.3622 0,3.5 c 0,4.1377 3.362302,7.5 7.5,7.5 l 2,0 c 4.137698,0 7.5,-3.3623 7.5,-7.5 l 0,-3.5 -5,0 0,1 c 0,1.6447 -1.355293,3 -3,3 l -1,0 c -1.644707,0 -3,-1.3553 -3,-3 l 0,-1 -5,0 z" | ||||
|        id="rect6178" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 6.8 KiB | 
							
								
								
									
										92
									
								
								static/js/novnc/app/images/mouse_none.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,92 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="mouse_none.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="16" | ||||
|      inkscape:cx="23.160825" | ||||
|      inkscape:cy="13.208262" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 8,1030.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,2 5,0 0,-2 c 0,-1.4738 1.090393,-2.7071 2.5,-2.9492 l 0,-1.0508 -3.5,0 z" | ||||
|        id="path6219" /> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 13.5,1030.3622 0,1.0508 c 1.409607,0.2421 2.5,1.4754 2.5,2.9492 l 0,2 5,0 0,-2 c 0,-2.1987 -1.801288,-4 -4,-4 l -3.5,0 z" | ||||
|        id="path6217" /> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 12,1033.3622 c -0.571311,0 -1,0.4287 -1,1 l 0,5 c 0,0.5713 0.428689,1 1,1 l 1,0 c 0.571311,0 1,-0.4287 1,-1 l 0,-5 c 0,-0.5713 -0.428689,-1 -1,-1 l -1,0 z" | ||||
|        id="path6215" /> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 4,1038.3622 0,3.5 c 0,4.1377 3.362302,7.5 7.5,7.5 l 2,0 c 4.137698,0 7.5,-3.3623 7.5,-7.5 l 0,-3.5 -5,0 0,1 c 0,1.6447 -1.355293,3 -3,3 l -1,0 c -1.644707,0 -3,-1.3553 -3,-3 l 0,-1 -5,0 z" | ||||
|        id="rect6178" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 6.8 KiB | 
							
								
								
									
										92
									
								
								static/js/novnc/app/images/mouse_right.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,92 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="mouse_right.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="11.313708" | ||||
|      inkscape:cx="15.551515" | ||||
|      inkscape:cy="12.205592" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 8,1030.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,2 5,0 0,-2 c 0,-1.4738 1.090393,-2.7071 2.5,-2.9492 l 0,-1.0508 -3.5,0 z" | ||||
|        id="path6219" /> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#0068f6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 13.5,1030.3622 0,1.0508 c 1.409607,0.2421 2.5,1.4754 2.5,2.9492 l 0,2 5,0 0,-2 c 0,-2.1987 -1.801288,-4 -4,-4 l -3.5,0 z" | ||||
|        id="path6217" /> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 12,1033.3622 c -0.571311,0 -1,0.4287 -1,1 l 0,5 c 0,0.5713 0.428689,1 1,1 l 1,0 c 0.571311,0 1,-0.4287 1,-1 l 0,-5 c 0,-0.5713 -0.428689,-1 -1,-1 l -1,0 z" | ||||
|        id="path6215" /> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 4,1038.3622 0,3.5 c 0,4.1377 3.362302,7.5 7.5,7.5 l 2,0 c 4.137698,0 7.5,-3.3623 7.5,-7.5 l 0,-3.5 -5,0 0,1 c 0,1.6447 -1.355293,3 -3,3 l -1,0 c -1.644707,0 -3,-1.3553 -3,-3 l 0,-1 -5,0 z" | ||||
|        id="rect6178" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 6.8 KiB | 
							
								
								
									
										87
									
								
								static/js/novnc/app/images/power.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,87 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="power.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="1" | ||||
|      inkscape:cx="9.3159849" | ||||
|      inkscape:cy="13.436208" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="M 9 6.8183594 C 6.3418164 8.1213032 4.5 10.849161 4.5 14 C 4.5 18.4065 8.0935666 22 12.5 22 C 16.906433 22 20.5 18.4065 20.5 14 C 20.5 10.849161 18.658184 8.1213032 16 6.8183594 L 16 9.125 C 17.514327 10.211757 18.5 11.984508 18.5 14 C 18.5 17.3256 15.825553 20 12.5 20 C 9.1744469 20 6.5 17.3256 6.5 14 C 6.5 11.984508 7.4856727 10.211757 9 9.125 L 9 6.8183594 z " | ||||
|        transform="translate(0,1027.3622)" | ||||
|        id="path6140" /> | ||||
|     <path | ||||
|        style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | ||||
|        d="m 12.5,1031.8836 0,6.4786" | ||||
|        id="path6142" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="cc" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 3.9 KiB | 
							
								
								
									
										76
									
								
								static/js/novnc/app/images/settings.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,76 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="settings.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="22.627417" | ||||
|      inkscape:cx="14.69683" | ||||
|      inkscape:cy="8.8039511" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="true" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="false" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <path | ||||
|        style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        d="M 11 3 L 11 5.1601562 A 7.5 7.5 0 0 0 8.3671875 6.2460938 L 6.84375 4.7226562 L 4.7226562 6.84375 L 6.2480469 8.3691406 A 7.5 7.5 0 0 0 5.1523438 11 L 3 11 L 3 14 L 5.1601562 14 A 7.5 7.5 0 0 0 6.2460938 16.632812 L 4.7226562 18.15625 L 6.84375 20.277344 L 8.3691406 18.751953 A 7.5 7.5 0 0 0 11 19.847656 L 11 22 L 14 22 L 14 19.839844 A 7.5 7.5 0 0 0 16.632812 18.753906 L 18.15625 20.277344 L 20.277344 18.15625 L 18.751953 16.630859 A 7.5 7.5 0 0 0 19.847656 14 L 22 14 L 22 11 L 19.839844 11 A 7.5 7.5 0 0 0 18.753906 8.3671875 L 20.277344 6.84375 L 18.15625 4.7226562 L 16.630859 6.2480469 A 7.5 7.5 0 0 0 14 5.1523438 L 14 3 L 11 3 z M 12.5 10 A 2.5 2.5 0 0 1 15 12.5 A 2.5 2.5 0 0 1 12.5 15 A 2.5 2.5 0 0 1 10 12.5 A 2.5 2.5 0 0 1 12.5 10 z " | ||||
|        transform="translate(0,1027.3622)" | ||||
|        id="rect4967" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 3 KiB | 
							
								
								
									
										86
									
								
								static/js/novnc/app/images/tab.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,86 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="tab.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="16" | ||||
|      inkscape:cx="11.67335" | ||||
|      inkscape:cy="17.881696" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="true" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <path | ||||
|        style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        d="m 3,1031.3622 0,8 2,0 0,-4 0,-4 -2,0 z m 2,4 4,4 0,-3 13,0 0,-2 -13,0 0,-3 -4,4 z" | ||||
|        id="rect5194" | ||||
|        inkscape:connector-curvature="0" /> | ||||
|     <path | ||||
|        id="path5211" | ||||
|        d="m 22,1048.3622 0,-8 -2,0 0,4 0,4 2,0 z m -2,-4 -4,-4 0,3 -13,0 0,2 13,0 0,3 4,-4 z" | ||||
|        style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||||
|        inkscape:connector-curvature="0" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.9 KiB | 
							
								
								
									
										90
									
								
								static/js/novnc/app/images/toggleextrakeys.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,90 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="extrakeys.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="1" | ||||
|      inkscape:cx="15.234555" | ||||
|      inkscape:cy="9.9710826" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="false" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="false"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="m 8,1031.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,8.9996 c 0,2.1987 1.8012876,4 4,4 l 9,0 c 2.198712,0 4,-1.8013 4,-4 l 0,-8.9996 c 0,-2.1987 -1.801288,-4 -4,-4 z m 0,2 9,0 c 1.125307,0 2,0.8747 2,2 l 0,7.0005 c 0,1.1253 -0.874693,2 -2,2 l -9,0 c -1.1253069,0 -2,-0.8747 -2,-2 l 0,-7.0005 c 0,-1.1253 0.8746931,-2 2,-2 z" | ||||
|        id="rect5006" | ||||
|        inkscape:connector-curvature="0" | ||||
|        sodipodi:nodetypes="ssssssssssssssssss" /> | ||||
|     <g | ||||
|        style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" | ||||
|        id="text4167" | ||||
|        transform="matrix(0.96021948,0,0,0.96021948,0.18921715,41.80659)"> | ||||
|       <path | ||||
|          d="m 14.292969,1040.6791 -2.939453,0 -0.463868,1.3281 -1.889648,0 2.700195,-7.29 2.241211,0 2.700196,7.29 -1.889649,0 -0.458984,-1.3281 z m -2.470703,-1.3526 1.99707,0 -0.996094,-2.9004 -1.000976,2.9004 z" | ||||
|          id="path4172" | ||||
|          inkscape:connector-curvature="0" /> | ||||
|     </g> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 4.3 KiB | 
							
								
								
									
										81
									
								
								static/js/novnc/app/images/warning.svg
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,81 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <!-- Created with Inkscape (http://www.inkscape.org/) --> | ||||
| 
 | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    width="25" | ||||
|    height="25" | ||||
|    viewBox="0 0 25 25" | ||||
|    id="svg2" | ||||
|    version="1.1" | ||||
|    inkscape:version="0.91 r13725" | ||||
|    sodipodi:docname="warning.svg" | ||||
|    inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png" | ||||
|    inkscape:export-xdpi="90" | ||||
|    inkscape:export-ydpi="90"> | ||||
|   <defs | ||||
|      id="defs4" /> | ||||
|   <sodipodi:namedview | ||||
|      id="base" | ||||
|      pagecolor="#959595" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1.0" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:zoom="1" | ||||
|      inkscape:cx="16.457343" | ||||
|      inkscape:cy="12.179552" | ||||
|      inkscape:document-units="px" | ||||
|      inkscape:current-layer="layer1" | ||||
|      showgrid="false" | ||||
|      units="px" | ||||
|      inkscape:snap-bbox="true" | ||||
|      inkscape:bbox-paths="true" | ||||
|      inkscape:bbox-nodes="true" | ||||
|      inkscape:snap-bbox-edge-midpoints="true" | ||||
|      inkscape:object-paths="true" | ||||
|      showguides="false" | ||||
|      inkscape:window-width="1920" | ||||
|      inkscape:window-height="1136" | ||||
|      inkscape:window-x="1920" | ||||
|      inkscape:window-y="27" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:snap-smooth-nodes="true" | ||||
|      inkscape:object-nodes="true" | ||||
|      inkscape:snap-intersection-paths="true" | ||||
|      inkscape:snap-nodes="true" | ||||
|      inkscape:snap-global="true"> | ||||
|     <inkscape:grid | ||||
|        type="xygrid" | ||||
|        id="grid4136" /> | ||||
|   </sodipodi:namedview> | ||||
|   <metadata | ||||
|      id="metadata7"> | ||||
|     <rdf:RDF> | ||||
|       <cc:Work | ||||
|          rdf:about=""> | ||||
|         <dc:format>image/svg+xml</dc:format> | ||||
|         <dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||
|         <dc:title></dc:title> | ||||
|       </cc:Work> | ||||
|     </rdf:RDF> | ||||
|   </metadata> | ||||
|   <g | ||||
|      inkscape:label="Layer 1" | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      transform="translate(0,-1027.3622)"> | ||||
|     <path | ||||
|        style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" | ||||
|        d="M 12.513672 3.0019531 C 11.751609 2.9919531 11.052563 3.4242687 10.710938 4.1054688 L 3.2109375 19.105469 C 2.5461937 20.435369 3.5132277 21.9999 5 22 L 20 22 C 21.486772 21.9999 22.453806 20.435369 21.789062 19.105469 L 14.289062 4.1054688 C 13.951849 3.4330688 13.265888 3.0066531 12.513672 3.0019531 z M 12.478516 6.9804688 A 1.50015 1.50015 0 0 1 14 8.5 L 14 14.5 A 1.50015 1.50015 0 1 1 11 14.5 L 11 8.5 A 1.50015 1.50015 0 0 1 12.478516 6.9804688 z M 12.5 17 A 1.5 1.5 0 0 1 14 18.5 A 1.5 1.5 0 0 1 12.5 20 A 1.5 1.5 0 0 1 11 18.5 A 1.5 1.5 0 0 1 12.5 17 z " | ||||
|        transform="translate(0,1027.3622)" | ||||
|        id="path4208" /> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 3.8 KiB | 
							
								
								
									
										69
									
								
								static/js/novnc/app/locale/de.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,69 @@ | |||
| { | ||||
|     "Connecting...": "Verbinden...", | ||||
|     "Disconnecting...": "Verbindung trennen...", | ||||
|     "Reconnecting...": "Verbindung wiederherstellen...", | ||||
|     "Internal error": "Interner Fehler", | ||||
|     "Must set host": "Richten Sie den Server ein", | ||||
|     "Connected (encrypted) to ": "Verbunden mit (verschlüsselt) ", | ||||
|     "Connected (unencrypted) to ": "Verbunden mit (unverschlüsselt) ", | ||||
|     "Something went wrong, connection is closed": "Etwas lief schief, Verbindung wurde getrennt", | ||||
|     "Disconnected": "Verbindung zum Server getrennt", | ||||
|     "New connection has been rejected with reason: ": "Verbindung wurde aus folgendem Grund abgelehnt: ", | ||||
|     "New connection has been rejected": "Verbindung wurde abgelehnt", | ||||
|     "Password is required": "Passwort ist erforderlich", | ||||
|     "noVNC encountered an error:": "Ein Fehler ist aufgetreten:", | ||||
|     "Hide/Show the control bar": "Kontrollleiste verstecken/anzeigen", | ||||
|     "Move/Drag Viewport": "Ansichtsfenster verschieben/ziehen", | ||||
|     "viewport drag": "Ansichtsfenster ziehen", | ||||
|     "Active Mouse Button": "Aktive Maustaste", | ||||
|     "No mousebutton": "Keine Maustaste", | ||||
|     "Left mousebutton": "Linke Maustaste", | ||||
|     "Middle mousebutton": "Mittlere Maustaste", | ||||
|     "Right mousebutton": "Rechte Maustaste", | ||||
|     "Keyboard": "Tastatur", | ||||
|     "Show Keyboard": "Tastatur anzeigen", | ||||
|     "Extra keys": "Zusatztasten", | ||||
|     "Show Extra Keys": "Zusatztasten anzeigen", | ||||
|     "Ctrl": "Strg", | ||||
|     "Toggle Ctrl": "Strg umschalten", | ||||
|     "Alt": "Alt", | ||||
|     "Toggle Alt": "Alt umschalten", | ||||
|     "Send Tab": "Tab senden", | ||||
|     "Tab": "Tab", | ||||
|     "Esc": "Esc", | ||||
|     "Send Escape": "Escape senden", | ||||
|     "Ctrl+Alt+Del": "Strg+Alt+Entf", | ||||
|     "Send Ctrl-Alt-Del": "Strg+Alt+Entf senden", | ||||
|     "Shutdown/Reboot": "Herunterfahren/Neustarten", | ||||
|     "Shutdown/Reboot...": "Herunterfahren/Neustarten...", | ||||
|     "Power": "Energie", | ||||
|     "Shutdown": "Herunterfahren", | ||||
|     "Reboot": "Neustarten", | ||||
|     "Reset": "Zurücksetzen", | ||||
|     "Clipboard": "Zwischenablage", | ||||
|     "Clear": "Löschen", | ||||
|     "Fullscreen": "Vollbild", | ||||
|     "Settings": "Einstellungen", | ||||
|     "Shared Mode": "Geteilter Modus", | ||||
|     "View Only": "Nur betrachten", | ||||
|     "Clip to Window": "Auf Fenster begrenzen", | ||||
|     "Scaling Mode:": "Skalierungsmodus:", | ||||
|     "None": "Keiner", | ||||
|     "Local Scaling": "Lokales skalieren", | ||||
|     "Remote Resizing": "Serverseitiges skalieren", | ||||
|     "Advanced": "Erweitert", | ||||
|     "Repeater ID:": "Repeater ID:", | ||||
|     "WebSocket": "WebSocket", | ||||
|     "Encrypt": "Verschlüsselt", | ||||
|     "Host:": "Server:", | ||||
|     "Port:": "Port:", | ||||
|     "Path:": "Pfad:", | ||||
|     "Automatic Reconnect": "Automatisch wiederverbinden", | ||||
|     "Reconnect Delay (ms):": "Wiederverbindungsverzögerung (ms):", | ||||
|     "Logging:": "Protokollierung:", | ||||
|     "Disconnect": "Verbindung trennen", | ||||
|     "Connect": "Verbinden", | ||||
|     "Password:": "Passwort:", | ||||
|     "Cancel": "Abbrechen", | ||||
|     "Canvas not supported.": "Canvas nicht unterstützt." | ||||
| } | ||||
							
								
								
									
										69
									
								
								static/js/novnc/app/locale/el.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,69 @@ | |||
| { | ||||
|     "Connecting...": "Συνδέεται...", | ||||
|     "Disconnecting...": "Aποσυνδέεται...", | ||||
|     "Reconnecting...": "Επανασυνδέεται...", | ||||
|     "Internal error": "Εσωτερικό σφάλμα", | ||||
|     "Must set host": "Πρέπει να οριστεί ο διακομιστής", | ||||
|     "Connected (encrypted) to ": "Συνδέθηκε (κρυπτογραφημένα) με το ", | ||||
|     "Connected (unencrypted) to ": "Συνδέθηκε (μη κρυπτογραφημένα) με το ", | ||||
|     "Something went wrong, connection is closed": "Κάτι πήγε στραβά, η σύνδεση διακόπηκε", | ||||
|     "Disconnected": "Αποσυνδέθηκε", | ||||
|     "New connection has been rejected with reason: ": "Η νέα σύνδεση απορρίφθηκε διότι: ", | ||||
|     "New connection has been rejected": "Η νέα σύνδεση απορρίφθηκε ", | ||||
|     "Password is required": "Απαιτείται ο κωδικός πρόσβασης", | ||||
|     "noVNC encountered an error:": "το noVNC αντιμετώπισε ένα σφάλμα:", | ||||
|     "Hide/Show the control bar": "Απόκρυψη/Εμφάνιση γραμμής ελέγχου", | ||||
|     "Move/Drag Viewport": "Μετακίνηση/Σύρσιμο Θεατού πεδίου", | ||||
|     "viewport drag": "σύρσιμο θεατού πεδίου", | ||||
|     "Active Mouse Button": "Ενεργό Πλήκτρο Ποντικιού", | ||||
|     "No mousebutton": "Χωρίς Πλήκτρο Ποντικιού", | ||||
|     "Left mousebutton": "Αριστερό Πλήκτρο Ποντικιού", | ||||
|     "Middle mousebutton": "Μεσαίο Πλήκτρο Ποντικιού", | ||||
|     "Right mousebutton": "Δεξί Πλήκτρο Ποντικιού", | ||||
|     "Keyboard": "Πληκτρολόγιο", | ||||
|     "Show Keyboard": "Εμφάνιση Πληκτρολογίου", | ||||
|     "Extra keys": "Επιπλέον πλήκτρα", | ||||
|     "Show Extra Keys": "Εμφάνιση Επιπλέον Πλήκτρων", | ||||
|     "Ctrl": "Ctrl", | ||||
|     "Toggle Ctrl": "Εναλλαγή Ctrl", | ||||
|     "Alt": "Alt", | ||||
|     "Toggle Alt": "Εναλλαγή Alt", | ||||
|     "Send Tab": "Αποστολή Tab", | ||||
|     "Tab": "Tab", | ||||
|     "Esc": "Esc", | ||||
|     "Send Escape": "Αποστολή Escape", | ||||
|     "Ctrl+Alt+Del": "Ctrl+Alt+Del", | ||||
|     "Send Ctrl-Alt-Del": "Αποστολή Ctrl-Alt-Del", | ||||
|     "Shutdown/Reboot": "Κλείσιμο/Επανεκκίνηση", | ||||
|     "Shutdown/Reboot...": "Κλείσιμο/Επανεκκίνηση...", | ||||
|     "Power": "Απενεργοποίηση", | ||||
|     "Shutdown": "Κλείσιμο", | ||||
|     "Reboot": "Επανεκκίνηση", | ||||
|     "Reset": "Επαναφορά", | ||||
|     "Clipboard": "Πρόχειρο", | ||||
|     "Clear": "Καθάρισμα", | ||||
|     "Fullscreen": "Πλήρης Οθόνη", | ||||
|     "Settings": "Ρυθμίσεις", | ||||
|     "Shared Mode": "Κοινόχρηστη Λειτουργία", | ||||
|     "View Only": "Μόνο Θέαση", | ||||
|     "Clip to Window": "Αποκοπή στο όριο του Παράθυρου", | ||||
|     "Scaling Mode:": "Λειτουργία Κλιμάκωσης:", | ||||
|     "None": "Καμία", | ||||
|     "Local Scaling": "Τοπική Κλιμάκωση", | ||||
|     "Remote Resizing": "Απομακρυσμένη Αλλαγή μεγέθους", | ||||
|     "Advanced": "Για προχωρημένους", | ||||
|     "Repeater ID:": "Repeater ID:", | ||||
|     "WebSocket": "WebSocket", | ||||
|     "Encrypt": "Κρυπτογράφηση", | ||||
|     "Host:": "Όνομα διακομιστή:", | ||||
|     "Port:": "Πόρτα διακομιστή:", | ||||
|     "Path:": "Διαδρομή:", | ||||
|     "Automatic Reconnect": "Αυτόματη επανασύνδεση", | ||||
|     "Reconnect Delay (ms):": "Καθυστέρηση επανασύνδεσης (ms):", | ||||
|     "Logging:": "Καταγραφή:", | ||||
|     "Disconnect": "Αποσύνδεση", | ||||
|     "Connect": "Σύνδεση", | ||||
|     "Password:": "Κωδικός Πρόσβασης:", | ||||
|     "Cancel": "Ακύρωση", | ||||
|     "Canvas not supported.": "Δεν υποστηρίζεται το στοιχείο Canvas" | ||||
| } | ||||
							
								
								
									
										68
									
								
								static/js/novnc/app/locale/es.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,68 @@ | |||
| { | ||||
|     "Connecting...": "Conectando...", | ||||
|     "Connected (encrypted) to ": "Conectado (con encriptación) a", | ||||
|     "Connected (unencrypted) to ": "Conectado (sin encriptación) a", | ||||
|     "Disconnecting...": "Desconectando...", | ||||
|     "Disconnected": "Desconectado", | ||||
|     "Must set host": "Debes configurar el host", | ||||
|     "Reconnecting...": "Reconectando...", | ||||
|     "Password is required": "Contraseña es obligatoria", | ||||
|     "Disconnect timeout": "Tiempo de desconexión agotado", | ||||
|     "noVNC encountered an error:": "noVNC ha encontrado un error:", | ||||
|     "Hide/Show the control bar": "Ocultar/Mostrar la barra de control", | ||||
|     "Move/Drag Viewport": "Mover/Arrastrar la ventana", | ||||
|     "viewport drag": "Arrastrar la ventana", | ||||
|     "Active Mouse Button": "Botón activo del ratón", | ||||
|     "No mousebutton": "Ningún botón del ratón", | ||||
|     "Left mousebutton": "Botón izquierdo del ratón", | ||||
|     "Middle mousebutton": "Botón central del ratón", | ||||
|     "Right mousebutton": "Botón derecho del ratón", | ||||
|     "Keyboard": "Teclado", | ||||
|     "Show Keyboard": "Mostrar teclado", | ||||
|     "Extra keys": "Teclas adicionales", | ||||
|     "Show Extra Keys": "Mostrar Teclas Adicionales", | ||||
|     "Ctrl": "Ctrl", | ||||
|     "Toggle Ctrl": "Pulsar/Soltar Ctrl", | ||||
|     "Alt": "Alt", | ||||
|     "Toggle Alt": "Pulsar/Soltar Alt", | ||||
|     "Send Tab": "Enviar Tabulación", | ||||
|     "Tab": "Tabulación", | ||||
|     "Esc": "Esc", | ||||
|     "Send Escape": "Enviar Escape", | ||||
|     "Ctrl+Alt+Del": "Ctrl+Alt+Del", | ||||
|     "Send Ctrl-Alt-Del": "Enviar Ctrl+Alt+Del", | ||||
|     "Shutdown/Reboot": "Apagar/Reiniciar", | ||||
|     "Shutdown/Reboot...": "Apagar/Reiniciar...", | ||||
|     "Power": "Encender", | ||||
|     "Shutdown": "Apagar", | ||||
|     "Reboot": "Reiniciar", | ||||
|     "Reset": "Restablecer", | ||||
|     "Clipboard": "Portapapeles", | ||||
|     "Clear": "Vaciar", | ||||
|     "Fullscreen": "Pantalla Completa", | ||||
|     "Settings": "Configuraciones", | ||||
|     "Shared Mode": "Modo Compartido", | ||||
|     "View Only": "Solo visualización", | ||||
|     "Clip to Window": "Recortar al tamaño de la ventana", | ||||
|     "Scaling Mode:": "Modo de escalado:", | ||||
|     "None": "Ninguno", | ||||
|     "Local Scaling": "Escalado Local", | ||||
|     "Local Downscaling": "Reducción de escala local", | ||||
|     "Remote Resizing": "Cambio de tamaño remoto", | ||||
|     "Advanced": "Avanzado", | ||||
|     "Local Cursor": "Cursor Local", | ||||
|     "Repeater ID:": "ID del Repetidor", | ||||
|     "WebSocket": "WebSocket", | ||||
|     "Encrypt": "", | ||||
|     "Host:": "Host", | ||||
|     "Port:": "Puesto", | ||||
|     "Path:": "Ruta", | ||||
|     "Automatic Reconnect": "Reconexión automática", | ||||
|     "Reconnect Delay (ms):": "Retraso en la reconexión (ms)", | ||||
|     "Logging:": "Logging", | ||||
|     "Disconnect": "Desconectar", | ||||
|     "Connect": "Conectar", | ||||
|     "Password:": "Contraseña", | ||||
|     "Cancel": "Cancelar", | ||||
|     "Canvas not supported.": "Canvas no está soportado" | ||||
| } | ||||
							
								
								
									
										68
									
								
								static/js/novnc/app/locale/nl.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,68 @@ | |||
| { | ||||
|     "Connecting...": "Verbinden...", | ||||
|     "Connected (encrypted) to ": "Verbonden (versleuteld) met ", | ||||
|     "Connected (unencrypted) to ": "Verbonden (onversleuteld) met ", | ||||
|     "Disconnecting...": "Verbinding verbreken...", | ||||
|     "Disconnected": "Verbinding verbroken", | ||||
|     "Must set host": "Host moeten worden ingesteld", | ||||
|     "Reconnecting...": "Opnieuw verbinding maken...", | ||||
|     "Password is required": "Wachtwoord is vereist", | ||||
|     "Disconnect timeout": "Timeout tijdens verbreken van verbinding", | ||||
|     "noVNC encountered an error:": "noVNC heeft een fout bemerkt:", | ||||
|     "Hide/Show the control bar": "Verberg/Toon de bedieningsbalk", | ||||
|     "Move/Drag Viewport": "Verplaats/Versleep Kijkvenster", | ||||
|     "viewport drag": "kijkvenster slepen", | ||||
|     "Active Mouse Button": "Actieve Muisknop", | ||||
|     "No mousebutton": "Geen muisknop", | ||||
|     "Left mousebutton": "Linker muisknop", | ||||
|     "Middle mousebutton": "Middelste muisknop", | ||||
|     "Right mousebutton": "Rechter muisknop", | ||||
|     "Keyboard": "Toetsenbord", | ||||
|     "Show Keyboard": "Toon Toetsenbord", | ||||
|     "Extra keys": "Extra toetsen", | ||||
|     "Show Extra Keys": "Toon Extra Toetsen", | ||||
|     "Ctrl": "Ctrl", | ||||
|     "Toggle Ctrl": "Ctrl aan/uitzetten", | ||||
|     "Alt": "Alt", | ||||
|     "Toggle Alt": "Alt aan/uitzetten", | ||||
|     "Send Tab": "Tab Sturen", | ||||
|     "Tab": "Tab", | ||||
|     "Esc": "Esc", | ||||
|     "Send Escape": "Escape Sturen", | ||||
|     "Ctrl+Alt+Del": "Ctrl-Alt-Del", | ||||
|     "Send Ctrl-Alt-Del": "Ctrl-Alt-Del Sturen", | ||||
|     "Shutdown/Reboot": "Uitschakelen/Herstarten", | ||||
|     "Shutdown/Reboot...": "Uitschakelen/Herstarten...", | ||||
|     "Power": "Systeem", | ||||
|     "Shutdown": "Uitschakelen", | ||||
|     "Reboot": "Herstarten", | ||||
|     "Reset": "Resetten", | ||||
|     "Clipboard": "Klembord", | ||||
|     "Clear": "Wissen", | ||||
|     "Fullscreen": "Volledig Scherm", | ||||
|     "Settings": "Instellingen", | ||||
|     "Shared Mode": "Gedeelde Modus", | ||||
|     "View Only": "Alleen Kijken", | ||||
|     "Clip to Window": "Randen buiten venster afsnijden", | ||||
|     "Scaling Mode:": "Schaalmodus:", | ||||
|     "None": "Geen", | ||||
|     "Local Scaling": "Lokaal Schalen", | ||||
|     "Local Downscaling": "Lokaal Neerschalen", | ||||
|     "Remote Resizing": "Op Afstand Formaat Wijzigen", | ||||
|     "Advanced": "Geavanceerd", | ||||
|     "Local Cursor": "Lokale Cursor", | ||||
|     "Repeater ID:": "Repeater ID:", | ||||
|     "WebSocket": "WebSocket", | ||||
|     "Encrypt": "Versleutelen", | ||||
|     "Host:": "Host:", | ||||
|     "Port:": "Poort:", | ||||
|     "Path:": "Pad:", | ||||
|     "Automatic Reconnect": "Automatisch Opnieuw Verbinden", | ||||
|     "Reconnect Delay (ms):": "Vertraging voor Opnieuw Verbinden (ms):", | ||||
|     "Logging:": "Logmeldingen:", | ||||
|     "Disconnect": "Verbinding verbreken", | ||||
|     "Connect": "Verbinden", | ||||
|     "Password:": "Wachtwoord:", | ||||
|     "Cancel": "Annuleren", | ||||
|     "Canvas not supported.": "Canvas wordt niet ondersteund." | ||||
| } | ||||
							
								
								
									
										69
									
								
								static/js/novnc/app/locale/pl.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,69 @@ | |||
| { | ||||
|     "Connecting...": "Łączenie...", | ||||
|     "Disconnecting...": "Rozłączanie...", | ||||
|     "Reconnecting...": "Łączenie...", | ||||
|     "Internal error": "Błąd wewnętrzny", | ||||
|     "Must set host": "Host i port są wymagane", | ||||
|     "Connected (encrypted) to ": "Połączenie (szyfrowane) z ", | ||||
|     "Connected (unencrypted) to ": "Połączenie (nieszyfrowane) z ", | ||||
|     "Something went wrong, connection is closed": "Coś poszło źle, połączenie zostało zamknięte", | ||||
|     "Disconnected": "Rozłączony", | ||||
|     "New connection has been rejected with reason: ": "Nowe połączenie zostało odrzucone z powodu: ", | ||||
|     "New connection has been rejected": "Nowe połączenie zostało odrzucone", | ||||
|     "Password is required": "Hasło jest wymagane", | ||||
|     "noVNC encountered an error:": "noVNC napotkało błąd:", | ||||
|     "Hide/Show the control bar": "Pokaż/Ukryj pasek ustawień", | ||||
|     "Move/Drag Viewport": "Ruszaj/Przeciągaj Viewport", | ||||
|     "viewport drag": "przeciągnij viewport", | ||||
|     "Active Mouse Button": "Aktywny Przycisk Myszy", | ||||
|     "No mousebutton": "Brak przycisku myszy", | ||||
|     "Left mousebutton": "Lewy przycisk myszy", | ||||
|     "Middle mousebutton": "Środkowy przycisk myszy", | ||||
|     "Right mousebutton": "Prawy przycisk myszy", | ||||
|     "Keyboard": "Klawiatura", | ||||
|     "Show Keyboard": "Pokaż klawiaturę", | ||||
|     "Extra keys": "Przyciski dodatkowe", | ||||
|     "Show Extra Keys": "Pokaż przyciski dodatkowe", | ||||
|     "Ctrl": "Ctrl", | ||||
|     "Toggle Ctrl": "Przełącz Ctrl", | ||||
|     "Alt": "Alt", | ||||
|     "Toggle Alt": "Przełącz Alt", | ||||
|     "Send Tab": "Wyślij Tab", | ||||
|     "Tab": "Tab", | ||||
|     "Esc": "Esc", | ||||
|     "Send Escape": "Wyślij Escape", | ||||
|     "Ctrl+Alt+Del": "Ctrl+Alt+Del", | ||||
|     "Send Ctrl-Alt-Del": "Wyślij Ctrl-Alt-Del", | ||||
|     "Shutdown/Reboot": "Wyłącz/Uruchom ponownie", | ||||
|     "Shutdown/Reboot...": "Wyłącz/Uruchom ponownie...", | ||||
|     "Power": "Włączony", | ||||
|     "Shutdown": "Wyłącz", | ||||
|     "Reboot": "Uruchom ponownie", | ||||
|     "Reset": "Resetuj", | ||||
|     "Clipboard": "Schowek", | ||||
|     "Clear": "Wyczyść", | ||||
|     "Fullscreen": "Pełny ekran", | ||||
|     "Settings": "Ustawienia", | ||||
|     "Shared Mode": "Tryb Współdzielenia", | ||||
|     "View Only": "Tylko Podgląd", | ||||
|     "Clip to Window": "Przytnij do Okna", | ||||
|     "Scaling Mode:": "Tryb Skalowania:", | ||||
|     "None": "Brak", | ||||
|     "Local Scaling": "Skalowanie lokalne", | ||||
|     "Remote Resizing": "Skalowanie zdalne", | ||||
|     "Advanced": "Zaawansowane", | ||||
|     "Repeater ID:": "ID Repeatera:", | ||||
|     "WebSocket": "WebSocket", | ||||
|     "Encrypt": "Szyfrowanie", | ||||
|     "Host:": "Host:", | ||||
|     "Port:": "Port:", | ||||
|     "Path:": "Ścieżka:", | ||||
|     "Automatic Reconnect": "Automatycznie wznawiaj połączenie", | ||||
|     "Reconnect Delay (ms):": "Opóźnienie wznawiania (ms):", | ||||
|     "Logging:": "Poziom logowania:", | ||||
|     "Disconnect": "Rozłącz", | ||||
|     "Connect": "Połącz", | ||||
|     "Password:": "Hasło:", | ||||
|     "Cancel": "Anuluj", | ||||
|     "Canvas not supported.": "Element Canvas nie jest wspierany." | ||||
| } | ||||
							
								
								
									
										68
									
								
								static/js/novnc/app/locale/sv.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,68 @@ | |||
| { | ||||
|     "Connecting...": "Ansluter...", | ||||
|     "Connected (encrypted) to ": "Ansluten (krypterat) till ", | ||||
|     "Connected (unencrypted) to ": "Ansluten (okrypterat) till ", | ||||
|     "Disconnecting...": "Kopplar ner...", | ||||
|     "Disconnected": "Frånkopplad", | ||||
|     "Must set host": "Du måste specifiera en värd", | ||||
|     "Reconnecting...": "Återansluter...", | ||||
|     "Password is required": "Lösenord krävs", | ||||
|     "Disconnect timeout": "Det tog för lång tid att koppla ner", | ||||
|     "noVNC encountered an error:": "noVNC stötte på ett problem:", | ||||
|     "Hide/Show the control bar": "Göm/Visa kontrollbaren", | ||||
|     "Move/Drag Viewport": "Flytta/Dra Vyn", | ||||
|     "viewport drag": "dra vy", | ||||
|     "Active Mouse Button": "Aktiv musknapp", | ||||
|     "No mousebutton": "Ingen musknapp", | ||||
|     "Left mousebutton": "Vänster musknapp", | ||||
|     "Middle mousebutton": "Mitten-musknapp", | ||||
|     "Right mousebutton": "Höger musknapp", | ||||
|     "Keyboard": "Tangentbord", | ||||
|     "Show Keyboard": "Visa Tangentbord", | ||||
|     "Extra keys": "Extraknappar", | ||||
|     "Show Extra Keys": "Visa Extraknappar", | ||||
|     "Ctrl": "Ctrl", | ||||
|     "Toggle Ctrl": "Växla Ctrl", | ||||
|     "Alt": "Alt", | ||||
|     "Toggle Alt": "Växla Alt", | ||||
|     "Send Tab": "Skicka Tab", | ||||
|     "Tab": "Tab", | ||||
|     "Esc": "Esc", | ||||
|     "Send Escape": "Skicka Escape", | ||||
|     "Ctrl+Alt+Del": "Ctrl+Alt+Del", | ||||
|     "Send Ctrl-Alt-Del": "Skicka Ctrl-Alt-Del", | ||||
|     "Shutdown/Reboot": "Stäng av/Boota om", | ||||
|     "Shutdown/Reboot...": "Stäng av/Boota om...", | ||||
|     "Power": "Ström", | ||||
|     "Shutdown": "Stäng av", | ||||
|     "Reboot": "Boota om", | ||||
|     "Reset": "Återställ", | ||||
|     "Clipboard": "Urklipp", | ||||
|     "Clear": "Rensa", | ||||
|     "Fullscreen": "Fullskärm", | ||||
|     "Settings": "Inställningar", | ||||
|     "Shared Mode": "Delat Läge", | ||||
|     "View Only": "Endast Visning", | ||||
|     "Clip to Window": "Begränsa till Fönster", | ||||
|     "Scaling Mode:": "Skalningsläge:", | ||||
|     "None": "Ingen", | ||||
|     "Local Scaling": "Lokal Skalning", | ||||
|     "Local Downscaling": "Lokal Nedskalning", | ||||
|     "Remote Resizing": "Ändra Storlek", | ||||
|     "Advanced": "Avancerat", | ||||
|     "Local Cursor": "Lokal Muspekare", | ||||
|     "Repeater ID:": "Repeater-ID:", | ||||
|     "WebSocket": "WebSocket", | ||||
|     "Encrypt": "Kryptera", | ||||
|     "Host:": "Värd:", | ||||
|     "Port:": "Port:", | ||||
|     "Path:": "Sökväg:", | ||||
|     "Automatic Reconnect": "Automatisk Återanslutning", | ||||
|     "Reconnect Delay (ms):": "Fördröjning (ms):", | ||||
|     "Logging:": "Loggning:", | ||||
|     "Disconnect": "Koppla från", | ||||
|     "Connect": "Anslut", | ||||
|     "Password:": "Lösenord:", | ||||
|     "Cancel": "Avbryt", | ||||
|     "Canvas not supported.": "Canvas stöds ej" | ||||
| } | ||||
							
								
								
									
										69
									
								
								static/js/novnc/app/locale/tr.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,69 @@ | |||
| { | ||||
|     "Connecting...": "Bağlanıyor...", | ||||
|     "Disconnecting...": "Bağlantı kesiliyor...", | ||||
|     "Reconnecting...": "Yeniden bağlantı kuruluyor...", | ||||
|     "Internal error": "İç hata", | ||||
|     "Must set host": "Sunucuyu kur", | ||||
|     "Connected (encrypted) to ": "Bağlı (şifrelenmiş)", | ||||
|     "Connected (unencrypted) to ": "Bağlandı (şifrelenmemiş)", | ||||
|     "Something went wrong, connection is closed": "Bir şeyler ters gitti, bağlantı kesildi", | ||||
|     "Disconnected": "Bağlantı kesildi", | ||||
|     "New connection has been rejected with reason: ": "Bağlantı aşağıdaki nedenlerden dolayı reddedildi: ", | ||||
|     "New connection has been rejected": "Bağlantı reddedildi", | ||||
|     "Password is required": "Şifre gerekli", | ||||
|     "noVNC encountered an error:": "Bir hata oluştu:", | ||||
|     "Hide/Show the control bar": "Denetim masasını Gizle/Göster", | ||||
|     "Move/Drag Viewport": "Görünümü Taşı/Sürükle", | ||||
|     "viewport drag": "Görüntü penceresini sürükle", | ||||
|     "Active Mouse Button": "Aktif Fare Düğmesi", | ||||
|     "No mousebutton": "Fare düğmesi yok", | ||||
|     "Left mousebutton": "Farenin sol düğmesi", | ||||
|     "Middle mousebutton": "Farenin orta düğmesi", | ||||
|     "Right mousebutton": "Farenin sağ düğmesi", | ||||
|     "Keyboard": "Klavye", | ||||
|     "Show Keyboard": "Klavye Düzenini Göster", | ||||
|     "Extra keys": "Ekstra tuşlar", | ||||
|     "Show Extra Keys": "Ekstra tuşları göster", | ||||
|     "Ctrl": "Ctrl", | ||||
|     "Toggle Ctrl": "Ctrl Değiştir ", | ||||
|     "Alt": "Alt", | ||||
|     "Toggle Alt": "Alt Değiştir", | ||||
|     "Send Tab": "Sekme Gönder", | ||||
|     "Tab": "Sekme", | ||||
|     "Esc": "Esc", | ||||
|     "Send Escape": "Boşluk Gönder", | ||||
|     "Ctrl+Alt+Del": "Ctrl + Alt + Del", | ||||
|     "Send Ctrl-Alt-Del": "Ctrl-Alt-Del Gönder", | ||||
|     "Shutdown/Reboot": "Kapat/Yeniden Başlat", | ||||
|     "Shutdown/Reboot...": "Kapat/Yeniden Başlat...", | ||||
|     "Power": "Güç", | ||||
|     "Shutdown": "Kapat", | ||||
|     "Reboot": "Yeniden Başlat", | ||||
|     "Reset": "Sıfırla", | ||||
|     "Clipboard": "Pano", | ||||
|     "Clear": "Temizle", | ||||
|     "Fullscreen": "Tam Ekran", | ||||
|     "Settings": "Ayarlar", | ||||
|     "Shared Mode": "Paylaşım Modu", | ||||
|     "View Only": "Sadece Görüntüle", | ||||
|     "Clip to Window": "Pencereye Tıkla", | ||||
|     "Scaling Mode:": "Ölçekleme Modu:", | ||||
|     "None": "Bilinmeyen", | ||||
|     "Local Scaling": "Yerel Ölçeklendirme", | ||||
|     "Remote Resizing": "Uzaktan Yeniden Boyutlandırma", | ||||
|     "Advanced": "Gelişmiş", | ||||
|     "Repeater ID:": "Tekralayıcı ID:", | ||||
|     "WebSocket": "WebSocket", | ||||
|     "Encrypt": "Şifrele", | ||||
|     "Host:": "Ana makine:", | ||||
|     "Port:": "Port:", | ||||
|     "Path:": "Yol:", | ||||
|     "Automatic Reconnect": "Otomatik Yeniden Bağlan", | ||||
|     "Reconnect Delay (ms):": "Yeniden Bağlanma Süreci (ms):", | ||||
|     "Logging:": "Giriş yapılıyor:", | ||||
|     "Disconnect": "Bağlantıyı Kes", | ||||
|     "Connect": "Bağlan", | ||||
|     "Password:": "Parola:", | ||||
|     "Cancel": "Vazgeç", | ||||
|     "Canvas not supported.": "Tuval desteklenmiyor." | ||||
| } | ||||
							
								
								
									
										69
									
								
								static/js/novnc/app/locale/zh.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,69 @@ | |||
| { | ||||
|     "Connecting...": "連線中...", | ||||
|     "Disconnecting...": "正在中斷連線...", | ||||
|     "Reconnecting...": "重新連線中...", | ||||
|     "Internal error": "內部錯誤", | ||||
|     "Must set host": "請提供主機資訊", | ||||
|     "Connected (encrypted) to ": "已加密連線到", | ||||
|     "Connected (unencrypted) to ": "未加密連線到", | ||||
|     "Something went wrong, connection is closed": "發生錯誤,連線已關閉", | ||||
|     "Failed to connect to server": "無法連線到伺服器", | ||||
|     "Disconnected": "連線已中斷", | ||||
|     "New connection has been rejected with reason: ": "連線被拒絕,原因:", | ||||
|     "New connection has been rejected": "連線被拒絕", | ||||
|     "Password is required": "請提供密碼", | ||||
|     "noVNC encountered an error:": "noVNC 遇到一個錯誤:", | ||||
|     "Hide/Show the control bar": "顯示/隱藏控制列", | ||||
|     "Move/Drag Viewport": "拖放顯示範圍", | ||||
|     "viewport drag": "顯示範圍拖放", | ||||
|     "Active Mouse Button": "啟用滑鼠按鍵", | ||||
|     "No mousebutton": "無滑鼠按鍵", | ||||
|     "Left mousebutton": "滑鼠左鍵", | ||||
|     "Middle mousebutton": "滑鼠中鍵", | ||||
|     "Right mousebutton": "滑鼠右鍵", | ||||
|     "Keyboard": "鍵盤", | ||||
|     "Show Keyboard": "顯示鍵盤", | ||||
|     "Extra keys": "額外按鍵", | ||||
|     "Show Extra Keys": "顯示額外按鍵", | ||||
|     "Ctrl": "Ctrl", | ||||
|     "Toggle Ctrl": "切換 Ctrl", | ||||
|     "Alt": "Alt", | ||||
|     "Toggle Alt": "切換 Alt", | ||||
|     "Send Tab": "送出 Tab 鍵", | ||||
|     "Tab": "Tab", | ||||
|     "Esc": "Esc", | ||||
|     "Send Escape": "送出 Escape 鍵", | ||||
|     "Ctrl+Alt+Del": "Ctrl-Alt-Del", | ||||
|     "Send Ctrl-Alt-Del": "送出 Ctrl-Alt-Del 快捷鍵", | ||||
|     "Shutdown/Reboot": "關機/重新啟動", | ||||
|     "Shutdown/Reboot...": "關機/重新啟動...", | ||||
|     "Power": "電源", | ||||
|     "Shutdown": "關機", | ||||
|     "Reboot": "重新啟動", | ||||
|     "Reset": "重設", | ||||
|     "Clipboard": "剪貼簿", | ||||
|     "Clear": "清除", | ||||
|     "Fullscreen": "全螢幕", | ||||
|     "Settings": "設定", | ||||
|     "Shared Mode": "分享模式", | ||||
|     "View Only": "僅檢視", | ||||
|     "Clip to Window": "限制/裁切視窗大小", | ||||
|     "Scaling Mode:": "縮放模式:", | ||||
|     "None": "無", | ||||
|     "Local Scaling": "本機縮放", | ||||
|     "Remote Resizing": "遠端調整大小", | ||||
|     "Advanced": "進階", | ||||
|     "Repeater ID:": "中繼站 ID", | ||||
|     "WebSocket": "WebSocket", | ||||
|     "Encrypt": "加密", | ||||
|     "Host:": "主機:", | ||||
|     "Port:": "連接埠:", | ||||
|     "Path:": "路徑:", | ||||
|     "Automatic Reconnect": "自動重新連線", | ||||
|     "Reconnect Delay (ms):": "重新連線間隔 (ms):", | ||||
|     "Logging:": "日誌級別:", | ||||
|     "Disconnect": "中斷連線", | ||||
|     "Connect": "連線", | ||||
|     "Password:": "密碼:", | ||||
|     "Cancel": "取消" | ||||
| } | ||||
							
								
								
									
										163
									
								
								static/js/novnc/app/localization.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,163 @@ | |||
| 'use strict'; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| exports.Localizer = Localizer; | ||||
| /* | ||||
|  * noVNC: HTML5 VNC client | ||||
|  * Copyright (C) 2012 Joel Martin | ||||
|  * Licensed under MPL 2.0 (see LICENSE.txt) | ||||
|  * | ||||
|  * See README.md for usage and integration instructions. | ||||
|  */ | ||||
| 
 | ||||
| /* | ||||
|  * Localization Utilities | ||||
|  */ | ||||
| 
 | ||||
| function Localizer() { | ||||
|     // Currently configured language
 | ||||
|     this.language = 'en'; | ||||
| 
 | ||||
|     // Current dictionary of translations
 | ||||
|     this.dictionary = undefined; | ||||
| } | ||||
| 
 | ||||
| Localizer.prototype = { | ||||
|     // Configure suitable language based on user preferences
 | ||||
|     setup: function (supportedLanguages) { | ||||
|         var userLanguages; | ||||
| 
 | ||||
|         this.language = 'en'; // Default: US English
 | ||||
| 
 | ||||
|         /* | ||||
|          * Navigator.languages only available in Chrome (32+) and FireFox (32+) | ||||
|          * Fall back to navigator.language for other browsers | ||||
|          */ | ||||
|         if (typeof window.navigator.languages == 'object') { | ||||
|             userLanguages = window.navigator.languages; | ||||
|         } else { | ||||
|             userLanguages = [navigator.language || navigator.userLanguage]; | ||||
|         } | ||||
| 
 | ||||
|         for (var i = 0; i < userLanguages.length; i++) { | ||||
|             var userLang = userLanguages[i]; | ||||
|             userLang = userLang.toLowerCase(); | ||||
|             userLang = userLang.replace("_", "-"); | ||||
|             userLang = userLang.split("-"); | ||||
| 
 | ||||
|             // Built-in default?
 | ||||
|             if (userLang[0] === 'en' && (userLang[1] === undefined || userLang[1] === 'us')) { | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             // First pass: perfect match
 | ||||
|             for (var j = 0; j < supportedLanguages.length; j++) { | ||||
|                 var supLang = supportedLanguages[j]; | ||||
|                 supLang = supLang.toLowerCase(); | ||||
|                 supLang = supLang.replace("_", "-"); | ||||
|                 supLang = supLang.split("-"); | ||||
| 
 | ||||
|                 if (userLang[0] !== supLang[0]) continue; | ||||
|                 if (userLang[1] !== supLang[1]) continue; | ||||
| 
 | ||||
|                 this.language = supportedLanguages[j]; | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             // Second pass: fallback
 | ||||
|             for (var j = 0; j < supportedLanguages.length; j++) { | ||||
|                 supLang = supportedLanguages[j]; | ||||
|                 supLang = supLang.toLowerCase(); | ||||
|                 supLang = supLang.replace("_", "-"); | ||||
|                 supLang = supLang.split("-"); | ||||
| 
 | ||||
|                 if (userLang[0] !== supLang[0]) continue; | ||||
|                 if (supLang[1] !== undefined) continue; | ||||
| 
 | ||||
|                 this.language = supportedLanguages[j]; | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     // Retrieve localised text
 | ||||
|     get: function (id) { | ||||
|         if (typeof this.dictionary !== 'undefined' && this.dictionary[id]) { | ||||
|             return this.dictionary[id]; | ||||
|         } else { | ||||
|             return id; | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     // Traverses the DOM and translates relevant fields
 | ||||
|     // See https://html.spec.whatwg.org/multipage/dom.html#attr-translate
 | ||||
|     translateDOM: function () { | ||||
|         var self = this; | ||||
|         function process(elem, enabled) { | ||||
|             function isAnyOf(searchElement, items) { | ||||
|                 return items.indexOf(searchElement) !== -1; | ||||
|             } | ||||
| 
 | ||||
|             function translateAttribute(elem, attr) { | ||||
|                 var str = elem.getAttribute(attr); | ||||
|                 str = self.get(str); | ||||
|                 elem.setAttribute(attr, str); | ||||
|             } | ||||
| 
 | ||||
|             function translateTextNode(node) { | ||||
|                 var str = node.data.trim(); | ||||
|                 str = self.get(str); | ||||
|                 node.data = str; | ||||
|             } | ||||
| 
 | ||||
|             if (elem.hasAttribute("translate")) { | ||||
|                 if (isAnyOf(elem.getAttribute("translate"), ["", "yes"])) { | ||||
|                     enabled = true; | ||||
|                 } else if (isAnyOf(elem.getAttribute("translate"), ["no"])) { | ||||
|                     enabled = false; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             if (enabled) { | ||||
|                 if (elem.hasAttribute("abbr") && elem.tagName === "TH") { | ||||
|                     translateAttribute(elem, "abbr"); | ||||
|                 } | ||||
|                 if (elem.hasAttribute("alt") && isAnyOf(elem.tagName, ["AREA", "IMG", "INPUT"])) { | ||||
|                     translateAttribute(elem, "alt"); | ||||
|                 } | ||||
|                 if (elem.hasAttribute("download") && isAnyOf(elem.tagName, ["A", "AREA"])) { | ||||
|                     translateAttribute(elem, "download"); | ||||
|                 } | ||||
|                 if (elem.hasAttribute("label") && isAnyOf(elem.tagName, ["MENUITEM", "MENU", "OPTGROUP", "OPTION", "TRACK"])) { | ||||
|                     translateAttribute(elem, "label"); | ||||
|                 } | ||||
|                 // FIXME: Should update "lang"
 | ||||
|                 if (elem.hasAttribute("placeholder") && isAnyOf(elem.tagName, ["INPUT", "TEXTAREA"])) { | ||||
|                     translateAttribute(elem, "placeholder"); | ||||
|                 } | ||||
|                 if (elem.hasAttribute("title")) { | ||||
|                     translateAttribute(elem, "title"); | ||||
|                 } | ||||
|                 if (elem.hasAttribute("value") && elem.tagName === "INPUT" && isAnyOf(elem.getAttribute("type"), ["reset", "button", "submit"])) { | ||||
|                     translateAttribute(elem, "value"); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             for (var i = 0; i < elem.childNodes.length; i++) { | ||||
|                 var node = elem.childNodes[i]; | ||||
|                 if (node.nodeType === node.ELEMENT_NODE) { | ||||
|                     process(node, enabled); | ||||
|                 } else if (node.nodeType === node.TEXT_NODE && enabled) { | ||||
|                     translateTextNode(node); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         process(document.body, true); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| var l10n = exports.l10n = new Localizer(); | ||||
| exports.default = l10n.get.bind(l10n); | ||||
							
								
								
									
										4
									
								
								static/js/novnc/app/sounds/CREDITS
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,4 @@ | |||
| bell | ||||
|         Copyright: Dr. Richard Boulanger et al | ||||
|         URL: http://www.archive.org/details/Berklee44v12 | ||||
|         License: CC-BY Attribution 3.0 Unported | ||||
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/sounds/bell.mp3
									
										
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								static/js/novnc/app/sounds/bell.oga
									
										
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								static/js/novnc/Orbitron700.ttf → static/js/novnc/app/styles/Orbitron700.ttf
									
										
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
							
								
								
									
										0
									
								
								static/js/novnc/Orbitron700.woff → static/js/novnc/app/styles/Orbitron700.woff
									
										
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
							
								
								
									
										902
									
								
								static/js/novnc/app/styles/base.css
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,902 @@ | |||
| /* | ||||
|  * noVNC base CSS | ||||
|  * Copyright (C) 2012 Joel Martin | ||||
|  * Copyright (C) 2016 Samuel Mannehed for Cendio AB | ||||
|  * Copyright (C) 2016 Pierre Ossman for Cendio AB | ||||
|  * noVNC is licensed under the MPL 2.0 (see LICENSE.txt) | ||||
|  * This file is licensed under the 2-Clause BSD license (see LICENSE.txt). | ||||
|  */ | ||||
| 
 | ||||
| /* | ||||
|  * Z index layers: | ||||
|  * | ||||
|  * 0: Main screen | ||||
|  * 10: Control bar | ||||
|  * 50: Transition blocker | ||||
|  * 60: Connection popups | ||||
|  * 100: Status bar | ||||
|  * ... | ||||
|  * 1000: Javascript crash | ||||
|  * ... | ||||
|  * 10000: Max (used for polyfills) | ||||
|  */ | ||||
| 
 | ||||
| body { | ||||
|   margin:0; | ||||
|   padding:0; | ||||
|   font-family: Helvetica; | ||||
|   /*Background image with light grey curve.*/ | ||||
|   background-color:#494949; | ||||
|   background-repeat:no-repeat; | ||||
|   background-position:right bottom; | ||||
|   height:100%; | ||||
|   touch-action: none; | ||||
| } | ||||
| 
 | ||||
| html { | ||||
|   height:100%; | ||||
| } | ||||
| 
 | ||||
| .noVNC_only_touch.noVNC_hidden { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| .noVNC_disabled { | ||||
|   color: rgb(128, 128, 128); | ||||
| } | ||||
| 
 | ||||
| /* ---------------------------------------- | ||||
|  * Spinner | ||||
|  * ---------------------------------------- | ||||
|  */ | ||||
| 
 | ||||
| .noVNC_spinner { | ||||
|   position: relative; | ||||
| } | ||||
| .noVNC_spinner, .noVNC_spinner::before, .noVNC_spinner::after { | ||||
|   width: 10px; | ||||
|   height: 10px; | ||||
|   border-radius: 2px; | ||||
|   box-shadow: -60px 10px 0 rgba(255, 255, 255, 0); | ||||
|   animation: noVNC_spinner 1.0s linear infinite; | ||||
| } | ||||
| .noVNC_spinner::before { | ||||
|   content: ""; | ||||
|   position: absolute; | ||||
|   left: 0px; | ||||
|   top: 0px; | ||||
|   animation-delay: -0.1s; | ||||
| } | ||||
| .noVNC_spinner::after { | ||||
|   content: ""; | ||||
|   position: absolute; | ||||
|   top: 0px; | ||||
|   left: 0px; | ||||
|   animation-delay: 0.1s; | ||||
| } | ||||
| @keyframes noVNC_spinner { | ||||
|   0% { box-shadow: -60px 10px 0 rgba(255, 255, 255, 0); width: 20px; } | ||||
|   25% { box-shadow: 20px 10px 0 rgba(255, 255, 255, 1); width: 10px; } | ||||
|   50% { box-shadow: 60px 10px 0 rgba(255, 255, 255, 0); width: 10px; } | ||||
| } | ||||
| 
 | ||||
| /* ---------------------------------------- | ||||
|  * Input Elements | ||||
|  * ---------------------------------------- | ||||
|  */ | ||||
| 
 | ||||
| input[type=input], input[type=password], input[type=number], | ||||
| input:not([type]), textarea { | ||||
|   /* Disable default rendering */ | ||||
|   -webkit-appearance: none; | ||||
|   -moz-appearance: none; | ||||
|   background: none; | ||||
| 
 | ||||
|   margin: 2px; | ||||
|   padding: 2px; | ||||
|   border: 1px solid rgb(192, 192, 192); | ||||
|   border-radius: 5px; | ||||
|   color: black; | ||||
|   background: linear-gradient(to top, rgb(255, 255, 255) 80%, rgb(240, 240, 240)); | ||||
| } | ||||
| 
 | ||||
| input[type=button], input[type=submit], select { | ||||
|   /* Disable default rendering */ | ||||
|   -webkit-appearance: none; | ||||
|   -moz-appearance: none; | ||||
|   background: none; | ||||
| 
 | ||||
|   margin: 2px; | ||||
|   padding: 2px; | ||||
|   border: 1px solid rgb(192, 192, 192); | ||||
|   border-bottom-width: 2px; | ||||
|   border-radius: 5px; | ||||
|   color: black; | ||||
|   background: linear-gradient(to top, rgb(255, 255, 255), rgb(240, 240, 240)); | ||||
| 
 | ||||
|   /* This avoids it jumping around when :active */ | ||||
|   vertical-align: middle; | ||||
| } | ||||
| 
 | ||||
| input[type=button], input[type=submit] { | ||||
|   padding-left: 20px; | ||||
|   padding-right: 20px; | ||||
| } | ||||
| 
 | ||||
| option { | ||||
|   color: black; | ||||
|   background: white; | ||||
| } | ||||
| 
 | ||||
| input[type=input]:focus, input[type=password]:focus, | ||||
| input:not([type]):focus, input[type=button]:focus, | ||||
| input[type=submit]:focus, | ||||
| textarea:focus, select:focus { | ||||
|   box-shadow: 0px 0px 3px rgba(74, 144, 217, 0.5); | ||||
|   border-color: rgb(74, 144, 217); | ||||
|   outline: none; | ||||
| } | ||||
| 
 | ||||
| input[type=button]::-moz-focus-inner, | ||||
| input[type=submit]::-moz-focus-inner { | ||||
|   border: none; | ||||
| } | ||||
| 
 | ||||
| input[type=input]:disabled, input[type=password]:disabled, | ||||
| input:not([type]):disabled, input[type=button]:disabled, | ||||
| input[type=submit]:disabled, input[type=number]:disabled, | ||||
| textarea:disabled, select:disabled { | ||||
|   color: rgb(128, 128, 128); | ||||
|   background: rgb(240, 240, 240); | ||||
| } | ||||
| 
 | ||||
| input[type=button]:active, input[type=submit]:active, | ||||
| select:active { | ||||
|   border-bottom-width: 1px; | ||||
|   margin-top: 3px; | ||||
| } | ||||
| 
 | ||||
| :root:not(.noVNC_touch) input[type=button]:hover:not(:disabled), | ||||
| :root:not(.noVNC_touch) input[type=submit]:hover:not(:disabled), | ||||
| :root:not(.noVNC_touch) select:hover:not(:disabled) { | ||||
|   background: linear-gradient(to top, rgb(255, 255, 255), rgb(250, 250, 250)); | ||||
| } | ||||
| 
 | ||||
| /* ---------------------------------------- | ||||
|  * WebKit centering hacks | ||||
|  * ---------------------------------------- | ||||
|  */ | ||||
| 
 | ||||
| .noVNC_center { | ||||
|   /* | ||||
|    * This is a workaround because webkit misrenders transforms and | ||||
|    * uses non-integer coordinates, resulting in blurry content. | ||||
|    * Ideally we'd use "top: 50%; transform: translateY(-50%);" on | ||||
|    * the objects instead. | ||||
|    */ | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   justify-content: center; | ||||
|   position: fixed; | ||||
|   top: 0; | ||||
|   left: 0; | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
|   pointer-events: none; | ||||
| } | ||||
| .noVNC_center > * { | ||||
|   pointer-events: auto; | ||||
| } | ||||
| .noVNC_vcenter { | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|   justify-content: center; | ||||
|   position: fixed; | ||||
|   top: 0; | ||||
|   left: 0; | ||||
|   height: 100%; | ||||
|   pointer-events: none; | ||||
| } | ||||
| .noVNC_vcenter > * { | ||||
|   pointer-events: auto; | ||||
| } | ||||
| 
 | ||||
| /* ---------------------------------------- | ||||
|  * Layering | ||||
|  * ---------------------------------------- | ||||
|  */ | ||||
| 
 | ||||
| .noVNC_connect_layer { | ||||
|   z-index: 60; | ||||
| } | ||||
| 
 | ||||
| /* ---------------------------------------- | ||||
|  * Fallback error | ||||
|  * ---------------------------------------- | ||||
|  */ | ||||
| 
 | ||||
| #noVNC_fallback_error { | ||||
|   z-index: 1000; | ||||
|   visibility: hidden; | ||||
| } | ||||
| #noVNC_fallback_error.noVNC_open { | ||||
|   visibility: visible; | ||||
| } | ||||
| 
 | ||||
| #noVNC_fallback_error > div { | ||||
|   max-width: 90%; | ||||
|   padding: 15px; | ||||
| 
 | ||||
|   transition: 0.5s ease-in-out; | ||||
| 
 | ||||
|   transform: translateY(-50px); | ||||
|   opacity: 0; | ||||
| 
 | ||||
|   text-align: center; | ||||
|   font-weight: bold; | ||||
|   color: #fff; | ||||
| 
 | ||||
|   border-radius: 10px; | ||||
|   box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); | ||||
|   background: rgba(200,55,55,0.8); | ||||
| } | ||||
| #noVNC_fallback_error.noVNC_open > div { | ||||
|   transform: translateY(0); | ||||
|   opacity: 1; | ||||
| } | ||||
| 
 | ||||
| #noVNC_fallback_errormsg { | ||||
|   font-weight: normal; | ||||
| } | ||||
| 
 | ||||
| #noVNC_fallback_errormsg .noVNC_message { | ||||
|   display: inline-block; | ||||
|   text-align: left; | ||||
|   font-family: monospace; | ||||
|   white-space: pre-wrap; | ||||
| } | ||||
| 
 | ||||
| #noVNC_fallback_error .noVNC_location { | ||||
|   font-style: italic; | ||||
|   font-size: 0.8em; | ||||
|   color: rgba(255, 255, 255, 0.8); | ||||
| } | ||||
| 
 | ||||
| #noVNC_fallback_error .noVNC_stack { | ||||
|   max-height: 50vh; | ||||
|   padding: 10px; | ||||
|   margin: 10px; | ||||
|   font-size: 0.8em; | ||||
|   text-align: left; | ||||
|   font-family: monospace; | ||||
|   white-space: pre; | ||||
|   border: 1px solid rgba(0, 0, 0, 0.5); | ||||
|   background: rgba(0, 0, 0, 0.2); | ||||
|   overflow: auto; | ||||
| } | ||||
| 
 | ||||
| /* ---------------------------------------- | ||||
|  * Control Bar | ||||
|  * ---------------------------------------- | ||||
|  */ | ||||
| 
 | ||||
| #noVNC_control_bar_anchor { | ||||
|   /* The anchor is needed to get z-stacking to work */ | ||||
|   position: fixed; | ||||
|   z-index: 10; | ||||
| 
 | ||||
|   transition: 0.5s ease-in-out; | ||||
| 
 | ||||
|   /* Edge misrenders animations wihthout this */ | ||||
|   transform: translateX(0); | ||||
| } | ||||
| :root.noVNC_connected #noVNC_control_bar_anchor.noVNC_idle { | ||||
|   opacity: 0.8; | ||||
| } | ||||
| #noVNC_control_bar_anchor.noVNC_right { | ||||
|   left: auto; | ||||
|   right: 0; | ||||
| } | ||||
| 
 | ||||
| #noVNC_control_bar { | ||||
|   position: relative; | ||||
|   left: -100%; | ||||
| 
 | ||||
|   transition: 0.5s ease-in-out; | ||||
| 
 | ||||
|   background-color: rgb(110, 132, 163); | ||||
|   border-radius: 0 10px 10px 0; | ||||
| 
 | ||||
| } | ||||
| #noVNC_control_bar.noVNC_open { | ||||
|   box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); | ||||
|   left: 0; | ||||
| } | ||||
| #noVNC_control_bar::before { | ||||
|   /* This extra element is to get a proper shadow */ | ||||
|   content: ""; | ||||
|   position: absolute; | ||||
|   z-index: -1; | ||||
|   height: 100%; | ||||
|   width: 30px; | ||||
|   left: -30px; | ||||
|   transition: box-shadow 0.5s ease-in-out; | ||||
| } | ||||
| #noVNC_control_bar.noVNC_open::before { | ||||
|   box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); | ||||
| } | ||||
| .noVNC_right #noVNC_control_bar { | ||||
|   left: 100%; | ||||
|   border-radius: 10px 0 0 10px; | ||||
| } | ||||
| .noVNC_right #noVNC_control_bar.noVNC_open { | ||||
|   left: 0; | ||||
| } | ||||
| .noVNC_right #noVNC_control_bar::before { | ||||
|   visibility: hidden; | ||||
| } | ||||
| 
 | ||||
| #noVNC_control_bar_handle { | ||||
|   position: absolute; | ||||
|   left: -15px; | ||||
|   top: 0; | ||||
|   transform: translateY(35px); | ||||
|   width: calc(100% + 30px); | ||||
|   height: 50px; | ||||
|   z-index: -1; | ||||
|   cursor: pointer; | ||||
|   border-radius: 5px; | ||||
|   background-color: rgb(83, 99, 122); | ||||
|   background-image: url("../images/handle_bg.svg"); | ||||
|   background-repeat: no-repeat; | ||||
|   background-position: right; | ||||
|   box-shadow: 3px 3px 0px rgba(0, 0, 0, 0.5); | ||||
| } | ||||
| #noVNC_control_bar_handle:after { | ||||
|   content: ""; | ||||
|   transition: transform 0.5s ease-in-out; | ||||
|   background: url("../images/handle.svg"); | ||||
|   position: absolute; | ||||
|   top: 22px; /* (50px-6px)/2 */ | ||||
|   right: 5px; | ||||
|   width: 5px; | ||||
|   height: 6px; | ||||
| } | ||||
| #noVNC_control_bar.noVNC_open #noVNC_control_bar_handle:after { | ||||
|   transform: translateX(1px) rotate(180deg); | ||||
| } | ||||
| :root:not(.noVNC_connected) #noVNC_control_bar_handle { | ||||
|   display: none; | ||||
| } | ||||
| .noVNC_right #noVNC_control_bar_handle { | ||||
|   background-position: left; | ||||
| } | ||||
| .noVNC_right #noVNC_control_bar_handle:after { | ||||
|   left: 5px; | ||||
|   right: 0; | ||||
|   transform: translateX(1px) rotate(180deg); | ||||
| } | ||||
| .noVNC_right #noVNC_control_bar.noVNC_open #noVNC_control_bar_handle:after { | ||||
|   transform: none; | ||||
| } | ||||
| #noVNC_control_bar_handle div { | ||||
|   position: absolute; | ||||
|   right: -35px; | ||||
|   top: 0; | ||||
|   width: 50px; | ||||
|   height: 50px; | ||||
| } | ||||
| :root:not(.noVNC_touch) #noVNC_control_bar_handle div { | ||||
|   display: none; | ||||
| } | ||||
| .noVNC_right #noVNC_control_bar_handle div { | ||||
|   left: -35px; | ||||
|   right: auto; | ||||
| } | ||||
| 
 | ||||
| #noVNC_control_bar .noVNC_scroll { | ||||
|   max-height: 100vh; /* Chrome is buggy with 100% */ | ||||
|   overflow-x: hidden; | ||||
|   overflow-y: auto; | ||||
|   padding: 0 10px 0 5px; | ||||
| } | ||||
| .noVNC_right #noVNC_control_bar .noVNC_scroll { | ||||
|   padding: 0 5px 0 10px; | ||||
| } | ||||
| 
 | ||||
| /* Control bar hint */ | ||||
| #noVNC_control_bar_hint { | ||||
|   position: fixed; | ||||
|   left: calc(100vw - 50px); | ||||
|   right: auto; | ||||
|   top: 50%; | ||||
|   transform: translateY(-50%) scale(0); | ||||
|   width: 100px; | ||||
|   height: 50%; | ||||
|   max-height: 600px; | ||||
| 
 | ||||
|   visibility: hidden; | ||||
|   opacity: 0; | ||||
|   transition: 0.2s ease-in-out; | ||||
|   background: transparent; | ||||
|   box-shadow: 0 0 10px black, inset 0 0 10px 10px rgba(110, 132, 163, 0.8); | ||||
|   border-radius: 10px; | ||||
|   transition-delay: 0s; | ||||
| } | ||||
| #noVNC_control_bar_anchor.noVNC_right #noVNC_control_bar_hint{ | ||||
|   left: auto; | ||||
|   right: calc(100vw - 50px); | ||||
| } | ||||
| #noVNC_control_bar_hint.noVNC_active { | ||||
|   visibility: visible; | ||||
|   opacity: 1; | ||||
|   transition-delay: 0.2s; | ||||
|   transform: translateY(-50%) scale(1); | ||||
| } | ||||
| 
 | ||||
| /* General button style */ | ||||
| .noVNC_button { | ||||
|   display: block; | ||||
|   padding: 4px 4px; | ||||
|   margin: 10px 0; | ||||
|   vertical-align: middle; | ||||
|   border:1px solid rgba(255, 255, 255, 0.2); | ||||
|   border-radius: 6px; | ||||
| } | ||||
| .noVNC_button.noVNC_selected { | ||||
|   border-color: rgba(0, 0, 0, 0.8); | ||||
|   background: rgba(0, 0, 0, 0.5); | ||||
| } | ||||
| .noVNC_button:disabled { | ||||
|   opacity: 0.4; | ||||
| } | ||||
| .noVNC_button:focus { | ||||
|   outline: none; | ||||
| } | ||||
| .noVNC_button:active { | ||||
|   padding-top: 5px; | ||||
|   padding-bottom: 3px; | ||||
| } | ||||
| /* Android browsers don't properly update hover state if touch events | ||||
|  * are intercepted, but focus should be safe to display */ | ||||
| :root:not(.noVNC_touch) .noVNC_button.noVNC_selected:hover, | ||||
| .noVNC_button.noVNC_selected:focus { | ||||
|   border-color: rgba(0, 0, 0, 0.4); | ||||
|   background: rgba(0, 0, 0, 0.2); | ||||
| } | ||||
| :root:not(.noVNC_touch) .noVNC_button:hover, | ||||
| .noVNC_button:focus { | ||||
|   background: rgba(255, 255, 255, 0.2); | ||||
| } | ||||
| .noVNC_button.noVNC_hidden { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| /* Panels */ | ||||
| .noVNC_panel { | ||||
|   transform: translateX(25px); | ||||
| 
 | ||||
|   transition: 0.5s ease-in-out; | ||||
| 
 | ||||
|   max-height: 100vh; /* Chrome is buggy with 100% */ | ||||
|   overflow-x: hidden; | ||||
|   overflow-y: auto; | ||||
| 
 | ||||
|   visibility: hidden; | ||||
|   opacity: 0; | ||||
| 
 | ||||
|   padding: 15px; | ||||
| 
 | ||||
|   background: #fff; | ||||
|   border-radius: 10px; | ||||
|   color: #000; | ||||
|   border: 2px solid #E0E0E0; | ||||
|   box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); | ||||
| } | ||||
| .noVNC_panel.noVNC_open { | ||||
|   visibility: visible; | ||||
|   opacity: 1; | ||||
|   transform: translateX(75px); | ||||
| } | ||||
| .noVNC_right .noVNC_vcenter { | ||||
|   left: auto; | ||||
|   right: 0; | ||||
| } | ||||
| .noVNC_right .noVNC_panel { | ||||
|   transform: translateX(-25px); | ||||
| } | ||||
| .noVNC_right .noVNC_panel.noVNC_open { | ||||
|   transform: translateX(-75px); | ||||
| } | ||||
| 
 | ||||
| .noVNC_panel hr { | ||||
|   border: none; | ||||
|   border-top: 1px solid rgb(192, 192, 192); | ||||
| } | ||||
| 
 | ||||
| .noVNC_panel label { | ||||
|   display: block; | ||||
|   white-space: nowrap; | ||||
| } | ||||
| 
 | ||||
| .noVNC_panel .noVNC_heading { | ||||
|   background-color: rgb(110, 132, 163); | ||||
|   border-radius: 5px; | ||||
|   padding: 5px; | ||||
|   /* Compensate for padding in image */ | ||||
|   padding-right: 8px; | ||||
|   color: white; | ||||
|   font-size: 20px; | ||||
|   margin-bottom: 10px; | ||||
|   white-space: nowrap; | ||||
| } | ||||
| .noVNC_panel .noVNC_heading img { | ||||
|   vertical-align: bottom; | ||||
| } | ||||
| 
 | ||||
| .noVNC_submit { | ||||
|   float: right; | ||||
| } | ||||
| 
 | ||||
| /* Expanders */ | ||||
| .noVNC_expander { | ||||
|   cursor: pointer; | ||||
| } | ||||
| .noVNC_expander::before { | ||||
|   content: url("../images/expander.svg"); | ||||
|   display: inline-block; | ||||
|   margin-right: 5px; | ||||
|   transition: 0.2s ease-in-out; | ||||
| } | ||||
| .noVNC_expander.noVNC_open::before { | ||||
|   transform: rotateZ(90deg); | ||||
| } | ||||
| .noVNC_expander ~ * { | ||||
|   margin: 5px; | ||||
|   margin-left: 10px; | ||||
|   padding: 5px; | ||||
|   background: rgba(0, 0, 0, 0.05); | ||||
|   border-radius: 5px; | ||||
| } | ||||
| .noVNC_expander:not(.noVNC_open) ~ * { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| /* Control bar content */ | ||||
| 
 | ||||
| #noVNC_control_bar .noVNC_logo { | ||||
|   font-size: 13px; | ||||
| } | ||||
| 
 | ||||
| :root:not(.noVNC_connected) #noVNC_view_drag_button { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| /* noVNC Touch Device only buttons */ | ||||
| :root:not(.noVNC_connected) #noVNC_mobile_buttons { | ||||
|   display: none; | ||||
| } | ||||
| :root:not(.noVNC_touch) #noVNC_mobile_buttons { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| /* Extra manual keys */ | ||||
| :root:not(.noVNC_connected) #noVNC_extra_keys { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| #noVNC_modifiers { | ||||
|   background-color: rgb(92, 92, 92); | ||||
|   border: none; | ||||
|   padding: 0 10px; | ||||
| } | ||||
| 
 | ||||
| /* Shutdown/Reboot */ | ||||
| :root:not(.noVNC_connected) #noVNC_power_button { | ||||
|   display: none; | ||||
| } | ||||
| #noVNC_power { | ||||
| } | ||||
| #noVNC_power_buttons { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| #noVNC_power input[type=button] { | ||||
|   width: 100%; | ||||
| } | ||||
| 
 | ||||
| /* Clipboard */ | ||||
| :root:not(.noVNC_connected) #noVNC_clipboard_button { | ||||
|   display: none; | ||||
| } | ||||
| #noVNC_clipboard { | ||||
|   /* Full screen, minus padding and left and right margins */ | ||||
|   max-width: calc(100vw - 2*15px - 75px - 25px); | ||||
| } | ||||
| #noVNC_clipboard_text { | ||||
|   width: 500px; | ||||
|   max-width: 100%; | ||||
| } | ||||
| 
 | ||||
| /* Settings */ | ||||
| #noVNC_settings { | ||||
| } | ||||
| #noVNC_settings ul { | ||||
|   list-style: none; | ||||
|   margin: 0px; | ||||
|   padding: 0px; | ||||
| } | ||||
| #noVNC_setting_port { | ||||
|   width: 80px; | ||||
| } | ||||
| #noVNC_setting_path { | ||||
|   width: 100px; | ||||
| } | ||||
| 
 | ||||
| /* Connection Controls */ | ||||
| :root:not(.noVNC_connected) #noVNC_disconnect_button { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| /* ---------------------------------------- | ||||
|  * Status Dialog | ||||
|  * ---------------------------------------- | ||||
|  */ | ||||
| 
 | ||||
| #noVNC_status { | ||||
|   position: fixed; | ||||
|   top: 0; | ||||
|   left: 0; | ||||
|   width: 100%; | ||||
|   z-index: 100; | ||||
|   transform: translateY(-100%); | ||||
| 
 | ||||
|   cursor: pointer; | ||||
| 
 | ||||
|   transition: 0.5s ease-in-out; | ||||
| 
 | ||||
|   visibility: hidden; | ||||
|   opacity: 0; | ||||
| 
 | ||||
|   padding: 5px; | ||||
| 
 | ||||
|   display: flex; | ||||
|   flex-direction: row; | ||||
|   justify-content: center; | ||||
|   align-content: center; | ||||
| 
 | ||||
|   line-height: 25px; | ||||
|   word-wrap: break-word; | ||||
|   color: #fff; | ||||
| 
 | ||||
|   border-bottom: 1px solid rgba(0, 0, 0, 0.9); | ||||
| } | ||||
| #noVNC_status.noVNC_open { | ||||
|   transform: translateY(0); | ||||
|   visibility: visible; | ||||
|   opacity: 1; | ||||
| } | ||||
| 
 | ||||
| #noVNC_status::before { | ||||
|   content: ""; | ||||
|   display: inline-block; | ||||
|   width: 25px; | ||||
|   height: 25px; | ||||
|   margin-right: 5px; | ||||
| } | ||||
| 
 | ||||
| #noVNC_status.noVNC_status_normal { | ||||
|   background: rgba(128,128,128,0.9); | ||||
| } | ||||
| #noVNC_status.noVNC_status_normal::before { | ||||
|   content: url("../images/info.svg") " "; | ||||
| } | ||||
| #noVNC_status.noVNC_status_error { | ||||
|   background: rgba(200,55,55,0.9); | ||||
| } | ||||
| #noVNC_status.noVNC_status_error::before { | ||||
|   content: url("../images/error.svg") " "; | ||||
| } | ||||
| #noVNC_status.noVNC_status_warn { | ||||
|   background: rgba(180,180,30,0.9); | ||||
| } | ||||
| #noVNC_status.noVNC_status_warn::before { | ||||
|   content: url("../images/warning.svg") " "; | ||||
| } | ||||
| 
 | ||||
| /* ---------------------------------------- | ||||
|  * Connect Dialog | ||||
|  * ---------------------------------------- | ||||
|  */ | ||||
| 
 | ||||
| #noVNC_connect_dlg { | ||||
|   transition: 0.5s ease-in-out; | ||||
| 
 | ||||
|   transform: scale(0, 0); | ||||
|   visibility: hidden; | ||||
|   opacity: 0; | ||||
| } | ||||
| #noVNC_connect_dlg.noVNC_open { | ||||
|   transform: scale(1, 1); | ||||
|   visibility: visible; | ||||
|   opacity: 1; | ||||
| } | ||||
| #noVNC_connect_dlg .noVNC_logo { | ||||
|   transition: 0.5s ease-in-out; | ||||
|   padding: 10px; | ||||
|   margin-bottom: 10px; | ||||
| 
 | ||||
|   font-size: 80px; | ||||
|   text-align: center; | ||||
| 
 | ||||
|   border-radius: 5px; | ||||
| } | ||||
| @media (max-width: 440px) { | ||||
|   #noVNC_connect_dlg { | ||||
|     max-width: calc(100vw - 100px); | ||||
|   } | ||||
|   #noVNC_connect_dlg .noVNC_logo { | ||||
|     font-size: calc(25vw - 30px); | ||||
|   } | ||||
| } | ||||
| #noVNC_connect_button { | ||||
|   cursor: pointer; | ||||
| 
 | ||||
|   padding: 10px; | ||||
| 
 | ||||
|   color: white; | ||||
|   background-color: rgb(110, 132, 163); | ||||
|   border-radius: 12px; | ||||
| 
 | ||||
|   text-align: center; | ||||
|   font-size: 20px; | ||||
| 
 | ||||
|   box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5); | ||||
| } | ||||
| #noVNC_connect_button div { | ||||
|   margin: 2px; | ||||
|   padding: 5px 30px; | ||||
|   border: 1px solid rgb(83, 99, 122); | ||||
|   border-bottom-width: 2px; | ||||
|   border-radius: 5px; | ||||
|   background: linear-gradient(to top, rgb(110, 132, 163), rgb(99, 119, 147)); | ||||
| 
 | ||||
|   /* This avoids it jumping around when :active */ | ||||
|   vertical-align: middle; | ||||
| } | ||||
| #noVNC_connect_button div:active { | ||||
|   border-bottom-width: 1px; | ||||
|   margin-top: 3px; | ||||
| } | ||||
| :root:not(.noVNC_touch) #noVNC_connect_button div:hover { | ||||
|   background: linear-gradient(to top, rgb(110, 132, 163), rgb(105, 125, 155)); | ||||
| } | ||||
| 
 | ||||
| #noVNC_connect_button img { | ||||
|   vertical-align: bottom; | ||||
|   height: 1.3em; | ||||
| } | ||||
| 
 | ||||
| /* ---------------------------------------- | ||||
|  * Password Dialog | ||||
|  * ---------------------------------------- | ||||
|  */ | ||||
| 
 | ||||
| #noVNC_password_dlg { | ||||
|   position: relative; | ||||
| 
 | ||||
|   transform: translateY(-50px); | ||||
| } | ||||
| #noVNC_password_dlg.noVNC_open { | ||||
|   transform: translateY(0); | ||||
| } | ||||
| #noVNC_password_dlg ul { | ||||
|   list-style: none; | ||||
|   margin: 0px; | ||||
|   padding: 0px; | ||||
| } | ||||
| 
 | ||||
| /* ---------------------------------------- | ||||
|  * Main Area | ||||
|  * ---------------------------------------- | ||||
|  */ | ||||
| 
 | ||||
| /* Transition screen */ | ||||
| #noVNC_transition { | ||||
|   display: none; | ||||
| 
 | ||||
|   position: fixed; | ||||
|   top: 0; | ||||
|   left: 0; | ||||
|   bottom: 0; | ||||
|   right: 0; | ||||
| 
 | ||||
|   color: white; | ||||
|   background: rgba(0, 0, 0, 0.5); | ||||
|   z-index: 50; | ||||
| 
 | ||||
|   /*display: flex;*/ | ||||
|   align-items: center; | ||||
|   justify-content: center; | ||||
|   flex-direction: column; | ||||
| } | ||||
| :root.noVNC_loading #noVNC_transition, | ||||
| :root.noVNC_connecting #noVNC_transition, | ||||
| :root.noVNC_disconnecting #noVNC_transition, | ||||
| :root.noVNC_reconnecting #noVNC_transition { | ||||
|   display: flex; | ||||
| } | ||||
| :root:not(.noVNC_reconnecting) #noVNC_cancel_reconnect_button { | ||||
|   display: none; | ||||
| } | ||||
| #noVNC_transition_text { | ||||
|   font-size: 1.5em; | ||||
| } | ||||
| 
 | ||||
| /* Main container */ | ||||
| #noVNC_container { | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
|   background-color: #313131; | ||||
|   border-bottom-right-radius: 800px 600px; | ||||
|   /*border-top-left-radius: 800px 600px;*/ | ||||
| } | ||||
| 
 | ||||
| #noVNC_keyboardinput { | ||||
|   width: 1px; | ||||
|   height: 1px; | ||||
|   background-color: #fff; | ||||
|   color: #fff; | ||||
|   border: 0; | ||||
|   position: absolute; | ||||
|   left: -40px; | ||||
|   z-index: -1; | ||||
|   ime-mode: disabled; | ||||
| } | ||||
| 
 | ||||
| /*Default noVNC logo.*/ | ||||
| /* From: http://fonts.googleapis.com/css?family=Orbitron:700 */ | ||||
| @font-face { | ||||
|   font-family: 'Orbitron'; | ||||
|   font-style: normal; | ||||
|   font-weight: 700; | ||||
|   src: local('?'), url('Orbitron700.woff') format('woff'), | ||||
|                    url('Orbitron700.ttf') format('truetype'); | ||||
| } | ||||
| 
 | ||||
| .noVNC_logo { | ||||
|   color:yellow; | ||||
|   font-family: 'Orbitron', 'OrbitronTTF', sans-serif; | ||||
|   line-height:90%; | ||||
|   text-shadow: 0.1em 0.1em 0 black; | ||||
| } | ||||
| .noVNC_logo span{ | ||||
|   color:green; | ||||
| } | ||||
| 
 | ||||
| #noVNC_bell { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| /* ---------------------------------------- | ||||
|  * Media sizing | ||||
|  * ---------------------------------------- | ||||
|  */ | ||||
| 
 | ||||
| @media screen and (max-width: 640px){ | ||||
|   #noVNC_logo { | ||||
|     font-size: 150px; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| @media screen and (min-width: 321px) and (max-width: 480px) { | ||||
|   #noVNC_logo { | ||||
|     font-size: 110px; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| @media screen and (max-width: 320px) { | ||||
|   #noVNC_logo { | ||||
|     font-size: 90px; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										63
									
								
								static/js/novnc/app/styles/lite.css
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,63 @@ | |||
| /* | ||||
|  * noVNC auto CSS | ||||
|  * Copyright (C) 2012 Joel Martin | ||||
|  * Copyright (C) 2017 Samuel Mannehed for Cendio AB | ||||
|  * noVNC is licensed under the MPL 2.0 (see LICENSE.txt) | ||||
|  * This file is licensed under the 2-Clause BSD license (see LICENSE.txt). | ||||
|  */ | ||||
| 
 | ||||
| body { | ||||
|   margin:0; | ||||
|   background-color:#313131; | ||||
|   border-bottom-right-radius: 800px 600px; | ||||
|   height:100%; | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
| } | ||||
| 
 | ||||
| html { | ||||
|   background-color:#494949; | ||||
|   height:100%; | ||||
| } | ||||
| 
 | ||||
| #noVNC_status_bar { | ||||
|   width: 100%; | ||||
|   display:flex; | ||||
|   justify-content: space-between; | ||||
| } | ||||
| 
 | ||||
| #noVNC_status { | ||||
|   color: #fff; | ||||
|   font: bold 12px Helvetica; | ||||
|   margin: auto; | ||||
| } | ||||
| 
 | ||||
| .noVNC_status_normal { | ||||
|   background: linear-gradient(#b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); | ||||
| } | ||||
| 
 | ||||
| .noVNC_status_error { | ||||
|   background: linear-gradient(#c83737 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); | ||||
| } | ||||
| 
 | ||||
| .noVNC_status_warn { | ||||
|   background: linear-gradient(#b4b41e 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); | ||||
| } | ||||
| 
 | ||||
| .noNVC_shown { | ||||
|   display: inline; | ||||
| } | ||||
| .noVNC_hidden { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| #noVNC_left_dummy_elem { | ||||
|   flex: 1; | ||||
| } | ||||
| 
 | ||||
| #noVNC_buttons { | ||||
|   padding: 1px; | ||||
|   flex: 1; | ||||
|   display: flex; | ||||
|   justify-content: flex-end; | ||||
| } | ||||
							
								
								
									
										1620
									
								
								static/js/novnc/app/ui.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										270
									
								
								static/js/novnc/app/webutil.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,270 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| exports.init_logging = init_logging; | ||||
| exports.getQueryVar = getQueryVar; | ||||
| exports.getHashVar = getHashVar; | ||||
| exports.getConfigVar = getConfigVar; | ||||
| exports.createCookie = createCookie; | ||||
| exports.readCookie = readCookie; | ||||
| exports.eraseCookie = eraseCookie; | ||||
| exports.initSettings = initSettings; | ||||
| exports.writeSetting = writeSetting; | ||||
| exports.readSetting = readSetting; | ||||
| exports.eraseSetting = eraseSetting; | ||||
| exports.injectParamIfMissing = injectParamIfMissing; | ||||
| exports.fetchJSON = fetchJSON; | ||||
| 
 | ||||
| var _logging = require("../core/util/logging.js"); | ||||
| 
 | ||||
| // init log level reading the logging HTTP param
 | ||||
| function init_logging(level) { | ||||
|     "use strict"; | ||||
| 
 | ||||
|     if (typeof level !== "undefined") { | ||||
|         (0, _logging.init_logging)(level); | ||||
|     } else { | ||||
|         var param = document.location.href.match(/logging=([A-Za-z0-9\._\-]*)/); | ||||
|         (0, _logging.init_logging)(param || undefined); | ||||
|     } | ||||
| } /* | ||||
|    * noVNC: HTML5 VNC client | ||||
|    * Copyright (C) 2012 Joel Martin | ||||
|    * Copyright (C) 2013 NTT corp. | ||||
|    * Licensed under MPL 2.0 (see LICENSE.txt) | ||||
|    * | ||||
|    * See README.md for usage and integration instructions. | ||||
|    */ | ||||
| 
 | ||||
| ; | ||||
| 
 | ||||
| // Read a query string variable
 | ||||
| function getQueryVar(name, defVal) { | ||||
|     "use strict"; | ||||
| 
 | ||||
|     var re = new RegExp('.*[?&]' + name + '=([^&#]*)'), | ||||
|         match = document.location.href.match(re); | ||||
|     if (typeof defVal === 'undefined') { | ||||
|         defVal = null; | ||||
|     } | ||||
|     if (match) { | ||||
|         return decodeURIComponent(match[1]); | ||||
|     } else { | ||||
|         return defVal; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| // Read a hash fragment variable
 | ||||
| function getHashVar(name, defVal) { | ||||
|     "use strict"; | ||||
| 
 | ||||
|     var re = new RegExp('.*[&#]' + name + '=([^&]*)'), | ||||
|         match = document.location.hash.match(re); | ||||
|     if (typeof defVal === 'undefined') { | ||||
|         defVal = null; | ||||
|     } | ||||
|     if (match) { | ||||
|         return decodeURIComponent(match[1]); | ||||
|     } else { | ||||
|         return defVal; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| // Read a variable from the fragment or the query string
 | ||||
| // Fragment takes precedence
 | ||||
| function getConfigVar(name, defVal) { | ||||
|     "use strict"; | ||||
| 
 | ||||
|     var val = getHashVar(name); | ||||
|     if (val === null) { | ||||
|         val = getQueryVar(name, defVal); | ||||
|     } | ||||
|     return val; | ||||
| }; | ||||
| 
 | ||||
| /* | ||||
|  * Cookie handling. Dervied from: http://www.quirksmode.org/js/cookies.html
 | ||||
|  */ | ||||
| 
 | ||||
| // No days means only for this browser session
 | ||||
| function createCookie(name, value, days) { | ||||
|     "use strict"; | ||||
| 
 | ||||
|     var date, expires; | ||||
|     if (days) { | ||||
|         date = new Date(); | ||||
|         date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000); | ||||
|         expires = "; expires=" + date.toGMTString(); | ||||
|     } else { | ||||
|         expires = ""; | ||||
|     } | ||||
| 
 | ||||
|     var secure; | ||||
|     if (document.location.protocol === "https:") { | ||||
|         secure = "; secure"; | ||||
|     } else { | ||||
|         secure = ""; | ||||
|     } | ||||
|     document.cookie = name + "=" + value + expires + "; path=/" + secure; | ||||
| }; | ||||
| 
 | ||||
| function readCookie(name, defaultValue) { | ||||
|     "use strict"; | ||||
| 
 | ||||
|     var nameEQ = name + "=", | ||||
|         ca = document.cookie.split(';'); | ||||
| 
 | ||||
|     for (var i = 0; i < ca.length; i += 1) { | ||||
|         var c = ca[i]; | ||||
|         while (c.charAt(0) === ' ') { | ||||
|             c = c.substring(1, c.length); | ||||
|         } | ||||
|         if (c.indexOf(nameEQ) === 0) { | ||||
|             return c.substring(nameEQ.length, c.length); | ||||
|         } | ||||
|     } | ||||
|     return typeof defaultValue !== 'undefined' ? defaultValue : null; | ||||
| }; | ||||
| 
 | ||||
| function eraseCookie(name) { | ||||
|     "use strict"; | ||||
| 
 | ||||
|     createCookie(name, "", -1); | ||||
| }; | ||||
| 
 | ||||
| /* | ||||
|  * Setting handling. | ||||
|  */ | ||||
| 
 | ||||
| var settings = {}; | ||||
| 
 | ||||
| function initSettings(callback /*, ...callbackArgs */) { | ||||
|     "use strict"; | ||||
| 
 | ||||
|     var callbackArgs = Array.prototype.slice.call(arguments, 1); | ||||
|     if (window.chrome && window.chrome.storage) { | ||||
|         window.chrome.storage.sync.get(function (cfg) { | ||||
|             settings = cfg; | ||||
|             if (callback) { | ||||
|                 callback.apply(this, callbackArgs); | ||||
|             } | ||||
|         }); | ||||
|     } else { | ||||
|         // No-op
 | ||||
|         if (callback) { | ||||
|             callback.apply(this, callbackArgs); | ||||
|         } | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| // No days means only for this browser session
 | ||||
| function writeSetting(name, value) { | ||||
|     "use strict"; | ||||
| 
 | ||||
|     if (window.chrome && window.chrome.storage) { | ||||
|         if (settings[name] !== value) { | ||||
|             settings[name] = value; | ||||
|             window.chrome.storage.sync.set(settings); | ||||
|         } | ||||
|     } else { | ||||
|         localStorage.setItem(name, value); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| function readSetting(name, defaultValue) { | ||||
|     "use strict"; | ||||
| 
 | ||||
|     var value; | ||||
|     if (window.chrome && window.chrome.storage) { | ||||
|         value = settings[name]; | ||||
|     } else { | ||||
|         value = localStorage.getItem(name); | ||||
|     } | ||||
|     if (typeof value === "undefined") { | ||||
|         value = null; | ||||
|     } | ||||
|     if (value === null && typeof defaultValue !== "undefined") { | ||||
|         return defaultValue; | ||||
|     } else { | ||||
|         return value; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| function eraseSetting(name) { | ||||
|     "use strict"; | ||||
| 
 | ||||
|     if (window.chrome && window.chrome.storage) { | ||||
|         window.chrome.storage.sync.remove(name); | ||||
|         delete settings[name]; | ||||
|     } else { | ||||
|         localStorage.removeItem(name); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| function injectParamIfMissing(path, param, value) { | ||||
|     // force pretend that we're dealing with a relative path
 | ||||
|     // (assume that we wanted an extra if we pass one in)
 | ||||
|     path = "/" + path; | ||||
| 
 | ||||
|     var elem = document.createElement('a'); | ||||
|     elem.href = path; | ||||
| 
 | ||||
|     var param_eq = encodeURIComponent(param) + "="; | ||||
|     var query; | ||||
|     if (elem.search) { | ||||
|         query = elem.search.slice(1).split('&'); | ||||
|     } else { | ||||
|         query = []; | ||||
|     } | ||||
| 
 | ||||
|     if (!query.some(function (v) { | ||||
|         return v.startsWith(param_eq); | ||||
|     })) { | ||||
|         query.push(param_eq + encodeURIComponent(value)); | ||||
|         elem.search = "?" + query.join("&"); | ||||
|     } | ||||
| 
 | ||||
|     // some browsers (e.g. IE11) may occasionally omit the leading slash
 | ||||
|     // in the elem.pathname string. Handle that case gracefully.
 | ||||
|     if (elem.pathname.charAt(0) == "/") { | ||||
|         return elem.pathname.slice(1) + elem.search + elem.hash; | ||||
|     } else { | ||||
|         return elem.pathname + elem.search + elem.hash; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| // sadly, we can't use the Fetch API until we decide to drop
 | ||||
| // IE11 support or polyfill promises and fetch in IE11.
 | ||||
| // resolve will receive an object on success, while reject
 | ||||
| // will receive either an event or an error on failure.
 | ||||
| function fetchJSON(path, resolve, reject) { | ||||
|     // NB: IE11 doesn't support JSON as a responseType
 | ||||
|     var req = new XMLHttpRequest(); | ||||
|     req.open('GET', path); | ||||
| 
 | ||||
|     req.onload = function () { | ||||
|         if (req.status === 200) { | ||||
|             try { | ||||
|                 var resObj = JSON.parse(req.responseText); | ||||
|             } catch (err) { | ||||
|                 reject(err); | ||||
|                 return; | ||||
|             } | ||||
|             resolve(resObj); | ||||
|         } else { | ||||
|             reject(new Error("XHR got non-200 status while trying to load '" + path + "': " + req.status)); | ||||
|         } | ||||
|     }; | ||||
| 
 | ||||
|     req.onerror = function (evt) { | ||||
|         reject(new Error("XHR encountered an error while trying to load '" + path + "': " + evt.message)); | ||||
|     }; | ||||
| 
 | ||||
|     req.ontimeout = function (evt) { | ||||
|         reject(new Error("XHR timed out while trying to load '" + path + "'")); | ||||
|     }; | ||||
| 
 | ||||
|     req.send(); | ||||
| } | ||||
|  | @ -1,405 +0,0 @@ | |||
| /* | ||||
|  * noVNC base CSS | ||||
|  * Copyright (C) 2012 Joel Martin | ||||
|  * noVNC is licensed under the MPL 2.0 (see LICENSE.txt) | ||||
|  * This file is licensed under the 2-Clause BSD license (see LICENSE.txt). | ||||
|  */ | ||||
| 
 | ||||
| body { | ||||
|   margin:0; | ||||
|   padding:0; | ||||
|   font-family: Helvetica; | ||||
|   /*Background image with light grey curve.*/ | ||||
|   background-color:#494949; | ||||
|   background-repeat:no-repeat; | ||||
|   background-position:right bottom; | ||||
|   height:100%; | ||||
| } | ||||
| 
 | ||||
| html { | ||||
|   height:100%; | ||||
| } | ||||
| 
 | ||||
| #noVNC_controls ul { | ||||
|   list-style: none; | ||||
|   margin: 0px; | ||||
|   padding: 0px; | ||||
| } | ||||
| #noVNC_controls li { | ||||
|   padding-bottom:8px; | ||||
| } | ||||
| 
 | ||||
| #noVNC_host { | ||||
|   width:150px; | ||||
| } | ||||
| #noVNC_port { | ||||
|   width: 80px; | ||||
| } | ||||
| #noVNC_password { | ||||
|   width: 150px; | ||||
| } | ||||
| #noVNC_encrypt { | ||||
| } | ||||
| #noVNC_connectTimeout { | ||||
|   width: 30px; | ||||
| } | ||||
| #noVNC_path { | ||||
|   width: 100px; | ||||
| } | ||||
| #noVNC_connect_button { | ||||
|   width: 110px; | ||||
|   float:right; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| #noVNC_view_drag_button { | ||||
|   display: none; | ||||
| } | ||||
| #sendCtrlAltDelButton { | ||||
|   display: none; | ||||
| } | ||||
| #noVNC_mobile_buttons { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| .noVNC-buttons-left { | ||||
|   float: left; | ||||
|   padding-left:10px; | ||||
|   padding-top:4px; | ||||
| } | ||||
| 
 | ||||
| .noVNC-buttons-right { | ||||
|   float:right; | ||||
|   right: 0px; | ||||
|   padding-right:10px; | ||||
|   padding-top:4px; | ||||
| } | ||||
| 
 | ||||
| #noVNC_status_bar { | ||||
|   margin-top: 0px; | ||||
|   padding: 0px; | ||||
| } | ||||
| 
 | ||||
| #noVNC_status_bar div { | ||||
|   font-size: 12px; | ||||
|   padding-top: 4px; | ||||
|   width:100%; | ||||
| } | ||||
| 
 | ||||
| #noVNC_status { | ||||
|   height:20px; | ||||
|   text-align: center; | ||||
| } | ||||
| #noVNC_settings_menu { | ||||
|   margin: 3px; | ||||
|   text-align: left; | ||||
| } | ||||
| #noVNC_settings_menu ul { | ||||
|   list-style: none; | ||||
|   margin: 0px; | ||||
|   padding: 0px; | ||||
| } | ||||
| 
 | ||||
| #noVNC_apply { | ||||
|   float:right; | ||||
| } | ||||
| 
 | ||||
| .noVNC_status_normal { | ||||
|   background: #eee; | ||||
| } | ||||
| .noVNC_status_error { | ||||
|   background: #f44; | ||||
| } | ||||
| .noVNC_status_warn { | ||||
|   background: #ff4; | ||||
| } | ||||
| 
 | ||||
| /* Do not set width/height for VNC_screen or VNC_canvas or incorrect | ||||
|  * scaling will occur. Canvas resizes to remote VNC settings */ | ||||
| #noVNC_screen_pad { | ||||
|   margin: 0px; | ||||
|   padding: 0px; | ||||
|   height: 44px; | ||||
| } | ||||
| #noVNC_screen { | ||||
|   text-align: center; | ||||
|   display: table; | ||||
|   width:100%; | ||||
|   height:100%; | ||||
|   background-color:#313131; | ||||
|   border-bottom-right-radius: 800px 600px; | ||||
|   /*border-top-left-radius: 800px 600px;*/ | ||||
| } | ||||
| 
 | ||||
| #noVNC_container, #noVNC_canvas { | ||||
|   margin: 0px; | ||||
|   padding: 0px; | ||||
| } | ||||
| 
 | ||||
| #noVNC_canvas { | ||||
|   left: 0px; | ||||
| } | ||||
| 
 | ||||
| #VNC_clipboard_clear_button { | ||||
|   float:right; | ||||
| } | ||||
| #VNC_clipboard_text { | ||||
|   font-size: 11px; | ||||
| } | ||||
| 
 | ||||
| #noVNC_clipboard_clear_button { | ||||
|   float:right; | ||||
| } | ||||
| 
 | ||||
| /*Bubble contents divs*/ | ||||
| #noVNC_settings { | ||||
|   display:none; | ||||
|   margin-top:77px; | ||||
|   right:20px; | ||||
|   position:fixed; | ||||
| } | ||||
| 
 | ||||
| #noVNC_controls { | ||||
|   display:none; | ||||
|   margin-top:77px; | ||||
|   right:12px; | ||||
|   position:fixed; | ||||
| } | ||||
| #noVNC_controls.top:after  { | ||||
|   right:15px; | ||||
| } | ||||
| 
 | ||||
| #noVNC_description { | ||||
|   display:none; | ||||
|   position:fixed; | ||||
| 
 | ||||
|   margin-top:77px; | ||||
|   right:20px; | ||||
|   left:20px; | ||||
|   padding:15px; | ||||
|   color:#000; | ||||
|   background:#eee; /* default background for browsers without gradient support */ | ||||
| 
 | ||||
|   border:2px solid #E0E0E0; | ||||
|   -webkit-border-radius:10px; | ||||
|   -moz-border-radius:10px; | ||||
|   border-radius:10px; | ||||
| } | ||||
| 
 | ||||
| #noVNC_clipboard { | ||||
|   display:none; | ||||
|   margin-top:77px; | ||||
|   right:30px; | ||||
|   position:fixed; | ||||
| } | ||||
| #noVNC_clipboard.top:after { | ||||
|   right:85px; | ||||
| } | ||||
| 
 | ||||
| #keyboardinput { | ||||
|   width:1px; | ||||
|   height:1px; | ||||
|   background-color:#fff; | ||||
|   color:#fff; | ||||
|   border:0; | ||||
|   position: relative; | ||||
|   left: -40px; | ||||
|   z-index: -1; | ||||
| } | ||||
| 
 | ||||
| .noVNC_status_warn { | ||||
|   background-color:yellow; | ||||
| } | ||||
| 
 | ||||
| /* | ||||
|  * Advanced Styling | ||||
|  */ | ||||
| 
 | ||||
| /* Control bar */ | ||||
| #noVNC-control-bar { | ||||
|   position:fixed; | ||||
|   background: #b2bdcd; /* Old browsers */ | ||||
|   background: -moz-linear-gradient(top, #b2bdcd 0%, #899cb3 49%, #7e93af 51%, #6e84a3 100%); /* FF3.6+ */ | ||||
|   background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#b2bdcd), color-stop(49%,#899cb3), color-stop(51%,#7e93af), color-stop(100%,#6e84a3)); /* Chrome,Safari4+ */ | ||||
|   background: -webkit-linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Chrome10+,Safari5.1+ */ | ||||
|   background: -o-linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Opera11.10+ */ | ||||
|   background: -ms-linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* IE10+ */ | ||||
|   background: linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* W3C */ | ||||
| 
 | ||||
|   display:block; | ||||
|   height:44px; | ||||
|   left:0; | ||||
|   top:0; | ||||
|   width:100%; | ||||
|   z-index:200; | ||||
| } | ||||
| 
 | ||||
| .noVNC_status_button { | ||||
|   padding: 4px 4px; | ||||
|   vertical-align: middle; | ||||
|   border:1px solid #869dbc; | ||||
|   -webkit-border-radius: 6px; | ||||
|   -moz-border-radius: 6px; | ||||
|   border-radius: 6px; | ||||
|   background: #b2bdcd; /* Old browsers */ | ||||
|   background: -moz-linear-gradient(top, #b2bdcd 0%, #899cb3 49%, #7e93af 51%, #6e84a3 100%); /* FF3.6+ */ | ||||
|   background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#b2bdcd), color-stop(49%,#899cb3), color-stop(51%,#7e93af), color-stop(100%,#6e84a3)); /* Chrome,Safari4+ */ | ||||
|   background: -webkit-linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Chrome10+,Safari5.1+ */ | ||||
|   background: -o-linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Opera11.10+ */ | ||||
|   background: -ms-linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* IE10+ */ | ||||
|   filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#b2bdcd', endColorstr='#6e84a3',GradientType=0 ); /* IE6-9 */ | ||||
|   background: linear-gradient(top, #b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* W3C */ | ||||
|   /*box-shadow:inset 0.4px 0.4px 0.4px #000000;*/ | ||||
| } | ||||
| 
 | ||||
| .noVNC_status_button_selected { | ||||
|   padding: 4px 4px; | ||||
|   vertical-align: middle; | ||||
|   border:1px solid #4366a9; | ||||
|   -webkit-border-radius: 6px; | ||||
|   -moz-border-radius: 6px; | ||||
|   background: #779ced; /* Old browsers */ | ||||
|   background: -moz-linear-gradient(top, #779ced 0%, #3970e0 49%, #2160dd 51%, #2463df 100%); /* FF3.6+ */ | ||||
|   background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#779ced), color-stop(49%,#3970e0), color-stop(51%,#2160dd), color-stop(100%,#2463df)); /* Chrome,Safari4+ */ | ||||
|   background: -webkit-linear-gradient(top, #779ced 0%,#3970e0 49%,#2160dd 51%,#2463df 100%); /* Chrome10+,Safari5.1+ */ | ||||
|   background: -o-linear-gradient(top, #779ced 0%,#3970e0 49%,#2160dd 51%,#2463df 100%); /* Opera11.10+ */ | ||||
|   background: -ms-linear-gradient(top, #779ced 0%,#3970e0 49%,#2160dd 51%,#2463df 100%); /* IE10+ */ | ||||
|   filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#779ced', endColorstr='#2463df',GradientType=0 ); /* IE6-9 */ | ||||
|   background: linear-gradient(top, #779ced 0%,#3970e0 49%,#2160dd 51%,#2463df 100%); /* W3C */ | ||||
|  /*box-shadow:inset 0.4px 0.4px 0.4px #000000;*/ | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /*Settings Bubble*/ | ||||
| .triangle-right { | ||||
|   position:relative; | ||||
|   padding:15px; | ||||
|   margin:1em 0 3em; | ||||
|   color:#fff; | ||||
|   background:#fff; /* default background for browsers without gradient support */ | ||||
|   /* css3 */ | ||||
|   /*background:-webkit-gradient(linear, 0 0, 0 100%, from(#2e88c4), to(#075698)); | ||||
|   background:-moz-linear-gradient(#2e88c4, #075698); | ||||
|   background:-o-linear-gradient(#2e88c4, #075698); | ||||
|   background:linear-gradient(#2e88c4, #075698);*/ | ||||
|   -webkit-border-radius:10px; | ||||
|   -moz-border-radius:10px; | ||||
|   border-radius:10px; | ||||
|   color:#000; | ||||
|   border:2px solid #E0E0E0; | ||||
| } | ||||
| 
 | ||||
| .triangle-right.top:after { | ||||
|   border-color: transparent #E0E0E0; | ||||
|   border-width: 20px 20px 0 0; | ||||
|   bottom: auto; | ||||
|   left: auto; | ||||
|   right: 50px; | ||||
|   top: -20px; | ||||
| } | ||||
| 
 | ||||
| .triangle-right:after { | ||||
|   content:""; | ||||
|   position:absolute; | ||||
|   bottom:-20px; /* value = - border-top-width - border-bottom-width */ | ||||
|   left:50px; /* controls horizontal position */ | ||||
|   border-width:20px 0 0 20px; /* vary these values to change the angle of the vertex */ | ||||
|   border-style:solid; | ||||
|   border-color:#E0E0E0 transparent; | ||||
|   /* reduce the damage in FF3.0 */ | ||||
|   display:block; | ||||
|   width:0; | ||||
| } | ||||
| 
 | ||||
| .triangle-right.top:after { | ||||
|   top:-40px; /* value = - border-top-width - border-bottom-width */ | ||||
|   right:50px; /* controls horizontal position */ | ||||
|   bottom:auto; | ||||
|   left:auto; | ||||
|   border-width:40px 40px 0 0; /* vary these values to change the angle of the vertex */ | ||||
|   border-color:transparent #E0E0E0; | ||||
| } | ||||
| 
 | ||||
| /*Default noVNC logo.*/ | ||||
| /* From: http://fonts.googleapis.com/css?family=Orbitron:700 */ | ||||
| @font-face { | ||||
|   font-family: 'Orbitron'; | ||||
|   font-style: normal; | ||||
|   font-weight: 700; | ||||
|   src: local('?'), url('Orbitron700.woff') format('woff'), | ||||
|                    url('Orbitron700.ttf') format('truetype'); | ||||
| } | ||||
| 
 | ||||
| #noVNC_logo { | ||||
|   margin-top: 170px; | ||||
|   margin-left: 10px; | ||||
|   color:yellow; | ||||
|   text-align:left; | ||||
|   font-family: 'Orbitron', 'OrbitronTTF', sans-serif; | ||||
|   line-height:90%; | ||||
|   text-shadow: | ||||
|        5px 5px 0 #000, | ||||
|       -1px -1px 0 #000, | ||||
|        1px -1px 0 #000, | ||||
|       -1px 1px 0 #000, | ||||
|        1px 1px 0 #000; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| #noVNC_logo span{ | ||||
|   color:green; | ||||
| } | ||||
| 
 | ||||
| /* ---------------------------------------- | ||||
|  * Media sizing | ||||
|  * ---------------------------------------- | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| .noVNC_status_button { | ||||
|   font-size: 12px; | ||||
| } | ||||
| 
 | ||||
| #noVNC_clipboard_text { | ||||
|   width: 500px; | ||||
| } | ||||
| 
 | ||||
| #noVNC_logo { | ||||
|   font-size: 180px; | ||||
| } | ||||
| 
 | ||||
| @media screen and (min-width: 481px) and (max-width: 640px) { | ||||
|   .noVNC_status_button { | ||||
|     font-size: 10px; | ||||
|   } | ||||
|   #noVNC_clipboard_text { | ||||
|     width: 410px; | ||||
|   } | ||||
|   #noVNC_logo { | ||||
|     font-size: 150px; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| @media screen and (min-width: 321px) and (max-width: 480px) { | ||||
|   .noVNC_status_button { | ||||
|     font-size: 10px; | ||||
|   } | ||||
|   #noVNC_clipboard_text { | ||||
|     width: 250px; | ||||
|   } | ||||
|   #noVNC_logo { | ||||
|     font-size: 110px; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| @media screen and (max-width: 320px) { | ||||
|   .noVNC_status_button { | ||||
|     font-size: 9px; | ||||
|   } | ||||
|   #noVNC_clipboard_text { | ||||
|     width: 220px; | ||||
|   } | ||||
|   #noVNC_logo { | ||||
|     font-size: 90px; | ||||
|   } | ||||
| } | ||||
|  | @ -1,115 +0,0 @@ | |||
| /* This Source Code Form is subject to the terms of the Mozilla Public | ||||
|  * License, v. 2.0. If a copy of the MPL was not distributed with this | ||||
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | ||||
| 
 | ||||
| // From: http://hg.mozilla.org/mozilla-central/raw-file/ec10630b1a54/js/src/devtools/jint/sunspider/string-base64.js
 | ||||
| 
 | ||||
| /*jslint white: false, bitwise: false, plusplus: false */ | ||||
| /*global console */ | ||||
| 
 | ||||
| var Base64 = { | ||||
| 
 | ||||
| /* Convert data (an array of integers) to a Base64 string. */ | ||||
| toBase64Table : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.split(''), | ||||
| base64Pad     : '=', | ||||
| 
 | ||||
| encode: function (data) { | ||||
|     "use strict"; | ||||
|     var result = ''; | ||||
|     var toBase64Table = Base64.toBase64Table; | ||||
|     var length = data.length | ||||
|     var lengthpad = (length%3); | ||||
|     var i = 0, j = 0; | ||||
|     // Convert every three bytes to 4 ascii characters.
 | ||||
|   /* BEGIN LOOP */ | ||||
|     for (i = 0; i < (length - 2); i += 3) { | ||||
|         result += toBase64Table[data[i] >> 2]; | ||||
|         result += toBase64Table[((data[i] & 0x03) << 4) + (data[i+1] >> 4)]; | ||||
|         result += toBase64Table[((data[i+1] & 0x0f) << 2) + (data[i+2] >> 6)]; | ||||
|         result += toBase64Table[data[i+2] & 0x3f]; | ||||
|     } | ||||
|   /* END LOOP */ | ||||
| 
 | ||||
|     // Convert the remaining 1 or 2 bytes, pad out to 4 characters.
 | ||||
|     if (lengthpad === 2) { | ||||
|         j = length - lengthpad; | ||||
|         result += toBase64Table[data[j] >> 2]; | ||||
|         result += toBase64Table[((data[j] & 0x03) << 4) + (data[j+1] >> 4)]; | ||||
|         result += toBase64Table[(data[j+1] & 0x0f) << 2]; | ||||
|         result += toBase64Table[64]; | ||||
|     } else if (lengthpad === 1) { | ||||
|         j = length - lengthpad; | ||||
|         result += toBase64Table[data[j] >> 2]; | ||||
|         result += toBase64Table[(data[j] & 0x03) << 4]; | ||||
|         result += toBase64Table[64]; | ||||
|         result += toBase64Table[64]; | ||||
|     } | ||||
| 
 | ||||
|     return result; | ||||
| }, | ||||
| 
 | ||||
| /* Convert Base64 data to a string */ | ||||
| toBinaryTable : [ | ||||
|     -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, | ||||
|     -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, | ||||
|     -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, | ||||
|     52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, | ||||
|     -1, 0, 1, 2,  3, 4, 5, 6,  7, 8, 9,10, 11,12,13,14, | ||||
|     15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1, | ||||
|     -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, | ||||
|     41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 | ||||
| ], | ||||
| 
 | ||||
| decode: function (data, offset) { | ||||
|     "use strict"; | ||||
|     offset = typeof(offset) !== 'undefined' ? offset : 0; | ||||
|     var toBinaryTable = Base64.toBinaryTable; | ||||
|     var base64Pad = Base64.base64Pad; | ||||
|     var result, result_length, idx, i, c, padding; | ||||
|     var leftbits = 0; // number of bits decoded, but yet to be appended
 | ||||
|     var leftdata = 0; // bits decoded, but yet to be appended
 | ||||
|     var data_length = data.indexOf('=') - offset; | ||||
| 
 | ||||
|     if (data_length < 0) { data_length = data.length - offset; } | ||||
| 
 | ||||
|     /* Every four characters is 3 resulting numbers */ | ||||
|     result_length = (data_length >> 2) * 3 + Math.floor((data_length%4)/1.5); | ||||
|     result = new Array(result_length); | ||||
| 
 | ||||
|     // Convert one by one.
 | ||||
|   /* BEGIN LOOP */ | ||||
|     for (idx = 0, i = offset; i < data.length; i++) { | ||||
|         c = toBinaryTable[data.charCodeAt(i) & 0x7f]; | ||||
|         padding = (data.charAt(i) === base64Pad); | ||||
|         // Skip illegal characters and whitespace
 | ||||
|         if (c === -1) { | ||||
|             console.error("Illegal character code " + data.charCodeAt(i) + " at position " + i); | ||||
|             continue; | ||||
|         } | ||||
|          | ||||
|         // Collect data into leftdata, update bitcount
 | ||||
|         leftdata = (leftdata << 6) | c; | ||||
|         leftbits += 6; | ||||
| 
 | ||||
|         // If we have 8 or more bits, append 8 bits to the result
 | ||||
|         if (leftbits >= 8) { | ||||
|             leftbits -= 8; | ||||
|             // Append if not padding.
 | ||||
|             if (!padding) { | ||||
|                 result[idx++] = (leftdata >> leftbits) & 0xff; | ||||
|             } | ||||
|             leftdata &= (1 << leftbits) - 1; | ||||
|         } | ||||
|     } | ||||
|   /* END LOOP */ | ||||
| 
 | ||||
|     // If there are any bits left, the base64 string was corrupted
 | ||||
|     if (leftbits) { | ||||
|         throw {name: 'Base64-Error',  | ||||
|                message: 'Corrupted base64 string'}; | ||||
|     } | ||||
| 
 | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| }; /* End of Base64 namespace */ | ||||
|  | @ -1,52 +0,0 @@ | |||
| /* | ||||
|  * noVNC black CSS | ||||
|  * Copyright (C) 2012 Joel Martin | ||||
|  * noVNC is licensed under the MPL 2.0 (see LICENSE.txt) | ||||
|  * This file is licensed under the 2-Clause BSD license (see LICENSE.txt). | ||||
|  */ | ||||
| 
 | ||||
| #keyboardinput { | ||||
|   background-color:#000; | ||||
| } | ||||
| 
 | ||||
| #noVNC-control-bar { | ||||
|   background: #4c4c4c; /* Old browsers */ | ||||
|   background: -moz-linear-gradient(top, #4c4c4c 0%, #2c2c2c 50%, #000000 51%, #131313 100%); /* FF3.6+ */ | ||||
|   background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#4c4c4c), color-stop(50%,#2c2c2c), color-stop(51%,#000000), color-stop(100%,#131313)); /* Chrome,Safari4+ */ | ||||
|   background: -webkit-linear-gradient(top, #4c4c4c 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* Chrome10+,Safari5.1+ */ | ||||
|   background: -o-linear-gradient(top, #4c4c4c 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* Opera11.10+ */ | ||||
|   background: -ms-linear-gradient(top, #4c4c4c 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* IE10+ */ | ||||
|   background: linear-gradient(top, #4c4c4c 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* W3C */ | ||||
| } | ||||
| 
 | ||||
| .triangle-right { | ||||
|   border:2px solid #fff; | ||||
|   background:#000; | ||||
|   color:#fff; | ||||
| } | ||||
| 
 | ||||
| .noVNC_status_button { | ||||
|   font-size: 12px; | ||||
|   vertical-align: middle; | ||||
|   border:1px solid #4c4c4c; | ||||
| 
 | ||||
|   background: #4c4c4c; /* Old browsers */ | ||||
|   background: -moz-linear-gradient(top, #4c4c4c 0%, #2c2c2c 50%, #000000 51%, #131313 100%); /* FF3.6+ */ | ||||
|   background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#4c4c4c), color-stop(50%,#2c2c2c), color-stop(51%,#000000), color-stop(100%,#131313)); /* Chrome,Safari4+ */ | ||||
|   background: -webkit-linear-gradient(top, #4c4c4c 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* Chrome10+,Safari5.1+ */ | ||||
|   background: -o-linear-gradient(top, #4c4c4c 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* Opera11.10+ */ | ||||
|   background: -ms-linear-gradient(top, #4c4c4c 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* IE10+ */ | ||||
|   filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#4c4c4c', endColorstr='#131313',GradientType=0 ); /* IE6-9 */ | ||||
|   background: linear-gradient(top, #4c4c4c 0%,#2c2c2c 50%,#000000 51%,#131313 100%); /* W3C */ | ||||
| } | ||||
| 
 | ||||
| .noVNC_status_button_selected { | ||||
|   background: #9dd53a; /* Old browsers */ | ||||
|   background: -moz-linear-gradient(top, #9dd53a 0%, #a1d54f 50%, #80c217 51%, #7cbc0a 100%); /* FF3.6+ */ | ||||
|   background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#9dd53a), color-stop(50%,#a1d54f), color-stop(51%,#80c217), color-stop(100%,#7cbc0a)); /* Chrome,Safari4+ */ | ||||
|   background: -webkit-linear-gradient(top, #9dd53a 0%,#a1d54f 50%,#80c217 51%,#7cbc0a 100%); /* Chrome10+,Safari5.1+ */ | ||||
|   background: -o-linear-gradient(top, #9dd53a 0%,#a1d54f 50%,#80c217 51%,#7cbc0a 100%); /* Opera11.10+ */ | ||||
|   background: -ms-linear-gradient(top, #9dd53a 0%,#a1d54f 50%,#80c217 51%,#7cbc0a 100%); /* IE10+ */ | ||||
|   filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9dd53a', endColorstr='#7cbc0a',GradientType=0 ); /* IE6-9 */ | ||||
|   background: linear-gradient(top, #9dd53a 0%,#a1d54f 50%,#80c217 51%,#7cbc0a 100%); /* W3C */ | ||||
| } | ||||
|  | @ -1,33 +0,0 @@ | |||
| /* | ||||
|  * noVNC blue CSS | ||||
|  * Copyright (C) 2012 Joel Martin | ||||
|  * noVNC is licensed under the MPL 2.0 (see LICENSE.txt) | ||||
|  * This file is licensed under the 2-Clause BSD license (see LICENSE.txt). | ||||
|  */ | ||||
| 
 | ||||
| #noVNC-control-bar { | ||||
|   background-color:#04073d; | ||||
|   background-image: -webkit-gradient( | ||||
|     linear, | ||||
|     left bottom, | ||||
|     left top, | ||||
|     color-stop(0.54, rgb(10,15,79)), | ||||
|     color-stop(0.5, rgb(4,7,61)) | ||||
|   ); | ||||
|   background-image: -moz-linear-gradient( | ||||
|     center bottom, | ||||
|     rgb(10,15,79) 54%, | ||||
|     rgb(4,7,61) 50% | ||||
|   ); | ||||
| } | ||||
| 
 | ||||
| .triangle-right { | ||||
|   border:2px solid #fff; | ||||
|   background:#04073d; | ||||
|   color:#fff; | ||||
| } | ||||
| 
 | ||||
| #keyboardinput { | ||||
|   background-color:#04073d; | ||||
| } | ||||
| 
 | ||||
|  | @ -1,321 +0,0 @@ | |||
| /* | ||||
| Copyright 2012 Google Inc. | ||||
| 
 | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
| 
 | ||||
|      http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| 
 | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. | ||||
| 
 | ||||
| Author: Boris Smus (smus@chromium.org) | ||||
| */ | ||||
| 
 | ||||
| (function(exports) { | ||||
| 
 | ||||
|   // Define some local variables here.
 | ||||
|   var socket = chrome.socket || chrome.experimental.socket; | ||||
|   var dns = chrome.experimental.dns; | ||||
| 
 | ||||
|   /** | ||||
|    * Creates an instance of the client | ||||
|    * | ||||
|    * @param {String} host The remote host to connect to | ||||
|    * @param {Number} port The port to connect to at the remote host | ||||
|    */ | ||||
|   function TcpClient(host, port, pollInterval) { | ||||
|     this.host = host; | ||||
|     this.port = port; | ||||
|     this.pollInterval = pollInterval || 15; | ||||
| 
 | ||||
|     // Callback functions.
 | ||||
|     this.callbacks = { | ||||
|       connect: null,    // Called when socket is connected.
 | ||||
|       disconnect: null, // Called when socket is disconnected.
 | ||||
|       recvBuffer: null, // Called (as ArrayBuffer) when client receives data from server.
 | ||||
|       recvString: null, // Called (as string) when client receives data from server.
 | ||||
|       sent: null        // Called when client sends data to server.
 | ||||
|     }; | ||||
| 
 | ||||
|     // Socket.
 | ||||
|     this.socketId = null; | ||||
|     this.isConnected = false; | ||||
| 
 | ||||
|     log('initialized tcp client'); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * Connects to the TCP socket, and creates an open socket. | ||||
|    * | ||||
|    * @see http://developer.chrome.com/trunk/apps/socket.html#method-create
 | ||||
|    * @param {Function} callback The function to call on connection | ||||
|    */ | ||||
|   TcpClient.prototype.connect = function(callback) { | ||||
|     // First resolve the hostname to an IP.
 | ||||
|     dns.resolve(this.host, function(result) { | ||||
|       this.addr = result.address; | ||||
|       socket.create('tcp', {}, this._onCreate.bind(this)); | ||||
| 
 | ||||
|       // Register connect callback.
 | ||||
|       this.callbacks.connect = callback; | ||||
|     }.bind(this)); | ||||
|   }; | ||||
| 
 | ||||
|   /** | ||||
|    * Sends an arraybuffer/view down the wire to the remote side | ||||
|    * | ||||
|    * @see http://developer.chrome.com/trunk/apps/socket.html#method-write
 | ||||
|    * @param {String} msg The arraybuffer/view to send | ||||
|    * @param {Function} callback The function to call when the message has sent | ||||
|    */ | ||||
|   TcpClient.prototype.sendBuffer = function(buf, callback) { | ||||
|     if (buf.buffer) { | ||||
|         buf = buf.buffer; | ||||
|     } | ||||
| 
 | ||||
|     /* | ||||
|     // Debug
 | ||||
|     var bytes = [], u8 = new Uint8Array(buf); | ||||
|     for (var i = 0; i < u8.length; i++) { | ||||
|         bytes.push(u8[i]); | ||||
|     } | ||||
|     log("sending bytes: " + (bytes.join(','))); | ||||
|     */ | ||||
|      | ||||
|     socket.write(this.socketId, buf, this._onWriteComplete.bind(this)); | ||||
| 
 | ||||
|     // Register sent callback.
 | ||||
|     this.callbacks.sent = callback; | ||||
|   }; | ||||
| 
 | ||||
|   /** | ||||
|    * Sends a string down the wire to the remote side | ||||
|    * | ||||
|    * @see http://developer.chrome.com/trunk/apps/socket.html#method-write
 | ||||
|    * @param {String} msg The string to send | ||||
|    * @param {Function} callback The function to call when the message has sent | ||||
|    */ | ||||
|   TcpClient.prototype.sendString = function(msg, callback) { | ||||
|     /* | ||||
|     // Debug
 | ||||
|     log("sending string: " + msg); | ||||
|     */ | ||||
| 
 | ||||
|     this._stringToArrayBuffer(msg, function(arrayBuffer) { | ||||
|       socket.write(this.socketId, arrayBuffer, this._onWriteComplete.bind(this)); | ||||
|     }.bind(this)); | ||||
| 
 | ||||
|     // Register sent callback.
 | ||||
|     this.callbacks.sent = callback; | ||||
|   }; | ||||
| 
 | ||||
|   /** | ||||
|    * Sets the callback for when a message is received | ||||
|    * | ||||
|    * @param {Function} callback The function to call when a message has arrived | ||||
|    * @param {String} type The callback argument type: "arraybuffer" or "string" | ||||
|    */ | ||||
|   TcpClient.prototype.addResponseListener = function(callback, type) { | ||||
|     if (typeof type === "undefined") { | ||||
|         type = "arraybuffer"; | ||||
|     } | ||||
|     // Register received callback.
 | ||||
|     if (type === "string") { | ||||
|       this.callbacks.recvString = callback; | ||||
|     } else { | ||||
|       this.callbacks.recvBuffer = callback; | ||||
|     } | ||||
|   }; | ||||
| 
 | ||||
|   /** | ||||
|    * Sets the callback for when the socket disconnects | ||||
|    * | ||||
|    * @param {Function} callback The function to call when the socket disconnects | ||||
|    * @param {String} type The callback argument type: "arraybuffer" or "string" | ||||
|    */ | ||||
|   TcpClient.prototype.addDisconnectListener = function(callback) { | ||||
|     // Register disconnect callback.
 | ||||
|     this.callbacks.disconnect = callback; | ||||
|   }; | ||||
| 
 | ||||
|   /** | ||||
|    * Disconnects from the remote side | ||||
|    * | ||||
|    * @see http://developer.chrome.com/trunk/apps/socket.html#method-disconnect
 | ||||
|    */ | ||||
|   TcpClient.prototype.disconnect = function() { | ||||
|     if (this.isConnected) { | ||||
|       this.isConnected = false; | ||||
|       socket.disconnect(this.socketId); | ||||
|       if (this.callbacks.disconnect) { | ||||
|         this.callbacks.disconnect(); | ||||
|       } | ||||
|       log('socket disconnected'); | ||||
|     } | ||||
|   }; | ||||
| 
 | ||||
|   /** | ||||
|    * The callback function used for when we attempt to have Chrome | ||||
|    * create a socket. If the socket is successfully created | ||||
|    * we go ahead and connect to the remote side. | ||||
|    * | ||||
|    * @private | ||||
|    * @see http://developer.chrome.com/trunk/apps/socket.html#method-connect
 | ||||
|    * @param {Object} createInfo The socket details | ||||
|    */ | ||||
|   TcpClient.prototype._onCreate = function(createInfo) { | ||||
|     this.socketId = createInfo.socketId; | ||||
|     if (this.socketId > 0) { | ||||
|       socket.connect(this.socketId, this.addr, this.port, this._onConnectComplete.bind(this)); | ||||
|     } else { | ||||
|       error('Unable to create socket'); | ||||
|     } | ||||
|   }; | ||||
| 
 | ||||
|   /** | ||||
|    * The callback function used for when we attempt to have Chrome | ||||
|    * connect to the remote side. If a successful connection is | ||||
|    * made then polling starts to check for data to read | ||||
|    * | ||||
|    * @private | ||||
|    * @param {Number} resultCode Indicates whether the connection was successful | ||||
|    */ | ||||
|   TcpClient.prototype._onConnectComplete = function(resultCode) { | ||||
|     // Start polling for reads.
 | ||||
|     this.isConnected = true; | ||||
|     setTimeout(this._periodicallyRead.bind(this), this.pollInterval); | ||||
| 
 | ||||
|     if (this.callbacks.connect) { | ||||
|       log('connect complete'); | ||||
|       this.callbacks.connect(); | ||||
|     } | ||||
|     log('onConnectComplete'); | ||||
|   }; | ||||
| 
 | ||||
|   /** | ||||
|    * Checks for new data to read from the socket | ||||
|    * | ||||
|    * @see http://developer.chrome.com/trunk/apps/socket.html#method-read
 | ||||
|    */ | ||||
|   TcpClient.prototype._periodicallyRead = function() { | ||||
|     var that = this; | ||||
|     socket.getInfo(this.socketId, function (info) { | ||||
|       if (info.connected) { | ||||
|         setTimeout(that._periodicallyRead.bind(that), that.pollInterval); | ||||
|         socket.read(that.socketId, null, that._onDataRead.bind(that)); | ||||
|       } else if (that.isConnected) { | ||||
|         log('socket disconnect detected'); | ||||
|         that.disconnect(); | ||||
|       } | ||||
|    }); | ||||
|   }; | ||||
| 
 | ||||
|   /** | ||||
|    * Callback function for when data has been read from the socket. | ||||
|    * Converts the array buffer that is read in to a string | ||||
|    * and sends it on for further processing by passing it to | ||||
|    * the previously assigned callback function. | ||||
|    * | ||||
|    * @private | ||||
|    * @see TcpClient.prototype.addResponseListener | ||||
|    * @param {Object} readInfo The incoming message | ||||
|    */ | ||||
|   TcpClient.prototype._onDataRead = function(readInfo) { | ||||
|     // Call received callback if there's data in the response.
 | ||||
|     if (readInfo.resultCode > 0) { | ||||
|       log('onDataRead'); | ||||
| 
 | ||||
|       /* | ||||
|       // Debug
 | ||||
|       var bytes = [], u8 = new Uint8Array(readInfo.data); | ||||
|       for (var i = 0; i < u8.length; i++) { | ||||
|           bytes.push(u8[i]); | ||||
|       } | ||||
|       log("received bytes: " + (bytes.join(','))); | ||||
|       */ | ||||
|        | ||||
|       if (this.callbacks.recvBuffer) { | ||||
|         // Return raw ArrayBuffer directly.
 | ||||
|         this.callbacks.recvBuffer(readInfo.data); | ||||
|       } | ||||
|       if (this.callbacks.recvString) { | ||||
|         // Convert ArrayBuffer to string.
 | ||||
|         this._arrayBufferToString(readInfo.data, function(str) { | ||||
|           this.callbacks.recvString(str); | ||||
|         }.bind(this)); | ||||
|       } | ||||
| 
 | ||||
|       // Trigger another read right away
 | ||||
|       setTimeout(this._periodicallyRead.bind(this), 0); | ||||
|     } | ||||
|   }; | ||||
| 
 | ||||
|   /** | ||||
|    * Callback for when data has been successfully | ||||
|    * written to the socket. | ||||
|    * | ||||
|    * @private | ||||
|    * @param {Object} writeInfo The outgoing message | ||||
|    */ | ||||
|   TcpClient.prototype._onWriteComplete = function(writeInfo) { | ||||
|     log('onWriteComplete'); | ||||
|     // Call sent callback.
 | ||||
|     if (this.callbacks.sent) { | ||||
|       this.callbacks.sent(writeInfo); | ||||
|     } | ||||
|   }; | ||||
| 
 | ||||
|   /** | ||||
|    * Converts an array buffer to a string | ||||
|    * | ||||
|    * @private | ||||
|    * @param {ArrayBuffer} buf The buffer to convert | ||||
|    * @param {Function} callback The function to call when conversion is complete | ||||
|    */ | ||||
|   TcpClient.prototype._arrayBufferToString = function(buf, callback) { | ||||
|     var bb = new Blob([new Uint8Array(buf)]); | ||||
|     var f = new FileReader(); | ||||
|     f.onload = function(e) { | ||||
|       callback(e.target.result); | ||||
|     }; | ||||
|     f.readAsText(bb); | ||||
|   }; | ||||
| 
 | ||||
|   /** | ||||
|    * Converts a string to an array buffer | ||||
|    * | ||||
|    * @private | ||||
|    * @param {String} str The string to convert | ||||
|    * @param {Function} callback The function to call when conversion is complete | ||||
|    */ | ||||
|   TcpClient.prototype._stringToArrayBuffer = function(str, callback) { | ||||
|     var bb = new Blob([str]); | ||||
|     var f = new FileReader(); | ||||
|     f.onload = function(e) { | ||||
|         callback(e.target.result); | ||||
|     }; | ||||
|     f.readAsArrayBuffer(bb); | ||||
|   }; | ||||
| 
 | ||||
|   /** | ||||
|    * Wrapper function for logging | ||||
|    */ | ||||
|   function log(msg) { | ||||
|     console.log(msg); | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * Wrapper function for error logging | ||||
|    */ | ||||
|   function error(msg) { | ||||
|     console.error(msg); | ||||
|   } | ||||
| 
 | ||||
|   exports.TcpClient = TcpClient; | ||||
| 
 | ||||
| })(window); | ||||
							
								
								
									
										114
									
								
								static/js/novnc/core/base64.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,114 @@ | |||
| 'use strict'; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| 
 | ||||
| var _logging = require('./util/logging.js'); | ||||
| 
 | ||||
| var Log = _interopRequireWildcard(_logging); | ||||
| 
 | ||||
| function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||||
| 
 | ||||
| exports.default = { | ||||
|     /* Convert data (an array of integers) to a Base64 string. */ | ||||
|     toBase64Table: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.split(''), | ||||
|     base64Pad: '=', | ||||
| 
 | ||||
|     encode: function (data) { | ||||
|         "use strict"; | ||||
| 
 | ||||
|         var result = ''; | ||||
|         var toBase64Table = this.toBase64Table; | ||||
|         var length = data.length; | ||||
|         var lengthpad = length % 3; | ||||
|         // Convert every three bytes to 4 ascii characters.
 | ||||
| 
 | ||||
|         for (var i = 0; i < length - 2; i += 3) { | ||||
|             result += toBase64Table[data[i] >> 2]; | ||||
|             result += toBase64Table[((data[i] & 0x03) << 4) + (data[i + 1] >> 4)]; | ||||
|             result += toBase64Table[((data[i + 1] & 0x0f) << 2) + (data[i + 2] >> 6)]; | ||||
|             result += toBase64Table[data[i + 2] & 0x3f]; | ||||
|         } | ||||
| 
 | ||||
|         // Convert the remaining 1 or 2 bytes, pad out to 4 characters.
 | ||||
|         var j = 0; | ||||
|         if (lengthpad === 2) { | ||||
|             j = length - lengthpad; | ||||
|             result += toBase64Table[data[j] >> 2]; | ||||
|             result += toBase64Table[((data[j] & 0x03) << 4) + (data[j + 1] >> 4)]; | ||||
|             result += toBase64Table[(data[j + 1] & 0x0f) << 2]; | ||||
|             result += toBase64Table[64]; | ||||
|         } else if (lengthpad === 1) { | ||||
|             j = length - lengthpad; | ||||
|             result += toBase64Table[data[j] >> 2]; | ||||
|             result += toBase64Table[(data[j] & 0x03) << 4]; | ||||
|             result += toBase64Table[64]; | ||||
|             result += toBase64Table[64]; | ||||
|         } | ||||
| 
 | ||||
|         return result; | ||||
|     }, | ||||
| 
 | ||||
|     /* Convert Base64 data to a string */ | ||||
|     toBinaryTable: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, 0, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1], | ||||
| 
 | ||||
|     decode: function (data, offset) { | ||||
|         "use strict"; | ||||
| 
 | ||||
|         offset = typeof offset !== 'undefined' ? offset : 0; | ||||
|         var toBinaryTable = this.toBinaryTable; | ||||
|         var base64Pad = this.base64Pad; | ||||
|         var result, result_length; | ||||
|         var leftbits = 0; // number of bits decoded, but yet to be appended
 | ||||
|         var leftdata = 0; // bits decoded, but yet to be appended
 | ||||
|         var data_length = data.indexOf('=') - offset; | ||||
| 
 | ||||
|         if (data_length < 0) { | ||||
|             data_length = data.length - offset; | ||||
|         } | ||||
| 
 | ||||
|         /* Every four characters is 3 resulting numbers */ | ||||
|         result_length = (data_length >> 2) * 3 + Math.floor(data_length % 4 / 1.5); | ||||
|         result = new Array(result_length); | ||||
| 
 | ||||
|         // Convert one by one.
 | ||||
|         for (var idx = 0, i = offset; i < data.length; i++) { | ||||
|             var c = toBinaryTable[data.charCodeAt(i) & 0x7f]; | ||||
|             var padding = data.charAt(i) === base64Pad; | ||||
|             // Skip illegal characters and whitespace
 | ||||
|             if (c === -1) { | ||||
|                 Log.Error("Illegal character code " + data.charCodeAt(i) + " at position " + i); | ||||
|                 continue; | ||||
|             } | ||||
| 
 | ||||
|             // Collect data into leftdata, update bitcount
 | ||||
|             leftdata = leftdata << 6 | c; | ||||
|             leftbits += 6; | ||||
| 
 | ||||
|             // If we have 8 or more bits, append 8 bits to the result
 | ||||
|             if (leftbits >= 8) { | ||||
|                 leftbits -= 8; | ||||
|                 // Append if not padding.
 | ||||
|                 if (!padding) { | ||||
|                     result[idx++] = leftdata >> leftbits & 0xff; | ||||
|                 } | ||||
|                 leftdata &= (1 << leftbits) - 1; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // If there are any bits left, the base64 string was corrupted
 | ||||
|         if (leftbits) { | ||||
|             err = new Error('Corrupted base64 string'); | ||||
|             err.name = 'Base64-Error'; | ||||
|             throw err; | ||||
|         } | ||||
| 
 | ||||
|         return result; | ||||
|     } | ||||
| }; /* End of Base64 namespace */ | ||||
| /* This Source Code Form is subject to the terms of the Mozilla Public | ||||
|  * License, v. 2.0. If a copy of the MPL was not distributed with this | ||||
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | ||||
| 
 | ||||
| // From: http://hg.mozilla.org/mozilla-central/raw-file/ec10630b1a54/js/src/devtools/jint/sunspider/string-base64.js
 | ||||
							
								
								
									
										283
									
								
								static/js/novnc/core/des.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,283 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| exports.default = DES; | ||||
| /* | ||||
|  * Ported from Flashlight VNC ActionScript implementation: | ||||
|  *     http://www.wizhelp.com/flashlight-vnc/
 | ||||
|  * | ||||
|  * Full attribution follows: | ||||
|  * | ||||
|  * ------------------------------------------------------------------------- | ||||
|  * | ||||
|  * This DES class has been extracted from package Acme.Crypto for use in VNC. | ||||
|  * The unnecessary odd parity code has been removed. | ||||
|  * | ||||
|  * These changes are: | ||||
|  *  Copyright (C) 1999 AT&T Laboratories Cambridge.  All Rights Reserved. | ||||
|  * | ||||
|  * This software is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||||
|  * | ||||
| 
 | ||||
|  * DesCipher - the DES encryption method | ||||
|  * | ||||
|  * The meat of this code is by Dave Zimmerman <dzimm@widget.com>, and is: | ||||
|  * | ||||
|  * Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this software | ||||
|  * and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and | ||||
|  * without fee is hereby granted, provided that this copyright notice is kept | ||||
|  * intact. | ||||
|  * | ||||
|  * WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY | ||||
|  * OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED | ||||
|  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A | ||||
|  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE LIABLE | ||||
|  * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR | ||||
|  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. | ||||
|  * | ||||
|  * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE | ||||
|  * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE | ||||
|  * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT | ||||
|  * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE | ||||
|  * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE | ||||
|  * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE | ||||
|  * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").  WIDGET WORKSHOP | ||||
|  * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR | ||||
|  * HIGH RISK ACTIVITIES. | ||||
|  * | ||||
|  * | ||||
|  * The rest is: | ||||
|  * | ||||
|  * Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>.  All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  * | ||||
|  * Visit the ACME Labs Java page for up-to-date versions of this and other | ||||
|  * fine Java utilities: http://www.acme.com/java/
 | ||||
|  */ | ||||
| 
 | ||||
| function DES(passwd) { | ||||
|     "use strict"; | ||||
| 
 | ||||
|     // Tables, permutations, S-boxes, etc.
 | ||||
| 
 | ||||
|     var PC2 = [13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31], | ||||
|         totrot = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28], | ||||
|         z = 0x0, | ||||
|         a, | ||||
|         b, | ||||
|         c, | ||||
|         d, | ||||
|         e, | ||||
|         f, | ||||
|         SP1, | ||||
|         SP2, | ||||
|         SP3, | ||||
|         SP4, | ||||
|         SP5, | ||||
|         SP6, | ||||
|         SP7, | ||||
|         SP8, | ||||
|         keys = []; | ||||
| 
 | ||||
|     a = 1 << 16;b = 1 << 24;c = a | b;d = 1 << 2;e = 1 << 10;f = d | e; | ||||
|     SP1 = [c | e, z | z, a | z, c | f, c | d, a | f, z | d, a | z, z | e, c | e, c | f, z | e, b | f, c | d, b | z, z | d, z | f, b | e, b | e, a | e, a | e, c | z, c | z, b | f, a | d, b | d, b | d, a | d, z | z, z | f, a | f, b | z, a | z, c | f, z | d, c | z, c | e, b | z, b | z, z | e, c | d, a | z, a | e, b | d, z | e, z | d, b | f, a | f, c | f, a | d, c | z, b | f, b | d, z | f, a | f, c | e, z | f, b | e, b | e, z | z, a | d, a | e, z | z, c | d]; | ||||
|     a = 1 << 20;b = 1 << 31;c = a | b;d = 1 << 5;e = 1 << 15;f = d | e; | ||||
|     SP2 = [c | f, b | e, z | e, a | f, a | z, z | d, c | d, b | f, b | d, c | f, c | e, b | z, b | e, a | z, z | d, c | d, a | e, a | d, b | f, z | z, b | z, z | e, a | f, c | z, a | d, b | d, z | z, a | e, z | f, c | e, c | z, z | f, z | z, a | f, c | d, a | z, b | f, c | z, c | e, z | e, c | z, b | e, z | d, c | f, a | f, z | d, z | e, b | z, z | f, c | e, a | z, b | d, a | d, b | f, b | d, a | d, a | e, z | z, b | e, z | f, b | z, c | d, c | f, a | e]; | ||||
|     a = 1 << 17;b = 1 << 27;c = a | b;d = 1 << 3;e = 1 << 9;f = d | e; | ||||
|     SP3 = [z | f, c | e, z | z, c | d, b | e, z | z, a | f, b | e, a | d, b | d, b | d, a | z, c | f, a | d, c | z, z | f, b | z, z | d, c | e, z | e, a | e, c | z, c | d, a | f, b | f, a | e, a | z, b | f, z | d, c | f, z | e, b | z, c | e, b | z, a | d, z | f, a | z, c | e, b | e, z | z, z | e, a | d, c | f, b | e, b | d, z | e, z | z, c | d, b | f, a | z, b | z, c | f, z | d, a | f, a | e, b | d, c | z, b | f, z | f, c | z, a | f, z | d, c | d, a | e]; | ||||
|     a = 1 << 13;b = 1 << 23;c = a | b;d = 1 << 0;e = 1 << 7;f = d | e; | ||||
|     SP4 = [c | d, a | f, a | f, z | e, c | e, b | f, b | d, a | d, z | z, c | z, c | z, c | f, z | f, z | z, b | e, b | d, z | d, a | z, b | z, c | d, z | e, b | z, a | d, a | e, b | f, z | d, a | e, b | e, a | z, c | e, c | f, z | f, b | e, b | d, c | z, c | f, z | f, z | z, z | z, c | z, a | e, b | e, b | f, z | d, c | d, a | f, a | f, z | e, c | f, z | f, z | d, a | z, b | d, a | d, c | e, b | f, a | d, a | e, b | z, c | d, z | e, b | z, a | z, c | e]; | ||||
|     a = 1 << 25;b = 1 << 30;c = a | b;d = 1 << 8;e = 1 << 19;f = d | e; | ||||
|     SP5 = [z | d, a | f, a | e, c | d, z | e, z | d, b | z, a | e, b | f, z | e, a | d, b | f, c | d, c | e, z | f, b | z, a | z, b | e, b | e, z | z, b | d, c | f, c | f, a | d, c | e, b | d, z | z, c | z, a | f, a | z, c | z, z | f, z | e, c | d, z | d, a | z, b | z, a | e, c | d, b | f, a | d, b | z, c | e, a | f, b | f, z | d, a | z, c | e, c | f, z | f, c | z, c | f, a | e, z | z, b | e, c | z, z | f, a | d, b | d, z | e, z | z, b | e, a | f, b | d]; | ||||
|     a = 1 << 22;b = 1 << 29;c = a | b;d = 1 << 4;e = 1 << 14;f = d | e; | ||||
|     SP6 = [b | d, c | z, z | e, c | f, c | z, z | d, c | f, a | z, b | e, a | f, a | z, b | d, a | d, b | e, b | z, z | f, z | z, a | d, b | f, z | e, a | e, b | f, z | d, c | d, c | d, z | z, a | f, c | e, z | f, a | e, c | e, b | z, b | e, z | d, c | d, a | e, c | f, a | z, z | f, b | d, a | z, b | e, b | z, z | f, b | d, c | f, a | e, c | z, a | f, c | e, z | z, c | d, z | d, z | e, c | z, a | f, z | e, a | d, b | f, z | z, c | e, b | z, a | d, b | f]; | ||||
|     a = 1 << 21;b = 1 << 26;c = a | b;d = 1 << 1;e = 1 << 11;f = d | e; | ||||
|     SP7 = [a | z, c | d, b | f, z | z, z | e, b | f, a | f, c | e, c | f, a | z, z | z, b | d, z | d, b | z, c | d, z | f, b | e, a | f, a | d, b | e, b | d, c | z, c | e, a | d, c | z, z | e, z | f, c | f, a | e, z | d, b | z, a | e, b | z, a | e, a | z, b | f, b | f, c | d, c | d, z | d, a | d, b | z, b | e, a | z, c | e, z | f, a | f, c | e, z | f, b | d, c | f, c | z, a | e, z | z, z | d, c | f, z | z, a | f, c | z, z | e, b | d, b | e, z | e, a | d]; | ||||
|     a = 1 << 18;b = 1 << 28;c = a | b;d = 1 << 6;e = 1 << 12;f = d | e; | ||||
|     SP8 = [b | f, z | e, a | z, c | f, b | z, b | f, z | d, b | z, a | d, c | z, c | f, a | e, c | e, a | f, z | e, z | d, c | z, b | d, b | e, z | f, a | e, a | d, c | d, c | e, z | f, z | z, z | z, c | d, b | d, b | e, a | f, a | z, a | f, a | z, c | e, z | e, z | d, c | d, z | e, a | f, b | e, z | d, b | d, c | z, c | d, b | z, a | z, b | f, z | z, c | f, a | d, b | d, c | z, b | e, b | f, z | z, c | f, a | e, a | e, z | f, z | f, a | d, b | z, c | e]; | ||||
| 
 | ||||
|     // Set the key.
 | ||||
|     function setKeys(keyBlock) { | ||||
|         var i, | ||||
|             j, | ||||
|             l, | ||||
|             m, | ||||
|             n, | ||||
|             o, | ||||
|             pc1m = [], | ||||
|             pcr = [], | ||||
|             kn = [], | ||||
|             raw0, | ||||
|             raw1, | ||||
|             rawi, | ||||
|             KnLi; | ||||
| 
 | ||||
|         for (j = 0, l = 56; j < 56; ++j, l -= 8) { | ||||
|             l += l < -5 ? 65 : l < -3 ? 31 : l < -1 ? 63 : l === 27 ? 35 : 0; // PC1
 | ||||
|             m = l & 0x7; | ||||
|             pc1m[j] = (keyBlock[l >>> 3] & 1 << m) !== 0 ? 1 : 0; | ||||
|         } | ||||
| 
 | ||||
|         for (i = 0; i < 16; ++i) { | ||||
|             m = i << 1; | ||||
|             n = m + 1; | ||||
|             kn[m] = kn[n] = 0; | ||||
|             for (o = 28; o < 59; o += 28) { | ||||
|                 for (j = o - 28; j < o; ++j) { | ||||
|                     l = j + totrot[i]; | ||||
|                     if (l < o) { | ||||
|                         pcr[j] = pc1m[l]; | ||||
|                     } else { | ||||
|                         pcr[j] = pc1m[l - 28]; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             for (j = 0; j < 24; ++j) { | ||||
|                 if (pcr[PC2[j]] !== 0) { | ||||
|                     kn[m] |= 1 << 23 - j; | ||||
|                 } | ||||
|                 if (pcr[PC2[j + 24]] !== 0) { | ||||
|                     kn[n] |= 1 << 23 - j; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // cookey
 | ||||
|         for (i = 0, rawi = 0, KnLi = 0; i < 16; ++i) { | ||||
|             raw0 = kn[rawi++]; | ||||
|             raw1 = kn[rawi++]; | ||||
|             keys[KnLi] = (raw0 & 0x00fc0000) << 6; | ||||
|             keys[KnLi] |= (raw0 & 0x00000fc0) << 10; | ||||
|             keys[KnLi] |= (raw1 & 0x00fc0000) >>> 10; | ||||
|             keys[KnLi] |= (raw1 & 0x00000fc0) >>> 6; | ||||
|             ++KnLi; | ||||
|             keys[KnLi] = (raw0 & 0x0003f000) << 12; | ||||
|             keys[KnLi] |= (raw0 & 0x0000003f) << 16; | ||||
|             keys[KnLi] |= (raw1 & 0x0003f000) >>> 4; | ||||
|             keys[KnLi] |= raw1 & 0x0000003f; | ||||
|             ++KnLi; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     // Encrypt 8 bytes of text
 | ||||
|     function enc8(text) { | ||||
|         var i = 0, | ||||
|             b = text.slice(), | ||||
|             fval, | ||||
|             keysi = 0, | ||||
|             l, | ||||
|             r, | ||||
|             x; // left, right, accumulator
 | ||||
| 
 | ||||
|         // Squash 8 bytes to 2 ints
 | ||||
|         l = b[i++] << 24 | b[i++] << 16 | b[i++] << 8 | b[i++]; | ||||
|         r = b[i++] << 24 | b[i++] << 16 | b[i++] << 8 | b[i++]; | ||||
| 
 | ||||
|         x = (l >>> 4 ^ r) & 0x0f0f0f0f; | ||||
|         r ^= x; | ||||
|         l ^= x << 4; | ||||
|         x = (l >>> 16 ^ r) & 0x0000ffff; | ||||
|         r ^= x; | ||||
|         l ^= x << 16; | ||||
|         x = (r >>> 2 ^ l) & 0x33333333; | ||||
|         l ^= x; | ||||
|         r ^= x << 2; | ||||
|         x = (r >>> 8 ^ l) & 0x00ff00ff; | ||||
|         l ^= x; | ||||
|         r ^= x << 8; | ||||
|         r = r << 1 | r >>> 31 & 1; | ||||
|         x = (l ^ r) & 0xaaaaaaaa; | ||||
|         l ^= x; | ||||
|         r ^= x; | ||||
|         l = l << 1 | l >>> 31 & 1; | ||||
| 
 | ||||
|         for (i = 0; i < 8; ++i) { | ||||
|             x = r << 28 | r >>> 4; | ||||
|             x ^= keys[keysi++]; | ||||
|             fval = SP7[x & 0x3f]; | ||||
|             fval |= SP5[x >>> 8 & 0x3f]; | ||||
|             fval |= SP3[x >>> 16 & 0x3f]; | ||||
|             fval |= SP1[x >>> 24 & 0x3f]; | ||||
|             x = r ^ keys[keysi++]; | ||||
|             fval |= SP8[x & 0x3f]; | ||||
|             fval |= SP6[x >>> 8 & 0x3f]; | ||||
|             fval |= SP4[x >>> 16 & 0x3f]; | ||||
|             fval |= SP2[x >>> 24 & 0x3f]; | ||||
|             l ^= fval; | ||||
|             x = l << 28 | l >>> 4; | ||||
|             x ^= keys[keysi++]; | ||||
|             fval = SP7[x & 0x3f]; | ||||
|             fval |= SP5[x >>> 8 & 0x3f]; | ||||
|             fval |= SP3[x >>> 16 & 0x3f]; | ||||
|             fval |= SP1[x >>> 24 & 0x3f]; | ||||
|             x = l ^ keys[keysi++]; | ||||
|             fval |= SP8[x & 0x0000003f]; | ||||
|             fval |= SP6[x >>> 8 & 0x3f]; | ||||
|             fval |= SP4[x >>> 16 & 0x3f]; | ||||
|             fval |= SP2[x >>> 24 & 0x3f]; | ||||
|             r ^= fval; | ||||
|         } | ||||
| 
 | ||||
|         r = r << 31 | r >>> 1; | ||||
|         x = (l ^ r) & 0xaaaaaaaa; | ||||
|         l ^= x; | ||||
|         r ^= x; | ||||
|         l = l << 31 | l >>> 1; | ||||
|         x = (l >>> 8 ^ r) & 0x00ff00ff; | ||||
|         r ^= x; | ||||
|         l ^= x << 8; | ||||
|         x = (l >>> 2 ^ r) & 0x33333333; | ||||
|         r ^= x; | ||||
|         l ^= x << 2; | ||||
|         x = (r >>> 16 ^ l) & 0x0000ffff; | ||||
|         l ^= x; | ||||
|         r ^= x << 16; | ||||
|         x = (r >>> 4 ^ l) & 0x0f0f0f0f; | ||||
|         l ^= x; | ||||
|         r ^= x << 4; | ||||
| 
 | ||||
|         // Spread ints to bytes
 | ||||
|         x = [r, l]; | ||||
|         for (i = 0; i < 8; i++) { | ||||
|             b[i] = (x[i >>> 2] >>> 8 * (3 - i % 4)) % 256; | ||||
|             if (b[i] < 0) { | ||||
|                 b[i] += 256; | ||||
|             } // unsigned
 | ||||
|         } | ||||
|         return b; | ||||
|     } | ||||
| 
 | ||||
|     // Encrypt 16 bytes of text using passwd as key
 | ||||
|     function encrypt(t) { | ||||
|         return enc8(t.slice(0, 8)).concat(enc8(t.slice(8, 16))); | ||||
|     } | ||||
| 
 | ||||
|     setKeys(passwd); // Setup keys
 | ||||
|     return { 'encrypt': encrypt }; // Public interface
 | ||||
| }; // function DES
 | ||||
							
								
								
									
										710
									
								
								static/js/novnc/core/display.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,710 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| exports.default = Display; | ||||
| 
 | ||||
| var _logging = require("./util/logging.js"); | ||||
| 
 | ||||
| var Log = _interopRequireWildcard(_logging); | ||||
| 
 | ||||
| var _base = require("./base64.js"); | ||||
| 
 | ||||
| var _base2 = _interopRequireDefault(_base); | ||||
| 
 | ||||
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||||
| 
 | ||||
| function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||||
| 
 | ||||
| /* | ||||
|  * noVNC: HTML5 VNC client | ||||
|  * Copyright (C) 2012 Joel Martin | ||||
|  * Copyright (C) 2015 Samuel Mannehed for Cendio AB | ||||
|  * Licensed under MPL 2.0 (see LICENSE.txt) | ||||
|  * | ||||
|  * See README.md for usage and integration instructions. | ||||
|  */ | ||||
| 
 | ||||
| function Display(target) { | ||||
|     this._drawCtx = null; | ||||
|     this._c_forceCanvas = false; | ||||
| 
 | ||||
|     this._renderQ = []; // queue drawing actions for in-oder rendering
 | ||||
|     this._flushing = false; | ||||
| 
 | ||||
|     // the full frame buffer (logical canvas) size
 | ||||
|     this._fb_width = 0; | ||||
|     this._fb_height = 0; | ||||
| 
 | ||||
|     this._prevDrawStyle = ""; | ||||
|     this._tile = null; | ||||
|     this._tile16x16 = null; | ||||
|     this._tile_x = 0; | ||||
|     this._tile_y = 0; | ||||
| 
 | ||||
|     Log.Debug(">> Display.constructor"); | ||||
| 
 | ||||
|     // The visible canvas
 | ||||
|     this._target = target; | ||||
| 
 | ||||
|     if (!this._target) { | ||||
|         throw new Error("Target must be set"); | ||||
|     } | ||||
| 
 | ||||
|     if (typeof this._target === 'string') { | ||||
|         throw new Error('target must be a DOM element'); | ||||
|     } | ||||
| 
 | ||||
|     if (!this._target.getContext) { | ||||
|         throw new Error("no getContext method"); | ||||
|     } | ||||
| 
 | ||||
|     this._targetCtx = this._target.getContext('2d'); | ||||
| 
 | ||||
|     // the visible canvas viewport (i.e. what actually gets seen)
 | ||||
|     this._viewportLoc = { 'x': 0, 'y': 0, 'w': this._target.width, 'h': this._target.height }; | ||||
| 
 | ||||
|     // The hidden canvas, where we do the actual rendering
 | ||||
|     this._backbuffer = document.createElement('canvas'); | ||||
|     this._drawCtx = this._backbuffer.getContext('2d'); | ||||
| 
 | ||||
|     this._damageBounds = { left: 0, top: 0, | ||||
|         right: this._backbuffer.width, | ||||
|         bottom: this._backbuffer.height }; | ||||
| 
 | ||||
|     Log.Debug("User Agent: " + navigator.userAgent); | ||||
| 
 | ||||
|     this.clear(); | ||||
| 
 | ||||
|     // Check canvas features
 | ||||
|     if (!('createImageData' in this._drawCtx)) { | ||||
|         throw new Error("Canvas does not support createImageData"); | ||||
|     } | ||||
| 
 | ||||
|     this._tile16x16 = this._drawCtx.createImageData(16, 16); | ||||
|     Log.Debug("<< Display.constructor"); | ||||
| }; | ||||
| 
 | ||||
| var SUPPORTS_IMAGEDATA_CONSTRUCTOR = false; | ||||
| try { | ||||
|     new ImageData(new Uint8ClampedArray(4), 1, 1); | ||||
|     SUPPORTS_IMAGEDATA_CONSTRUCTOR = true; | ||||
| } catch (ex) { | ||||
|     // ignore failure
 | ||||
| } | ||||
| 
 | ||||
| Display.prototype = { | ||||
|     // ===== PROPERTIES =====
 | ||||
| 
 | ||||
|     _scale: 1.0, | ||||
|     get scale() { | ||||
|         return this._scale; | ||||
|     }, | ||||
|     set scale(scale) { | ||||
|         this._rescale(scale); | ||||
|     }, | ||||
| 
 | ||||
|     _clipViewport: false, | ||||
|     get clipViewport() { | ||||
|         return this._clipViewport; | ||||
|     }, | ||||
|     set clipViewport(viewport) { | ||||
|         this._clipViewport = viewport; | ||||
|         // May need to readjust the viewport dimensions
 | ||||
|         var vp = this._viewportLoc; | ||||
|         this.viewportChangeSize(vp.w, vp.h); | ||||
|         this.viewportChangePos(0, 0); | ||||
|     }, | ||||
| 
 | ||||
|     get width() { | ||||
|         return this._fb_width; | ||||
|     }, | ||||
|     get height() { | ||||
|         return this._fb_height; | ||||
|     }, | ||||
| 
 | ||||
|     logo: null, | ||||
| 
 | ||||
|     // ===== EVENT HANDLERS =====
 | ||||
| 
 | ||||
|     onflush: function () {}, // A flush request has finished
 | ||||
| 
 | ||||
|     // ===== PUBLIC METHODS =====
 | ||||
| 
 | ||||
|     viewportChangePos: function (deltaX, deltaY) { | ||||
|         var vp = this._viewportLoc; | ||||
|         deltaX = Math.floor(deltaX); | ||||
|         deltaY = Math.floor(deltaY); | ||||
| 
 | ||||
|         if (!this._clipViewport) { | ||||
|             deltaX = -vp.w; // clamped later of out of bounds
 | ||||
|             deltaY = -vp.h; | ||||
|         } | ||||
| 
 | ||||
|         var vx2 = vp.x + vp.w - 1; | ||||
|         var vy2 = vp.y + vp.h - 1; | ||||
| 
 | ||||
|         // Position change
 | ||||
| 
 | ||||
|         if (deltaX < 0 && vp.x + deltaX < 0) { | ||||
|             deltaX = -vp.x; | ||||
|         } | ||||
|         if (vx2 + deltaX >= this._fb_width) { | ||||
|             deltaX -= vx2 + deltaX - this._fb_width + 1; | ||||
|         } | ||||
| 
 | ||||
|         if (vp.y + deltaY < 0) { | ||||
|             deltaY = -vp.y; | ||||
|         } | ||||
|         if (vy2 + deltaY >= this._fb_height) { | ||||
|             deltaY -= vy2 + deltaY - this._fb_height + 1; | ||||
|         } | ||||
| 
 | ||||
|         if (deltaX === 0 && deltaY === 0) { | ||||
|             return; | ||||
|         } | ||||
|         Log.Debug("viewportChange deltaX: " + deltaX + ", deltaY: " + deltaY); | ||||
| 
 | ||||
|         vp.x += deltaX; | ||||
|         vp.y += deltaY; | ||||
| 
 | ||||
|         this._damage(vp.x, vp.y, vp.w, vp.h); | ||||
| 
 | ||||
|         this.flip(); | ||||
|     }, | ||||
| 
 | ||||
|     viewportChangeSize: function (width, height) { | ||||
| 
 | ||||
|         if (!this._clipViewport || typeof width === "undefined" || typeof height === "undefined") { | ||||
| 
 | ||||
|             Log.Debug("Setting viewport to full display region"); | ||||
|             width = this._fb_width; | ||||
|             height = this._fb_height; | ||||
|         } | ||||
| 
 | ||||
|         if (width > this._fb_width) { | ||||
|             width = this._fb_width; | ||||
|         } | ||||
|         if (height > this._fb_height) { | ||||
|             height = this._fb_height; | ||||
|         } | ||||
| 
 | ||||
|         var vp = this._viewportLoc; | ||||
|         if (vp.w !== width || vp.h !== height) { | ||||
|             vp.w = width; | ||||
|             vp.h = height; | ||||
| 
 | ||||
|             var canvas = this._target; | ||||
|             canvas.width = width; | ||||
|             canvas.height = height; | ||||
| 
 | ||||
|             // The position might need to be updated if we've grown
 | ||||
|             this.viewportChangePos(0, 0); | ||||
| 
 | ||||
|             this._damage(vp.x, vp.y, vp.w, vp.h); | ||||
|             this.flip(); | ||||
| 
 | ||||
|             // Update the visible size of the target canvas
 | ||||
|             this._rescale(this._scale); | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     absX: function (x) { | ||||
|         return x / this._scale + this._viewportLoc.x; | ||||
|     }, | ||||
| 
 | ||||
|     absY: function (y) { | ||||
|         return y / this._scale + this._viewportLoc.y; | ||||
|     }, | ||||
| 
 | ||||
|     resize: function (width, height) { | ||||
|         this._prevDrawStyle = ""; | ||||
| 
 | ||||
|         this._fb_width = width; | ||||
|         this._fb_height = height; | ||||
| 
 | ||||
|         var canvas = this._backbuffer; | ||||
|         if (canvas.width !== width || canvas.height !== height) { | ||||
| 
 | ||||
|             // We have to save the canvas data since changing the size will clear it
 | ||||
|             var saveImg = null; | ||||
|             if (canvas.width > 0 && canvas.height > 0) { | ||||
|                 saveImg = this._drawCtx.getImageData(0, 0, canvas.width, canvas.height); | ||||
|             } | ||||
| 
 | ||||
|             if (canvas.width !== width) { | ||||
|                 canvas.width = width; | ||||
|             } | ||||
|             if (canvas.height !== height) { | ||||
|                 canvas.height = height; | ||||
|             } | ||||
| 
 | ||||
|             if (saveImg) { | ||||
|                 this._drawCtx.putImageData(saveImg, 0, 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // Readjust the viewport as it may be incorrectly sized
 | ||||
|         // and positioned
 | ||||
|         var vp = this._viewportLoc; | ||||
|         this.viewportChangeSize(vp.w, vp.h); | ||||
|         this.viewportChangePos(0, 0); | ||||
|     }, | ||||
| 
 | ||||
|     // Track what parts of the visible canvas that need updating
 | ||||
|     _damage: function (x, y, w, h) { | ||||
|         if (x < this._damageBounds.left) { | ||||
|             this._damageBounds.left = x; | ||||
|         } | ||||
|         if (y < this._damageBounds.top) { | ||||
|             this._damageBounds.top = y; | ||||
|         } | ||||
|         if (x + w > this._damageBounds.right) { | ||||
|             this._damageBounds.right = x + w; | ||||
|         } | ||||
|         if (y + h > this._damageBounds.bottom) { | ||||
|             this._damageBounds.bottom = y + h; | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     // Update the visible canvas with the contents of the
 | ||||
|     // rendering canvas
 | ||||
|     flip: function (from_queue) { | ||||
|         if (this._renderQ.length !== 0 && !from_queue) { | ||||
|             this._renderQ_push({ | ||||
|                 'type': 'flip' | ||||
|             }); | ||||
|         } else { | ||||
|             var x, y, vx, vy, w, h; | ||||
| 
 | ||||
|             x = this._damageBounds.left; | ||||
|             y = this._damageBounds.top; | ||||
|             w = this._damageBounds.right - x; | ||||
|             h = this._damageBounds.bottom - y; | ||||
| 
 | ||||
|             vx = x - this._viewportLoc.x; | ||||
|             vy = y - this._viewportLoc.y; | ||||
| 
 | ||||
|             if (vx < 0) { | ||||
|                 w += vx; | ||||
|                 x -= vx; | ||||
|                 vx = 0; | ||||
|             } | ||||
|             if (vy < 0) { | ||||
|                 h += vy; | ||||
|                 y -= vy; | ||||
|                 vy = 0; | ||||
|             } | ||||
| 
 | ||||
|             if (vx + w > this._viewportLoc.w) { | ||||
|                 w = this._viewportLoc.w - vx; | ||||
|             } | ||||
|             if (vy + h > this._viewportLoc.h) { | ||||
|                 h = this._viewportLoc.h - vy; | ||||
|             } | ||||
| 
 | ||||
|             if (w > 0 && h > 0) { | ||||
|                 // FIXME: We may need to disable image smoothing here
 | ||||
|                 //        as well (see copyImage()), but we haven't
 | ||||
|                 //        noticed any problem yet.
 | ||||
|                 this._targetCtx.drawImage(this._backbuffer, x, y, w, h, vx, vy, w, h); | ||||
|             } | ||||
| 
 | ||||
|             this._damageBounds.left = this._damageBounds.top = 65535; | ||||
|             this._damageBounds.right = this._damageBounds.bottom = 0; | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     clear: function () { | ||||
|         if (this._logo) { | ||||
|             this.resize(this._logo.width, this._logo.height); | ||||
|             this.imageRect(0, 0, this._logo.type, this._logo.data); | ||||
|         } else { | ||||
|             this.resize(240, 20); | ||||
|             this._drawCtx.clearRect(0, 0, this._fb_width, this._fb_height); | ||||
|         } | ||||
|         this.flip(); | ||||
|     }, | ||||
| 
 | ||||
|     pending: function () { | ||||
|         return this._renderQ.length > 0; | ||||
|     }, | ||||
| 
 | ||||
|     flush: function () { | ||||
|         if (this._renderQ.length === 0) { | ||||
|             this.onflush(); | ||||
|         } else { | ||||
|             this._flushing = true; | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     fillRect: function (x, y, width, height, color, from_queue) { | ||||
|         if (this._renderQ.length !== 0 && !from_queue) { | ||||
|             this._renderQ_push({ | ||||
|                 'type': 'fill', | ||||
|                 'x': x, | ||||
|                 'y': y, | ||||
|                 'width': width, | ||||
|                 'height': height, | ||||
|                 'color': color | ||||
|             }); | ||||
|         } else { | ||||
|             this._setFillColor(color); | ||||
|             this._drawCtx.fillRect(x, y, width, height); | ||||
|             this._damage(x, y, width, height); | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     copyImage: function (old_x, old_y, new_x, new_y, w, h, from_queue) { | ||||
|         if (this._renderQ.length !== 0 && !from_queue) { | ||||
|             this._renderQ_push({ | ||||
|                 'type': 'copy', | ||||
|                 'old_x': old_x, | ||||
|                 'old_y': old_y, | ||||
|                 'x': new_x, | ||||
|                 'y': new_y, | ||||
|                 'width': w, | ||||
|                 'height': h | ||||
|             }); | ||||
|         } else { | ||||
|             // Due to this bug among others [1] we need to disable the image-smoothing to
 | ||||
|             // avoid getting a blur effect when copying data.
 | ||||
|             //
 | ||||
|             // 1. https://bugzilla.mozilla.org/show_bug.cgi?id=1194719
 | ||||
|             //
 | ||||
|             // We need to set these every time since all properties are reset
 | ||||
|             // when the the size is changed
 | ||||
|             this._drawCtx.mozImageSmoothingEnabled = false; | ||||
|             this._drawCtx.webkitImageSmoothingEnabled = false; | ||||
|             this._drawCtx.msImageSmoothingEnabled = false; | ||||
|             this._drawCtx.imageSmoothingEnabled = false; | ||||
| 
 | ||||
|             this._drawCtx.drawImage(this._backbuffer, old_x, old_y, w, h, new_x, new_y, w, h); | ||||
|             this._damage(new_x, new_y, w, h); | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     imageRect: function (x, y, mime, arr) { | ||||
|         var img = new Image(); | ||||
|         img.src = "data: " + mime + ";base64," + _base2.default.encode(arr); | ||||
|         this._renderQ_push({ | ||||
|             'type': 'img', | ||||
|             'img': img, | ||||
|             'x': x, | ||||
|             'y': y | ||||
|         }); | ||||
|     }, | ||||
| 
 | ||||
|     // start updating a tile
 | ||||
|     startTile: function (x, y, width, height, color) { | ||||
|         this._tile_x = x; | ||||
|         this._tile_y = y; | ||||
|         if (width === 16 && height === 16) { | ||||
|             this._tile = this._tile16x16; | ||||
|         } else { | ||||
|             this._tile = this._drawCtx.createImageData(width, height); | ||||
|         } | ||||
| 
 | ||||
|         var red = color[2]; | ||||
|         var green = color[1]; | ||||
|         var blue = color[0]; | ||||
| 
 | ||||
|         var data = this._tile.data; | ||||
|         for (var i = 0; i < width * height * 4; i += 4) { | ||||
|             data[i] = red; | ||||
|             data[i + 1] = green; | ||||
|             data[i + 2] = blue; | ||||
|             data[i + 3] = 255; | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     // update sub-rectangle of the current tile
 | ||||
|     subTile: function (x, y, w, h, color) { | ||||
|         var red = color[2]; | ||||
|         var green = color[1]; | ||||
|         var blue = color[0]; | ||||
|         var xend = x + w; | ||||
|         var yend = y + h; | ||||
| 
 | ||||
|         var data = this._tile.data; | ||||
|         var width = this._tile.width; | ||||
|         for (var j = y; j < yend; j++) { | ||||
|             for (var i = x; i < xend; i++) { | ||||
|                 var p = (i + j * width) * 4; | ||||
|                 data[p] = red; | ||||
|                 data[p + 1] = green; | ||||
|                 data[p + 2] = blue; | ||||
|                 data[p + 3] = 255; | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     // draw the current tile to the screen
 | ||||
|     finishTile: function () { | ||||
|         this._drawCtx.putImageData(this._tile, this._tile_x, this._tile_y); | ||||
|         this._damage(this._tile_x, this._tile_y, this._tile.width, this._tile.height); | ||||
|     }, | ||||
| 
 | ||||
|     blitImage: function (x, y, width, height, arr, offset, from_queue) { | ||||
|         if (this._renderQ.length !== 0 && !from_queue) { | ||||
|             // NB(directxman12): it's technically more performant here to use preallocated arrays,
 | ||||
|             // but it's a lot of extra work for not a lot of payoff -- if we're using the render queue,
 | ||||
|             // this probably isn't getting called *nearly* as much
 | ||||
|             var new_arr = new Uint8Array(width * height * 4); | ||||
|             new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length)); | ||||
|             this._renderQ_push({ | ||||
|                 'type': 'blit', | ||||
|                 'data': new_arr, | ||||
|                 'x': x, | ||||
|                 'y': y, | ||||
|                 'width': width, | ||||
|                 'height': height | ||||
|             }); | ||||
|         } else { | ||||
|             this._bgrxImageData(x, y, width, height, arr, offset); | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     blitRgbImage: function (x, y, width, height, arr, offset, from_queue) { | ||||
|         if (this._renderQ.length !== 0 && !from_queue) { | ||||
|             // NB(directxman12): it's technically more performant here to use preallocated arrays,
 | ||||
|             // but it's a lot of extra work for not a lot of payoff -- if we're using the render queue,
 | ||||
|             // this probably isn't getting called *nearly* as much
 | ||||
|             var new_arr = new Uint8Array(width * height * 3); | ||||
|             new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length)); | ||||
|             this._renderQ_push({ | ||||
|                 'type': 'blitRgb', | ||||
|                 'data': new_arr, | ||||
|                 'x': x, | ||||
|                 'y': y, | ||||
|                 'width': width, | ||||
|                 'height': height | ||||
|             }); | ||||
|         } else { | ||||
|             this._rgbImageData(x, y, width, height, arr, offset); | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     blitRgbxImage: function (x, y, width, height, arr, offset, from_queue) { | ||||
|         if (this._renderQ.length !== 0 && !from_queue) { | ||||
|             // NB(directxman12): it's technically more performant here to use preallocated arrays,
 | ||||
|             // but it's a lot of extra work for not a lot of payoff -- if we're using the render queue,
 | ||||
|             // this probably isn't getting called *nearly* as much
 | ||||
|             var new_arr = new Uint8Array(width * height * 4); | ||||
|             new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length)); | ||||
|             this._renderQ_push({ | ||||
|                 'type': 'blitRgbx', | ||||
|                 'data': new_arr, | ||||
|                 'x': x, | ||||
|                 'y': y, | ||||
|                 'width': width, | ||||
|                 'height': height | ||||
|             }); | ||||
|         } else { | ||||
|             this._rgbxImageData(x, y, width, height, arr, offset); | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     drawImage: function (img, x, y) { | ||||
|         this._drawCtx.drawImage(img, x, y); | ||||
|         this._damage(x, y, img.width, img.height); | ||||
|     }, | ||||
| 
 | ||||
|     changeCursor: function (pixels, mask, hotx, hoty, w, h) { | ||||
|         Display.changeCursor(this._target, pixels, mask, hotx, hoty, w, h); | ||||
|     }, | ||||
| 
 | ||||
|     defaultCursor: function () { | ||||
|         this._target.style.cursor = "default"; | ||||
|     }, | ||||
| 
 | ||||
|     disableLocalCursor: function () { | ||||
|         this._target.style.cursor = "none"; | ||||
|     }, | ||||
| 
 | ||||
|     autoscale: function (containerWidth, containerHeight) { | ||||
|         var vp = this._viewportLoc; | ||||
|         var targetAspectRatio = containerWidth / containerHeight; | ||||
|         var fbAspectRatio = vp.w / vp.h; | ||||
| 
 | ||||
|         var scaleRatio; | ||||
|         if (fbAspectRatio >= targetAspectRatio) { | ||||
|             scaleRatio = containerWidth / vp.w; | ||||
|         } else { | ||||
|             scaleRatio = containerHeight / vp.h; | ||||
|         } | ||||
| 
 | ||||
|         this._rescale(scaleRatio); | ||||
|     }, | ||||
| 
 | ||||
|     // ===== PRIVATE METHODS =====
 | ||||
| 
 | ||||
|     _rescale: function (factor) { | ||||
|         this._scale = factor; | ||||
|         var vp = this._viewportLoc; | ||||
| 
 | ||||
|         // NB(directxman12): If you set the width directly, or set the
 | ||||
|         //                   style width to a number, the canvas is cleared.
 | ||||
|         //                   However, if you set the style width to a string
 | ||||
|         //                   ('NNNpx'), the canvas is scaled without clearing.
 | ||||
|         var width = Math.round(factor * vp.w) + 'px'; | ||||
|         var height = Math.round(factor * vp.h) + 'px'; | ||||
| 
 | ||||
|         if (this._target.style.width !== width || this._target.style.height !== height) { | ||||
|             this._target.style.width = width; | ||||
|             this._target.style.height = height; | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     _setFillColor: function (color) { | ||||
|         var newStyle = 'rgb(' + color[2] + ',' + color[1] + ',' + color[0] + ')'; | ||||
|         if (newStyle !== this._prevDrawStyle) { | ||||
|             this._drawCtx.fillStyle = newStyle; | ||||
|             this._prevDrawStyle = newStyle; | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     _rgbImageData: function (x, y, width, height, arr, offset) { | ||||
|         var img = this._drawCtx.createImageData(width, height); | ||||
|         var data = img.data; | ||||
|         for (var i = 0, j = offset; i < width * height * 4; i += 4, j += 3) { | ||||
|             data[i] = arr[j]; | ||||
|             data[i + 1] = arr[j + 1]; | ||||
|             data[i + 2] = arr[j + 2]; | ||||
|             data[i + 3] = 255; // Alpha
 | ||||
|         } | ||||
|         this._drawCtx.putImageData(img, x, y); | ||||
|         this._damage(x, y, img.width, img.height); | ||||
|     }, | ||||
| 
 | ||||
|     _bgrxImageData: function (x, y, width, height, arr, offset) { | ||||
|         var img = this._drawCtx.createImageData(width, height); | ||||
|         var data = img.data; | ||||
|         for (var i = 0, j = offset; i < width * height * 4; i += 4, j += 4) { | ||||
|             data[i] = arr[j + 2]; | ||||
|             data[i + 1] = arr[j + 1]; | ||||
|             data[i + 2] = arr[j]; | ||||
|             data[i + 3] = 255; // Alpha
 | ||||
|         } | ||||
|         this._drawCtx.putImageData(img, x, y); | ||||
|         this._damage(x, y, img.width, img.height); | ||||
|     }, | ||||
| 
 | ||||
|     _rgbxImageData: function (x, y, width, height, arr, offset) { | ||||
|         // NB(directxman12): arr must be an Type Array view
 | ||||
|         var img; | ||||
|         if (SUPPORTS_IMAGEDATA_CONSTRUCTOR) { | ||||
|             img = new ImageData(new Uint8ClampedArray(arr.buffer, arr.byteOffset, width * height * 4), width, height); | ||||
|         } else { | ||||
|             img = this._drawCtx.createImageData(width, height); | ||||
|             img.data.set(new Uint8ClampedArray(arr.buffer, arr.byteOffset, width * height * 4)); | ||||
|         } | ||||
|         this._drawCtx.putImageData(img, x, y); | ||||
|         this._damage(x, y, img.width, img.height); | ||||
|     }, | ||||
| 
 | ||||
|     _renderQ_push: function (action) { | ||||
|         this._renderQ.push(action); | ||||
|         if (this._renderQ.length === 1) { | ||||
|             // If this can be rendered immediately it will be, otherwise
 | ||||
|             // the scanner will wait for the relevant event
 | ||||
|             this._scan_renderQ(); | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     _resume_renderQ: function () { | ||||
|         // "this" is the object that is ready, not the
 | ||||
|         // display object
 | ||||
|         this.removeEventListener('load', this._noVNC_display._resume_renderQ); | ||||
|         this._noVNC_display._scan_renderQ(); | ||||
|     }, | ||||
| 
 | ||||
|     _scan_renderQ: function () { | ||||
|         var ready = true; | ||||
|         while (ready && this._renderQ.length > 0) { | ||||
|             var a = this._renderQ[0]; | ||||
|             switch (a.type) { | ||||
|                 case 'flip': | ||||
|                     this.flip(true); | ||||
|                     break; | ||||
|                 case 'copy': | ||||
|                     this.copyImage(a.old_x, a.old_y, a.x, a.y, a.width, a.height, true); | ||||
|                     break; | ||||
|                 case 'fill': | ||||
|                     this.fillRect(a.x, a.y, a.width, a.height, a.color, true); | ||||
|                     break; | ||||
|                 case 'blit': | ||||
|                     this.blitImage(a.x, a.y, a.width, a.height, a.data, 0, true); | ||||
|                     break; | ||||
|                 case 'blitRgb': | ||||
|                     this.blitRgbImage(a.x, a.y, a.width, a.height, a.data, 0, true); | ||||
|                     break; | ||||
|                 case 'blitRgbx': | ||||
|                     this.blitRgbxImage(a.x, a.y, a.width, a.height, a.data, 0, true); | ||||
|                     break; | ||||
|                 case 'img': | ||||
|                     if (a.img.complete) { | ||||
|                         this.drawImage(a.img, a.x, a.y); | ||||
|                     } else { | ||||
|                         a.img._noVNC_display = this; | ||||
|                         a.img.addEventListener('load', this._resume_renderQ); | ||||
|                         // We need to wait for this image to 'load'
 | ||||
|                         // to keep things in-order
 | ||||
|                         ready = false; | ||||
|                     } | ||||
|                     break; | ||||
|             } | ||||
| 
 | ||||
|             if (ready) { | ||||
|                 this._renderQ.shift(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (this._renderQ.length === 0 && this._flushing) { | ||||
|             this._flushing = false; | ||||
|             this.onflush(); | ||||
|         } | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| // Class Methods
 | ||||
| Display.changeCursor = function (target, pixels, mask, hotx, hoty, w, h) { | ||||
|     if (w === 0 || h === 0) { | ||||
|         target.style.cursor = 'none'; | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     var cur = []; | ||||
|     var y, x; | ||||
|     for (y = 0; y < h; y++) { | ||||
|         for (x = 0; x < w; x++) { | ||||
|             var idx = y * Math.ceil(w / 8) + Math.floor(x / 8); | ||||
|             var alpha = mask[idx] << x % 8 & 0x80 ? 255 : 0; | ||||
|             idx = (w * y + x) * 4; | ||||
|             cur.push(pixels[idx + 2]); // red
 | ||||
|             cur.push(pixels[idx + 1]); // green
 | ||||
|             cur.push(pixels[idx]); // blue
 | ||||
|             cur.push(alpha); // alpha
 | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     var canvas = document.createElement('canvas'); | ||||
|     var ctx = canvas.getContext('2d'); | ||||
| 
 | ||||
|     canvas.width = w; | ||||
|     canvas.height = h; | ||||
| 
 | ||||
|     var img; | ||||
|     if (SUPPORTS_IMAGEDATA_CONSTRUCTOR) { | ||||
|         img = new ImageData(new Uint8ClampedArray(cur), w, h); | ||||
|     } else { | ||||
|         img = ctx.createImageData(w, h); | ||||
|         img.data.set(new Uint8ClampedArray(cur)); | ||||
|     } | ||||
|     ctx.clearRect(0, 0, w, h); | ||||
|     ctx.putImageData(img, 0, 0); | ||||
| 
 | ||||
|     var url = canvas.toDataURL(); | ||||
|     target.style.cursor = 'url(' + url + ')' + hotx + ' ' + hoty + ', default'; | ||||
| }; | ||||
							
								
								
									
										52
									
								
								static/js/novnc/core/encodings.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,52 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| exports.encodingName = encodingName; | ||||
| /* | ||||
|  * noVNC: HTML5 VNC client | ||||
|  * Copyright (C) 2017 Pierre Ossman for Cendio AB | ||||
|  * Licensed under MPL 2.0 (see LICENSE.txt) | ||||
|  * | ||||
|  * See README.md for usage and integration instructions. | ||||
|  */ | ||||
| 
 | ||||
| var encodings = exports.encodings = { | ||||
|     encodingRaw: 0, | ||||
|     encodingCopyRect: 1, | ||||
|     encodingRRE: 2, | ||||
|     encodingHextile: 5, | ||||
|     encodingTight: 7, | ||||
| 
 | ||||
|     pseudoEncodingQualityLevel9: -23, | ||||
|     pseudoEncodingQualityLevel0: -32, | ||||
|     pseudoEncodingDesktopSize: -223, | ||||
|     pseudoEncodingLastRect: -224, | ||||
|     pseudoEncodingCursor: -239, | ||||
|     pseudoEncodingQEMUExtendedKeyEvent: -258, | ||||
|     pseudoEncodingTightPNG: -260, | ||||
|     pseudoEncodingExtendedDesktopSize: -308, | ||||
|     pseudoEncodingXvp: -309, | ||||
|     pseudoEncodingFence: -312, | ||||
|     pseudoEncodingContinuousUpdates: -313, | ||||
|     pseudoEncodingCompressLevel9: -247, | ||||
|     pseudoEncodingCompressLevel0: -256 | ||||
| }; | ||||
| 
 | ||||
| function encodingName(num) { | ||||
|     switch (num) { | ||||
|         case encodings.encodingRaw: | ||||
|             return "Raw"; | ||||
|         case encodings.encodingCopyRect: | ||||
|             return "CopyRect"; | ||||
|         case encodings.encodingRRE: | ||||
|             return "RRE"; | ||||
|         case encodings.encodingHextile: | ||||
|             return "Hextile"; | ||||
|         case encodings.encodingTight: | ||||
|             return "Tight"; | ||||
|         default: | ||||
|             return "[unknown encoding " + num + "]"; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										50
									
								
								static/js/novnc/core/inflator.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,50 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| exports.default = Inflate; | ||||
| 
 | ||||
| var _inflate = require("../vendor/pako/lib/zlib/inflate.js"); | ||||
| 
 | ||||
| var _zstream = require("../vendor/pako/lib/zlib/zstream.js"); | ||||
| 
 | ||||
| var _zstream2 = _interopRequireDefault(_zstream); | ||||
| 
 | ||||
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||||
| 
 | ||||
| Inflate.prototype = { | ||||
|     inflate: function (data, flush, expected) { | ||||
|         this.strm.input = data; | ||||
|         this.strm.avail_in = this.strm.input.length; | ||||
|         this.strm.next_in = 0; | ||||
|         this.strm.next_out = 0; | ||||
| 
 | ||||
|         // resize our output buffer if it's too small
 | ||||
|         // (we could just use multiple chunks, but that would cause an extra
 | ||||
|         // allocation each time to flatten the chunks)
 | ||||
|         if (expected > this.chunkSize) { | ||||
|             this.chunkSize = expected; | ||||
|             this.strm.output = new Uint8Array(this.chunkSize); | ||||
|         } | ||||
| 
 | ||||
|         this.strm.avail_out = this.chunkSize; | ||||
| 
 | ||||
|         (0, _inflate.inflate)(this.strm, flush); | ||||
| 
 | ||||
|         return new Uint8Array(this.strm.output.buffer, 0, this.strm.next_out); | ||||
|     }, | ||||
| 
 | ||||
|     reset: function () { | ||||
|         (0, _inflate.inflateReset)(this.strm); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| function Inflate() { | ||||
|     this.strm = new _zstream2.default(); | ||||
|     this.chunkSize = 1024 * 10 * 10; | ||||
|     this.strm.output = new Uint8Array(this.chunkSize); | ||||
|     this.windowBits = 5; | ||||
| 
 | ||||
|     (0, _inflate.inflateInit)(this.strm, this.windowBits); | ||||
| }; | ||||
							
								
								
									
										315
									
								
								static/js/novnc/core/input/domkeytable.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,315 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| 
 | ||||
| var _keysym = require("./keysym.js"); | ||||
| 
 | ||||
| var _keysym2 = _interopRequireDefault(_keysym); | ||||
| 
 | ||||
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||||
| 
 | ||||
| /* | ||||
|  * Mapping between HTML key values and VNC/X11 keysyms for "special" | ||||
|  * keys that cannot be handled via their Unicode codepoint. | ||||
|  * | ||||
|  * See https://www.w3.org/TR/uievents-key/ for possible values.
 | ||||
|  */ | ||||
| 
 | ||||
| var DOMKeyTable = {}; /* | ||||
|                        * noVNC: HTML5 VNC client | ||||
|                        * Copyright (C) 2017 Pierre Ossman for Cendio AB | ||||
|                        * Licensed under MPL 2.0 or any later version (see LICENSE.txt) | ||||
|                        */ | ||||
| 
 | ||||
| function addStandard(key, standard) { | ||||
|     if (standard === undefined) throw "Undefined keysym for key \"" + key + "\""; | ||||
|     if (key in DOMKeyTable) throw "Duplicate entry for key \"" + key + "\""; | ||||
|     DOMKeyTable[key] = [standard, standard, standard, standard]; | ||||
| } | ||||
| 
 | ||||
| function addLeftRight(key, left, right) { | ||||
|     if (left === undefined) throw "Undefined keysym for key \"" + key + "\""; | ||||
|     if (right === undefined) throw "Undefined keysym for key \"" + key + "\""; | ||||
|     if (key in DOMKeyTable) throw "Duplicate entry for key \"" + key + "\""; | ||||
|     DOMKeyTable[key] = [left, left, right, left]; | ||||
| } | ||||
| 
 | ||||
| function addNumpad(key, standard, numpad) { | ||||
|     if (standard === undefined) throw "Undefined keysym for key \"" + key + "\""; | ||||
|     if (numpad === undefined) throw "Undefined keysym for key \"" + key + "\""; | ||||
|     if (key in DOMKeyTable) throw "Duplicate entry for key \"" + key + "\""; | ||||
|     DOMKeyTable[key] = [standard, standard, standard, numpad]; | ||||
| } | ||||
| 
 | ||||
| // 2.2. Modifier Keys
 | ||||
| 
 | ||||
| addLeftRight("Alt", _keysym2.default.XK_Alt_L, _keysym2.default.XK_Alt_R); | ||||
| addStandard("AltGraph", _keysym2.default.XK_ISO_Level3_Shift); | ||||
| addStandard("CapsLock", _keysym2.default.XK_Caps_Lock); | ||||
| addLeftRight("Control", _keysym2.default.XK_Control_L, _keysym2.default.XK_Control_R); | ||||
| // - Fn
 | ||||
| // - FnLock
 | ||||
| addLeftRight("Hyper", _keysym2.default.XK_Super_L, _keysym2.default.XK_Super_R); | ||||
| addLeftRight("Meta", _keysym2.default.XK_Super_L, _keysym2.default.XK_Super_R); | ||||
| addStandard("NumLock", _keysym2.default.XK_Num_Lock); | ||||
| addStandard("ScrollLock", _keysym2.default.XK_Scroll_Lock); | ||||
| addLeftRight("Shift", _keysym2.default.XK_Shift_L, _keysym2.default.XK_Shift_R); | ||||
| addLeftRight("Super", _keysym2.default.XK_Super_L, _keysym2.default.XK_Super_R); | ||||
| // - Symbol
 | ||||
| // - SymbolLock
 | ||||
| 
 | ||||
| // 2.3. Whitespace Keys
 | ||||
| 
 | ||||
| addNumpad("Enter", _keysym2.default.XK_Return, _keysym2.default.XK_KP_Enter); | ||||
| addStandard("Tab", _keysym2.default.XK_Tab); | ||||
| addNumpad(" ", _keysym2.default.XK_space, _keysym2.default.XK_KP_Space); | ||||
| 
 | ||||
| // 2.4. Navigation Keys
 | ||||
| 
 | ||||
| addNumpad("ArrowDown", _keysym2.default.XK_Down, _keysym2.default.XK_KP_Down); | ||||
| addNumpad("ArrowUp", _keysym2.default.XK_Up, _keysym2.default.XK_KP_Up); | ||||
| addNumpad("ArrowLeft", _keysym2.default.XK_Left, _keysym2.default.XK_KP_Left); | ||||
| addNumpad("ArrowRight", _keysym2.default.XK_Right, _keysym2.default.XK_KP_Right); | ||||
| addNumpad("End", _keysym2.default.XK_End, _keysym2.default.XK_KP_End); | ||||
| addNumpad("Home", _keysym2.default.XK_Home, _keysym2.default.XK_KP_Home); | ||||
| addNumpad("PageDown", _keysym2.default.XK_Next, _keysym2.default.XK_KP_Next); | ||||
| addNumpad("PageUp", _keysym2.default.XK_Prior, _keysym2.default.XK_KP_Prior); | ||||
| 
 | ||||
| // 2.5. Editing Keys
 | ||||
| 
 | ||||
| addStandard("Backspace", _keysym2.default.XK_BackSpace); | ||||
| addStandard("Clear", _keysym2.default.XK_Clear); | ||||
| addStandard("Copy", _keysym2.default.XF86XK_Copy); | ||||
| // - CrSel
 | ||||
| addStandard("Cut", _keysym2.default.XF86XK_Cut); | ||||
| addNumpad("Delete", _keysym2.default.XK_Delete, _keysym2.default.XK_KP_Delete); | ||||
| // - EraseEof
 | ||||
| // - ExSel
 | ||||
| addNumpad("Insert", _keysym2.default.XK_Insert, _keysym2.default.XK_KP_Insert); | ||||
| addStandard("Paste", _keysym2.default.XF86XK_Paste); | ||||
| addStandard("Redo", _keysym2.default.XK_Redo); | ||||
| addStandard("Undo", _keysym2.default.XK_Undo); | ||||
| 
 | ||||
| // 2.6. UI Keys
 | ||||
| 
 | ||||
| // - Accept
 | ||||
| // - Again (could just be XK_Redo)
 | ||||
| // - Attn
 | ||||
| addStandard("Cancel", _keysym2.default.XK_Cancel); | ||||
| addStandard("ContextMenu", _keysym2.default.XK_Menu); | ||||
| addStandard("Escape", _keysym2.default.XK_Escape); | ||||
| addStandard("Execute", _keysym2.default.XK_Execute); | ||||
| addStandard("Find", _keysym2.default.XK_Find); | ||||
| addStandard("Help", _keysym2.default.XK_Help); | ||||
| addStandard("Pause", _keysym2.default.XK_Pause); | ||||
| // - Play
 | ||||
| // - Props
 | ||||
| addStandard("Select", _keysym2.default.XK_Select); | ||||
| addStandard("ZoomIn", _keysym2.default.XF86XK_ZoomIn); | ||||
| addStandard("ZoomOut", _keysym2.default.XF86XK_ZoomOut); | ||||
| 
 | ||||
| // 2.7. Device Keys
 | ||||
| 
 | ||||
| addStandard("BrightnessDown", _keysym2.default.XF86XK_MonBrightnessDown); | ||||
| addStandard("BrightnessUp", _keysym2.default.XF86XK_MonBrightnessUp); | ||||
| addStandard("Eject", _keysym2.default.XF86XK_Eject); | ||||
| addStandard("LogOff", _keysym2.default.XF86XK_LogOff); | ||||
| addStandard("Power", _keysym2.default.XF86XK_PowerOff); | ||||
| addStandard("PowerOff", _keysym2.default.XF86XK_PowerDown); | ||||
| addStandard("PrintScreen", _keysym2.default.XK_Print); | ||||
| addStandard("Hibernate", _keysym2.default.XF86XK_Hibernate); | ||||
| addStandard("Standby", _keysym2.default.XF86XK_Standby); | ||||
| addStandard("WakeUp", _keysym2.default.XF86XK_WakeUp); | ||||
| 
 | ||||
| // 2.8. IME and Composition Keys
 | ||||
| 
 | ||||
| addStandard("AllCandidates", _keysym2.default.XK_MultipleCandidate); | ||||
| addStandard("Alphanumeric", _keysym2.default.XK_Eisu_Shift); // could also be _Eisu_Toggle
 | ||||
| addStandard("CodeInput", _keysym2.default.XK_Codeinput); | ||||
| addStandard("Compose", _keysym2.default.XK_Multi_key); | ||||
| addStandard("Convert", _keysym2.default.XK_Henkan); | ||||
| // - Dead
 | ||||
| // - FinalMode
 | ||||
| addStandard("GroupFirst", _keysym2.default.XK_ISO_First_Group); | ||||
| addStandard("GroupLast", _keysym2.default.XK_ISO_Last_Group); | ||||
| addStandard("GroupNext", _keysym2.default.XK_ISO_Next_Group); | ||||
| addStandard("GroupPrevious", _keysym2.default.XK_ISO_Prev_Group); | ||||
| // - ModeChange (XK_Mode_switch is often used for AltGr)
 | ||||
| // - NextCandidate
 | ||||
| addStandard("NonConvert", _keysym2.default.XK_Muhenkan); | ||||
| addStandard("PreviousCandidate", _keysym2.default.XK_PreviousCandidate); | ||||
| // - Process
 | ||||
| addStandard("SingleCandidate", _keysym2.default.XK_SingleCandidate); | ||||
| addStandard("HangulMode", _keysym2.default.XK_Hangul); | ||||
| addStandard("HanjaMode", _keysym2.default.XK_Hangul_Hanja); | ||||
| addStandard("JunjuaMode", _keysym2.default.XK_Hangul_Jeonja); | ||||
| addStandard("Eisu", _keysym2.default.XK_Eisu_toggle); | ||||
| addStandard("Hankaku", _keysym2.default.XK_Hankaku); | ||||
| addStandard("Hiragana", _keysym2.default.XK_Hiragana); | ||||
| addStandard("HiraganaKatakana", _keysym2.default.XK_Hiragana_Katakana); | ||||
| addStandard("KanaMode", _keysym2.default.XK_Kana_Shift); // could also be _Kana_Lock
 | ||||
| addStandard("KanjiMode", _keysym2.default.XK_Kanji); | ||||
| addStandard("Katakana", _keysym2.default.XK_Katakana); | ||||
| addStandard("Romaji", _keysym2.default.XK_Romaji); | ||||
| addStandard("Zenkaku", _keysym2.default.XK_Zenkaku); | ||||
| addStandard("ZenkakuHanaku", _keysym2.default.XK_Zenkaku_Hankaku); | ||||
| 
 | ||||
| // 2.9. General-Purpose Function Keys
 | ||||
| 
 | ||||
| addStandard("F1", _keysym2.default.XK_F1); | ||||
| addStandard("F2", _keysym2.default.XK_F2); | ||||
| addStandard("F3", _keysym2.default.XK_F3); | ||||
| addStandard("F4", _keysym2.default.XK_F4); | ||||
| addStandard("F5", _keysym2.default.XK_F5); | ||||
| addStandard("F6", _keysym2.default.XK_F6); | ||||
| addStandard("F7", _keysym2.default.XK_F7); | ||||
| addStandard("F8", _keysym2.default.XK_F8); | ||||
| addStandard("F9", _keysym2.default.XK_F9); | ||||
| addStandard("F10", _keysym2.default.XK_F10); | ||||
| addStandard("F11", _keysym2.default.XK_F11); | ||||
| addStandard("F12", _keysym2.default.XK_F12); | ||||
| addStandard("F13", _keysym2.default.XK_F13); | ||||
| addStandard("F14", _keysym2.default.XK_F14); | ||||
| addStandard("F15", _keysym2.default.XK_F15); | ||||
| addStandard("F16", _keysym2.default.XK_F16); | ||||
| addStandard("F17", _keysym2.default.XK_F17); | ||||
| addStandard("F18", _keysym2.default.XK_F18); | ||||
| addStandard("F19", _keysym2.default.XK_F19); | ||||
| addStandard("F20", _keysym2.default.XK_F20); | ||||
| addStandard("F21", _keysym2.default.XK_F21); | ||||
| addStandard("F22", _keysym2.default.XK_F22); | ||||
| addStandard("F23", _keysym2.default.XK_F23); | ||||
| addStandard("F24", _keysym2.default.XK_F24); | ||||
| addStandard("F25", _keysym2.default.XK_F25); | ||||
| addStandard("F26", _keysym2.default.XK_F26); | ||||
| addStandard("F27", _keysym2.default.XK_F27); | ||||
| addStandard("F28", _keysym2.default.XK_F28); | ||||
| addStandard("F29", _keysym2.default.XK_F29); | ||||
| addStandard("F30", _keysym2.default.XK_F30); | ||||
| addStandard("F31", _keysym2.default.XK_F31); | ||||
| addStandard("F32", _keysym2.default.XK_F32); | ||||
| addStandard("F33", _keysym2.default.XK_F33); | ||||
| addStandard("F34", _keysym2.default.XK_F34); | ||||
| addStandard("F35", _keysym2.default.XK_F35); | ||||
| // - Soft1...
 | ||||
| 
 | ||||
| // 2.10. Multimedia Keys
 | ||||
| 
 | ||||
| // - ChannelDown
 | ||||
| // - ChannelUp
 | ||||
| addStandard("Close", _keysym2.default.XF86XK_Close); | ||||
| addStandard("MailForward", _keysym2.default.XF86XK_MailForward); | ||||
| addStandard("MailReply", _keysym2.default.XF86XK_Reply); | ||||
| addStandard("MainSend", _keysym2.default.XF86XK_Send); | ||||
| addStandard("MediaFastForward", _keysym2.default.XF86XK_AudioForward); | ||||
| addStandard("MediaPause", _keysym2.default.XF86XK_AudioPause); | ||||
| addStandard("MediaPlay", _keysym2.default.XF86XK_AudioPlay); | ||||
| addStandard("MediaRecord", _keysym2.default.XF86XK_AudioRecord); | ||||
| addStandard("MediaRewind", _keysym2.default.XF86XK_AudioRewind); | ||||
| addStandard("MediaStop", _keysym2.default.XF86XK_AudioStop); | ||||
| addStandard("MediaTrackNext", _keysym2.default.XF86XK_AudioNext); | ||||
| addStandard("MediaTrackPrevious", _keysym2.default.XF86XK_AudioPrev); | ||||
| addStandard("New", _keysym2.default.XF86XK_New); | ||||
| addStandard("Open", _keysym2.default.XF86XK_Open); | ||||
| addStandard("Print", _keysym2.default.XK_Print); | ||||
| addStandard("Save", _keysym2.default.XF86XK_Save); | ||||
| addStandard("SpellCheck", _keysym2.default.XF86XK_Spell); | ||||
| 
 | ||||
| // 2.11. Multimedia Numpad Keys
 | ||||
| 
 | ||||
| // - Key11
 | ||||
| // - Key12
 | ||||
| 
 | ||||
| // 2.12. Audio Keys
 | ||||
| 
 | ||||
| // - AudioBalanceLeft
 | ||||
| // - AudioBalanceRight
 | ||||
| // - AudioBassDown
 | ||||
| // - AudioBassBoostDown
 | ||||
| // - AudioBassBoostToggle
 | ||||
| // - AudioBassBoostUp
 | ||||
| // - AudioBassUp
 | ||||
| // - AudioFaderFront
 | ||||
| // - AudioFaderRear
 | ||||
| // - AudioSurroundModeNext
 | ||||
| // - AudioTrebleDown
 | ||||
| // - AudioTrebleUp
 | ||||
| addStandard("AudioVolumeDown", _keysym2.default.XF86XK_AudioLowerVolume); | ||||
| addStandard("AudioVolumeUp", _keysym2.default.XF86XK_AudioRaiseVolume); | ||||
| addStandard("AudioVolumeMute", _keysym2.default.XF86XK_AudioMute); | ||||
| // - MicrophoneToggle
 | ||||
| // - MicrophoneVolumeDown
 | ||||
| // - MicrophoneVolumeUp
 | ||||
| addStandard("MicrophoneVolumeMute", _keysym2.default.XF86XK_AudioMicMute); | ||||
| 
 | ||||
| // 2.13. Speech Keys
 | ||||
| 
 | ||||
| // - SpeechCorrectionList
 | ||||
| // - SpeechInputToggle
 | ||||
| 
 | ||||
| // 2.14. Application Keys
 | ||||
| 
 | ||||
| addStandard("LaunchCalculator", _keysym2.default.XF86XK_Calculator); | ||||
| addStandard("LaunchCalendar", _keysym2.default.XF86XK_Calendar); | ||||
| addStandard("LaunchMail", _keysym2.default.XF86XK_Mail); | ||||
| addStandard("LaunchMediaPlayer", _keysym2.default.XF86XK_AudioMedia); | ||||
| addStandard("LaunchMusicPlayer", _keysym2.default.XF86XK_Music); | ||||
| addStandard("LaunchMyComputer", _keysym2.default.XF86XK_MyComputer); | ||||
| addStandard("LaunchPhone", _keysym2.default.XF86XK_Phone); | ||||
| addStandard("LaunchScreenSaver", _keysym2.default.XF86XK_ScreenSaver); | ||||
| addStandard("LaunchSpreadsheet", _keysym2.default.XF86XK_Excel); | ||||
| addStandard("LaunchWebBrowser", _keysym2.default.XF86XK_WWW); | ||||
| addStandard("LaunchWebCam", _keysym2.default.XF86XK_WebCam); | ||||
| addStandard("LaunchWordProcessor", _keysym2.default.XF86XK_Word); | ||||
| 
 | ||||
| // 2.15. Browser Keys
 | ||||
| 
 | ||||
| addStandard("BrowserBack", _keysym2.default.XF86XK_Back); | ||||
| addStandard("BrowserFavorites", _keysym2.default.XF86XK_Favorites); | ||||
| addStandard("BrowserForward", _keysym2.default.XF86XK_Forward); | ||||
| addStandard("BrowserHome", _keysym2.default.XF86XK_HomePage); | ||||
| addStandard("BrowserRefresh", _keysym2.default.XF86XK_Refresh); | ||||
| addStandard("BrowserSearch", _keysym2.default.XF86XK_Search); | ||||
| addStandard("BrowserStop", _keysym2.default.XF86XK_Stop); | ||||
| 
 | ||||
| // 2.16. Mobile Phone Keys
 | ||||
| 
 | ||||
| // - A whole bunch...
 | ||||
| 
 | ||||
| // 2.17. TV Keys
 | ||||
| 
 | ||||
| // - A whole bunch...
 | ||||
| 
 | ||||
| // 2.18. Media Controller Keys
 | ||||
| 
 | ||||
| // - A whole bunch...
 | ||||
| addStandard("Dimmer", _keysym2.default.XF86XK_BrightnessAdjust); | ||||
| addStandard("MediaAudioTrack", _keysym2.default.XF86XK_AudioCycleTrack); | ||||
| addStandard("RandomToggle", _keysym2.default.XF86XK_AudioRandomPlay); | ||||
| addStandard("SplitScreenToggle", _keysym2.default.XF86XK_SplitScreen); | ||||
| addStandard("Subtitle", _keysym2.default.XF86XK_Subtitle); | ||||
| addStandard("VideoModeNext", _keysym2.default.XF86XK_Next_VMode); | ||||
| 
 | ||||
| // Extra: Numpad
 | ||||
| 
 | ||||
| addNumpad("=", _keysym2.default.XK_equal, _keysym2.default.XK_KP_Equal); | ||||
| addNumpad("+", _keysym2.default.XK_plus, _keysym2.default.XK_KP_Add); | ||||
| addNumpad("-", _keysym2.default.XK_minus, _keysym2.default.XK_KP_Subtract); | ||||
| addNumpad("*", _keysym2.default.XK_asterisk, _keysym2.default.XK_KP_Multiply); | ||||
| addNumpad("/", _keysym2.default.XK_slash, _keysym2.default.XK_KP_Divide); | ||||
| addNumpad(".", _keysym2.default.XK_period, _keysym2.default.XK_KP_Decimal); | ||||
| addNumpad(",", _keysym2.default.XK_comma, _keysym2.default.XK_KP_Separator); | ||||
| addNumpad("0", _keysym2.default.XK_0, _keysym2.default.XK_KP_0); | ||||
| addNumpad("1", _keysym2.default.XK_1, _keysym2.default.XK_KP_1); | ||||
| addNumpad("2", _keysym2.default.XK_2, _keysym2.default.XK_KP_2); | ||||
| addNumpad("3", _keysym2.default.XK_3, _keysym2.default.XK_KP_3); | ||||
| addNumpad("4", _keysym2.default.XK_4, _keysym2.default.XK_KP_4); | ||||
| addNumpad("5", _keysym2.default.XK_5, _keysym2.default.XK_KP_5); | ||||
| addNumpad("6", _keysym2.default.XK_6, _keysym2.default.XK_KP_6); | ||||
| addNumpad("7", _keysym2.default.XK_7, _keysym2.default.XK_KP_7); | ||||
| addNumpad("8", _keysym2.default.XK_8, _keysym2.default.XK_KP_8); | ||||
| addNumpad("9", _keysym2.default.XK_9, _keysym2.default.XK_KP_9); | ||||
| 
 | ||||
| exports.default = DOMKeyTable; | ||||
							
								
								
									
										132
									
								
								static/js/novnc/core/input/fixedkeys.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,132 @@ | |||
| 'use strict'; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| /* | ||||
|  * noVNC: HTML5 VNC client | ||||
|  * Copyright (C) 2017 Pierre Ossman for Cendio AB | ||||
|  * Licensed under MPL 2.0 or any later version (see LICENSE.txt) | ||||
|  */ | ||||
| 
 | ||||
| /* | ||||
|  * Fallback mapping between HTML key codes (physical keys) and | ||||
|  * HTML key values. This only works for keys that don't vary | ||||
|  * between layouts. We also omit those who manage fine by mapping the | ||||
|  * Unicode representation. | ||||
|  * | ||||
|  * See https://www.w3.org/TR/uievents-code/ for possible codes.
 | ||||
|  * See https://www.w3.org/TR/uievents-key/ for possible values.
 | ||||
|  */ | ||||
| 
 | ||||
| exports.default = { | ||||
| 
 | ||||
|     // 3.1.1.1. Writing System Keys
 | ||||
| 
 | ||||
|     'Backspace': 'Backspace', | ||||
| 
 | ||||
|     // 3.1.1.2. Functional Keys
 | ||||
| 
 | ||||
|     'AltLeft': 'Alt', | ||||
|     'AltRight': 'Alt', // This could also be 'AltGraph'
 | ||||
|     'CapsLock': 'CapsLock', | ||||
|     'ContextMenu': 'ContextMenu', | ||||
|     'ControlLeft': 'Control', | ||||
|     'ControlRight': 'Control', | ||||
|     'Enter': 'Enter', | ||||
|     'MetaLeft': 'Meta', | ||||
|     'MetaRight': 'Meta', | ||||
|     'ShiftLeft': 'Shift', | ||||
|     'ShiftRight': 'Shift', | ||||
|     'Tab': 'Tab', | ||||
|     // FIXME: Japanese/Korean keys
 | ||||
| 
 | ||||
|     // 3.1.2. Control Pad Section
 | ||||
| 
 | ||||
|     'Delete': 'Delete', | ||||
|     'End': 'End', | ||||
|     'Help': 'Help', | ||||
|     'Home': 'Home', | ||||
|     'Insert': 'Insert', | ||||
|     'PageDown': 'PageDown', | ||||
|     'PageUp': 'PageUp', | ||||
| 
 | ||||
|     // 3.1.3. Arrow Pad Section
 | ||||
| 
 | ||||
|     'ArrowDown': 'ArrowDown', | ||||
|     'ArrowLeft': 'ArrowLeft', | ||||
|     'ArrowRight': 'ArrowRight', | ||||
|     'ArrowUp': 'ArrowUp', | ||||
| 
 | ||||
|     // 3.1.4. Numpad Section
 | ||||
| 
 | ||||
|     'NumLock': 'NumLock', | ||||
|     'NumpadBackspace': 'Backspace', | ||||
|     'NumpadClear': 'Clear', | ||||
| 
 | ||||
|     // 3.1.5. Function Section
 | ||||
| 
 | ||||
|     'Escape': 'Escape', | ||||
|     'F1': 'F1', | ||||
|     'F2': 'F2', | ||||
|     'F3': 'F3', | ||||
|     'F4': 'F4', | ||||
|     'F5': 'F5', | ||||
|     'F6': 'F6', | ||||
|     'F7': 'F7', | ||||
|     'F8': 'F8', | ||||
|     'F9': 'F9', | ||||
|     'F10': 'F10', | ||||
|     'F11': 'F11', | ||||
|     'F12': 'F12', | ||||
|     'F13': 'F13', | ||||
|     'F14': 'F14', | ||||
|     'F15': 'F15', | ||||
|     'F16': 'F16', | ||||
|     'F17': 'F17', | ||||
|     'F18': 'F18', | ||||
|     'F19': 'F19', | ||||
|     'F20': 'F20', | ||||
|     'F21': 'F21', | ||||
|     'F22': 'F22', | ||||
|     'F23': 'F23', | ||||
|     'F24': 'F24', | ||||
|     'F25': 'F25', | ||||
|     'F26': 'F26', | ||||
|     'F27': 'F27', | ||||
|     'F28': 'F28', | ||||
|     'F29': 'F29', | ||||
|     'F30': 'F30', | ||||
|     'F31': 'F31', | ||||
|     'F32': 'F32', | ||||
|     'F33': 'F33', | ||||
|     'F34': 'F34', | ||||
|     'F35': 'F35', | ||||
|     'PrintScreen': 'PrintScreen', | ||||
|     'ScrollLock': 'ScrollLock', | ||||
|     'Pause': 'Pause', | ||||
| 
 | ||||
|     // 3.1.6. Media Keys
 | ||||
| 
 | ||||
|     'BrowserBack': 'BrowserBack', | ||||
|     'BrowserFavorites': 'BrowserFavorites', | ||||
|     'BrowserForward': 'BrowserForward', | ||||
|     'BrowserHome': 'BrowserHome', | ||||
|     'BrowserRefresh': 'BrowserRefresh', | ||||
|     'BrowserSearch': 'BrowserSearch', | ||||
|     'BrowserStop': 'BrowserStop', | ||||
|     'Eject': 'Eject', | ||||
|     'LaunchApp1': 'LaunchMyComputer', | ||||
|     'LaunchApp2': 'LaunchCalendar', | ||||
|     'LaunchMail': 'LaunchMail', | ||||
|     'MediaPlayPause': 'MediaPlay', | ||||
|     'MediaStop': 'MediaStop', | ||||
|     'MediaTrackNext': 'MediaTrackNext', | ||||
|     'MediaTrackPrevious': 'MediaTrackPrevious', | ||||
|     'Power': 'Power', | ||||
|     'Sleep': 'Sleep', | ||||
|     'AudioVolumeDown': 'AudioVolumeDown', | ||||
|     'AudioVolumeMute': 'AudioVolumeMute', | ||||
|     'AudioVolumeUp': 'AudioVolumeUp', | ||||
|     'WakeUp': 'WakeUp' | ||||
| }; | ||||
							
								
								
									
										326
									
								
								static/js/novnc/core/input/keyboard.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,326 @@ | |||
| 'use strict'; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| exports.default = Keyboard; | ||||
| 
 | ||||
| var _logging = require('../util/logging.js'); | ||||
| 
 | ||||
| var Log = _interopRequireWildcard(_logging); | ||||
| 
 | ||||
| var _events = require('../util/events.js'); | ||||
| 
 | ||||
| var _util = require('./util.js'); | ||||
| 
 | ||||
| var KeyboardUtil = _interopRequireWildcard(_util); | ||||
| 
 | ||||
| var _keysym = require('./keysym.js'); | ||||
| 
 | ||||
| var _keysym2 = _interopRequireDefault(_keysym); | ||||
| 
 | ||||
| var _browser = require('../util/browser.js'); | ||||
| 
 | ||||
| var browser = _interopRequireWildcard(_browser); | ||||
| 
 | ||||
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||||
| 
 | ||||
| function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||||
| 
 | ||||
| //
 | ||||
| // Keyboard event handler
 | ||||
| //
 | ||||
| 
 | ||||
| function Keyboard(target) { | ||||
|     this._target = target || null; | ||||
| 
 | ||||
|     this._keyDownList = {}; // List of depressed keys
 | ||||
|     // (even if they are happy)
 | ||||
|     this._pendingKey = null; // Key waiting for keypress
 | ||||
| 
 | ||||
|     // keep these here so we can refer to them later
 | ||||
|     this._eventHandlers = { | ||||
|         'keyup': this._handleKeyUp.bind(this), | ||||
|         'keydown': this._handleKeyDown.bind(this), | ||||
|         'keypress': this._handleKeyPress.bind(this), | ||||
|         'blur': this._allKeysUp.bind(this) | ||||
|     }; | ||||
| } /* | ||||
|    * noVNC: HTML5 VNC client | ||||
|    * Copyright (C) 2012 Joel Martin | ||||
|    * Copyright (C) 2013 Samuel Mannehed for Cendio AB | ||||
|    * Licensed under MPL 2.0 or any later version (see LICENSE.txt) | ||||
|    */ | ||||
| 
 | ||||
| ; | ||||
| 
 | ||||
| Keyboard.prototype = { | ||||
|     // ===== EVENT HANDLERS =====
 | ||||
| 
 | ||||
|     onkeyevent: function () {}, // Handler for key press/release
 | ||||
| 
 | ||||
|     // ===== PRIVATE METHODS =====
 | ||||
| 
 | ||||
|     _sendKeyEvent: function (keysym, code, down) { | ||||
|         Log.Debug("onkeyevent " + (down ? "down" : "up") + ", keysym: " + keysym, ", code: " + code); | ||||
| 
 | ||||
|         // Windows sends CtrlLeft+AltRight when you press
 | ||||
|         // AltGraph, which tends to confuse the hell out of
 | ||||
|         // remote systems. Fake a release of these keys until
 | ||||
|         // there is a way to detect AltGraph properly.
 | ||||
|         var fakeAltGraph = false; | ||||
|         if (down && browser.isWindows()) { | ||||
|             if (code !== 'ControlLeft' && code !== 'AltRight' && 'ControlLeft' in this._keyDownList && 'AltRight' in this._keyDownList) { | ||||
|                 fakeAltGraph = true; | ||||
|                 this.onkeyevent(this._keyDownList['AltRight'], 'AltRight', false); | ||||
|                 this.onkeyevent(this._keyDownList['ControlLeft'], 'ControlLeft', false); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         this.onkeyevent(keysym, code, down); | ||||
| 
 | ||||
|         if (fakeAltGraph) { | ||||
|             this.onkeyevent(this._keyDownList['ControlLeft'], 'ControlLeft', true); | ||||
|             this.onkeyevent(this._keyDownList['AltRight'], 'AltRight', true); | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     _getKeyCode: function (e) { | ||||
|         var code = KeyboardUtil.getKeycode(e); | ||||
|         if (code !== 'Unidentified') { | ||||
|             return code; | ||||
|         } | ||||
| 
 | ||||
|         // Unstable, but we don't have anything else to go on
 | ||||
|         // (don't use it for 'keypress' events thought since
 | ||||
|         // WebKit sets it to the same as charCode)
 | ||||
|         if (e.keyCode && e.type !== 'keypress') { | ||||
|             // 229 is used for composition events
 | ||||
|             if (e.keyCode !== 229) { | ||||
|                 return 'Platform' + e.keyCode; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // A precursor to the final DOM3 standard. Unfortunately it
 | ||||
|         // is not layout independent, so it is as bad as using keyCode
 | ||||
|         if (e.keyIdentifier) { | ||||
|             // Non-character key?
 | ||||
|             if (e.keyIdentifier.substr(0, 2) !== 'U+') { | ||||
|                 return e.keyIdentifier; | ||||
|             } | ||||
| 
 | ||||
|             var codepoint = parseInt(e.keyIdentifier.substr(2), 16); | ||||
|             var char = String.fromCharCode(codepoint); | ||||
|             // Some implementations fail to uppercase the symbols
 | ||||
|             char = char.toUpperCase(); | ||||
| 
 | ||||
|             return 'Platform' + char.charCodeAt(); | ||||
|         } | ||||
| 
 | ||||
|         return 'Unidentified'; | ||||
|     }, | ||||
| 
 | ||||
|     _handleKeyDown: function (e) { | ||||
|         var code = this._getKeyCode(e); | ||||
|         var keysym = KeyboardUtil.getKeysym(e); | ||||
| 
 | ||||
|         // We cannot handle keys we cannot track, but we also need
 | ||||
|         // to deal with virtual keyboards which omit key info
 | ||||
|         // (iOS omits tracking info on keyup events, which forces us to
 | ||||
|         // special treat that platform here)
 | ||||
|         if (code === 'Unidentified' || browser.isIOS()) { | ||||
|             if (keysym) { | ||||
|                 // If it's a virtual keyboard then it should be
 | ||||
|                 // sufficient to just send press and release right
 | ||||
|                 // after each other
 | ||||
|                 this._sendKeyEvent(keysym, code, true); | ||||
|                 this._sendKeyEvent(keysym, code, false); | ||||
|             } | ||||
| 
 | ||||
|             (0, _events.stopEvent)(e); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         // Alt behaves more like AltGraph on macOS, so shuffle the
 | ||||
|         // keys around a bit to make things more sane for the remote
 | ||||
|         // server. This method is used by RealVNC and TigerVNC (and
 | ||||
|         // possibly others).
 | ||||
|         if (browser.isMac()) { | ||||
|             switch (keysym) { | ||||
|                 case _keysym2.default.XK_Super_L: | ||||
|                     keysym = _keysym2.default.XK_Alt_L; | ||||
|                     break; | ||||
|                 case _keysym2.default.XK_Super_R: | ||||
|                     keysym = _keysym2.default.XK_Super_L; | ||||
|                     break; | ||||
|                 case _keysym2.default.XK_Alt_L: | ||||
|                     keysym = _keysym2.default.XK_Mode_switch; | ||||
|                     break; | ||||
|                 case _keysym2.default.XK_Alt_R: | ||||
|                     keysym = _keysym2.default.XK_ISO_Level3_Shift; | ||||
|                     break; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // Is this key already pressed? If so, then we must use the
 | ||||
|         // same keysym or we'll confuse the server
 | ||||
|         if (code in this._keyDownList) { | ||||
|             keysym = this._keyDownList[code]; | ||||
|         } | ||||
| 
 | ||||
|         // macOS doesn't send proper key events for modifiers, only
 | ||||
|         // state change events. That gets extra confusing for CapsLock
 | ||||
|         // which toggles on each press, but not on release. So pretend
 | ||||
|         // it was a quick press and release of the button.
 | ||||
|         if (browser.isMac() && code === 'CapsLock') { | ||||
|             this._sendKeyEvent(_keysym2.default.XK_Caps_Lock, 'CapsLock', true); | ||||
|             this._sendKeyEvent(_keysym2.default.XK_Caps_Lock, 'CapsLock', false); | ||||
|             (0, _events.stopEvent)(e); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         // If this is a legacy browser then we'll need to wait for
 | ||||
|         // a keypress event as well
 | ||||
|         // (IE and Edge has a broken KeyboardEvent.key, so we can't
 | ||||
|         // just check for the presence of that field)
 | ||||
|         if (!keysym && (!e.key || browser.isIE() || browser.isEdge())) { | ||||
|             this._pendingKey = code; | ||||
|             // However we might not get a keypress event if the key
 | ||||
|             // is non-printable, which needs some special fallback
 | ||||
|             // handling
 | ||||
|             setTimeout(this._handleKeyPressTimeout.bind(this), 10, e); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         this._pendingKey = null; | ||||
|         (0, _events.stopEvent)(e); | ||||
| 
 | ||||
|         this._keyDownList[code] = keysym; | ||||
| 
 | ||||
|         this._sendKeyEvent(keysym, code, true); | ||||
|     }, | ||||
| 
 | ||||
|     // Legacy event for browsers without code/key
 | ||||
|     _handleKeyPress: function (e) { | ||||
|         (0, _events.stopEvent)(e); | ||||
| 
 | ||||
|         // Are we expecting a keypress?
 | ||||
|         if (this._pendingKey === null) { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         var code = this._getKeyCode(e); | ||||
|         var keysym = KeyboardUtil.getKeysym(e); | ||||
| 
 | ||||
|         // The key we were waiting for?
 | ||||
|         if (code !== 'Unidentified' && code != this._pendingKey) { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         code = this._pendingKey; | ||||
|         this._pendingKey = null; | ||||
| 
 | ||||
|         if (!keysym) { | ||||
|             Log.Info('keypress with no keysym:', e); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         this._keyDownList[code] = keysym; | ||||
| 
 | ||||
|         this._sendKeyEvent(keysym, code, true); | ||||
|     }, | ||||
|     _handleKeyPressTimeout: function (e) { | ||||
|         // Did someone manage to sort out the key already?
 | ||||
|         if (this._pendingKey === null) { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         var code, keysym; | ||||
| 
 | ||||
|         code = this._pendingKey; | ||||
|         this._pendingKey = null; | ||||
| 
 | ||||
|         // We have no way of knowing the proper keysym with the
 | ||||
|         // information given, but the following are true for most
 | ||||
|         // layouts
 | ||||
|         if (e.keyCode >= 0x30 && e.keyCode <= 0x39) { | ||||
|             // Digit
 | ||||
|             keysym = e.keyCode; | ||||
|         } else if (e.keyCode >= 0x41 && e.keyCode <= 0x5a) { | ||||
|             // Character (A-Z)
 | ||||
|             var char = String.fromCharCode(e.keyCode); | ||||
|             // A feeble attempt at the correct case
 | ||||
|             if (e.shiftKey) char = char.toUpperCase();else char = char.toLowerCase(); | ||||
|             keysym = char.charCodeAt(); | ||||
|         } else { | ||||
|             // Unknown, give up
 | ||||
|             keysym = 0; | ||||
|         } | ||||
| 
 | ||||
|         this._keyDownList[code] = keysym; | ||||
| 
 | ||||
|         this._sendKeyEvent(keysym, code, true); | ||||
|     }, | ||||
| 
 | ||||
|     _handleKeyUp: function (e) { | ||||
|         (0, _events.stopEvent)(e); | ||||
| 
 | ||||
|         var code = this._getKeyCode(e); | ||||
| 
 | ||||
|         // See comment in _handleKeyDown()
 | ||||
|         if (browser.isMac() && code === 'CapsLock') { | ||||
|             this._sendKeyEvent(_keysym2.default.XK_Caps_Lock, 'CapsLock', true); | ||||
|             this._sendKeyEvent(_keysym2.default.XK_Caps_Lock, 'CapsLock', false); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         // Do we really think this key is down?
 | ||||
|         if (!(code in this._keyDownList)) { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         this._sendKeyEvent(this._keyDownList[code], code, false); | ||||
| 
 | ||||
|         delete this._keyDownList[code]; | ||||
|     }, | ||||
| 
 | ||||
|     _allKeysUp: function () { | ||||
|         Log.Debug(">> Keyboard.allKeysUp"); | ||||
|         for (var code in this._keyDownList) { | ||||
|             this._sendKeyEvent(this._keyDownList[code], code, false); | ||||
|         }; | ||||
|         this._keyDownList = {}; | ||||
|         Log.Debug("<< Keyboard.allKeysUp"); | ||||
|     }, | ||||
| 
 | ||||
|     // ===== PUBLIC METHODS =====
 | ||||
| 
 | ||||
|     grab: function () { | ||||
|         //Log.Debug(">> Keyboard.grab");
 | ||||
|         var c = this._target; | ||||
| 
 | ||||
|         c.addEventListener('keydown', this._eventHandlers.keydown); | ||||
|         c.addEventListener('keyup', this._eventHandlers.keyup); | ||||
|         c.addEventListener('keypress', this._eventHandlers.keypress); | ||||
| 
 | ||||
|         // Release (key up) if window loses focus
 | ||||
|         window.addEventListener('blur', this._eventHandlers.blur); | ||||
| 
 | ||||
|         //Log.Debug("<< Keyboard.grab");
 | ||||
|     }, | ||||
| 
 | ||||
|     ungrab: function () { | ||||
|         //Log.Debug(">> Keyboard.ungrab");
 | ||||
|         var c = this._target; | ||||
| 
 | ||||
|         c.removeEventListener('keydown', this._eventHandlers.keydown); | ||||
|         c.removeEventListener('keyup', this._eventHandlers.keyup); | ||||
|         c.removeEventListener('keypress', this._eventHandlers.keypress); | ||||
|         window.removeEventListener('blur', this._eventHandlers.blur); | ||||
| 
 | ||||
|         // Release (key up) all keys that are in a down state
 | ||||
|         this._allKeysUp(); | ||||
| 
 | ||||
|         //Log.Debug(">> Keyboard.ungrab");
 | ||||
|     } | ||||
| }; | ||||
							
								
								
									
										618
									
								
								static/js/novnc/core/input/keysym.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,618 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|   value: true | ||||
| }); | ||||
| exports.default = { | ||||
|   XK_VoidSymbol: 0xffffff, /* Void symbol */ | ||||
| 
 | ||||
|   XK_BackSpace: 0xff08, /* Back space, back char */ | ||||
|   XK_Tab: 0xff09, | ||||
|   XK_Linefeed: 0xff0a, /* Linefeed, LF */ | ||||
|   XK_Clear: 0xff0b, | ||||
|   XK_Return: 0xff0d, /* Return, enter */ | ||||
|   XK_Pause: 0xff13, /* Pause, hold */ | ||||
|   XK_Scroll_Lock: 0xff14, | ||||
|   XK_Sys_Req: 0xff15, | ||||
|   XK_Escape: 0xff1b, | ||||
|   XK_Delete: 0xffff, /* Delete, rubout */ | ||||
| 
 | ||||
|   /* International & multi-key character composition */ | ||||
| 
 | ||||
|   XK_Multi_key: 0xff20, /* Multi-key character compose */ | ||||
|   XK_Codeinput: 0xff37, | ||||
|   XK_SingleCandidate: 0xff3c, | ||||
|   XK_MultipleCandidate: 0xff3d, | ||||
|   XK_PreviousCandidate: 0xff3e, | ||||
| 
 | ||||
|   /* Japanese keyboard support */ | ||||
| 
 | ||||
|   XK_Kanji: 0xff21, /* Kanji, Kanji convert */ | ||||
|   XK_Muhenkan: 0xff22, /* Cancel Conversion */ | ||||
|   XK_Henkan_Mode: 0xff23, /* Start/Stop Conversion */ | ||||
|   XK_Henkan: 0xff23, /* Alias for Henkan_Mode */ | ||||
|   XK_Romaji: 0xff24, /* to Romaji */ | ||||
|   XK_Hiragana: 0xff25, /* to Hiragana */ | ||||
|   XK_Katakana: 0xff26, /* to Katakana */ | ||||
|   XK_Hiragana_Katakana: 0xff27, /* Hiragana/Katakana toggle */ | ||||
|   XK_Zenkaku: 0xff28, /* to Zenkaku */ | ||||
|   XK_Hankaku: 0xff29, /* to Hankaku */ | ||||
|   XK_Zenkaku_Hankaku: 0xff2a, /* Zenkaku/Hankaku toggle */ | ||||
|   XK_Touroku: 0xff2b, /* Add to Dictionary */ | ||||
|   XK_Massyo: 0xff2c, /* Delete from Dictionary */ | ||||
|   XK_Kana_Lock: 0xff2d, /* Kana Lock */ | ||||
|   XK_Kana_Shift: 0xff2e, /* Kana Shift */ | ||||
|   XK_Eisu_Shift: 0xff2f, /* Alphanumeric Shift */ | ||||
|   XK_Eisu_toggle: 0xff30, /* Alphanumeric toggle */ | ||||
|   XK_Kanji_Bangou: 0xff37, /* Codeinput */ | ||||
|   XK_Zen_Koho: 0xff3d, /* Multiple/All Candidate(s) */ | ||||
|   XK_Mae_Koho: 0xff3e, /* Previous Candidate */ | ||||
| 
 | ||||
|   /* Cursor control & motion */ | ||||
| 
 | ||||
|   XK_Home: 0xff50, | ||||
|   XK_Left: 0xff51, /* Move left, left arrow */ | ||||
|   XK_Up: 0xff52, /* Move up, up arrow */ | ||||
|   XK_Right: 0xff53, /* Move right, right arrow */ | ||||
|   XK_Down: 0xff54, /* Move down, down arrow */ | ||||
|   XK_Prior: 0xff55, /* Prior, previous */ | ||||
|   XK_Page_Up: 0xff55, | ||||
|   XK_Next: 0xff56, /* Next */ | ||||
|   XK_Page_Down: 0xff56, | ||||
|   XK_End: 0xff57, /* EOL */ | ||||
|   XK_Begin: 0xff58, /* BOL */ | ||||
| 
 | ||||
|   /* Misc functions */ | ||||
| 
 | ||||
|   XK_Select: 0xff60, /* Select, mark */ | ||||
|   XK_Print: 0xff61, | ||||
|   XK_Execute: 0xff62, /* Execute, run, do */ | ||||
|   XK_Insert: 0xff63, /* Insert, insert here */ | ||||
|   XK_Undo: 0xff65, | ||||
|   XK_Redo: 0xff66, /* Redo, again */ | ||||
|   XK_Menu: 0xff67, | ||||
|   XK_Find: 0xff68, /* Find, search */ | ||||
|   XK_Cancel: 0xff69, /* Cancel, stop, abort, exit */ | ||||
|   XK_Help: 0xff6a, /* Help */ | ||||
|   XK_Break: 0xff6b, | ||||
|   XK_Mode_switch: 0xff7e, /* Character set switch */ | ||||
|   XK_script_switch: 0xff7e, /* Alias for mode_switch */ | ||||
|   XK_Num_Lock: 0xff7f, | ||||
| 
 | ||||
|   /* Keypad functions, keypad numbers cleverly chosen to map to ASCII */ | ||||
| 
 | ||||
|   XK_KP_Space: 0xff80, /* Space */ | ||||
|   XK_KP_Tab: 0xff89, | ||||
|   XK_KP_Enter: 0xff8d, /* Enter */ | ||||
|   XK_KP_F1: 0xff91, /* PF1, KP_A, ... */ | ||||
|   XK_KP_F2: 0xff92, | ||||
|   XK_KP_F3: 0xff93, | ||||
|   XK_KP_F4: 0xff94, | ||||
|   XK_KP_Home: 0xff95, | ||||
|   XK_KP_Left: 0xff96, | ||||
|   XK_KP_Up: 0xff97, | ||||
|   XK_KP_Right: 0xff98, | ||||
|   XK_KP_Down: 0xff99, | ||||
|   XK_KP_Prior: 0xff9a, | ||||
|   XK_KP_Page_Up: 0xff9a, | ||||
|   XK_KP_Next: 0xff9b, | ||||
|   XK_KP_Page_Down: 0xff9b, | ||||
|   XK_KP_End: 0xff9c, | ||||
|   XK_KP_Begin: 0xff9d, | ||||
|   XK_KP_Insert: 0xff9e, | ||||
|   XK_KP_Delete: 0xff9f, | ||||
|   XK_KP_Equal: 0xffbd, /* Equals */ | ||||
|   XK_KP_Multiply: 0xffaa, | ||||
|   XK_KP_Add: 0xffab, | ||||
|   XK_KP_Separator: 0xffac, /* Separator, often comma */ | ||||
|   XK_KP_Subtract: 0xffad, | ||||
|   XK_KP_Decimal: 0xffae, | ||||
|   XK_KP_Divide: 0xffaf, | ||||
| 
 | ||||
|   XK_KP_0: 0xffb0, | ||||
|   XK_KP_1: 0xffb1, | ||||
|   XK_KP_2: 0xffb2, | ||||
|   XK_KP_3: 0xffb3, | ||||
|   XK_KP_4: 0xffb4, | ||||
|   XK_KP_5: 0xffb5, | ||||
|   XK_KP_6: 0xffb6, | ||||
|   XK_KP_7: 0xffb7, | ||||
|   XK_KP_8: 0xffb8, | ||||
|   XK_KP_9: 0xffb9, | ||||
| 
 | ||||
|   /* | ||||
|    * Auxiliary functions; note the duplicate definitions for left and right | ||||
|    * function keys;  Sun keyboards and a few other manufacturers have such | ||||
|    * function key groups on the left and/or right sides of the keyboard. | ||||
|    * We've not found a keyboard with more than 35 function keys total. | ||||
|    */ | ||||
| 
 | ||||
|   XK_F1: 0xffbe, | ||||
|   XK_F2: 0xffbf, | ||||
|   XK_F3: 0xffc0, | ||||
|   XK_F4: 0xffc1, | ||||
|   XK_F5: 0xffc2, | ||||
|   XK_F6: 0xffc3, | ||||
|   XK_F7: 0xffc4, | ||||
|   XK_F8: 0xffc5, | ||||
|   XK_F9: 0xffc6, | ||||
|   XK_F10: 0xffc7, | ||||
|   XK_F11: 0xffc8, | ||||
|   XK_L1: 0xffc8, | ||||
|   XK_F12: 0xffc9, | ||||
|   XK_L2: 0xffc9, | ||||
|   XK_F13: 0xffca, | ||||
|   XK_L3: 0xffca, | ||||
|   XK_F14: 0xffcb, | ||||
|   XK_L4: 0xffcb, | ||||
|   XK_F15: 0xffcc, | ||||
|   XK_L5: 0xffcc, | ||||
|   XK_F16: 0xffcd, | ||||
|   XK_L6: 0xffcd, | ||||
|   XK_F17: 0xffce, | ||||
|   XK_L7: 0xffce, | ||||
|   XK_F18: 0xffcf, | ||||
|   XK_L8: 0xffcf, | ||||
|   XK_F19: 0xffd0, | ||||
|   XK_L9: 0xffd0, | ||||
|   XK_F20: 0xffd1, | ||||
|   XK_L10: 0xffd1, | ||||
|   XK_F21: 0xffd2, | ||||
|   XK_R1: 0xffd2, | ||||
|   XK_F22: 0xffd3, | ||||
|   XK_R2: 0xffd3, | ||||
|   XK_F23: 0xffd4, | ||||
|   XK_R3: 0xffd4, | ||||
|   XK_F24: 0xffd5, | ||||
|   XK_R4: 0xffd5, | ||||
|   XK_F25: 0xffd6, | ||||
|   XK_R5: 0xffd6, | ||||
|   XK_F26: 0xffd7, | ||||
|   XK_R6: 0xffd7, | ||||
|   XK_F27: 0xffd8, | ||||
|   XK_R7: 0xffd8, | ||||
|   XK_F28: 0xffd9, | ||||
|   XK_R8: 0xffd9, | ||||
|   XK_F29: 0xffda, | ||||
|   XK_R9: 0xffda, | ||||
|   XK_F30: 0xffdb, | ||||
|   XK_R10: 0xffdb, | ||||
|   XK_F31: 0xffdc, | ||||
|   XK_R11: 0xffdc, | ||||
|   XK_F32: 0xffdd, | ||||
|   XK_R12: 0xffdd, | ||||
|   XK_F33: 0xffde, | ||||
|   XK_R13: 0xffde, | ||||
|   XK_F34: 0xffdf, | ||||
|   XK_R14: 0xffdf, | ||||
|   XK_F35: 0xffe0, | ||||
|   XK_R15: 0xffe0, | ||||
| 
 | ||||
|   /* Modifiers */ | ||||
| 
 | ||||
|   XK_Shift_L: 0xffe1, /* Left shift */ | ||||
|   XK_Shift_R: 0xffe2, /* Right shift */ | ||||
|   XK_Control_L: 0xffe3, /* Left control */ | ||||
|   XK_Control_R: 0xffe4, /* Right control */ | ||||
|   XK_Caps_Lock: 0xffe5, /* Caps lock */ | ||||
|   XK_Shift_Lock: 0xffe6, /* Shift lock */ | ||||
| 
 | ||||
|   XK_Meta_L: 0xffe7, /* Left meta */ | ||||
|   XK_Meta_R: 0xffe8, /* Right meta */ | ||||
|   XK_Alt_L: 0xffe9, /* Left alt */ | ||||
|   XK_Alt_R: 0xffea, /* Right alt */ | ||||
|   XK_Super_L: 0xffeb, /* Left super */ | ||||
|   XK_Super_R: 0xffec, /* Right super */ | ||||
|   XK_Hyper_L: 0xffed, /* Left hyper */ | ||||
|   XK_Hyper_R: 0xffee, /* Right hyper */ | ||||
| 
 | ||||
|   /* | ||||
|    * Keyboard (XKB) Extension function and modifier keys | ||||
|    * (from Appendix C of "The X Keyboard Extension: Protocol Specification") | ||||
|    * Byte 3 = 0xfe | ||||
|    */ | ||||
| 
 | ||||
|   XK_ISO_Level3_Shift: 0xfe03, /* AltGr */ | ||||
|   XK_ISO_Next_Group: 0xfe08, | ||||
|   XK_ISO_Prev_Group: 0xfe0a, | ||||
|   XK_ISO_First_Group: 0xfe0c, | ||||
|   XK_ISO_Last_Group: 0xfe0e, | ||||
| 
 | ||||
|   /* | ||||
|    * Latin 1 | ||||
|    * (ISO/IEC 8859-1: Unicode U+0020..U+00FF) | ||||
|    * Byte 3: 0 | ||||
|    */ | ||||
| 
 | ||||
|   XK_space: 0x0020, /* U+0020 SPACE */ | ||||
|   XK_exclam: 0x0021, /* U+0021 EXCLAMATION MARK */ | ||||
|   XK_quotedbl: 0x0022, /* U+0022 QUOTATION MARK */ | ||||
|   XK_numbersign: 0x0023, /* U+0023 NUMBER SIGN */ | ||||
|   XK_dollar: 0x0024, /* U+0024 DOLLAR SIGN */ | ||||
|   XK_percent: 0x0025, /* U+0025 PERCENT SIGN */ | ||||
|   XK_ampersand: 0x0026, /* U+0026 AMPERSAND */ | ||||
|   XK_apostrophe: 0x0027, /* U+0027 APOSTROPHE */ | ||||
|   XK_quoteright: 0x0027, /* deprecated */ | ||||
|   XK_parenleft: 0x0028, /* U+0028 LEFT PARENTHESIS */ | ||||
|   XK_parenright: 0x0029, /* U+0029 RIGHT PARENTHESIS */ | ||||
|   XK_asterisk: 0x002a, /* U+002A ASTERISK */ | ||||
|   XK_plus: 0x002b, /* U+002B PLUS SIGN */ | ||||
|   XK_comma: 0x002c, /* U+002C COMMA */ | ||||
|   XK_minus: 0x002d, /* U+002D HYPHEN-MINUS */ | ||||
|   XK_period: 0x002e, /* U+002E FULL STOP */ | ||||
|   XK_slash: 0x002f, /* U+002F SOLIDUS */ | ||||
|   XK_0: 0x0030, /* U+0030 DIGIT ZERO */ | ||||
|   XK_1: 0x0031, /* U+0031 DIGIT ONE */ | ||||
|   XK_2: 0x0032, /* U+0032 DIGIT TWO */ | ||||
|   XK_3: 0x0033, /* U+0033 DIGIT THREE */ | ||||
|   XK_4: 0x0034, /* U+0034 DIGIT FOUR */ | ||||
|   XK_5: 0x0035, /* U+0035 DIGIT FIVE */ | ||||
|   XK_6: 0x0036, /* U+0036 DIGIT SIX */ | ||||
|   XK_7: 0x0037, /* U+0037 DIGIT SEVEN */ | ||||
|   XK_8: 0x0038, /* U+0038 DIGIT EIGHT */ | ||||
|   XK_9: 0x0039, /* U+0039 DIGIT NINE */ | ||||
|   XK_colon: 0x003a, /* U+003A COLON */ | ||||
|   XK_semicolon: 0x003b, /* U+003B SEMICOLON */ | ||||
|   XK_less: 0x003c, /* U+003C LESS-THAN SIGN */ | ||||
|   XK_equal: 0x003d, /* U+003D EQUALS SIGN */ | ||||
|   XK_greater: 0x003e, /* U+003E GREATER-THAN SIGN */ | ||||
|   XK_question: 0x003f, /* U+003F QUESTION MARK */ | ||||
|   XK_at: 0x0040, /* U+0040 COMMERCIAL AT */ | ||||
|   XK_A: 0x0041, /* U+0041 LATIN CAPITAL LETTER A */ | ||||
|   XK_B: 0x0042, /* U+0042 LATIN CAPITAL LETTER B */ | ||||
|   XK_C: 0x0043, /* U+0043 LATIN CAPITAL LETTER C */ | ||||
|   XK_D: 0x0044, /* U+0044 LATIN CAPITAL LETTER D */ | ||||
|   XK_E: 0x0045, /* U+0045 LATIN CAPITAL LETTER E */ | ||||
|   XK_F: 0x0046, /* U+0046 LATIN CAPITAL LETTER F */ | ||||
|   XK_G: 0x0047, /* U+0047 LATIN CAPITAL LETTER G */ | ||||
|   XK_H: 0x0048, /* U+0048 LATIN CAPITAL LETTER H */ | ||||
|   XK_I: 0x0049, /* U+0049 LATIN CAPITAL LETTER I */ | ||||
|   XK_J: 0x004a, /* U+004A LATIN CAPITAL LETTER J */ | ||||
|   XK_K: 0x004b, /* U+004B LATIN CAPITAL LETTER K */ | ||||
|   XK_L: 0x004c, /* U+004C LATIN CAPITAL LETTER L */ | ||||
|   XK_M: 0x004d, /* U+004D LATIN CAPITAL LETTER M */ | ||||
|   XK_N: 0x004e, /* U+004E LATIN CAPITAL LETTER N */ | ||||
|   XK_O: 0x004f, /* U+004F LATIN CAPITAL LETTER O */ | ||||
|   XK_P: 0x0050, /* U+0050 LATIN CAPITAL LETTER P */ | ||||
|   XK_Q: 0x0051, /* U+0051 LATIN CAPITAL LETTER Q */ | ||||
|   XK_R: 0x0052, /* U+0052 LATIN CAPITAL LETTER R */ | ||||
|   XK_S: 0x0053, /* U+0053 LATIN CAPITAL LETTER S */ | ||||
|   XK_T: 0x0054, /* U+0054 LATIN CAPITAL LETTER T */ | ||||
|   XK_U: 0x0055, /* U+0055 LATIN CAPITAL LETTER U */ | ||||
|   XK_V: 0x0056, /* U+0056 LATIN CAPITAL LETTER V */ | ||||
|   XK_W: 0x0057, /* U+0057 LATIN CAPITAL LETTER W */ | ||||
|   XK_X: 0x0058, /* U+0058 LATIN CAPITAL LETTER X */ | ||||
|   XK_Y: 0x0059, /* U+0059 LATIN CAPITAL LETTER Y */ | ||||
|   XK_Z: 0x005a, /* U+005A LATIN CAPITAL LETTER Z */ | ||||
|   XK_bracketleft: 0x005b, /* U+005B LEFT SQUARE BRACKET */ | ||||
|   XK_backslash: 0x005c, /* U+005C REVERSE SOLIDUS */ | ||||
|   XK_bracketright: 0x005d, /* U+005D RIGHT SQUARE BRACKET */ | ||||
|   XK_asciicircum: 0x005e, /* U+005E CIRCUMFLEX ACCENT */ | ||||
|   XK_underscore: 0x005f, /* U+005F LOW LINE */ | ||||
|   XK_grave: 0x0060, /* U+0060 GRAVE ACCENT */ | ||||
|   XK_quoteleft: 0x0060, /* deprecated */ | ||||
|   XK_a: 0x0061, /* U+0061 LATIN SMALL LETTER A */ | ||||
|   XK_b: 0x0062, /* U+0062 LATIN SMALL LETTER B */ | ||||
|   XK_c: 0x0063, /* U+0063 LATIN SMALL LETTER C */ | ||||
|   XK_d: 0x0064, /* U+0064 LATIN SMALL LETTER D */ | ||||
|   XK_e: 0x0065, /* U+0065 LATIN SMALL LETTER E */ | ||||
|   XK_f: 0x0066, /* U+0066 LATIN SMALL LETTER F */ | ||||
|   XK_g: 0x0067, /* U+0067 LATIN SMALL LETTER G */ | ||||
|   XK_h: 0x0068, /* U+0068 LATIN SMALL LETTER H */ | ||||
|   XK_i: 0x0069, /* U+0069 LATIN SMALL LETTER I */ | ||||
|   XK_j: 0x006a, /* U+006A LATIN SMALL LETTER J */ | ||||
|   XK_k: 0x006b, /* U+006B LATIN SMALL LETTER K */ | ||||
|   XK_l: 0x006c, /* U+006C LATIN SMALL LETTER L */ | ||||
|   XK_m: 0x006d, /* U+006D LATIN SMALL LETTER M */ | ||||
|   XK_n: 0x006e, /* U+006E LATIN SMALL LETTER N */ | ||||
|   XK_o: 0x006f, /* U+006F LATIN SMALL LETTER O */ | ||||
|   XK_p: 0x0070, /* U+0070 LATIN SMALL LETTER P */ | ||||
|   XK_q: 0x0071, /* U+0071 LATIN SMALL LETTER Q */ | ||||
|   XK_r: 0x0072, /* U+0072 LATIN SMALL LETTER R */ | ||||
|   XK_s: 0x0073, /* U+0073 LATIN SMALL LETTER S */ | ||||
|   XK_t: 0x0074, /* U+0074 LATIN SMALL LETTER T */ | ||||
|   XK_u: 0x0075, /* U+0075 LATIN SMALL LETTER U */ | ||||
|   XK_v: 0x0076, /* U+0076 LATIN SMALL LETTER V */ | ||||
|   XK_w: 0x0077, /* U+0077 LATIN SMALL LETTER W */ | ||||
|   XK_x: 0x0078, /* U+0078 LATIN SMALL LETTER X */ | ||||
|   XK_y: 0x0079, /* U+0079 LATIN SMALL LETTER Y */ | ||||
|   XK_z: 0x007a, /* U+007A LATIN SMALL LETTER Z */ | ||||
|   XK_braceleft: 0x007b, /* U+007B LEFT CURLY BRACKET */ | ||||
|   XK_bar: 0x007c, /* U+007C VERTICAL LINE */ | ||||
|   XK_braceright: 0x007d, /* U+007D RIGHT CURLY BRACKET */ | ||||
|   XK_asciitilde: 0x007e, /* U+007E TILDE */ | ||||
| 
 | ||||
|   XK_nobreakspace: 0x00a0, /* U+00A0 NO-BREAK SPACE */ | ||||
|   XK_exclamdown: 0x00a1, /* U+00A1 INVERTED EXCLAMATION MARK */ | ||||
|   XK_cent: 0x00a2, /* U+00A2 CENT SIGN */ | ||||
|   XK_sterling: 0x00a3, /* U+00A3 POUND SIGN */ | ||||
|   XK_currency: 0x00a4, /* U+00A4 CURRENCY SIGN */ | ||||
|   XK_yen: 0x00a5, /* U+00A5 YEN SIGN */ | ||||
|   XK_brokenbar: 0x00a6, /* U+00A6 BROKEN BAR */ | ||||
|   XK_section: 0x00a7, /* U+00A7 SECTION SIGN */ | ||||
|   XK_diaeresis: 0x00a8, /* U+00A8 DIAERESIS */ | ||||
|   XK_copyright: 0x00a9, /* U+00A9 COPYRIGHT SIGN */ | ||||
|   XK_ordfeminine: 0x00aa, /* U+00AA FEMININE ORDINAL INDICATOR */ | ||||
|   XK_guillemotleft: 0x00ab, /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ | ||||
|   XK_notsign: 0x00ac, /* U+00AC NOT SIGN */ | ||||
|   XK_hyphen: 0x00ad, /* U+00AD SOFT HYPHEN */ | ||||
|   XK_registered: 0x00ae, /* U+00AE REGISTERED SIGN */ | ||||
|   XK_macron: 0x00af, /* U+00AF MACRON */ | ||||
|   XK_degree: 0x00b0, /* U+00B0 DEGREE SIGN */ | ||||
|   XK_plusminus: 0x00b1, /* U+00B1 PLUS-MINUS SIGN */ | ||||
|   XK_twosuperior: 0x00b2, /* U+00B2 SUPERSCRIPT TWO */ | ||||
|   XK_threesuperior: 0x00b3, /* U+00B3 SUPERSCRIPT THREE */ | ||||
|   XK_acute: 0x00b4, /* U+00B4 ACUTE ACCENT */ | ||||
|   XK_mu: 0x00b5, /* U+00B5 MICRO SIGN */ | ||||
|   XK_paragraph: 0x00b6, /* U+00B6 PILCROW SIGN */ | ||||
|   XK_periodcentered: 0x00b7, /* U+00B7 MIDDLE DOT */ | ||||
|   XK_cedilla: 0x00b8, /* U+00B8 CEDILLA */ | ||||
|   XK_onesuperior: 0x00b9, /* U+00B9 SUPERSCRIPT ONE */ | ||||
|   XK_masculine: 0x00ba, /* U+00BA MASCULINE ORDINAL INDICATOR */ | ||||
|   XK_guillemotright: 0x00bb, /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ | ||||
|   XK_onequarter: 0x00bc, /* U+00BC VULGAR FRACTION ONE QUARTER */ | ||||
|   XK_onehalf: 0x00bd, /* U+00BD VULGAR FRACTION ONE HALF */ | ||||
|   XK_threequarters: 0x00be, /* U+00BE VULGAR FRACTION THREE QUARTERS */ | ||||
|   XK_questiondown: 0x00bf, /* U+00BF INVERTED QUESTION MARK */ | ||||
|   XK_Agrave: 0x00c0, /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */ | ||||
|   XK_Aacute: 0x00c1, /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */ | ||||
|   XK_Acircumflex: 0x00c2, /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ | ||||
|   XK_Atilde: 0x00c3, /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */ | ||||
|   XK_Adiaeresis: 0x00c4, /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */ | ||||
|   XK_Aring: 0x00c5, /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */ | ||||
|   XK_AE: 0x00c6, /* U+00C6 LATIN CAPITAL LETTER AE */ | ||||
|   XK_Ccedilla: 0x00c7, /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */ | ||||
|   XK_Egrave: 0x00c8, /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */ | ||||
|   XK_Eacute: 0x00c9, /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */ | ||||
|   XK_Ecircumflex: 0x00ca, /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ | ||||
|   XK_Ediaeresis: 0x00cb, /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */ | ||||
|   XK_Igrave: 0x00cc, /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */ | ||||
|   XK_Iacute: 0x00cd, /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */ | ||||
|   XK_Icircumflex: 0x00ce, /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ | ||||
|   XK_Idiaeresis: 0x00cf, /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */ | ||||
|   XK_ETH: 0x00d0, /* U+00D0 LATIN CAPITAL LETTER ETH */ | ||||
|   XK_Eth: 0x00d0, /* deprecated */ | ||||
|   XK_Ntilde: 0x00d1, /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */ | ||||
|   XK_Ograve: 0x00d2, /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */ | ||||
|   XK_Oacute: 0x00d3, /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */ | ||||
|   XK_Ocircumflex: 0x00d4, /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ | ||||
|   XK_Otilde: 0x00d5, /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */ | ||||
|   XK_Odiaeresis: 0x00d6, /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */ | ||||
|   XK_multiply: 0x00d7, /* U+00D7 MULTIPLICATION SIGN */ | ||||
|   XK_Oslash: 0x00d8, /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ | ||||
|   XK_Ooblique: 0x00d8, /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ | ||||
|   XK_Ugrave: 0x00d9, /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */ | ||||
|   XK_Uacute: 0x00da, /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */ | ||||
|   XK_Ucircumflex: 0x00db, /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ | ||||
|   XK_Udiaeresis: 0x00dc, /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */ | ||||
|   XK_Yacute: 0x00dd, /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */ | ||||
|   XK_THORN: 0x00de, /* U+00DE LATIN CAPITAL LETTER THORN */ | ||||
|   XK_Thorn: 0x00de, /* deprecated */ | ||||
|   XK_ssharp: 0x00df, /* U+00DF LATIN SMALL LETTER SHARP S */ | ||||
|   XK_agrave: 0x00e0, /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */ | ||||
|   XK_aacute: 0x00e1, /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */ | ||||
|   XK_acircumflex: 0x00e2, /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */ | ||||
|   XK_atilde: 0x00e3, /* U+00E3 LATIN SMALL LETTER A WITH TILDE */ | ||||
|   XK_adiaeresis: 0x00e4, /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */ | ||||
|   XK_aring: 0x00e5, /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */ | ||||
|   XK_ae: 0x00e6, /* U+00E6 LATIN SMALL LETTER AE */ | ||||
|   XK_ccedilla: 0x00e7, /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */ | ||||
|   XK_egrave: 0x00e8, /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */ | ||||
|   XK_eacute: 0x00e9, /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */ | ||||
|   XK_ecircumflex: 0x00ea, /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */ | ||||
|   XK_ediaeresis: 0x00eb, /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */ | ||||
|   XK_igrave: 0x00ec, /* U+00EC LATIN SMALL LETTER I WITH GRAVE */ | ||||
|   XK_iacute: 0x00ed, /* U+00ED LATIN SMALL LETTER I WITH ACUTE */ | ||||
|   XK_icircumflex: 0x00ee, /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */ | ||||
|   XK_idiaeresis: 0x00ef, /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */ | ||||
|   XK_eth: 0x00f0, /* U+00F0 LATIN SMALL LETTER ETH */ | ||||
|   XK_ntilde: 0x00f1, /* U+00F1 LATIN SMALL LETTER N WITH TILDE */ | ||||
|   XK_ograve: 0x00f2, /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */ | ||||
|   XK_oacute: 0x00f3, /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */ | ||||
|   XK_ocircumflex: 0x00f4, /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */ | ||||
|   XK_otilde: 0x00f5, /* U+00F5 LATIN SMALL LETTER O WITH TILDE */ | ||||
|   XK_odiaeresis: 0x00f6, /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */ | ||||
|   XK_division: 0x00f7, /* U+00F7 DIVISION SIGN */ | ||||
|   XK_oslash: 0x00f8, /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ | ||||
|   XK_ooblique: 0x00f8, /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ | ||||
|   XK_ugrave: 0x00f9, /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */ | ||||
|   XK_uacute: 0x00fa, /* U+00FA LATIN SMALL LETTER U WITH ACUTE */ | ||||
|   XK_ucircumflex: 0x00fb, /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */ | ||||
|   XK_udiaeresis: 0x00fc, /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */ | ||||
|   XK_yacute: 0x00fd, /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */ | ||||
|   XK_thorn: 0x00fe, /* U+00FE LATIN SMALL LETTER THORN */ | ||||
|   XK_ydiaeresis: 0x00ff, /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */ | ||||
| 
 | ||||
|   /* | ||||
|    * Korean | ||||
|    * Byte 3 = 0x0e | ||||
|    */ | ||||
| 
 | ||||
|   XK_Hangul: 0xff31, /* Hangul start/stop(toggle) */ | ||||
|   XK_Hangul_Hanja: 0xff34, /* Start Hangul->Hanja Conversion */ | ||||
|   XK_Hangul_Jeonja: 0xff38, /* Jeonja mode */ | ||||
| 
 | ||||
|   /* | ||||
|    * XFree86 vendor specific keysyms. | ||||
|    * | ||||
|    * The XFree86 keysym range is 0x10080001 - 0x1008FFFF. | ||||
|    */ | ||||
| 
 | ||||
|   XF86XK_ModeLock: 0x1008FF01, | ||||
|   XF86XK_MonBrightnessUp: 0x1008FF02, | ||||
|   XF86XK_MonBrightnessDown: 0x1008FF03, | ||||
|   XF86XK_KbdLightOnOff: 0x1008FF04, | ||||
|   XF86XK_KbdBrightnessUp: 0x1008FF05, | ||||
|   XF86XK_KbdBrightnessDown: 0x1008FF06, | ||||
|   XF86XK_Standby: 0x1008FF10, | ||||
|   XF86XK_AudioLowerVolume: 0x1008FF11, | ||||
|   XF86XK_AudioMute: 0x1008FF12, | ||||
|   XF86XK_AudioRaiseVolume: 0x1008FF13, | ||||
|   XF86XK_AudioPlay: 0x1008FF14, | ||||
|   XF86XK_AudioStop: 0x1008FF15, | ||||
|   XF86XK_AudioPrev: 0x1008FF16, | ||||
|   XF86XK_AudioNext: 0x1008FF17, | ||||
|   XF86XK_HomePage: 0x1008FF18, | ||||
|   XF86XK_Mail: 0x1008FF19, | ||||
|   XF86XK_Start: 0x1008FF1A, | ||||
|   XF86XK_Search: 0x1008FF1B, | ||||
|   XF86XK_AudioRecord: 0x1008FF1C, | ||||
|   XF86XK_Calculator: 0x1008FF1D, | ||||
|   XF86XK_Memo: 0x1008FF1E, | ||||
|   XF86XK_ToDoList: 0x1008FF1F, | ||||
|   XF86XK_Calendar: 0x1008FF20, | ||||
|   XF86XK_PowerDown: 0x1008FF21, | ||||
|   XF86XK_ContrastAdjust: 0x1008FF22, | ||||
|   XF86XK_RockerUp: 0x1008FF23, | ||||
|   XF86XK_RockerDown: 0x1008FF24, | ||||
|   XF86XK_RockerEnter: 0x1008FF25, | ||||
|   XF86XK_Back: 0x1008FF26, | ||||
|   XF86XK_Forward: 0x1008FF27, | ||||
|   XF86XK_Stop: 0x1008FF28, | ||||
|   XF86XK_Refresh: 0x1008FF29, | ||||
|   XF86XK_PowerOff: 0x1008FF2A, | ||||
|   XF86XK_WakeUp: 0x1008FF2B, | ||||
|   XF86XK_Eject: 0x1008FF2C, | ||||
|   XF86XK_ScreenSaver: 0x1008FF2D, | ||||
|   XF86XK_WWW: 0x1008FF2E, | ||||
|   XF86XK_Sleep: 0x1008FF2F, | ||||
|   XF86XK_Favorites: 0x1008FF30, | ||||
|   XF86XK_AudioPause: 0x1008FF31, | ||||
|   XF86XK_AudioMedia: 0x1008FF32, | ||||
|   XF86XK_MyComputer: 0x1008FF33, | ||||
|   XF86XK_VendorHome: 0x1008FF34, | ||||
|   XF86XK_LightBulb: 0x1008FF35, | ||||
|   XF86XK_Shop: 0x1008FF36, | ||||
|   XF86XK_History: 0x1008FF37, | ||||
|   XF86XK_OpenURL: 0x1008FF38, | ||||
|   XF86XK_AddFavorite: 0x1008FF39, | ||||
|   XF86XK_HotLinks: 0x1008FF3A, | ||||
|   XF86XK_BrightnessAdjust: 0x1008FF3B, | ||||
|   XF86XK_Finance: 0x1008FF3C, | ||||
|   XF86XK_Community: 0x1008FF3D, | ||||
|   XF86XK_AudioRewind: 0x1008FF3E, | ||||
|   XF86XK_BackForward: 0x1008FF3F, | ||||
|   XF86XK_Launch0: 0x1008FF40, | ||||
|   XF86XK_Launch1: 0x1008FF41, | ||||
|   XF86XK_Launch2: 0x1008FF42, | ||||
|   XF86XK_Launch3: 0x1008FF43, | ||||
|   XF86XK_Launch4: 0x1008FF44, | ||||
|   XF86XK_Launch5: 0x1008FF45, | ||||
|   XF86XK_Launch6: 0x1008FF46, | ||||
|   XF86XK_Launch7: 0x1008FF47, | ||||
|   XF86XK_Launch8: 0x1008FF48, | ||||
|   XF86XK_Launch9: 0x1008FF49, | ||||
|   XF86XK_LaunchA: 0x1008FF4A, | ||||
|   XF86XK_LaunchB: 0x1008FF4B, | ||||
|   XF86XK_LaunchC: 0x1008FF4C, | ||||
|   XF86XK_LaunchD: 0x1008FF4D, | ||||
|   XF86XK_LaunchE: 0x1008FF4E, | ||||
|   XF86XK_LaunchF: 0x1008FF4F, | ||||
|   XF86XK_ApplicationLeft: 0x1008FF50, | ||||
|   XF86XK_ApplicationRight: 0x1008FF51, | ||||
|   XF86XK_Book: 0x1008FF52, | ||||
|   XF86XK_CD: 0x1008FF53, | ||||
|   XF86XK_Calculater: 0x1008FF54, | ||||
|   XF86XK_Clear: 0x1008FF55, | ||||
|   XF86XK_Close: 0x1008FF56, | ||||
|   XF86XK_Copy: 0x1008FF57, | ||||
|   XF86XK_Cut: 0x1008FF58, | ||||
|   XF86XK_Display: 0x1008FF59, | ||||
|   XF86XK_DOS: 0x1008FF5A, | ||||
|   XF86XK_Documents: 0x1008FF5B, | ||||
|   XF86XK_Excel: 0x1008FF5C, | ||||
|   XF86XK_Explorer: 0x1008FF5D, | ||||
|   XF86XK_Game: 0x1008FF5E, | ||||
|   XF86XK_Go: 0x1008FF5F, | ||||
|   XF86XK_iTouch: 0x1008FF60, | ||||
|   XF86XK_LogOff: 0x1008FF61, | ||||
|   XF86XK_Market: 0x1008FF62, | ||||
|   XF86XK_Meeting: 0x1008FF63, | ||||
|   XF86XK_MenuKB: 0x1008FF65, | ||||
|   XF86XK_MenuPB: 0x1008FF66, | ||||
|   XF86XK_MySites: 0x1008FF67, | ||||
|   XF86XK_New: 0x1008FF68, | ||||
|   XF86XK_News: 0x1008FF69, | ||||
|   XF86XK_OfficeHome: 0x1008FF6A, | ||||
|   XF86XK_Open: 0x1008FF6B, | ||||
|   XF86XK_Option: 0x1008FF6C, | ||||
|   XF86XK_Paste: 0x1008FF6D, | ||||
|   XF86XK_Phone: 0x1008FF6E, | ||||
|   XF86XK_Q: 0x1008FF70, | ||||
|   XF86XK_Reply: 0x1008FF72, | ||||
|   XF86XK_Reload: 0x1008FF73, | ||||
|   XF86XK_RotateWindows: 0x1008FF74, | ||||
|   XF86XK_RotationPB: 0x1008FF75, | ||||
|   XF86XK_RotationKB: 0x1008FF76, | ||||
|   XF86XK_Save: 0x1008FF77, | ||||
|   XF86XK_ScrollUp: 0x1008FF78, | ||||
|   XF86XK_ScrollDown: 0x1008FF79, | ||||
|   XF86XK_ScrollClick: 0x1008FF7A, | ||||
|   XF86XK_Send: 0x1008FF7B, | ||||
|   XF86XK_Spell: 0x1008FF7C, | ||||
|   XF86XK_SplitScreen: 0x1008FF7D, | ||||
|   XF86XK_Support: 0x1008FF7E, | ||||
|   XF86XK_TaskPane: 0x1008FF7F, | ||||
|   XF86XK_Terminal: 0x1008FF80, | ||||
|   XF86XK_Tools: 0x1008FF81, | ||||
|   XF86XK_Travel: 0x1008FF82, | ||||
|   XF86XK_UserPB: 0x1008FF84, | ||||
|   XF86XK_User1KB: 0x1008FF85, | ||||
|   XF86XK_User2KB: 0x1008FF86, | ||||
|   XF86XK_Video: 0x1008FF87, | ||||
|   XF86XK_WheelButton: 0x1008FF88, | ||||
|   XF86XK_Word: 0x1008FF89, | ||||
|   XF86XK_Xfer: 0x1008FF8A, | ||||
|   XF86XK_ZoomIn: 0x1008FF8B, | ||||
|   XF86XK_ZoomOut: 0x1008FF8C, | ||||
|   XF86XK_Away: 0x1008FF8D, | ||||
|   XF86XK_Messenger: 0x1008FF8E, | ||||
|   XF86XK_WebCam: 0x1008FF8F, | ||||
|   XF86XK_MailForward: 0x1008FF90, | ||||
|   XF86XK_Pictures: 0x1008FF91, | ||||
|   XF86XK_Music: 0x1008FF92, | ||||
|   XF86XK_Battery: 0x1008FF93, | ||||
|   XF86XK_Bluetooth: 0x1008FF94, | ||||
|   XF86XK_WLAN: 0x1008FF95, | ||||
|   XF86XK_UWB: 0x1008FF96, | ||||
|   XF86XK_AudioForward: 0x1008FF97, | ||||
|   XF86XK_AudioRepeat: 0x1008FF98, | ||||
|   XF86XK_AudioRandomPlay: 0x1008FF99, | ||||
|   XF86XK_Subtitle: 0x1008FF9A, | ||||
|   XF86XK_AudioCycleTrack: 0x1008FF9B, | ||||
|   XF86XK_CycleAngle: 0x1008FF9C, | ||||
|   XF86XK_FrameBack: 0x1008FF9D, | ||||
|   XF86XK_FrameForward: 0x1008FF9E, | ||||
|   XF86XK_Time: 0x1008FF9F, | ||||
|   XF86XK_Select: 0x1008FFA0, | ||||
|   XF86XK_View: 0x1008FFA1, | ||||
|   XF86XK_TopMenu: 0x1008FFA2, | ||||
|   XF86XK_Red: 0x1008FFA3, | ||||
|   XF86XK_Green: 0x1008FFA4, | ||||
|   XF86XK_Yellow: 0x1008FFA5, | ||||
|   XF86XK_Blue: 0x1008FFA6, | ||||
|   XF86XK_Suspend: 0x1008FFA7, | ||||
|   XF86XK_Hibernate: 0x1008FFA8, | ||||
|   XF86XK_TouchpadToggle: 0x1008FFA9, | ||||
|   XF86XK_TouchpadOn: 0x1008FFB0, | ||||
|   XF86XK_TouchpadOff: 0x1008FFB1, | ||||
|   XF86XK_AudioMicMute: 0x1008FFB2, | ||||
|   XF86XK_Switch_VT_1: 0x1008FE01, | ||||
|   XF86XK_Switch_VT_2: 0x1008FE02, | ||||
|   XF86XK_Switch_VT_3: 0x1008FE03, | ||||
|   XF86XK_Switch_VT_4: 0x1008FE04, | ||||
|   XF86XK_Switch_VT_5: 0x1008FE05, | ||||
|   XF86XK_Switch_VT_6: 0x1008FE06, | ||||
|   XF86XK_Switch_VT_7: 0x1008FE07, | ||||
|   XF86XK_Switch_VT_8: 0x1008FE08, | ||||
|   XF86XK_Switch_VT_9: 0x1008FE09, | ||||
|   XF86XK_Switch_VT_10: 0x1008FE0A, | ||||
|   XF86XK_Switch_VT_11: 0x1008FE0B, | ||||
|   XF86XK_Switch_VT_12: 0x1008FE0C, | ||||
|   XF86XK_Ungrab: 0x1008FE20, | ||||
|   XF86XK_ClearGrab: 0x1008FE21, | ||||
|   XF86XK_Next_VMode: 0x1008FE22, | ||||
|   XF86XK_Prev_VMode: 0x1008FE23, | ||||
|   XF86XK_LogWindowTree: 0x1008FE24, | ||||
|   XF86XK_LogGrabInfo: 0x1008FE25 | ||||
| }; | ||||
							
								
								
									
										693
									
								
								static/js/novnc/core/input/keysymdef.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,693 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| /* | ||||
|  * Mapping from Unicode codepoints to X11/RFB keysyms | ||||
|  * | ||||
|  * This file was automatically generated from keysymdef.h | ||||
|  * DO NOT EDIT! | ||||
|  */ | ||||
| 
 | ||||
| /* Functions at the bottom */ | ||||
| 
 | ||||
| var codepoints = { | ||||
|     0x0100: 0x03c0, // XK_Amacron
 | ||||
|     0x0101: 0x03e0, // XK_amacron
 | ||||
|     0x0102: 0x01c3, // XK_Abreve
 | ||||
|     0x0103: 0x01e3, // XK_abreve
 | ||||
|     0x0104: 0x01a1, // XK_Aogonek
 | ||||
|     0x0105: 0x01b1, // XK_aogonek
 | ||||
|     0x0106: 0x01c6, // XK_Cacute
 | ||||
|     0x0107: 0x01e6, // XK_cacute
 | ||||
|     0x0108: 0x02c6, // XK_Ccircumflex
 | ||||
|     0x0109: 0x02e6, // XK_ccircumflex
 | ||||
|     0x010a: 0x02c5, // XK_Cabovedot
 | ||||
|     0x010b: 0x02e5, // XK_cabovedot
 | ||||
|     0x010c: 0x01c8, // XK_Ccaron
 | ||||
|     0x010d: 0x01e8, // XK_ccaron
 | ||||
|     0x010e: 0x01cf, // XK_Dcaron
 | ||||
|     0x010f: 0x01ef, // XK_dcaron
 | ||||
|     0x0110: 0x01d0, // XK_Dstroke
 | ||||
|     0x0111: 0x01f0, // XK_dstroke
 | ||||
|     0x0112: 0x03aa, // XK_Emacron
 | ||||
|     0x0113: 0x03ba, // XK_emacron
 | ||||
|     0x0116: 0x03cc, // XK_Eabovedot
 | ||||
|     0x0117: 0x03ec, // XK_eabovedot
 | ||||
|     0x0118: 0x01ca, // XK_Eogonek
 | ||||
|     0x0119: 0x01ea, // XK_eogonek
 | ||||
|     0x011a: 0x01cc, // XK_Ecaron
 | ||||
|     0x011b: 0x01ec, // XK_ecaron
 | ||||
|     0x011c: 0x02d8, // XK_Gcircumflex
 | ||||
|     0x011d: 0x02f8, // XK_gcircumflex
 | ||||
|     0x011e: 0x02ab, // XK_Gbreve
 | ||||
|     0x011f: 0x02bb, // XK_gbreve
 | ||||
|     0x0120: 0x02d5, // XK_Gabovedot
 | ||||
|     0x0121: 0x02f5, // XK_gabovedot
 | ||||
|     0x0122: 0x03ab, // XK_Gcedilla
 | ||||
|     0x0123: 0x03bb, // XK_gcedilla
 | ||||
|     0x0124: 0x02a6, // XK_Hcircumflex
 | ||||
|     0x0125: 0x02b6, // XK_hcircumflex
 | ||||
|     0x0126: 0x02a1, // XK_Hstroke
 | ||||
|     0x0127: 0x02b1, // XK_hstroke
 | ||||
|     0x0128: 0x03a5, // XK_Itilde
 | ||||
|     0x0129: 0x03b5, // XK_itilde
 | ||||
|     0x012a: 0x03cf, // XK_Imacron
 | ||||
|     0x012b: 0x03ef, // XK_imacron
 | ||||
|     0x012e: 0x03c7, // XK_Iogonek
 | ||||
|     0x012f: 0x03e7, // XK_iogonek
 | ||||
|     0x0130: 0x02a9, // XK_Iabovedot
 | ||||
|     0x0131: 0x02b9, // XK_idotless
 | ||||
|     0x0134: 0x02ac, // XK_Jcircumflex
 | ||||
|     0x0135: 0x02bc, // XK_jcircumflex
 | ||||
|     0x0136: 0x03d3, // XK_Kcedilla
 | ||||
|     0x0137: 0x03f3, // XK_kcedilla
 | ||||
|     0x0138: 0x03a2, // XK_kra
 | ||||
|     0x0139: 0x01c5, // XK_Lacute
 | ||||
|     0x013a: 0x01e5, // XK_lacute
 | ||||
|     0x013b: 0x03a6, // XK_Lcedilla
 | ||||
|     0x013c: 0x03b6, // XK_lcedilla
 | ||||
|     0x013d: 0x01a5, // XK_Lcaron
 | ||||
|     0x013e: 0x01b5, // XK_lcaron
 | ||||
|     0x0141: 0x01a3, // XK_Lstroke
 | ||||
|     0x0142: 0x01b3, // XK_lstroke
 | ||||
|     0x0143: 0x01d1, // XK_Nacute
 | ||||
|     0x0144: 0x01f1, // XK_nacute
 | ||||
|     0x0145: 0x03d1, // XK_Ncedilla
 | ||||
|     0x0146: 0x03f1, // XK_ncedilla
 | ||||
|     0x0147: 0x01d2, // XK_Ncaron
 | ||||
|     0x0148: 0x01f2, // XK_ncaron
 | ||||
|     0x014a: 0x03bd, // XK_ENG
 | ||||
|     0x014b: 0x03bf, // XK_eng
 | ||||
|     0x014c: 0x03d2, // XK_Omacron
 | ||||
|     0x014d: 0x03f2, // XK_omacron
 | ||||
|     0x0150: 0x01d5, // XK_Odoubleacute
 | ||||
|     0x0151: 0x01f5, // XK_odoubleacute
 | ||||
|     0x0152: 0x13bc, // XK_OE
 | ||||
|     0x0153: 0x13bd, // XK_oe
 | ||||
|     0x0154: 0x01c0, // XK_Racute
 | ||||
|     0x0155: 0x01e0, // XK_racute
 | ||||
|     0x0156: 0x03a3, // XK_Rcedilla
 | ||||
|     0x0157: 0x03b3, // XK_rcedilla
 | ||||
|     0x0158: 0x01d8, // XK_Rcaron
 | ||||
|     0x0159: 0x01f8, // XK_rcaron
 | ||||
|     0x015a: 0x01a6, // XK_Sacute
 | ||||
|     0x015b: 0x01b6, // XK_sacute
 | ||||
|     0x015c: 0x02de, // XK_Scircumflex
 | ||||
|     0x015d: 0x02fe, // XK_scircumflex
 | ||||
|     0x015e: 0x01aa, // XK_Scedilla
 | ||||
|     0x015f: 0x01ba, // XK_scedilla
 | ||||
|     0x0160: 0x01a9, // XK_Scaron
 | ||||
|     0x0161: 0x01b9, // XK_scaron
 | ||||
|     0x0162: 0x01de, // XK_Tcedilla
 | ||||
|     0x0163: 0x01fe, // XK_tcedilla
 | ||||
|     0x0164: 0x01ab, // XK_Tcaron
 | ||||
|     0x0165: 0x01bb, // XK_tcaron
 | ||||
|     0x0166: 0x03ac, // XK_Tslash
 | ||||
|     0x0167: 0x03bc, // XK_tslash
 | ||||
|     0x0168: 0x03dd, // XK_Utilde
 | ||||
|     0x0169: 0x03fd, // XK_utilde
 | ||||
|     0x016a: 0x03de, // XK_Umacron
 | ||||
|     0x016b: 0x03fe, // XK_umacron
 | ||||
|     0x016c: 0x02dd, // XK_Ubreve
 | ||||
|     0x016d: 0x02fd, // XK_ubreve
 | ||||
|     0x016e: 0x01d9, // XK_Uring
 | ||||
|     0x016f: 0x01f9, // XK_uring
 | ||||
|     0x0170: 0x01db, // XK_Udoubleacute
 | ||||
|     0x0171: 0x01fb, // XK_udoubleacute
 | ||||
|     0x0172: 0x03d9, // XK_Uogonek
 | ||||
|     0x0173: 0x03f9, // XK_uogonek
 | ||||
|     0x0178: 0x13be, // XK_Ydiaeresis
 | ||||
|     0x0179: 0x01ac, // XK_Zacute
 | ||||
|     0x017a: 0x01bc, // XK_zacute
 | ||||
|     0x017b: 0x01af, // XK_Zabovedot
 | ||||
|     0x017c: 0x01bf, // XK_zabovedot
 | ||||
|     0x017d: 0x01ae, // XK_Zcaron
 | ||||
|     0x017e: 0x01be, // XK_zcaron
 | ||||
|     0x0192: 0x08f6, // XK_function
 | ||||
|     0x01d2: 0x10001d1, // XK_Ocaron
 | ||||
|     0x02c7: 0x01b7, // XK_caron
 | ||||
|     0x02d8: 0x01a2, // XK_breve
 | ||||
|     0x02d9: 0x01ff, // XK_abovedot
 | ||||
|     0x02db: 0x01b2, // XK_ogonek
 | ||||
|     0x02dd: 0x01bd, // XK_doubleacute
 | ||||
|     0x0385: 0x07ae, // XK_Greek_accentdieresis
 | ||||
|     0x0386: 0x07a1, // XK_Greek_ALPHAaccent
 | ||||
|     0x0388: 0x07a2, // XK_Greek_EPSILONaccent
 | ||||
|     0x0389: 0x07a3, // XK_Greek_ETAaccent
 | ||||
|     0x038a: 0x07a4, // XK_Greek_IOTAaccent
 | ||||
|     0x038c: 0x07a7, // XK_Greek_OMICRONaccent
 | ||||
|     0x038e: 0x07a8, // XK_Greek_UPSILONaccent
 | ||||
|     0x038f: 0x07ab, // XK_Greek_OMEGAaccent
 | ||||
|     0x0390: 0x07b6, // XK_Greek_iotaaccentdieresis
 | ||||
|     0x0391: 0x07c1, // XK_Greek_ALPHA
 | ||||
|     0x0392: 0x07c2, // XK_Greek_BETA
 | ||||
|     0x0393: 0x07c3, // XK_Greek_GAMMA
 | ||||
|     0x0394: 0x07c4, // XK_Greek_DELTA
 | ||||
|     0x0395: 0x07c5, // XK_Greek_EPSILON
 | ||||
|     0x0396: 0x07c6, // XK_Greek_ZETA
 | ||||
|     0x0397: 0x07c7, // XK_Greek_ETA
 | ||||
|     0x0398: 0x07c8, // XK_Greek_THETA
 | ||||
|     0x0399: 0x07c9, // XK_Greek_IOTA
 | ||||
|     0x039a: 0x07ca, // XK_Greek_KAPPA
 | ||||
|     0x039b: 0x07cb, // XK_Greek_LAMDA
 | ||||
|     0x039c: 0x07cc, // XK_Greek_MU
 | ||||
|     0x039d: 0x07cd, // XK_Greek_NU
 | ||||
|     0x039e: 0x07ce, // XK_Greek_XI
 | ||||
|     0x039f: 0x07cf, // XK_Greek_OMICRON
 | ||||
|     0x03a0: 0x07d0, // XK_Greek_PI
 | ||||
|     0x03a1: 0x07d1, // XK_Greek_RHO
 | ||||
|     0x03a3: 0x07d2, // XK_Greek_SIGMA
 | ||||
|     0x03a4: 0x07d4, // XK_Greek_TAU
 | ||||
|     0x03a5: 0x07d5, // XK_Greek_UPSILON
 | ||||
|     0x03a6: 0x07d6, // XK_Greek_PHI
 | ||||
|     0x03a7: 0x07d7, // XK_Greek_CHI
 | ||||
|     0x03a8: 0x07d8, // XK_Greek_PSI
 | ||||
|     0x03a9: 0x07d9, // XK_Greek_OMEGA
 | ||||
|     0x03aa: 0x07a5, // XK_Greek_IOTAdieresis
 | ||||
|     0x03ab: 0x07a9, // XK_Greek_UPSILONdieresis
 | ||||
|     0x03ac: 0x07b1, // XK_Greek_alphaaccent
 | ||||
|     0x03ad: 0x07b2, // XK_Greek_epsilonaccent
 | ||||
|     0x03ae: 0x07b3, // XK_Greek_etaaccent
 | ||||
|     0x03af: 0x07b4, // XK_Greek_iotaaccent
 | ||||
|     0x03b0: 0x07ba, // XK_Greek_upsilonaccentdieresis
 | ||||
|     0x03b1: 0x07e1, // XK_Greek_alpha
 | ||||
|     0x03b2: 0x07e2, // XK_Greek_beta
 | ||||
|     0x03b3: 0x07e3, // XK_Greek_gamma
 | ||||
|     0x03b4: 0x07e4, // XK_Greek_delta
 | ||||
|     0x03b5: 0x07e5, // XK_Greek_epsilon
 | ||||
|     0x03b6: 0x07e6, // XK_Greek_zeta
 | ||||
|     0x03b7: 0x07e7, // XK_Greek_eta
 | ||||
|     0x03b8: 0x07e8, // XK_Greek_theta
 | ||||
|     0x03b9: 0x07e9, // XK_Greek_iota
 | ||||
|     0x03ba: 0x07ea, // XK_Greek_kappa
 | ||||
|     0x03bb: 0x07eb, // XK_Greek_lamda
 | ||||
|     0x03bc: 0x07ec, // XK_Greek_mu
 | ||||
|     0x03bd: 0x07ed, // XK_Greek_nu
 | ||||
|     0x03be: 0x07ee, // XK_Greek_xi
 | ||||
|     0x03bf: 0x07ef, // XK_Greek_omicron
 | ||||
|     0x03c0: 0x07f0, // XK_Greek_pi
 | ||||
|     0x03c1: 0x07f1, // XK_Greek_rho
 | ||||
|     0x03c2: 0x07f3, // XK_Greek_finalsmallsigma
 | ||||
|     0x03c3: 0x07f2, // XK_Greek_sigma
 | ||||
|     0x03c4: 0x07f4, // XK_Greek_tau
 | ||||
|     0x03c5: 0x07f5, // XK_Greek_upsilon
 | ||||
|     0x03c6: 0x07f6, // XK_Greek_phi
 | ||||
|     0x03c7: 0x07f7, // XK_Greek_chi
 | ||||
|     0x03c8: 0x07f8, // XK_Greek_psi
 | ||||
|     0x03c9: 0x07f9, // XK_Greek_omega
 | ||||
|     0x03ca: 0x07b5, // XK_Greek_iotadieresis
 | ||||
|     0x03cb: 0x07b9, // XK_Greek_upsilondieresis
 | ||||
|     0x03cc: 0x07b7, // XK_Greek_omicronaccent
 | ||||
|     0x03cd: 0x07b8, // XK_Greek_upsilonaccent
 | ||||
|     0x03ce: 0x07bb, // XK_Greek_omegaaccent
 | ||||
|     0x0401: 0x06b3, // XK_Cyrillic_IO
 | ||||
|     0x0402: 0x06b1, // XK_Serbian_DJE
 | ||||
|     0x0403: 0x06b2, // XK_Macedonia_GJE
 | ||||
|     0x0404: 0x06b4, // XK_Ukrainian_IE
 | ||||
|     0x0405: 0x06b5, // XK_Macedonia_DSE
 | ||||
|     0x0406: 0x06b6, // XK_Ukrainian_I
 | ||||
|     0x0407: 0x06b7, // XK_Ukrainian_YI
 | ||||
|     0x0408: 0x06b8, // XK_Cyrillic_JE
 | ||||
|     0x0409: 0x06b9, // XK_Cyrillic_LJE
 | ||||
|     0x040a: 0x06ba, // XK_Cyrillic_NJE
 | ||||
|     0x040b: 0x06bb, // XK_Serbian_TSHE
 | ||||
|     0x040c: 0x06bc, // XK_Macedonia_KJE
 | ||||
|     0x040e: 0x06be, // XK_Byelorussian_SHORTU
 | ||||
|     0x040f: 0x06bf, // XK_Cyrillic_DZHE
 | ||||
|     0x0410: 0x06e1, // XK_Cyrillic_A
 | ||||
|     0x0411: 0x06e2, // XK_Cyrillic_BE
 | ||||
|     0x0412: 0x06f7, // XK_Cyrillic_VE
 | ||||
|     0x0413: 0x06e7, // XK_Cyrillic_GHE
 | ||||
|     0x0414: 0x06e4, // XK_Cyrillic_DE
 | ||||
|     0x0415: 0x06e5, // XK_Cyrillic_IE
 | ||||
|     0x0416: 0x06f6, // XK_Cyrillic_ZHE
 | ||||
|     0x0417: 0x06fa, // XK_Cyrillic_ZE
 | ||||
|     0x0418: 0x06e9, // XK_Cyrillic_I
 | ||||
|     0x0419: 0x06ea, // XK_Cyrillic_SHORTI
 | ||||
|     0x041a: 0x06eb, // XK_Cyrillic_KA
 | ||||
|     0x041b: 0x06ec, // XK_Cyrillic_EL
 | ||||
|     0x041c: 0x06ed, // XK_Cyrillic_EM
 | ||||
|     0x041d: 0x06ee, // XK_Cyrillic_EN
 | ||||
|     0x041e: 0x06ef, // XK_Cyrillic_O
 | ||||
|     0x041f: 0x06f0, // XK_Cyrillic_PE
 | ||||
|     0x0420: 0x06f2, // XK_Cyrillic_ER
 | ||||
|     0x0421: 0x06f3, // XK_Cyrillic_ES
 | ||||
|     0x0422: 0x06f4, // XK_Cyrillic_TE
 | ||||
|     0x0423: 0x06f5, // XK_Cyrillic_U
 | ||||
|     0x0424: 0x06e6, // XK_Cyrillic_EF
 | ||||
|     0x0425: 0x06e8, // XK_Cyrillic_HA
 | ||||
|     0x0426: 0x06e3, // XK_Cyrillic_TSE
 | ||||
|     0x0427: 0x06fe, // XK_Cyrillic_CHE
 | ||||
|     0x0428: 0x06fb, // XK_Cyrillic_SHA
 | ||||
|     0x0429: 0x06fd, // XK_Cyrillic_SHCHA
 | ||||
|     0x042a: 0x06ff, // XK_Cyrillic_HARDSIGN
 | ||||
|     0x042b: 0x06f9, // XK_Cyrillic_YERU
 | ||||
|     0x042c: 0x06f8, // XK_Cyrillic_SOFTSIGN
 | ||||
|     0x042d: 0x06fc, // XK_Cyrillic_E
 | ||||
|     0x042e: 0x06e0, // XK_Cyrillic_YU
 | ||||
|     0x042f: 0x06f1, // XK_Cyrillic_YA
 | ||||
|     0x0430: 0x06c1, // XK_Cyrillic_a
 | ||||
|     0x0431: 0x06c2, // XK_Cyrillic_be
 | ||||
|     0x0432: 0x06d7, // XK_Cyrillic_ve
 | ||||
|     0x0433: 0x06c7, // XK_Cyrillic_ghe
 | ||||
|     0x0434: 0x06c4, // XK_Cyrillic_de
 | ||||
|     0x0435: 0x06c5, // XK_Cyrillic_ie
 | ||||
|     0x0436: 0x06d6, // XK_Cyrillic_zhe
 | ||||
|     0x0437: 0x06da, // XK_Cyrillic_ze
 | ||||
|     0x0438: 0x06c9, // XK_Cyrillic_i
 | ||||
|     0x0439: 0x06ca, // XK_Cyrillic_shorti
 | ||||
|     0x043a: 0x06cb, // XK_Cyrillic_ka
 | ||||
|     0x043b: 0x06cc, // XK_Cyrillic_el
 | ||||
|     0x043c: 0x06cd, // XK_Cyrillic_em
 | ||||
|     0x043d: 0x06ce, // XK_Cyrillic_en
 | ||||
|     0x043e: 0x06cf, // XK_Cyrillic_o
 | ||||
|     0x043f: 0x06d0, // XK_Cyrillic_pe
 | ||||
|     0x0440: 0x06d2, // XK_Cyrillic_er
 | ||||
|     0x0441: 0x06d3, // XK_Cyrillic_es
 | ||||
|     0x0442: 0x06d4, // XK_Cyrillic_te
 | ||||
|     0x0443: 0x06d5, // XK_Cyrillic_u
 | ||||
|     0x0444: 0x06c6, // XK_Cyrillic_ef
 | ||||
|     0x0445: 0x06c8, // XK_Cyrillic_ha
 | ||||
|     0x0446: 0x06c3, // XK_Cyrillic_tse
 | ||||
|     0x0447: 0x06de, // XK_Cyrillic_che
 | ||||
|     0x0448: 0x06db, // XK_Cyrillic_sha
 | ||||
|     0x0449: 0x06dd, // XK_Cyrillic_shcha
 | ||||
|     0x044a: 0x06df, // XK_Cyrillic_hardsign
 | ||||
|     0x044b: 0x06d9, // XK_Cyrillic_yeru
 | ||||
|     0x044c: 0x06d8, // XK_Cyrillic_softsign
 | ||||
|     0x044d: 0x06dc, // XK_Cyrillic_e
 | ||||
|     0x044e: 0x06c0, // XK_Cyrillic_yu
 | ||||
|     0x044f: 0x06d1, // XK_Cyrillic_ya
 | ||||
|     0x0451: 0x06a3, // XK_Cyrillic_io
 | ||||
|     0x0452: 0x06a1, // XK_Serbian_dje
 | ||||
|     0x0453: 0x06a2, // XK_Macedonia_gje
 | ||||
|     0x0454: 0x06a4, // XK_Ukrainian_ie
 | ||||
|     0x0455: 0x06a5, // XK_Macedonia_dse
 | ||||
|     0x0456: 0x06a6, // XK_Ukrainian_i
 | ||||
|     0x0457: 0x06a7, // XK_Ukrainian_yi
 | ||||
|     0x0458: 0x06a8, // XK_Cyrillic_je
 | ||||
|     0x0459: 0x06a9, // XK_Cyrillic_lje
 | ||||
|     0x045a: 0x06aa, // XK_Cyrillic_nje
 | ||||
|     0x045b: 0x06ab, // XK_Serbian_tshe
 | ||||
|     0x045c: 0x06ac, // XK_Macedonia_kje
 | ||||
|     0x045e: 0x06ae, // XK_Byelorussian_shortu
 | ||||
|     0x045f: 0x06af, // XK_Cyrillic_dzhe
 | ||||
|     0x0490: 0x06bd, // XK_Ukrainian_GHE_WITH_UPTURN
 | ||||
|     0x0491: 0x06ad, // XK_Ukrainian_ghe_with_upturn
 | ||||
|     0x05d0: 0x0ce0, // XK_hebrew_aleph
 | ||||
|     0x05d1: 0x0ce1, // XK_hebrew_bet
 | ||||
|     0x05d2: 0x0ce2, // XK_hebrew_gimel
 | ||||
|     0x05d3: 0x0ce3, // XK_hebrew_dalet
 | ||||
|     0x05d4: 0x0ce4, // XK_hebrew_he
 | ||||
|     0x05d5: 0x0ce5, // XK_hebrew_waw
 | ||||
|     0x05d6: 0x0ce6, // XK_hebrew_zain
 | ||||
|     0x05d7: 0x0ce7, // XK_hebrew_chet
 | ||||
|     0x05d8: 0x0ce8, // XK_hebrew_tet
 | ||||
|     0x05d9: 0x0ce9, // XK_hebrew_yod
 | ||||
|     0x05da: 0x0cea, // XK_hebrew_finalkaph
 | ||||
|     0x05db: 0x0ceb, // XK_hebrew_kaph
 | ||||
|     0x05dc: 0x0cec, // XK_hebrew_lamed
 | ||||
|     0x05dd: 0x0ced, // XK_hebrew_finalmem
 | ||||
|     0x05de: 0x0cee, // XK_hebrew_mem
 | ||||
|     0x05df: 0x0cef, // XK_hebrew_finalnun
 | ||||
|     0x05e0: 0x0cf0, // XK_hebrew_nun
 | ||||
|     0x05e1: 0x0cf1, // XK_hebrew_samech
 | ||||
|     0x05e2: 0x0cf2, // XK_hebrew_ayin
 | ||||
|     0x05e3: 0x0cf3, // XK_hebrew_finalpe
 | ||||
|     0x05e4: 0x0cf4, // XK_hebrew_pe
 | ||||
|     0x05e5: 0x0cf5, // XK_hebrew_finalzade
 | ||||
|     0x05e6: 0x0cf6, // XK_hebrew_zade
 | ||||
|     0x05e7: 0x0cf7, // XK_hebrew_qoph
 | ||||
|     0x05e8: 0x0cf8, // XK_hebrew_resh
 | ||||
|     0x05e9: 0x0cf9, // XK_hebrew_shin
 | ||||
|     0x05ea: 0x0cfa, // XK_hebrew_taw
 | ||||
|     0x060c: 0x05ac, // XK_Arabic_comma
 | ||||
|     0x061b: 0x05bb, // XK_Arabic_semicolon
 | ||||
|     0x061f: 0x05bf, // XK_Arabic_question_mark
 | ||||
|     0x0621: 0x05c1, // XK_Arabic_hamza
 | ||||
|     0x0622: 0x05c2, // XK_Arabic_maddaonalef
 | ||||
|     0x0623: 0x05c3, // XK_Arabic_hamzaonalef
 | ||||
|     0x0624: 0x05c4, // XK_Arabic_hamzaonwaw
 | ||||
|     0x0625: 0x05c5, // XK_Arabic_hamzaunderalef
 | ||||
|     0x0626: 0x05c6, // XK_Arabic_hamzaonyeh
 | ||||
|     0x0627: 0x05c7, // XK_Arabic_alef
 | ||||
|     0x0628: 0x05c8, // XK_Arabic_beh
 | ||||
|     0x0629: 0x05c9, // XK_Arabic_tehmarbuta
 | ||||
|     0x062a: 0x05ca, // XK_Arabic_teh
 | ||||
|     0x062b: 0x05cb, // XK_Arabic_theh
 | ||||
|     0x062c: 0x05cc, // XK_Arabic_jeem
 | ||||
|     0x062d: 0x05cd, // XK_Arabic_hah
 | ||||
|     0x062e: 0x05ce, // XK_Arabic_khah
 | ||||
|     0x062f: 0x05cf, // XK_Arabic_dal
 | ||||
|     0x0630: 0x05d0, // XK_Arabic_thal
 | ||||
|     0x0631: 0x05d1, // XK_Arabic_ra
 | ||||
|     0x0632: 0x05d2, // XK_Arabic_zain
 | ||||
|     0x0633: 0x05d3, // XK_Arabic_seen
 | ||||
|     0x0634: 0x05d4, // XK_Arabic_sheen
 | ||||
|     0x0635: 0x05d5, // XK_Arabic_sad
 | ||||
|     0x0636: 0x05d6, // XK_Arabic_dad
 | ||||
|     0x0637: 0x05d7, // XK_Arabic_tah
 | ||||
|     0x0638: 0x05d8, // XK_Arabic_zah
 | ||||
|     0x0639: 0x05d9, // XK_Arabic_ain
 | ||||
|     0x063a: 0x05da, // XK_Arabic_ghain
 | ||||
|     0x0640: 0x05e0, // XK_Arabic_tatweel
 | ||||
|     0x0641: 0x05e1, // XK_Arabic_feh
 | ||||
|     0x0642: 0x05e2, // XK_Arabic_qaf
 | ||||
|     0x0643: 0x05e3, // XK_Arabic_kaf
 | ||||
|     0x0644: 0x05e4, // XK_Arabic_lam
 | ||||
|     0x0645: 0x05e5, // XK_Arabic_meem
 | ||||
|     0x0646: 0x05e6, // XK_Arabic_noon
 | ||||
|     0x0647: 0x05e7, // XK_Arabic_ha
 | ||||
|     0x0648: 0x05e8, // XK_Arabic_waw
 | ||||
|     0x0649: 0x05e9, // XK_Arabic_alefmaksura
 | ||||
|     0x064a: 0x05ea, // XK_Arabic_yeh
 | ||||
|     0x064b: 0x05eb, // XK_Arabic_fathatan
 | ||||
|     0x064c: 0x05ec, // XK_Arabic_dammatan
 | ||||
|     0x064d: 0x05ed, // XK_Arabic_kasratan
 | ||||
|     0x064e: 0x05ee, // XK_Arabic_fatha
 | ||||
|     0x064f: 0x05ef, // XK_Arabic_damma
 | ||||
|     0x0650: 0x05f0, // XK_Arabic_kasra
 | ||||
|     0x0651: 0x05f1, // XK_Arabic_shadda
 | ||||
|     0x0652: 0x05f2, // XK_Arabic_sukun
 | ||||
|     0x0e01: 0x0da1, // XK_Thai_kokai
 | ||||
|     0x0e02: 0x0da2, // XK_Thai_khokhai
 | ||||
|     0x0e03: 0x0da3, // XK_Thai_khokhuat
 | ||||
|     0x0e04: 0x0da4, // XK_Thai_khokhwai
 | ||||
|     0x0e05: 0x0da5, // XK_Thai_khokhon
 | ||||
|     0x0e06: 0x0da6, // XK_Thai_khorakhang
 | ||||
|     0x0e07: 0x0da7, // XK_Thai_ngongu
 | ||||
|     0x0e08: 0x0da8, // XK_Thai_chochan
 | ||||
|     0x0e09: 0x0da9, // XK_Thai_choching
 | ||||
|     0x0e0a: 0x0daa, // XK_Thai_chochang
 | ||||
|     0x0e0b: 0x0dab, // XK_Thai_soso
 | ||||
|     0x0e0c: 0x0dac, // XK_Thai_chochoe
 | ||||
|     0x0e0d: 0x0dad, // XK_Thai_yoying
 | ||||
|     0x0e0e: 0x0dae, // XK_Thai_dochada
 | ||||
|     0x0e0f: 0x0daf, // XK_Thai_topatak
 | ||||
|     0x0e10: 0x0db0, // XK_Thai_thothan
 | ||||
|     0x0e11: 0x0db1, // XK_Thai_thonangmontho
 | ||||
|     0x0e12: 0x0db2, // XK_Thai_thophuthao
 | ||||
|     0x0e13: 0x0db3, // XK_Thai_nonen
 | ||||
|     0x0e14: 0x0db4, // XK_Thai_dodek
 | ||||
|     0x0e15: 0x0db5, // XK_Thai_totao
 | ||||
|     0x0e16: 0x0db6, // XK_Thai_thothung
 | ||||
|     0x0e17: 0x0db7, // XK_Thai_thothahan
 | ||||
|     0x0e18: 0x0db8, // XK_Thai_thothong
 | ||||
|     0x0e19: 0x0db9, // XK_Thai_nonu
 | ||||
|     0x0e1a: 0x0dba, // XK_Thai_bobaimai
 | ||||
|     0x0e1b: 0x0dbb, // XK_Thai_popla
 | ||||
|     0x0e1c: 0x0dbc, // XK_Thai_phophung
 | ||||
|     0x0e1d: 0x0dbd, // XK_Thai_fofa
 | ||||
|     0x0e1e: 0x0dbe, // XK_Thai_phophan
 | ||||
|     0x0e1f: 0x0dbf, // XK_Thai_fofan
 | ||||
|     0x0e20: 0x0dc0, // XK_Thai_phosamphao
 | ||||
|     0x0e21: 0x0dc1, // XK_Thai_moma
 | ||||
|     0x0e22: 0x0dc2, // XK_Thai_yoyak
 | ||||
|     0x0e23: 0x0dc3, // XK_Thai_rorua
 | ||||
|     0x0e24: 0x0dc4, // XK_Thai_ru
 | ||||
|     0x0e25: 0x0dc5, // XK_Thai_loling
 | ||||
|     0x0e26: 0x0dc6, // XK_Thai_lu
 | ||||
|     0x0e27: 0x0dc7, // XK_Thai_wowaen
 | ||||
|     0x0e28: 0x0dc8, // XK_Thai_sosala
 | ||||
|     0x0e29: 0x0dc9, // XK_Thai_sorusi
 | ||||
|     0x0e2a: 0x0dca, // XK_Thai_sosua
 | ||||
|     0x0e2b: 0x0dcb, // XK_Thai_hohip
 | ||||
|     0x0e2c: 0x0dcc, // XK_Thai_lochula
 | ||||
|     0x0e2d: 0x0dcd, // XK_Thai_oang
 | ||||
|     0x0e2e: 0x0dce, // XK_Thai_honokhuk
 | ||||
|     0x0e2f: 0x0dcf, // XK_Thai_paiyannoi
 | ||||
|     0x0e30: 0x0dd0, // XK_Thai_saraa
 | ||||
|     0x0e31: 0x0dd1, // XK_Thai_maihanakat
 | ||||
|     0x0e32: 0x0dd2, // XK_Thai_saraaa
 | ||||
|     0x0e33: 0x0dd3, // XK_Thai_saraam
 | ||||
|     0x0e34: 0x0dd4, // XK_Thai_sarai
 | ||||
|     0x0e35: 0x0dd5, // XK_Thai_saraii
 | ||||
|     0x0e36: 0x0dd6, // XK_Thai_saraue
 | ||||
|     0x0e37: 0x0dd7, // XK_Thai_sarauee
 | ||||
|     0x0e38: 0x0dd8, // XK_Thai_sarau
 | ||||
|     0x0e39: 0x0dd9, // XK_Thai_sarauu
 | ||||
|     0x0e3a: 0x0dda, // XK_Thai_phinthu
 | ||||
|     0x0e3f: 0x0ddf, // XK_Thai_baht
 | ||||
|     0x0e40: 0x0de0, // XK_Thai_sarae
 | ||||
|     0x0e41: 0x0de1, // XK_Thai_saraae
 | ||||
|     0x0e42: 0x0de2, // XK_Thai_sarao
 | ||||
|     0x0e43: 0x0de3, // XK_Thai_saraaimaimuan
 | ||||
|     0x0e44: 0x0de4, // XK_Thai_saraaimaimalai
 | ||||
|     0x0e45: 0x0de5, // XK_Thai_lakkhangyao
 | ||||
|     0x0e46: 0x0de6, // XK_Thai_maiyamok
 | ||||
|     0x0e47: 0x0de7, // XK_Thai_maitaikhu
 | ||||
|     0x0e48: 0x0de8, // XK_Thai_maiek
 | ||||
|     0x0e49: 0x0de9, // XK_Thai_maitho
 | ||||
|     0x0e4a: 0x0dea, // XK_Thai_maitri
 | ||||
|     0x0e4b: 0x0deb, // XK_Thai_maichattawa
 | ||||
|     0x0e4c: 0x0dec, // XK_Thai_thanthakhat
 | ||||
|     0x0e4d: 0x0ded, // XK_Thai_nikhahit
 | ||||
|     0x0e50: 0x0df0, // XK_Thai_leksun
 | ||||
|     0x0e51: 0x0df1, // XK_Thai_leknung
 | ||||
|     0x0e52: 0x0df2, // XK_Thai_leksong
 | ||||
|     0x0e53: 0x0df3, // XK_Thai_leksam
 | ||||
|     0x0e54: 0x0df4, // XK_Thai_leksi
 | ||||
|     0x0e55: 0x0df5, // XK_Thai_lekha
 | ||||
|     0x0e56: 0x0df6, // XK_Thai_lekhok
 | ||||
|     0x0e57: 0x0df7, // XK_Thai_lekchet
 | ||||
|     0x0e58: 0x0df8, // XK_Thai_lekpaet
 | ||||
|     0x0e59: 0x0df9, // XK_Thai_lekkao
 | ||||
|     0x2002: 0x0aa2, // XK_enspace
 | ||||
|     0x2003: 0x0aa1, // XK_emspace
 | ||||
|     0x2004: 0x0aa3, // XK_em3space
 | ||||
|     0x2005: 0x0aa4, // XK_em4space
 | ||||
|     0x2007: 0x0aa5, // XK_digitspace
 | ||||
|     0x2008: 0x0aa6, // XK_punctspace
 | ||||
|     0x2009: 0x0aa7, // XK_thinspace
 | ||||
|     0x200a: 0x0aa8, // XK_hairspace
 | ||||
|     0x2012: 0x0abb, // XK_figdash
 | ||||
|     0x2013: 0x0aaa, // XK_endash
 | ||||
|     0x2014: 0x0aa9, // XK_emdash
 | ||||
|     0x2015: 0x07af, // XK_Greek_horizbar
 | ||||
|     0x2017: 0x0cdf, // XK_hebrew_doublelowline
 | ||||
|     0x2018: 0x0ad0, // XK_leftsinglequotemark
 | ||||
|     0x2019: 0x0ad1, // XK_rightsinglequotemark
 | ||||
|     0x201a: 0x0afd, // XK_singlelowquotemark
 | ||||
|     0x201c: 0x0ad2, // XK_leftdoublequotemark
 | ||||
|     0x201d: 0x0ad3, // XK_rightdoublequotemark
 | ||||
|     0x201e: 0x0afe, // XK_doublelowquotemark
 | ||||
|     0x2020: 0x0af1, // XK_dagger
 | ||||
|     0x2021: 0x0af2, // XK_doubledagger
 | ||||
|     0x2022: 0x0ae6, // XK_enfilledcircbullet
 | ||||
|     0x2025: 0x0aaf, // XK_doubbaselinedot
 | ||||
|     0x2026: 0x0aae, // XK_ellipsis
 | ||||
|     0x2030: 0x0ad5, // XK_permille
 | ||||
|     0x2032: 0x0ad6, // XK_minutes
 | ||||
|     0x2033: 0x0ad7, // XK_seconds
 | ||||
|     0x2038: 0x0afc, // XK_caret
 | ||||
|     0x203e: 0x047e, // XK_overline
 | ||||
|     0x20a9: 0x0eff, // XK_Korean_Won
 | ||||
|     0x20ac: 0x20ac, // XK_EuroSign
 | ||||
|     0x2105: 0x0ab8, // XK_careof
 | ||||
|     0x2116: 0x06b0, // XK_numerosign
 | ||||
|     0x2117: 0x0afb, // XK_phonographcopyright
 | ||||
|     0x211e: 0x0ad4, // XK_prescription
 | ||||
|     0x2122: 0x0ac9, // XK_trademark
 | ||||
|     0x2153: 0x0ab0, // XK_onethird
 | ||||
|     0x2154: 0x0ab1, // XK_twothirds
 | ||||
|     0x2155: 0x0ab2, // XK_onefifth
 | ||||
|     0x2156: 0x0ab3, // XK_twofifths
 | ||||
|     0x2157: 0x0ab4, // XK_threefifths
 | ||||
|     0x2158: 0x0ab5, // XK_fourfifths
 | ||||
|     0x2159: 0x0ab6, // XK_onesixth
 | ||||
|     0x215a: 0x0ab7, // XK_fivesixths
 | ||||
|     0x215b: 0x0ac3, // XK_oneeighth
 | ||||
|     0x215c: 0x0ac4, // XK_threeeighths
 | ||||
|     0x215d: 0x0ac5, // XK_fiveeighths
 | ||||
|     0x215e: 0x0ac6, // XK_seveneighths
 | ||||
|     0x2190: 0x08fb, // XK_leftarrow
 | ||||
|     0x2191: 0x08fc, // XK_uparrow
 | ||||
|     0x2192: 0x08fd, // XK_rightarrow
 | ||||
|     0x2193: 0x08fe, // XK_downarrow
 | ||||
|     0x21d2: 0x08ce, // XK_implies
 | ||||
|     0x21d4: 0x08cd, // XK_ifonlyif
 | ||||
|     0x2202: 0x08ef, // XK_partialderivative
 | ||||
|     0x2207: 0x08c5, // XK_nabla
 | ||||
|     0x2218: 0x0bca, // XK_jot
 | ||||
|     0x221a: 0x08d6, // XK_radical
 | ||||
|     0x221d: 0x08c1, // XK_variation
 | ||||
|     0x221e: 0x08c2, // XK_infinity
 | ||||
|     0x2227: 0x08de, // XK_logicaland
 | ||||
|     0x2228: 0x08df, // XK_logicalor
 | ||||
|     0x2229: 0x08dc, // XK_intersection
 | ||||
|     0x222a: 0x08dd, // XK_union
 | ||||
|     0x222b: 0x08bf, // XK_integral
 | ||||
|     0x2234: 0x08c0, // XK_therefore
 | ||||
|     0x223c: 0x08c8, // XK_approximate
 | ||||
|     0x2243: 0x08c9, // XK_similarequal
 | ||||
|     0x2245: 0x1002248, // XK_approxeq
 | ||||
|     0x2260: 0x08bd, // XK_notequal
 | ||||
|     0x2261: 0x08cf, // XK_identical
 | ||||
|     0x2264: 0x08bc, // XK_lessthanequal
 | ||||
|     0x2265: 0x08be, // XK_greaterthanequal
 | ||||
|     0x2282: 0x08da, // XK_includedin
 | ||||
|     0x2283: 0x08db, // XK_includes
 | ||||
|     0x22a2: 0x0bfc, // XK_righttack
 | ||||
|     0x22a3: 0x0bdc, // XK_lefttack
 | ||||
|     0x22a4: 0x0bc2, // XK_downtack
 | ||||
|     0x22a5: 0x0bce, // XK_uptack
 | ||||
|     0x2308: 0x0bd3, // XK_upstile
 | ||||
|     0x230a: 0x0bc4, // XK_downstile
 | ||||
|     0x2315: 0x0afa, // XK_telephonerecorder
 | ||||
|     0x2320: 0x08a4, // XK_topintegral
 | ||||
|     0x2321: 0x08a5, // XK_botintegral
 | ||||
|     0x2395: 0x0bcc, // XK_quad
 | ||||
|     0x239b: 0x08ab, // XK_topleftparens
 | ||||
|     0x239d: 0x08ac, // XK_botleftparens
 | ||||
|     0x239e: 0x08ad, // XK_toprightparens
 | ||||
|     0x23a0: 0x08ae, // XK_botrightparens
 | ||||
|     0x23a1: 0x08a7, // XK_topleftsqbracket
 | ||||
|     0x23a3: 0x08a8, // XK_botleftsqbracket
 | ||||
|     0x23a4: 0x08a9, // XK_toprightsqbracket
 | ||||
|     0x23a6: 0x08aa, // XK_botrightsqbracket
 | ||||
|     0x23a8: 0x08af, // XK_leftmiddlecurlybrace
 | ||||
|     0x23ac: 0x08b0, // XK_rightmiddlecurlybrace
 | ||||
|     0x23b7: 0x08a1, // XK_leftradical
 | ||||
|     0x23ba: 0x09ef, // XK_horizlinescan1
 | ||||
|     0x23bb: 0x09f0, // XK_horizlinescan3
 | ||||
|     0x23bc: 0x09f2, // XK_horizlinescan7
 | ||||
|     0x23bd: 0x09f3, // XK_horizlinescan9
 | ||||
|     0x2409: 0x09e2, // XK_ht
 | ||||
|     0x240a: 0x09e5, // XK_lf
 | ||||
|     0x240b: 0x09e9, // XK_vt
 | ||||
|     0x240c: 0x09e3, // XK_ff
 | ||||
|     0x240d: 0x09e4, // XK_cr
 | ||||
|     0x2423: 0x0aac, // XK_signifblank
 | ||||
|     0x2424: 0x09e8, // XK_nl
 | ||||
|     0x2500: 0x08a3, // XK_horizconnector
 | ||||
|     0x2502: 0x08a6, // XK_vertconnector
 | ||||
|     0x250c: 0x08a2, // XK_topleftradical
 | ||||
|     0x2510: 0x09eb, // XK_uprightcorner
 | ||||
|     0x2514: 0x09ed, // XK_lowleftcorner
 | ||||
|     0x2518: 0x09ea, // XK_lowrightcorner
 | ||||
|     0x251c: 0x09f4, // XK_leftt
 | ||||
|     0x2524: 0x09f5, // XK_rightt
 | ||||
|     0x252c: 0x09f7, // XK_topt
 | ||||
|     0x2534: 0x09f6, // XK_bott
 | ||||
|     0x253c: 0x09ee, // XK_crossinglines
 | ||||
|     0x2592: 0x09e1, // XK_checkerboard
 | ||||
|     0x25aa: 0x0ae7, // XK_enfilledsqbullet
 | ||||
|     0x25ab: 0x0ae1, // XK_enopensquarebullet
 | ||||
|     0x25ac: 0x0adb, // XK_filledrectbullet
 | ||||
|     0x25ad: 0x0ae2, // XK_openrectbullet
 | ||||
|     0x25ae: 0x0adf, // XK_emfilledrect
 | ||||
|     0x25af: 0x0acf, // XK_emopenrectangle
 | ||||
|     0x25b2: 0x0ae8, // XK_filledtribulletup
 | ||||
|     0x25b3: 0x0ae3, // XK_opentribulletup
 | ||||
|     0x25b6: 0x0add, // XK_filledrighttribullet
 | ||||
|     0x25b7: 0x0acd, // XK_rightopentriangle
 | ||||
|     0x25bc: 0x0ae9, // XK_filledtribulletdown
 | ||||
|     0x25bd: 0x0ae4, // XK_opentribulletdown
 | ||||
|     0x25c0: 0x0adc, // XK_filledlefttribullet
 | ||||
|     0x25c1: 0x0acc, // XK_leftopentriangle
 | ||||
|     0x25c6: 0x09e0, // XK_soliddiamond
 | ||||
|     0x25cb: 0x0ace, // XK_emopencircle
 | ||||
|     0x25cf: 0x0ade, // XK_emfilledcircle
 | ||||
|     0x25e6: 0x0ae0, // XK_enopencircbullet
 | ||||
|     0x2606: 0x0ae5, // XK_openstar
 | ||||
|     0x260e: 0x0af9, // XK_telephone
 | ||||
|     0x2613: 0x0aca, // XK_signaturemark
 | ||||
|     0x261c: 0x0aea, // XK_leftpointer
 | ||||
|     0x261e: 0x0aeb, // XK_rightpointer
 | ||||
|     0x2640: 0x0af8, // XK_femalesymbol
 | ||||
|     0x2642: 0x0af7, // XK_malesymbol
 | ||||
|     0x2663: 0x0aec, // XK_club
 | ||||
|     0x2665: 0x0aee, // XK_heart
 | ||||
|     0x2666: 0x0aed, // XK_diamond
 | ||||
|     0x266d: 0x0af6, // XK_musicalflat
 | ||||
|     0x266f: 0x0af5, // XK_musicalsharp
 | ||||
|     0x2713: 0x0af3, // XK_checkmark
 | ||||
|     0x2717: 0x0af4, // XK_ballotcross
 | ||||
|     0x271d: 0x0ad9, // XK_latincross
 | ||||
|     0x2720: 0x0af0, // XK_maltesecross
 | ||||
|     0x27e8: 0x0abc, // XK_leftanglebracket
 | ||||
|     0x27e9: 0x0abe, // XK_rightanglebracket
 | ||||
|     0x3001: 0x04a4, // XK_kana_comma
 | ||||
|     0x3002: 0x04a1, // XK_kana_fullstop
 | ||||
|     0x300c: 0x04a2, // XK_kana_openingbracket
 | ||||
|     0x300d: 0x04a3, // XK_kana_closingbracket
 | ||||
|     0x309b: 0x04de, // XK_voicedsound
 | ||||
|     0x309c: 0x04df, // XK_semivoicedsound
 | ||||
|     0x30a1: 0x04a7, // XK_kana_a
 | ||||
|     0x30a2: 0x04b1, // XK_kana_A
 | ||||
|     0x30a3: 0x04a8, // XK_kana_i
 | ||||
|     0x30a4: 0x04b2, // XK_kana_I
 | ||||
|     0x30a5: 0x04a9, // XK_kana_u
 | ||||
|     0x30a6: 0x04b3, // XK_kana_U
 | ||||
|     0x30a7: 0x04aa, // XK_kana_e
 | ||||
|     0x30a8: 0x04b4, // XK_kana_E
 | ||||
|     0x30a9: 0x04ab, // XK_kana_o
 | ||||
|     0x30aa: 0x04b5, // XK_kana_O
 | ||||
|     0x30ab: 0x04b6, // XK_kana_KA
 | ||||
|     0x30ad: 0x04b7, // XK_kana_KI
 | ||||
|     0x30af: 0x04b8, // XK_kana_KU
 | ||||
|     0x30b1: 0x04b9, // XK_kana_KE
 | ||||
|     0x30b3: 0x04ba, // XK_kana_KO
 | ||||
|     0x30b5: 0x04bb, // XK_kana_SA
 | ||||
|     0x30b7: 0x04bc, // XK_kana_SHI
 | ||||
|     0x30b9: 0x04bd, // XK_kana_SU
 | ||||
|     0x30bb: 0x04be, // XK_kana_SE
 | ||||
|     0x30bd: 0x04bf, // XK_kana_SO
 | ||||
|     0x30bf: 0x04c0, // XK_kana_TA
 | ||||
|     0x30c1: 0x04c1, // XK_kana_CHI
 | ||||
|     0x30c3: 0x04af, // XK_kana_tsu
 | ||||
|     0x30c4: 0x04c2, // XK_kana_TSU
 | ||||
|     0x30c6: 0x04c3, // XK_kana_TE
 | ||||
|     0x30c8: 0x04c4, // XK_kana_TO
 | ||||
|     0x30ca: 0x04c5, // XK_kana_NA
 | ||||
|     0x30cb: 0x04c6, // XK_kana_NI
 | ||||
|     0x30cc: 0x04c7, // XK_kana_NU
 | ||||
|     0x30cd: 0x04c8, // XK_kana_NE
 | ||||
|     0x30ce: 0x04c9, // XK_kana_NO
 | ||||
|     0x30cf: 0x04ca, // XK_kana_HA
 | ||||
|     0x30d2: 0x04cb, // XK_kana_HI
 | ||||
|     0x30d5: 0x04cc, // XK_kana_FU
 | ||||
|     0x30d8: 0x04cd, // XK_kana_HE
 | ||||
|     0x30db: 0x04ce, // XK_kana_HO
 | ||||
|     0x30de: 0x04cf, // XK_kana_MA
 | ||||
|     0x30df: 0x04d0, // XK_kana_MI
 | ||||
|     0x30e0: 0x04d1, // XK_kana_MU
 | ||||
|     0x30e1: 0x04d2, // XK_kana_ME
 | ||||
|     0x30e2: 0x04d3, // XK_kana_MO
 | ||||
|     0x30e3: 0x04ac, // XK_kana_ya
 | ||||
|     0x30e4: 0x04d4, // XK_kana_YA
 | ||||
|     0x30e5: 0x04ad, // XK_kana_yu
 | ||||
|     0x30e6: 0x04d5, // XK_kana_YU
 | ||||
|     0x30e7: 0x04ae, // XK_kana_yo
 | ||||
|     0x30e8: 0x04d6, // XK_kana_YO
 | ||||
|     0x30e9: 0x04d7, // XK_kana_RA
 | ||||
|     0x30ea: 0x04d8, // XK_kana_RI
 | ||||
|     0x30eb: 0x04d9, // XK_kana_RU
 | ||||
|     0x30ec: 0x04da, // XK_kana_RE
 | ||||
|     0x30ed: 0x04db, // XK_kana_RO
 | ||||
|     0x30ef: 0x04dc, // XK_kana_WA
 | ||||
|     0x30f2: 0x04a6, // XK_kana_WO
 | ||||
|     0x30f3: 0x04dd, // XK_kana_N
 | ||||
|     0x30fb: 0x04a5, // XK_kana_conjunctive
 | ||||
|     0x30fc: 0x04b0 // XK_prolongedsound
 | ||||
| }; | ||||
| 
 | ||||
| exports.default = { | ||||
|     lookup: function (u) { | ||||
|         // Latin-1 is one-to-one mapping
 | ||||
|         if (u >= 0x20 && u <= 0xff) { | ||||
|             return u; | ||||
|         } | ||||
| 
 | ||||
|         // Lookup table (fairly random)
 | ||||
|         var keysym = codepoints[u]; | ||||
|         if (keysym !== undefined) { | ||||
|             return keysym; | ||||
|         } | ||||
| 
 | ||||
|         // General mapping as final fallback
 | ||||
|         return 0x01000000 | u; | ||||
|     } | ||||
| }; | ||||
							
								
								
									
										288
									
								
								static/js/novnc/core/input/mouse.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,288 @@ | |||
| 'use strict'; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| exports.default = Mouse; | ||||
| 
 | ||||
| var _logging = require('../util/logging.js'); | ||||
| 
 | ||||
| var Log = _interopRequireWildcard(_logging); | ||||
| 
 | ||||
| var _browser = require('../util/browser.js'); | ||||
| 
 | ||||
| var _events = require('../util/events.js'); | ||||
| 
 | ||||
| function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||||
| 
 | ||||
| var WHEEL_STEP = 10; // Delta threshold for a mouse wheel step
 | ||||
| /* | ||||
|  * noVNC: HTML5 VNC client | ||||
|  * Copyright (C) 2012 Joel Martin | ||||
|  * Copyright (C) 2013 Samuel Mannehed for Cendio AB | ||||
|  * Licensed under MPL 2.0 or any later version (see LICENSE.txt) | ||||
|  */ | ||||
| 
 | ||||
| var WHEEL_STEP_TIMEOUT = 50; // ms
 | ||||
| var WHEEL_LINE_HEIGHT = 19; | ||||
| 
 | ||||
| function Mouse(target) { | ||||
|     this._target = target || document; | ||||
| 
 | ||||
|     this._doubleClickTimer = null; | ||||
|     this._lastTouchPos = null; | ||||
| 
 | ||||
|     this._pos = null; | ||||
|     this._wheelStepXTimer = null; | ||||
|     this._wheelStepYTimer = null; | ||||
|     this._accumulatedWheelDeltaX = 0; | ||||
|     this._accumulatedWheelDeltaY = 0; | ||||
| 
 | ||||
|     this._eventHandlers = { | ||||
|         'mousedown': this._handleMouseDown.bind(this), | ||||
|         'mouseup': this._handleMouseUp.bind(this), | ||||
|         'mousemove': this._handleMouseMove.bind(this), | ||||
|         'mousewheel': this._handleMouseWheel.bind(this), | ||||
|         'mousedisable': this._handleMouseDisable.bind(this) | ||||
|     }; | ||||
| }; | ||||
| 
 | ||||
| Mouse.prototype = { | ||||
|     // ===== PROPERTIES =====
 | ||||
| 
 | ||||
|     touchButton: 1, // Button mask (1, 2, 4) for touch devices (0 means ignore clicks)
 | ||||
| 
 | ||||
|     // ===== EVENT HANDLERS =====
 | ||||
| 
 | ||||
|     onmousebutton: function () {}, // Handler for mouse button click/release
 | ||||
|     onmousemove: function () {}, // Handler for mouse movement
 | ||||
| 
 | ||||
|     // ===== PRIVATE METHODS =====
 | ||||
| 
 | ||||
|     _resetDoubleClickTimer: function () { | ||||
|         this._doubleClickTimer = null; | ||||
|     }, | ||||
| 
 | ||||
|     _handleMouseButton: function (e, down) { | ||||
|         this._updateMousePosition(e); | ||||
|         var pos = this._pos; | ||||
| 
 | ||||
|         var bmask; | ||||
|         if (e.touches || e.changedTouches) { | ||||
|             // Touch device
 | ||||
| 
 | ||||
|             // When two touches occur within 500 ms of each other and are
 | ||||
|             // close enough together a double click is triggered.
 | ||||
|             if (down == 1) { | ||||
|                 if (this._doubleClickTimer === null) { | ||||
|                     this._lastTouchPos = pos; | ||||
|                 } else { | ||||
|                     clearTimeout(this._doubleClickTimer); | ||||
| 
 | ||||
|                     // When the distance between the two touches is small enough
 | ||||
|                     // force the position of the latter touch to the position of
 | ||||
|                     // the first.
 | ||||
| 
 | ||||
|                     var xs = this._lastTouchPos.x - pos.x; | ||||
|                     var ys = this._lastTouchPos.y - pos.y; | ||||
|                     var d = Math.sqrt(xs * xs + ys * ys); | ||||
| 
 | ||||
|                     // The goal is to trigger on a certain physical width, the
 | ||||
|                     // devicePixelRatio brings us a bit closer but is not optimal.
 | ||||
|                     var threshold = 20 * (window.devicePixelRatio || 1); | ||||
|                     if (d < threshold) { | ||||
|                         pos = this._lastTouchPos; | ||||
|                     } | ||||
|                 } | ||||
|                 this._doubleClickTimer = setTimeout(this._resetDoubleClickTimer.bind(this), 500); | ||||
|             } | ||||
|             bmask = this.touchButton; | ||||
|             // If bmask is set
 | ||||
|         } else if (e.which) { | ||||
|             /* everything except IE */ | ||||
|             bmask = 1 << e.button; | ||||
|         } else { | ||||
|             /* IE including 9 */ | ||||
|             bmask = (e.button & 0x1) + // Left
 | ||||
|             (e.button & 0x2) * 2 + // Right
 | ||||
|             (e.button & 0x4) / 2; // Middle
 | ||||
|         } | ||||
| 
 | ||||
|         Log.Debug("onmousebutton " + (down ? "down" : "up") + ", x: " + pos.x + ", y: " + pos.y + ", bmask: " + bmask); | ||||
|         this.onmousebutton(pos.x, pos.y, down, bmask); | ||||
| 
 | ||||
|         (0, _events.stopEvent)(e); | ||||
|     }, | ||||
| 
 | ||||
|     _handleMouseDown: function (e) { | ||||
|         // Touch events have implicit capture
 | ||||
|         if (e.type === "mousedown") { | ||||
|             (0, _events.setCapture)(this._target); | ||||
|         } | ||||
| 
 | ||||
|         this._handleMouseButton(e, 1); | ||||
|     }, | ||||
| 
 | ||||
|     _handleMouseUp: function (e) { | ||||
|         this._handleMouseButton(e, 0); | ||||
|     }, | ||||
| 
 | ||||
|     // Mouse wheel events are sent in steps over VNC. This means that the VNC
 | ||||
|     // protocol can't handle a wheel event with specific distance or speed.
 | ||||
|     // Therefor, if we get a lot of small mouse wheel events we combine them.
 | ||||
|     _generateWheelStepX: function () { | ||||
| 
 | ||||
|         if (this._accumulatedWheelDeltaX < 0) { | ||||
|             this.onmousebutton(this._pos.x, this._pos.y, 1, 1 << 5); | ||||
|             this.onmousebutton(this._pos.x, this._pos.y, 0, 1 << 5); | ||||
|         } else if (this._accumulatedWheelDeltaX > 0) { | ||||
|             this.onmousebutton(this._pos.x, this._pos.y, 1, 1 << 6); | ||||
|             this.onmousebutton(this._pos.x, this._pos.y, 0, 1 << 6); | ||||
|         } | ||||
| 
 | ||||
|         this._accumulatedWheelDeltaX = 0; | ||||
|     }, | ||||
| 
 | ||||
|     _generateWheelStepY: function () { | ||||
| 
 | ||||
|         if (this._accumulatedWheelDeltaY < 0) { | ||||
|             this.onmousebutton(this._pos.x, this._pos.y, 1, 1 << 3); | ||||
|             this.onmousebutton(this._pos.x, this._pos.y, 0, 1 << 3); | ||||
|         } else if (this._accumulatedWheelDeltaY > 0) { | ||||
|             this.onmousebutton(this._pos.x, this._pos.y, 1, 1 << 4); | ||||
|             this.onmousebutton(this._pos.x, this._pos.y, 0, 1 << 4); | ||||
|         } | ||||
| 
 | ||||
|         this._accumulatedWheelDeltaY = 0; | ||||
|     }, | ||||
| 
 | ||||
|     _resetWheelStepTimers: function () { | ||||
|         window.clearTimeout(this._wheelStepXTimer); | ||||
|         window.clearTimeout(this._wheelStepYTimer); | ||||
|         this._wheelStepXTimer = null; | ||||
|         this._wheelStepYTimer = null; | ||||
|     }, | ||||
| 
 | ||||
|     _handleMouseWheel: function (e) { | ||||
|         this._resetWheelStepTimers(); | ||||
| 
 | ||||
|         this._updateMousePosition(e); | ||||
| 
 | ||||
|         var dX = e.deltaX; | ||||
|         var dY = e.deltaY; | ||||
| 
 | ||||
|         // Pixel units unless it's non-zero.
 | ||||
|         // Note that if deltamode is line or page won't matter since we aren't
 | ||||
|         // sending the mouse wheel delta to the server anyway.
 | ||||
|         // The difference between pixel and line can be important however since
 | ||||
|         // we have a threshold that can be smaller than the line height.
 | ||||
|         if (e.deltaMode !== 0) { | ||||
|             dX *= WHEEL_LINE_HEIGHT; | ||||
|             dY *= WHEEL_LINE_HEIGHT; | ||||
|         } | ||||
| 
 | ||||
|         this._accumulatedWheelDeltaX += dX; | ||||
|         this._accumulatedWheelDeltaY += dY; | ||||
| 
 | ||||
|         // Generate a mouse wheel step event when the accumulated delta
 | ||||
|         // for one of the axes is large enough.
 | ||||
|         // Small delta events that do not pass the threshold get sent
 | ||||
|         // after a timeout.
 | ||||
|         if (Math.abs(this._accumulatedWheelDeltaX) > WHEEL_STEP) { | ||||
|             this._generateWheelStepX(); | ||||
|         } else { | ||||
|             this._wheelStepXTimer = window.setTimeout(this._generateWheelStepX.bind(this), WHEEL_STEP_TIMEOUT); | ||||
|         } | ||||
|         if (Math.abs(this._accumulatedWheelDeltaY) > WHEEL_STEP) { | ||||
|             this._generateWheelStepY(); | ||||
|         } else { | ||||
|             this._wheelStepYTimer = window.setTimeout(this._generateWheelStepY.bind(this), WHEEL_STEP_TIMEOUT); | ||||
|         } | ||||
| 
 | ||||
|         (0, _events.stopEvent)(e); | ||||
|     }, | ||||
| 
 | ||||
|     _handleMouseMove: function (e) { | ||||
|         this._updateMousePosition(e); | ||||
|         this.onmousemove(this._pos.x, this._pos.y); | ||||
|         (0, _events.stopEvent)(e); | ||||
|     }, | ||||
| 
 | ||||
|     _handleMouseDisable: function (e) { | ||||
|         /* | ||||
|          * Stop propagation if inside canvas area | ||||
|          * Note: This is only needed for the 'click' event as it fails | ||||
|          *       to fire properly for the target element so we have | ||||
|          *       to listen on the document element instead. | ||||
|          */ | ||||
|         if (e.target == this._target) { | ||||
|             (0, _events.stopEvent)(e); | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     // Update coordinates relative to target
 | ||||
|     _updateMousePosition: function (e) { | ||||
|         e = (0, _events.getPointerEvent)(e); | ||||
|         var bounds = this._target.getBoundingClientRect(); | ||||
|         var x, y; | ||||
|         // Clip to target bounds
 | ||||
|         if (e.clientX < bounds.left) { | ||||
|             x = 0; | ||||
|         } else if (e.clientX >= bounds.right) { | ||||
|             x = bounds.width - 1; | ||||
|         } else { | ||||
|             x = e.clientX - bounds.left; | ||||
|         } | ||||
|         if (e.clientY < bounds.top) { | ||||
|             y = 0; | ||||
|         } else if (e.clientY >= bounds.bottom) { | ||||
|             y = bounds.height - 1; | ||||
|         } else { | ||||
|             y = e.clientY - bounds.top; | ||||
|         } | ||||
|         this._pos = { x: x, y: y }; | ||||
|     }, | ||||
| 
 | ||||
|     // ===== PUBLIC METHODS =====
 | ||||
| 
 | ||||
|     grab: function () { | ||||
|         var c = this._target; | ||||
| 
 | ||||
|         if (_browser.isTouchDevice) { | ||||
|             c.addEventListener('touchstart', this._eventHandlers.mousedown); | ||||
|             c.addEventListener('touchend', this._eventHandlers.mouseup); | ||||
|             c.addEventListener('touchmove', this._eventHandlers.mousemove); | ||||
|         } | ||||
|         c.addEventListener('mousedown', this._eventHandlers.mousedown); | ||||
|         c.addEventListener('mouseup', this._eventHandlers.mouseup); | ||||
|         c.addEventListener('mousemove', this._eventHandlers.mousemove); | ||||
|         c.addEventListener('wheel', this._eventHandlers.mousewheel); | ||||
| 
 | ||||
|         /* Prevent middle-click pasting (see above for why we bind to document) */ | ||||
|         document.addEventListener('click', this._eventHandlers.mousedisable); | ||||
| 
 | ||||
|         /* preventDefault() on mousedown doesn't stop this event for some | ||||
|            reason so we have to explicitly block it */ | ||||
|         c.addEventListener('contextmenu', this._eventHandlers.mousedisable); | ||||
|     }, | ||||
| 
 | ||||
|     ungrab: function () { | ||||
|         var c = this._target; | ||||
| 
 | ||||
|         this._resetWheelStepTimers(); | ||||
| 
 | ||||
|         if (_browser.isTouchDevice) { | ||||
|             c.removeEventListener('touchstart', this._eventHandlers.mousedown); | ||||
|             c.removeEventListener('touchend', this._eventHandlers.mouseup); | ||||
|             c.removeEventListener('touchmove', this._eventHandlers.mousemove); | ||||
|         } | ||||
|         c.removeEventListener('mousedown', this._eventHandlers.mousedown); | ||||
|         c.removeEventListener('mouseup', this._eventHandlers.mouseup); | ||||
|         c.removeEventListener('mousemove', this._eventHandlers.mousemove); | ||||
|         c.removeEventListener('wheel', this._eventHandlers.mousewheel); | ||||
| 
 | ||||
|         document.removeEventListener('click', this._eventHandlers.mousedisable); | ||||
| 
 | ||||
|         c.removeEventListener('contextmenu', this._eventHandlers.mousedisable); | ||||
|     } | ||||
| }; | ||||
							
								
								
									
										234
									
								
								static/js/novnc/core/input/util.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,234 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| exports.getKeycode = getKeycode; | ||||
| exports.getKey = getKey; | ||||
| exports.getKeysym = getKeysym; | ||||
| 
 | ||||
| var _keysym = require("./keysym.js"); | ||||
| 
 | ||||
| var _keysym2 = _interopRequireDefault(_keysym); | ||||
| 
 | ||||
| var _keysymdef = require("./keysymdef.js"); | ||||
| 
 | ||||
| var _keysymdef2 = _interopRequireDefault(_keysymdef); | ||||
| 
 | ||||
| var _vkeys = require("./vkeys.js"); | ||||
| 
 | ||||
| var _vkeys2 = _interopRequireDefault(_vkeys); | ||||
| 
 | ||||
| var _fixedkeys = require("./fixedkeys.js"); | ||||
| 
 | ||||
| var _fixedkeys2 = _interopRequireDefault(_fixedkeys); | ||||
| 
 | ||||
| var _domkeytable = require("./domkeytable.js"); | ||||
| 
 | ||||
| var _domkeytable2 = _interopRequireDefault(_domkeytable); | ||||
| 
 | ||||
| var _browser = require("../util/browser.js"); | ||||
| 
 | ||||
| var browser = _interopRequireWildcard(_browser); | ||||
| 
 | ||||
| function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||||
| 
 | ||||
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||||
| 
 | ||||
| // Get 'KeyboardEvent.code', handling legacy browsers
 | ||||
| function getKeycode(evt) { | ||||
|     // Are we getting proper key identifiers?
 | ||||
|     // (unfortunately Firefox and Chrome are crappy here and gives
 | ||||
|     // us an empty string on some platforms, rather than leaving it
 | ||||
|     // undefined)
 | ||||
|     if (evt.code) { | ||||
|         // Mozilla isn't fully in sync with the spec yet
 | ||||
|         switch (evt.code) { | ||||
|             case 'OSLeft': | ||||
|                 return 'MetaLeft'; | ||||
|             case 'OSRight': | ||||
|                 return 'MetaRight'; | ||||
|         } | ||||
| 
 | ||||
|         return evt.code; | ||||
|     } | ||||
| 
 | ||||
|     // The de-facto standard is to use Windows Virtual-Key codes
 | ||||
|     // in the 'keyCode' field for non-printable characters. However
 | ||||
|     // Webkit sets it to the same as charCode in 'keypress' events.
 | ||||
|     if (evt.type !== 'keypress' && evt.keyCode in _vkeys2.default) { | ||||
|         var code = _vkeys2.default[evt.keyCode]; | ||||
| 
 | ||||
|         // macOS has messed up this code for some reason
 | ||||
|         if (browser.isMac() && code === 'ContextMenu') { | ||||
|             code = 'MetaRight'; | ||||
|         } | ||||
| 
 | ||||
|         // The keyCode doesn't distinguish between left and right
 | ||||
|         // for the standard modifiers
 | ||||
|         if (evt.location === 2) { | ||||
|             switch (code) { | ||||
|                 case 'ShiftLeft': | ||||
|                     return 'ShiftRight'; | ||||
|                 case 'ControlLeft': | ||||
|                     return 'ControlRight'; | ||||
|                 case 'AltLeft': | ||||
|                     return 'AltRight'; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // Nor a bunch of the numpad keys
 | ||||
|         if (evt.location === 3) { | ||||
|             switch (code) { | ||||
|                 case 'Delete': | ||||
|                     return 'NumpadDecimal'; | ||||
|                 case 'Insert': | ||||
|                     return 'Numpad0'; | ||||
|                 case 'End': | ||||
|                     return 'Numpad1'; | ||||
|                 case 'ArrowDown': | ||||
|                     return 'Numpad2'; | ||||
|                 case 'PageDown': | ||||
|                     return 'Numpad3'; | ||||
|                 case 'ArrowLeft': | ||||
|                     return 'Numpad4'; | ||||
|                 case 'ArrowRight': | ||||
|                     return 'Numpad6'; | ||||
|                 case 'Home': | ||||
|                     return 'Numpad7'; | ||||
|                 case 'ArrowUp': | ||||
|                     return 'Numpad8'; | ||||
|                 case 'PageUp': | ||||
|                     return 'Numpad9'; | ||||
|                 case 'Enter': | ||||
|                     return 'NumpadEnter'; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return code; | ||||
|     } | ||||
| 
 | ||||
|     return 'Unidentified'; | ||||
| } | ||||
| 
 | ||||
| // Get 'KeyboardEvent.key', handling legacy browsers
 | ||||
| function getKey(evt) { | ||||
|     // Are we getting a proper key value?
 | ||||
|     if (evt.key !== undefined) { | ||||
|         // IE and Edge use some ancient version of the spec
 | ||||
|         // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/
 | ||||
|         switch (evt.key) { | ||||
|             case 'Spacebar': | ||||
|                 return ' '; | ||||
|             case 'Esc': | ||||
|                 return 'Escape'; | ||||
|             case 'Scroll': | ||||
|                 return 'ScrollLock'; | ||||
|             case 'Win': | ||||
|                 return 'Meta'; | ||||
|             case 'Apps': | ||||
|                 return 'ContextMenu'; | ||||
|             case 'Up': | ||||
|                 return 'ArrowUp'; | ||||
|             case 'Left': | ||||
|                 return 'ArrowLeft'; | ||||
|             case 'Right': | ||||
|                 return 'ArrowRight'; | ||||
|             case 'Down': | ||||
|                 return 'ArrowDown'; | ||||
|             case 'Del': | ||||
|                 return 'Delete'; | ||||
|             case 'Divide': | ||||
|                 return '/'; | ||||
|             case 'Multiply': | ||||
|                 return '*'; | ||||
|             case 'Subtract': | ||||
|                 return '-'; | ||||
|             case 'Add': | ||||
|                 return '+'; | ||||
|             case 'Decimal': | ||||
|                 return evt.char; | ||||
|         } | ||||
| 
 | ||||
|         // Mozilla isn't fully in sync with the spec yet
 | ||||
|         switch (evt.key) { | ||||
|             case 'OS': | ||||
|                 return 'Meta'; | ||||
|         } | ||||
| 
 | ||||
|         // iOS leaks some OS names
 | ||||
|         switch (evt.key) { | ||||
|             case 'UIKeyInputUpArrow': | ||||
|                 return 'ArrowUp'; | ||||
|             case 'UIKeyInputDownArrow': | ||||
|                 return 'ArrowDown'; | ||||
|             case 'UIKeyInputLeftArrow': | ||||
|                 return 'ArrowLeft'; | ||||
|             case 'UIKeyInputRightArrow': | ||||
|                 return 'ArrowRight'; | ||||
|             case 'UIKeyInputEscape': | ||||
|                 return 'Escape'; | ||||
|         } | ||||
| 
 | ||||
|         // IE and Edge have broken handling of AltGraph so we cannot
 | ||||
|         // trust them for printable characters
 | ||||
|         if (evt.key.length !== 1 || !browser.isIE() && !browser.isEdge()) { | ||||
|             return evt.key; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     // Try to deduce it based on the physical key
 | ||||
|     var code = getKeycode(evt); | ||||
|     if (code in _fixedkeys2.default) { | ||||
|         return _fixedkeys2.default[code]; | ||||
|     } | ||||
| 
 | ||||
|     // If that failed, then see if we have a printable character
 | ||||
|     if (evt.charCode) { | ||||
|         return String.fromCharCode(evt.charCode); | ||||
|     } | ||||
| 
 | ||||
|     // At this point we have nothing left to go on
 | ||||
|     return 'Unidentified'; | ||||
| } | ||||
| 
 | ||||
| // Get the most reliable keysym value we can get from a key event
 | ||||
| function getKeysym(evt) { | ||||
|     var key = getKey(evt); | ||||
| 
 | ||||
|     if (key === 'Unidentified') { | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     // First look up special keys
 | ||||
|     if (key in _domkeytable2.default) { | ||||
|         var location = evt.location; | ||||
| 
 | ||||
|         // Safari screws up location for the right cmd key
 | ||||
|         if (key === 'Meta' && location === 0) { | ||||
|             location = 2; | ||||
|         } | ||||
| 
 | ||||
|         if (location === undefined || location > 3) { | ||||
|             location = 0; | ||||
|         } | ||||
| 
 | ||||
|         return _domkeytable2.default[key][location]; | ||||
|     } | ||||
| 
 | ||||
|     // Now we need to look at the Unicode symbol instead
 | ||||
| 
 | ||||
|     var codepoint; | ||||
| 
 | ||||
|     // Special key? (FIXME: Should have been caught earlier)
 | ||||
|     if (key.length !== 1) { | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     codepoint = key.charCodeAt(); | ||||
|     if (codepoint) { | ||||
|         return _keysymdef2.default.lookup(codepoint); | ||||
|     } | ||||
| 
 | ||||
|     return null; | ||||
| } | ||||
							
								
								
									
										121
									
								
								static/js/novnc/core/input/vkeys.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,121 @@ | |||
| 'use strict'; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|   value: true | ||||
| }); | ||||
| /* | ||||
|  * noVNC: HTML5 VNC client | ||||
|  * Copyright (C) 2017 Pierre Ossman for Cendio AB | ||||
|  * Licensed under MPL 2.0 or any later version (see LICENSE.txt) | ||||
|  */ | ||||
| 
 | ||||
| /* | ||||
|  * Mapping between Microsoft® Windows® Virtual-Key codes and | ||||
|  * HTML key codes. | ||||
|  */ | ||||
| 
 | ||||
| exports.default = { | ||||
|   0x08: 'Backspace', | ||||
|   0x09: 'Tab', | ||||
|   0x0a: 'NumpadClear', | ||||
|   0x0d: 'Enter', | ||||
|   0x10: 'ShiftLeft', | ||||
|   0x11: 'ControlLeft', | ||||
|   0x12: 'AltLeft', | ||||
|   0x13: 'Pause', | ||||
|   0x14: 'CapsLock', | ||||
|   0x15: 'Lang1', | ||||
|   0x19: 'Lang2', | ||||
|   0x1b: 'Escape', | ||||
|   0x1c: 'Convert', | ||||
|   0x1d: 'NonConvert', | ||||
|   0x20: 'Space', | ||||
|   0x21: 'PageUp', | ||||
|   0x22: 'PageDown', | ||||
|   0x23: 'End', | ||||
|   0x24: 'Home', | ||||
|   0x25: 'ArrowLeft', | ||||
|   0x26: 'ArrowUp', | ||||
|   0x27: 'ArrowRight', | ||||
|   0x28: 'ArrowDown', | ||||
|   0x29: 'Select', | ||||
|   0x2c: 'PrintScreen', | ||||
|   0x2d: 'Insert', | ||||
|   0x2e: 'Delete', | ||||
|   0x2f: 'Help', | ||||
|   0x30: 'Digit0', | ||||
|   0x31: 'Digit1', | ||||
|   0x32: 'Digit2', | ||||
|   0x33: 'Digit3', | ||||
|   0x34: 'Digit4', | ||||
|   0x35: 'Digit5', | ||||
|   0x36: 'Digit6', | ||||
|   0x37: 'Digit7', | ||||
|   0x38: 'Digit8', | ||||
|   0x39: 'Digit9', | ||||
|   0x5b: 'MetaLeft', | ||||
|   0x5c: 'MetaRight', | ||||
|   0x5d: 'ContextMenu', | ||||
|   0x5f: 'Sleep', | ||||
|   0x60: 'Numpad0', | ||||
|   0x61: 'Numpad1', | ||||
|   0x62: 'Numpad2', | ||||
|   0x63: 'Numpad3', | ||||
|   0x64: 'Numpad4', | ||||
|   0x65: 'Numpad5', | ||||
|   0x66: 'Numpad6', | ||||
|   0x67: 'Numpad7', | ||||
|   0x68: 'Numpad8', | ||||
|   0x69: 'Numpad9', | ||||
|   0x6a: 'NumpadMultiply', | ||||
|   0x6b: 'NumpadAdd', | ||||
|   0x6c: 'NumpadDecimal', | ||||
|   0x6d: 'NumpadSubtract', | ||||
|   0x6e: 'NumpadDecimal', // Duplicate, because buggy on Windows
 | ||||
|   0x6f: 'NumpadDivide', | ||||
|   0x70: 'F1', | ||||
|   0x71: 'F2', | ||||
|   0x72: 'F3', | ||||
|   0x73: 'F4', | ||||
|   0x74: 'F5', | ||||
|   0x75: 'F6', | ||||
|   0x76: 'F7', | ||||
|   0x77: 'F8', | ||||
|   0x78: 'F9', | ||||
|   0x79: 'F10', | ||||
|   0x7a: 'F11', | ||||
|   0x7b: 'F12', | ||||
|   0x7c: 'F13', | ||||
|   0x7d: 'F14', | ||||
|   0x7e: 'F15', | ||||
|   0x7f: 'F16', | ||||
|   0x80: 'F17', | ||||
|   0x81: 'F18', | ||||
|   0x82: 'F19', | ||||
|   0x83: 'F20', | ||||
|   0x84: 'F21', | ||||
|   0x85: 'F22', | ||||
|   0x86: 'F23', | ||||
|   0x87: 'F24', | ||||
|   0x90: 'NumLock', | ||||
|   0x91: 'ScrollLock', | ||||
|   0xa6: 'BrowserBack', | ||||
|   0xa7: 'BrowserForward', | ||||
|   0xa8: 'BrowserRefresh', | ||||
|   0xa9: 'BrowserStop', | ||||
|   0xaa: 'BrowserSearch', | ||||
|   0xab: 'BrowserFavorites', | ||||
|   0xac: 'BrowserHome', | ||||
|   0xad: 'AudioVolumeMute', | ||||
|   0xae: 'AudioVolumeDown', | ||||
|   0xaf: 'AudioVolumeUp', | ||||
|   0xb0: 'MediaTrackNext', | ||||
|   0xb1: 'MediaTrackPrevious', | ||||
|   0xb2: 'MediaStop', | ||||
|   0xb3: 'MediaPlayPause', | ||||
|   0xb4: 'LaunchMail', | ||||
|   0xb5: 'MediaSelect', | ||||
|   0xb6: 'LaunchApp1', | ||||
|   0xb7: 'LaunchApp2', | ||||
|   0xe1: 'AltRight' // Only when it is AltGraph
 | ||||
| }; | ||||
							
								
								
									
										176
									
								
								static/js/novnc/core/input/xtscancodes.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,176 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|   value: true | ||||
| }); | ||||
| /* | ||||
|  * This file is auto-generated from keymaps.csv on 2017-05-31 16:20 | ||||
|  * Database checksum sha256(92fd165507f2a3b8c5b3fa56e425d45788dbcb98cf067a307527d91ce22cab94) | ||||
|  * To re-generate, run: | ||||
|  *   keymap-gen --lang=js code-map keymaps.csv html atset1 | ||||
| */ | ||||
| exports.default = { | ||||
|   "Again": 0xe005, /* html:Again (Again) -> linux:129 (KEY_AGAIN) -> atset1:57349 */ | ||||
|   "AltLeft": 0x38, /* html:AltLeft (AltLeft) -> linux:56 (KEY_LEFTALT) -> atset1:56 */ | ||||
|   "AltRight": 0xe038, /* html:AltRight (AltRight) -> linux:100 (KEY_RIGHTALT) -> atset1:57400 */ | ||||
|   "ArrowDown": 0xe050, /* html:ArrowDown (ArrowDown) -> linux:108 (KEY_DOWN) -> atset1:57424 */ | ||||
|   "ArrowLeft": 0xe04b, /* html:ArrowLeft (ArrowLeft) -> linux:105 (KEY_LEFT) -> atset1:57419 */ | ||||
|   "ArrowRight": 0xe04d, /* html:ArrowRight (ArrowRight) -> linux:106 (KEY_RIGHT) -> atset1:57421 */ | ||||
|   "ArrowUp": 0xe048, /* html:ArrowUp (ArrowUp) -> linux:103 (KEY_UP) -> atset1:57416 */ | ||||
|   "AudioVolumeDown": 0xe02e, /* html:AudioVolumeDown (AudioVolumeDown) -> linux:114 (KEY_VOLUMEDOWN) -> atset1:57390 */ | ||||
|   "AudioVolumeMute": 0xe020, /* html:AudioVolumeMute (AudioVolumeMute) -> linux:113 (KEY_MUTE) -> atset1:57376 */ | ||||
|   "AudioVolumeUp": 0xe030, /* html:AudioVolumeUp (AudioVolumeUp) -> linux:115 (KEY_VOLUMEUP) -> atset1:57392 */ | ||||
|   "Backquote": 0x29, /* html:Backquote (Backquote) -> linux:41 (KEY_GRAVE) -> atset1:41 */ | ||||
|   "Backslash": 0x2b, /* html:Backslash (Backslash) -> linux:43 (KEY_BACKSLASH) -> atset1:43 */ | ||||
|   "Backspace": 0xe, /* html:Backspace (Backspace) -> linux:14 (KEY_BACKSPACE) -> atset1:14 */ | ||||
|   "BracketLeft": 0x1a, /* html:BracketLeft (BracketLeft) -> linux:26 (KEY_LEFTBRACE) -> atset1:26 */ | ||||
|   "BracketRight": 0x1b, /* html:BracketRight (BracketRight) -> linux:27 (KEY_RIGHTBRACE) -> atset1:27 */ | ||||
|   "BrowserBack": 0xe06a, /* html:BrowserBack (BrowserBack) -> linux:158 (KEY_BACK) -> atset1:57450 */ | ||||
|   "BrowserFavorites": 0xe066, /* html:BrowserFavorites (BrowserFavorites) -> linux:156 (KEY_BOOKMARKS) -> atset1:57446 */ | ||||
|   "BrowserForward": 0xe069, /* html:BrowserForward (BrowserForward) -> linux:159 (KEY_FORWARD) -> atset1:57449 */ | ||||
|   "BrowserHome": 0xe032, /* html:BrowserHome (BrowserHome) -> linux:172 (KEY_HOMEPAGE) -> atset1:57394 */ | ||||
|   "BrowserRefresh": 0xe067, /* html:BrowserRefresh (BrowserRefresh) -> linux:173 (KEY_REFRESH) -> atset1:57447 */ | ||||
|   "BrowserSearch": 0xe065, /* html:BrowserSearch (BrowserSearch) -> linux:217 (KEY_SEARCH) -> atset1:57445 */ | ||||
|   "BrowserStop": 0xe068, /* html:BrowserStop (BrowserStop) -> linux:128 (KEY_STOP) -> atset1:57448 */ | ||||
|   "CapsLock": 0x3a, /* html:CapsLock (CapsLock) -> linux:58 (KEY_CAPSLOCK) -> atset1:58 */ | ||||
|   "Comma": 0x33, /* html:Comma (Comma) -> linux:51 (KEY_COMMA) -> atset1:51 */ | ||||
|   "ContextMenu": 0xe05d, /* html:ContextMenu (ContextMenu) -> linux:127 (KEY_COMPOSE) -> atset1:57437 */ | ||||
|   "ControlLeft": 0x1d, /* html:ControlLeft (ControlLeft) -> linux:29 (KEY_LEFTCTRL) -> atset1:29 */ | ||||
|   "ControlRight": 0xe01d, /* html:ControlRight (ControlRight) -> linux:97 (KEY_RIGHTCTRL) -> atset1:57373 */ | ||||
|   "Convert": 0x79, /* html:Convert (Convert) -> linux:92 (KEY_HENKAN) -> atset1:121 */ | ||||
|   "Copy": 0xe078, /* html:Copy (Copy) -> linux:133 (KEY_COPY) -> atset1:57464 */ | ||||
|   "Cut": 0xe03c, /* html:Cut (Cut) -> linux:137 (KEY_CUT) -> atset1:57404 */ | ||||
|   "Delete": 0xe053, /* html:Delete (Delete) -> linux:111 (KEY_DELETE) -> atset1:57427 */ | ||||
|   "Digit0": 0xb, /* html:Digit0 (Digit0) -> linux:11 (KEY_0) -> atset1:11 */ | ||||
|   "Digit1": 0x2, /* html:Digit1 (Digit1) -> linux:2 (KEY_1) -> atset1:2 */ | ||||
|   "Digit2": 0x3, /* html:Digit2 (Digit2) -> linux:3 (KEY_2) -> atset1:3 */ | ||||
|   "Digit3": 0x4, /* html:Digit3 (Digit3) -> linux:4 (KEY_3) -> atset1:4 */ | ||||
|   "Digit4": 0x5, /* html:Digit4 (Digit4) -> linux:5 (KEY_4) -> atset1:5 */ | ||||
|   "Digit5": 0x6, /* html:Digit5 (Digit5) -> linux:6 (KEY_5) -> atset1:6 */ | ||||
|   "Digit6": 0x7, /* html:Digit6 (Digit6) -> linux:7 (KEY_6) -> atset1:7 */ | ||||
|   "Digit7": 0x8, /* html:Digit7 (Digit7) -> linux:8 (KEY_7) -> atset1:8 */ | ||||
|   "Digit8": 0x9, /* html:Digit8 (Digit8) -> linux:9 (KEY_8) -> atset1:9 */ | ||||
|   "Digit9": 0xa, /* html:Digit9 (Digit9) -> linux:10 (KEY_9) -> atset1:10 */ | ||||
|   "Eject": 0xe07d, /* html:Eject (Eject) -> linux:162 (KEY_EJECTCLOSECD) -> atset1:57469 */ | ||||
|   "End": 0xe04f, /* html:End (End) -> linux:107 (KEY_END) -> atset1:57423 */ | ||||
|   "Enter": 0x1c, /* html:Enter (Enter) -> linux:28 (KEY_ENTER) -> atset1:28 */ | ||||
|   "Equal": 0xd, /* html:Equal (Equal) -> linux:13 (KEY_EQUAL) -> atset1:13 */ | ||||
|   "Escape": 0x1, /* html:Escape (Escape) -> linux:1 (KEY_ESC) -> atset1:1 */ | ||||
|   "F1": 0x3b, /* html:F1 (F1) -> linux:59 (KEY_F1) -> atset1:59 */ | ||||
|   "F10": 0x44, /* html:F10 (F10) -> linux:68 (KEY_F10) -> atset1:68 */ | ||||
|   "F11": 0x57, /* html:F11 (F11) -> linux:87 (KEY_F11) -> atset1:87 */ | ||||
|   "F12": 0x58, /* html:F12 (F12) -> linux:88 (KEY_F12) -> atset1:88 */ | ||||
|   "F13": 0x5d, /* html:F13 (F13) -> linux:183 (KEY_F13) -> atset1:93 */ | ||||
|   "F14": 0x5e, /* html:F14 (F14) -> linux:184 (KEY_F14) -> atset1:94 */ | ||||
|   "F15": 0x5f, /* html:F15 (F15) -> linux:185 (KEY_F15) -> atset1:95 */ | ||||
|   "F16": 0x55, /* html:F16 (F16) -> linux:186 (KEY_F16) -> atset1:85 */ | ||||
|   "F17": 0xe003, /* html:F17 (F17) -> linux:187 (KEY_F17) -> atset1:57347 */ | ||||
|   "F18": 0xe077, /* html:F18 (F18) -> linux:188 (KEY_F18) -> atset1:57463 */ | ||||
|   "F19": 0xe004, /* html:F19 (F19) -> linux:189 (KEY_F19) -> atset1:57348 */ | ||||
|   "F2": 0x3c, /* html:F2 (F2) -> linux:60 (KEY_F2) -> atset1:60 */ | ||||
|   "F20": 0x5a, /* html:F20 (F20) -> linux:190 (KEY_F20) -> atset1:90 */ | ||||
|   "F21": 0x74, /* html:F21 (F21) -> linux:191 (KEY_F21) -> atset1:116 */ | ||||
|   "F22": 0xe079, /* html:F22 (F22) -> linux:192 (KEY_F22) -> atset1:57465 */ | ||||
|   "F23": 0x6d, /* html:F23 (F23) -> linux:193 (KEY_F23) -> atset1:109 */ | ||||
|   "F24": 0x6f, /* html:F24 (F24) -> linux:194 (KEY_F24) -> atset1:111 */ | ||||
|   "F3": 0x3d, /* html:F3 (F3) -> linux:61 (KEY_F3) -> atset1:61 */ | ||||
|   "F4": 0x3e, /* html:F4 (F4) -> linux:62 (KEY_F4) -> atset1:62 */ | ||||
|   "F5": 0x3f, /* html:F5 (F5) -> linux:63 (KEY_F5) -> atset1:63 */ | ||||
|   "F6": 0x40, /* html:F6 (F6) -> linux:64 (KEY_F6) -> atset1:64 */ | ||||
|   "F7": 0x41, /* html:F7 (F7) -> linux:65 (KEY_F7) -> atset1:65 */ | ||||
|   "F8": 0x42, /* html:F8 (F8) -> linux:66 (KEY_F8) -> atset1:66 */ | ||||
|   "F9": 0x43, /* html:F9 (F9) -> linux:67 (KEY_F9) -> atset1:67 */ | ||||
|   "Find": 0xe041, /* html:Find (Find) -> linux:136 (KEY_FIND) -> atset1:57409 */ | ||||
|   "Help": 0xe075, /* html:Help (Help) -> linux:138 (KEY_HELP) -> atset1:57461 */ | ||||
|   "Hiragana": 0x77, /* html:Hiragana (Lang4) -> linux:91 (KEY_HIRAGANA) -> atset1:119 */ | ||||
|   "Home": 0xe047, /* html:Home (Home) -> linux:102 (KEY_HOME) -> atset1:57415 */ | ||||
|   "Insert": 0xe052, /* html:Insert (Insert) -> linux:110 (KEY_INSERT) -> atset1:57426 */ | ||||
|   "IntlBackslash": 0x56, /* html:IntlBackslash (IntlBackslash) -> linux:86 (KEY_102ND) -> atset1:86 */ | ||||
|   "IntlRo": 0x73, /* html:IntlRo (IntlRo) -> linux:89 (KEY_RO) -> atset1:115 */ | ||||
|   "IntlYen": 0x7d, /* html:IntlYen (IntlYen) -> linux:124 (KEY_YEN) -> atset1:125 */ | ||||
|   "KanaMode": 0x70, /* html:KanaMode (KanaMode) -> linux:93 (KEY_KATAKANAHIRAGANA) -> atset1:112 */ | ||||
|   "Katakana": 0x78, /* html:Katakana (Lang3) -> linux:90 (KEY_KATAKANA) -> atset1:120 */ | ||||
|   "KeyA": 0x1e, /* html:KeyA (KeyA) -> linux:30 (KEY_A) -> atset1:30 */ | ||||
|   "KeyB": 0x30, /* html:KeyB (KeyB) -> linux:48 (KEY_B) -> atset1:48 */ | ||||
|   "KeyC": 0x2e, /* html:KeyC (KeyC) -> linux:46 (KEY_C) -> atset1:46 */ | ||||
|   "KeyD": 0x20, /* html:KeyD (KeyD) -> linux:32 (KEY_D) -> atset1:32 */ | ||||
|   "KeyE": 0x12, /* html:KeyE (KeyE) -> linux:18 (KEY_E) -> atset1:18 */ | ||||
|   "KeyF": 0x21, /* html:KeyF (KeyF) -> linux:33 (KEY_F) -> atset1:33 */ | ||||
|   "KeyG": 0x22, /* html:KeyG (KeyG) -> linux:34 (KEY_G) -> atset1:34 */ | ||||
|   "KeyH": 0x23, /* html:KeyH (KeyH) -> linux:35 (KEY_H) -> atset1:35 */ | ||||
|   "KeyI": 0x17, /* html:KeyI (KeyI) -> linux:23 (KEY_I) -> atset1:23 */ | ||||
|   "KeyJ": 0x24, /* html:KeyJ (KeyJ) -> linux:36 (KEY_J) -> atset1:36 */ | ||||
|   "KeyK": 0x25, /* html:KeyK (KeyK) -> linux:37 (KEY_K) -> atset1:37 */ | ||||
|   "KeyL": 0x26, /* html:KeyL (KeyL) -> linux:38 (KEY_L) -> atset1:38 */ | ||||
|   "KeyM": 0x32, /* html:KeyM (KeyM) -> linux:50 (KEY_M) -> atset1:50 */ | ||||
|   "KeyN": 0x31, /* html:KeyN (KeyN) -> linux:49 (KEY_N) -> atset1:49 */ | ||||
|   "KeyO": 0x18, /* html:KeyO (KeyO) -> linux:24 (KEY_O) -> atset1:24 */ | ||||
|   "KeyP": 0x19, /* html:KeyP (KeyP) -> linux:25 (KEY_P) -> atset1:25 */ | ||||
|   "KeyQ": 0x10, /* html:KeyQ (KeyQ) -> linux:16 (KEY_Q) -> atset1:16 */ | ||||
|   "KeyR": 0x13, /* html:KeyR (KeyR) -> linux:19 (KEY_R) -> atset1:19 */ | ||||
|   "KeyS": 0x1f, /* html:KeyS (KeyS) -> linux:31 (KEY_S) -> atset1:31 */ | ||||
|   "KeyT": 0x14, /* html:KeyT (KeyT) -> linux:20 (KEY_T) -> atset1:20 */ | ||||
|   "KeyU": 0x16, /* html:KeyU (KeyU) -> linux:22 (KEY_U) -> atset1:22 */ | ||||
|   "KeyV": 0x2f, /* html:KeyV (KeyV) -> linux:47 (KEY_V) -> atset1:47 */ | ||||
|   "KeyW": 0x11, /* html:KeyW (KeyW) -> linux:17 (KEY_W) -> atset1:17 */ | ||||
|   "KeyX": 0x2d, /* html:KeyX (KeyX) -> linux:45 (KEY_X) -> atset1:45 */ | ||||
|   "KeyY": 0x15, /* html:KeyY (KeyY) -> linux:21 (KEY_Y) -> atset1:21 */ | ||||
|   "KeyZ": 0x2c, /* html:KeyZ (KeyZ) -> linux:44 (KEY_Z) -> atset1:44 */ | ||||
|   "Lang3": 0x78, /* html:Lang3 (Lang3) -> linux:90 (KEY_KATAKANA) -> atset1:120 */ | ||||
|   "Lang4": 0x77, /* html:Lang4 (Lang4) -> linux:91 (KEY_HIRAGANA) -> atset1:119 */ | ||||
|   "Lang5": 0x76, /* html:Lang5 (Lang5) -> linux:85 (KEY_ZENKAKUHANKAKU) -> atset1:118 */ | ||||
|   "LaunchApp1": 0xe06b, /* html:LaunchApp1 (LaunchApp1) -> linux:157 (KEY_COMPUTER) -> atset1:57451 */ | ||||
|   "LaunchApp2": 0xe021, /* html:LaunchApp2 (LaunchApp2) -> linux:140 (KEY_CALC) -> atset1:57377 */ | ||||
|   "LaunchMail": 0xe06c, /* html:LaunchMail (LaunchMail) -> linux:155 (KEY_MAIL) -> atset1:57452 */ | ||||
|   "MediaPlayPause": 0xe022, /* html:MediaPlayPause (MediaPlayPause) -> linux:164 (KEY_PLAYPAUSE) -> atset1:57378 */ | ||||
|   "MediaSelect": 0xe06d, /* html:MediaSelect (MediaSelect) -> linux:226 (KEY_MEDIA) -> atset1:57453 */ | ||||
|   "MediaStop": 0xe024, /* html:MediaStop (MediaStop) -> linux:166 (KEY_STOPCD) -> atset1:57380 */ | ||||
|   "MediaTrackNext": 0xe019, /* html:MediaTrackNext (MediaTrackNext) -> linux:163 (KEY_NEXTSONG) -> atset1:57369 */ | ||||
|   "MediaTrackPrevious": 0xe010, /* html:MediaTrackPrevious (MediaTrackPrevious) -> linux:165 (KEY_PREVIOUSSONG) -> atset1:57360 */ | ||||
|   "MetaLeft": 0xe05b, /* html:MetaLeft (MetaLeft) -> linux:125 (KEY_LEFTMETA) -> atset1:57435 */ | ||||
|   "MetaRight": 0xe05c, /* html:MetaRight (MetaRight) -> linux:126 (KEY_RIGHTMETA) -> atset1:57436 */ | ||||
|   "Minus": 0xc, /* html:Minus (Minus) -> linux:12 (KEY_MINUS) -> atset1:12 */ | ||||
|   "NonConvert": 0x7b, /* html:NonConvert (NonConvert) -> linux:94 (KEY_MUHENKAN) -> atset1:123 */ | ||||
|   "NumLock": 0x45, /* html:NumLock (NumLock) -> linux:69 (KEY_NUMLOCK) -> atset1:69 */ | ||||
|   "Numpad0": 0x52, /* html:Numpad0 (Numpad0) -> linux:82 (KEY_KP0) -> atset1:82 */ | ||||
|   "Numpad1": 0x4f, /* html:Numpad1 (Numpad1) -> linux:79 (KEY_KP1) -> atset1:79 */ | ||||
|   "Numpad2": 0x50, /* html:Numpad2 (Numpad2) -> linux:80 (KEY_KP2) -> atset1:80 */ | ||||
|   "Numpad3": 0x51, /* html:Numpad3 (Numpad3) -> linux:81 (KEY_KP3) -> atset1:81 */ | ||||
|   "Numpad4": 0x4b, /* html:Numpad4 (Numpad4) -> linux:75 (KEY_KP4) -> atset1:75 */ | ||||
|   "Numpad5": 0x4c, /* html:Numpad5 (Numpad5) -> linux:76 (KEY_KP5) -> atset1:76 */ | ||||
|   "Numpad6": 0x4d, /* html:Numpad6 (Numpad6) -> linux:77 (KEY_KP6) -> atset1:77 */ | ||||
|   "Numpad7": 0x47, /* html:Numpad7 (Numpad7) -> linux:71 (KEY_KP7) -> atset1:71 */ | ||||
|   "Numpad8": 0x48, /* html:Numpad8 (Numpad8) -> linux:72 (KEY_KP8) -> atset1:72 */ | ||||
|   "Numpad9": 0x49, /* html:Numpad9 (Numpad9) -> linux:73 (KEY_KP9) -> atset1:73 */ | ||||
|   "NumpadAdd": 0x4e, /* html:NumpadAdd (NumpadAdd) -> linux:78 (KEY_KPPLUS) -> atset1:78 */ | ||||
|   "NumpadComma": 0x7e, /* html:NumpadComma (NumpadComma) -> linux:121 (KEY_KPCOMMA) -> atset1:126 */ | ||||
|   "NumpadDecimal": 0x53, /* html:NumpadDecimal (NumpadDecimal) -> linux:83 (KEY_KPDOT) -> atset1:83 */ | ||||
|   "NumpadDivide": 0xe035, /* html:NumpadDivide (NumpadDivide) -> linux:98 (KEY_KPSLASH) -> atset1:57397 */ | ||||
|   "NumpadEnter": 0xe01c, /* html:NumpadEnter (NumpadEnter) -> linux:96 (KEY_KPENTER) -> atset1:57372 */ | ||||
|   "NumpadEqual": 0x59, /* html:NumpadEqual (NumpadEqual) -> linux:117 (KEY_KPEQUAL) -> atset1:89 */ | ||||
|   "NumpadMultiply": 0x37, /* html:NumpadMultiply (NumpadMultiply) -> linux:55 (KEY_KPASTERISK) -> atset1:55 */ | ||||
|   "NumpadParenLeft": 0xe076, /* html:NumpadParenLeft (NumpadParenLeft) -> linux:179 (KEY_KPLEFTPAREN) -> atset1:57462 */ | ||||
|   "NumpadParenRight": 0xe07b, /* html:NumpadParenRight (NumpadParenRight) -> linux:180 (KEY_KPRIGHTPAREN) -> atset1:57467 */ | ||||
|   "NumpadSubtract": 0x4a, /* html:NumpadSubtract (NumpadSubtract) -> linux:74 (KEY_KPMINUS) -> atset1:74 */ | ||||
|   "Open": 0x64, /* html:Open (Open) -> linux:134 (KEY_OPEN) -> atset1:100 */ | ||||
|   "PageDown": 0xe051, /* html:PageDown (PageDown) -> linux:109 (KEY_PAGEDOWN) -> atset1:57425 */ | ||||
|   "PageUp": 0xe049, /* html:PageUp (PageUp) -> linux:104 (KEY_PAGEUP) -> atset1:57417 */ | ||||
|   "Paste": 0x65, /* html:Paste (Paste) -> linux:135 (KEY_PASTE) -> atset1:101 */ | ||||
|   "Pause": 0xe046, /* html:Pause (Pause) -> linux:119 (KEY_PAUSE) -> atset1:57414 */ | ||||
|   "Period": 0x34, /* html:Period (Period) -> linux:52 (KEY_DOT) -> atset1:52 */ | ||||
|   "Power": 0xe05e, /* html:Power (Power) -> linux:116 (KEY_POWER) -> atset1:57438 */ | ||||
|   "PrintScreen": 0x54, /* html:PrintScreen (PrintScreen) -> linux:99 (KEY_SYSRQ) -> atset1:84 */ | ||||
|   "Props": 0xe006, /* html:Props (Props) -> linux:130 (KEY_PROPS) -> atset1:57350 */ | ||||
|   "Quote": 0x28, /* html:Quote (Quote) -> linux:40 (KEY_APOSTROPHE) -> atset1:40 */ | ||||
|   "ScrollLock": 0x46, /* html:ScrollLock (ScrollLock) -> linux:70 (KEY_SCROLLLOCK) -> atset1:70 */ | ||||
|   "Semicolon": 0x27, /* html:Semicolon (Semicolon) -> linux:39 (KEY_SEMICOLON) -> atset1:39 */ | ||||
|   "ShiftLeft": 0x2a, /* html:ShiftLeft (ShiftLeft) -> linux:42 (KEY_LEFTSHIFT) -> atset1:42 */ | ||||
|   "ShiftRight": 0x36, /* html:ShiftRight (ShiftRight) -> linux:54 (KEY_RIGHTSHIFT) -> atset1:54 */ | ||||
|   "Slash": 0x35, /* html:Slash (Slash) -> linux:53 (KEY_SLASH) -> atset1:53 */ | ||||
|   "Sleep": 0xe05f, /* html:Sleep (Sleep) -> linux:142 (KEY_SLEEP) -> atset1:57439 */ | ||||
|   "Space": 0x39, /* html:Space (Space) -> linux:57 (KEY_SPACE) -> atset1:57 */ | ||||
|   "Suspend": 0xe025, /* html:Suspend (Suspend) -> linux:205 (KEY_SUSPEND) -> atset1:57381 */ | ||||
|   "Tab": 0xf, /* html:Tab (Tab) -> linux:15 (KEY_TAB) -> atset1:15 */ | ||||
|   "Undo": 0xe007, /* html:Undo (Undo) -> linux:131 (KEY_UNDO) -> atset1:57351 */ | ||||
|   "WakeUp": 0xe063 /* html:WakeUp (WakeUp) -> linux:143 (KEY_WAKEUP) -> atset1:57443 */ | ||||
| }; | ||||
							
								
								
									
										2661
									
								
								static/js/novnc/core/rfb.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										80
									
								
								static/js/novnc/core/util/browser.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,80 @@ | |||
| 'use strict'; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| exports.isTouchDevice = undefined; | ||||
| exports.supportsCursorURIs = supportsCursorURIs; | ||||
| exports.isMac = isMac; | ||||
| exports.isIE = isIE; | ||||
| exports.isEdge = isEdge; | ||||
| exports.isWindows = isWindows; | ||||
| exports.isIOS = isIOS; | ||||
| 
 | ||||
| var _logging = require('./logging.js'); | ||||
| 
 | ||||
| var Log = _interopRequireWildcard(_logging); | ||||
| 
 | ||||
| function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||||
| 
 | ||||
| // Touch detection
 | ||||
| var isTouchDevice = exports.isTouchDevice = 'ontouchstart' in document.documentElement || | ||||
| // requried for Chrome debugger
 | ||||
| document.ontouchstart !== undefined || | ||||
| // required for MS Surface
 | ||||
| navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; /* | ||||
|                                                                  * noVNC: HTML5 VNC client | ||||
|                                                                  * Copyright (C) 2012 Joel Martin | ||||
|                                                                  * Licensed under MPL 2.0 (see LICENSE.txt) | ||||
|                                                                  * | ||||
|                                                                  * See README.md for usage and integration instructions. | ||||
|                                                                  */ | ||||
| 
 | ||||
| window.addEventListener('touchstart', function onFirstTouch() { | ||||
|     exports.isTouchDevice = isTouchDevice = true; | ||||
|     window.removeEventListener('touchstart', onFirstTouch, false); | ||||
| }, false); | ||||
| 
 | ||||
| var _cursor_uris_supported = null; | ||||
| 
 | ||||
| function supportsCursorURIs() { | ||||
|     if (_cursor_uris_supported === null) { | ||||
|         try { | ||||
|             var target = document.createElement('canvas'); | ||||
|             target.style.cursor = 'url("data:image/x-icon;base64,AAACAAEACAgAAAIAAgA4AQAAFgAAACgAAAAIAAAAEAAAAAEAIAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAA==") 2 2, default'; | ||||
| 
 | ||||
|             if (target.style.cursor) { | ||||
|                 Log.Info("Data URI scheme cursor supported"); | ||||
|                 _cursor_uris_supported = true; | ||||
|             } else { | ||||
|                 Log.Warn("Data URI scheme cursor not supported"); | ||||
|                 _cursor_uris_supported = false; | ||||
|             } | ||||
|         } catch (exc) { | ||||
|             Log.Error("Data URI scheme cursor test exception: " + exc); | ||||
|             _cursor_uris_supported = false; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return _cursor_uris_supported; | ||||
| }; | ||||
| 
 | ||||
| function isMac() { | ||||
|     return navigator && !!/mac/i.exec(navigator.platform); | ||||
| } | ||||
| 
 | ||||
| function isIE() { | ||||
|     return navigator && !!/trident/i.exec(navigator.userAgent); | ||||
| } | ||||
| 
 | ||||
| function isEdge() { | ||||
|     return navigator && !!/edge/i.exec(navigator.userAgent); | ||||
| } | ||||
| 
 | ||||
| function isWindows() { | ||||
|     return navigator && !!/win/i.exec(navigator.platform); | ||||
| } | ||||
| 
 | ||||
| function isIOS() { | ||||
|     return navigator && (!!/ipad/i.exec(navigator.platform) || !!/iphone/i.exec(navigator.platform) || !!/ipod/i.exec(navigator.platform)); | ||||
| } | ||||
							
								
								
									
										145
									
								
								static/js/novnc/core/util/events.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,145 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| exports.getPointerEvent = getPointerEvent; | ||||
| exports.stopEvent = stopEvent; | ||||
| exports.setCapture = setCapture; | ||||
| exports.releaseCapture = releaseCapture; | ||||
| /* | ||||
|  * noVNC: HTML5 VNC client | ||||
|  * Copyright (C) 2012 Joel Martin | ||||
|  * Licensed under MPL 2.0 (see LICENSE.txt) | ||||
|  * | ||||
|  * See README.md for usage and integration instructions. | ||||
|  */ | ||||
| 
 | ||||
| /* | ||||
|  * Cross-browser event and position routines | ||||
|  */ | ||||
| 
 | ||||
| function getPointerEvent(e) { | ||||
|     return e.changedTouches ? e.changedTouches[0] : e.touches ? e.touches[0] : e; | ||||
| }; | ||||
| 
 | ||||
| function stopEvent(e) { | ||||
|     e.stopPropagation(); | ||||
|     e.preventDefault(); | ||||
| }; | ||||
| 
 | ||||
| // Emulate Element.setCapture() when not supported
 | ||||
| var _captureRecursion = false; | ||||
| var _captureElem = null; | ||||
| function _captureProxy(e) { | ||||
|     // Recursion protection as we'll see our own event
 | ||||
|     if (_captureRecursion) return; | ||||
| 
 | ||||
|     // Clone the event as we cannot dispatch an already dispatched event
 | ||||
|     var newEv = new e.constructor(e.type, e); | ||||
| 
 | ||||
|     _captureRecursion = true; | ||||
|     _captureElem.dispatchEvent(newEv); | ||||
|     _captureRecursion = false; | ||||
| 
 | ||||
|     // Avoid double events
 | ||||
|     e.stopPropagation(); | ||||
| 
 | ||||
|     // Respect the wishes of the redirected event handlers
 | ||||
|     if (newEv.defaultPrevented) { | ||||
|         e.preventDefault(); | ||||
|     } | ||||
| 
 | ||||
|     // Implicitly release the capture on button release
 | ||||
|     if (e.type === "mouseup") { | ||||
|         releaseCapture(); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| // Follow cursor style of target element
 | ||||
| function _captureElemChanged() { | ||||
|     var captureElem = document.getElementById("noVNC_mouse_capture_elem"); | ||||
|     captureElem.style.cursor = window.getComputedStyle(_captureElem).cursor; | ||||
| }; | ||||
| var _captureObserver = new MutationObserver(_captureElemChanged); | ||||
| 
 | ||||
| var _captureIndex = 0; | ||||
| 
 | ||||
| function setCapture(elem) { | ||||
|     if (elem.setCapture) { | ||||
| 
 | ||||
|         elem.setCapture(); | ||||
| 
 | ||||
|         // IE releases capture on 'click' events which might not trigger
 | ||||
|         elem.addEventListener('mouseup', releaseCapture); | ||||
|     } else { | ||||
|         // Release any existing capture in case this method is
 | ||||
|         // called multiple times without coordination
 | ||||
|         releaseCapture(); | ||||
| 
 | ||||
|         var captureElem = document.getElementById("noVNC_mouse_capture_elem"); | ||||
| 
 | ||||
|         if (captureElem === null) { | ||||
|             captureElem = document.createElement("div"); | ||||
|             captureElem.id = "noVNC_mouse_capture_elem"; | ||||
|             captureElem.style.position = "fixed"; | ||||
|             captureElem.style.top = "0px"; | ||||
|             captureElem.style.left = "0px"; | ||||
|             captureElem.style.width = "100%"; | ||||
|             captureElem.style.height = "100%"; | ||||
|             captureElem.style.zIndex = 10000; | ||||
|             captureElem.style.display = "none"; | ||||
|             document.body.appendChild(captureElem); | ||||
| 
 | ||||
|             // This is to make sure callers don't get confused by having
 | ||||
|             // our blocking element as the target
 | ||||
|             captureElem.addEventListener('contextmenu', _captureProxy); | ||||
| 
 | ||||
|             captureElem.addEventListener('mousemove', _captureProxy); | ||||
|             captureElem.addEventListener('mouseup', _captureProxy); | ||||
|         } | ||||
| 
 | ||||
|         _captureElem = elem; | ||||
|         _captureIndex++; | ||||
| 
 | ||||
|         // Track cursor and get initial cursor
 | ||||
|         _captureObserver.observe(elem, { attributes: true }); | ||||
|         _captureElemChanged(); | ||||
| 
 | ||||
|         captureElem.style.display = ""; | ||||
| 
 | ||||
|         // We listen to events on window in order to keep tracking if it
 | ||||
|         // happens to leave the viewport
 | ||||
|         window.addEventListener('mousemove', _captureProxy); | ||||
|         window.addEventListener('mouseup', _captureProxy); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| function releaseCapture() { | ||||
|     if (document.releaseCapture) { | ||||
| 
 | ||||
|         document.releaseCapture(); | ||||
|     } else { | ||||
|         if (!_captureElem) { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         // There might be events already queued, so we need to wait for
 | ||||
|         // them to flush. E.g. contextmenu in Microsoft Edge
 | ||||
|         window.setTimeout(function (expected) { | ||||
|             // Only clear it if it's the expected grab (i.e. no one
 | ||||
|             // else has initiated a new grab)
 | ||||
|             if (_captureIndex === expected) { | ||||
|                 _captureElem = null; | ||||
|             } | ||||
|         }, 0, _captureIndex); | ||||
| 
 | ||||
|         _captureObserver.disconnect(); | ||||
| 
 | ||||
|         var captureElem = document.getElementById("noVNC_mouse_capture_elem"); | ||||
|         captureElem.style.display = "none"; | ||||
| 
 | ||||
|         window.removeEventListener('mousemove', _captureProxy); | ||||
|         window.removeEventListener('mouseup', _captureProxy); | ||||
|     } | ||||
| }; | ||||
							
								
								
									
										45
									
								
								static/js/novnc/core/util/eventtarget.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,45 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|    value: true | ||||
| }); | ||||
| /* | ||||
|  * noVNC: HTML5 VNC client | ||||
|  * Copyright 2017 Pierre Ossman for Cendio AB | ||||
|  * Licensed under MPL 2.0 (see LICENSE.txt) | ||||
|  * | ||||
|  * See README.md for usage and integration instructions. | ||||
|  */ | ||||
| 
 | ||||
| var EventTargetMixin = { | ||||
|    _listeners: null, | ||||
| 
 | ||||
|    addEventListener: function (type, callback) { | ||||
|       if (!this._listeners) { | ||||
|          this._listeners = new Map(); | ||||
|       } | ||||
|       if (!this._listeners.has(type)) { | ||||
|          this._listeners.set(type, new Set()); | ||||
|       } | ||||
|       this._listeners.get(type).add(callback); | ||||
|    }, | ||||
| 
 | ||||
|    removeEventListener: function (type, callback) { | ||||
|       if (!this._listeners || !this._listeners.has(type)) { | ||||
|          return; | ||||
|       } | ||||
|       this._listeners.get(type).delete(callback); | ||||
|    }, | ||||
| 
 | ||||
|    dispatchEvent: function (event) { | ||||
|       if (!this._listeners || !this._listeners.has(event.type)) { | ||||
|          return true; | ||||
|       } | ||||
|       this._listeners.get(event.type).forEach(function (callback) { | ||||
|          callback.call(this, event); | ||||
|       }, this); | ||||
|       return !event.defaultPrevented; | ||||
|    } | ||||
| }; | ||||
| 
 | ||||
| exports.default = EventTargetMixin; | ||||
							
								
								
									
										62
									
								
								static/js/novnc/core/util/logging.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,62 @@ | |||
| 'use strict'; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| exports.init_logging = init_logging; | ||||
| exports.get_logging = get_logging; | ||||
| /* | ||||
|  * noVNC: HTML5 VNC client | ||||
|  * Copyright (C) 2012 Joel Martin | ||||
|  * Licensed under MPL 2.0 (see LICENSE.txt) | ||||
|  * | ||||
|  * See README.md for usage and integration instructions. | ||||
|  */ | ||||
| 
 | ||||
| /* | ||||
|  * Logging/debug routines | ||||
|  */ | ||||
| 
 | ||||
| var _log_level = 'warn'; | ||||
| 
 | ||||
| var Debug = function (msg) {}; | ||||
| var Info = function (msg) {}; | ||||
| var Warn = function (msg) {}; | ||||
| var Error = function (msg) {}; | ||||
| 
 | ||||
| function init_logging(level) { | ||||
|     if (typeof level === 'undefined') { | ||||
|         level = _log_level; | ||||
|     } else { | ||||
|         _log_level = level; | ||||
|     } | ||||
| 
 | ||||
|     exports.Debug = Debug = exports.Info = Info = exports.Warn = Warn = exports.Error = Error = function (msg) {}; | ||||
|     if (typeof window.console !== "undefined") { | ||||
|         switch (level) { | ||||
|             case 'debug': | ||||
|                 exports.Debug = Debug = console.debug.bind(window.console); | ||||
|             case 'info': | ||||
|                 exports.Info = Info = console.info.bind(window.console); | ||||
|             case 'warn': | ||||
|                 exports.Warn = Warn = console.warn.bind(window.console); | ||||
|             case 'error': | ||||
|                 exports.Error = Error = console.error.bind(window.console); | ||||
|             case 'none': | ||||
|                 break; | ||||
|             default: | ||||
|                 throw new Error("invalid logging type '" + level + "'"); | ||||
|         } | ||||
|     } | ||||
| }; | ||||
| function get_logging() { | ||||
|     return _log_level; | ||||
| }; | ||||
| exports.Debug = Debug; | ||||
| exports.Info = Info; | ||||
| exports.Warn = Warn; | ||||
| exports.Error = Error; | ||||
| 
 | ||||
| // Initialize logging level
 | ||||
| 
 | ||||
| init_logging(); | ||||
							
								
								
									
										60
									
								
								static/js/novnc/core/util/polyfill.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,60 @@ | |||
| 'use strict'; | ||||
| 
 | ||||
| /* | ||||
|  * noVNC: HTML5 VNC client | ||||
|  * Copyright 2017 Pierre Ossman for noVNC | ||||
|  * Licensed under MPL 2.0 or any later version (see LICENSE.txt) | ||||
|  */ | ||||
| 
 | ||||
| /* Polyfills to provide new APIs in old browsers */ | ||||
| 
 | ||||
| /* Object.assign() (taken from MDN) */ | ||||
| if (typeof Object.assign != 'function') { | ||||
|     // Must be writable: true, enumerable: false, configurable: true
 | ||||
|     Object.defineProperty(Object, "assign", { | ||||
|         value: function assign(target, varArgs) { | ||||
|             // .length of function is 2
 | ||||
|             'use strict'; | ||||
| 
 | ||||
|             if (target == null) { | ||||
|                 // TypeError if undefined or null
 | ||||
|                 throw new TypeError('Cannot convert undefined or null to object'); | ||||
|             } | ||||
| 
 | ||||
|             var to = Object(target); | ||||
| 
 | ||||
|             for (var index = 1; index < arguments.length; index++) { | ||||
|                 var nextSource = arguments[index]; | ||||
| 
 | ||||
|                 if (nextSource != null) { | ||||
|                     // Skip over if undefined or null
 | ||||
|                     for (var nextKey in nextSource) { | ||||
|                         // Avoid bugs when hasOwnProperty is shadowed
 | ||||
|                         if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { | ||||
|                             to[nextKey] = nextSource[nextKey]; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             return to; | ||||
|         }, | ||||
|         writable: true, | ||||
|         configurable: true | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| /* CustomEvent constructor (taken from MDN) */ | ||||
| (function () { | ||||
|     function CustomEvent(event, params) { | ||||
|         params = params || { bubbles: false, cancelable: false, detail: undefined }; | ||||
|         var evt = document.createEvent('CustomEvent'); | ||||
|         evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); | ||||
|         return evt; | ||||
|     } | ||||
| 
 | ||||
|     CustomEvent.prototype = window.Event.prototype; | ||||
| 
 | ||||
|     if (typeof window.CustomEvent !== "function") { | ||||
|         window.CustomEvent = CustomEvent; | ||||
|     } | ||||
| })(); | ||||
							
								
								
									
										22
									
								
								static/js/novnc/core/util/strings.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,22 @@ | |||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|   value: true | ||||
| }); | ||||
| exports.decodeUTF8 = decodeUTF8; | ||||
| /* | ||||
|  * noVNC: HTML5 VNC client | ||||
|  * Copyright (C) 2012 Joel Martin | ||||
|  * Licensed under MPL 2.0 (see LICENSE.txt) | ||||
|  * | ||||
|  * See README.md for usage and integration instructions. | ||||
|  */ | ||||
| 
 | ||||
| /* | ||||
|  * Decode from UTF-8 | ||||
|  */ | ||||
| function decodeUTF8(utf8string) { | ||||
|   "use strict"; | ||||
| 
 | ||||
|   return decodeURIComponent(escape(utf8string)); | ||||
| }; | ||||
							
								
								
									
										331
									
								
								static/js/novnc/core/websock.js
									
										
									
									
									
										Executable file
									
								
							
							
						
						|  | @ -0,0 +1,331 @@ | |||
| 'use strict'; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", { | ||||
|     value: true | ||||
| }); | ||||
| exports.default = Websock; | ||||
| 
 | ||||
| var _logging = require('./util/logging.js'); | ||||
| 
 | ||||
| var Log = _interopRequireWildcard(_logging); | ||||
| 
 | ||||
| function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||||
| 
 | ||||
| function Websock() { | ||||
|     "use strict"; | ||||
| 
 | ||||
|     this._websocket = null; // WebSocket object
 | ||||
| 
 | ||||
|     this._rQi = 0; // Receive queue index
 | ||||
|     this._rQlen = 0; // Next write position in the receive queue
 | ||||
|     this._rQbufferSize = 1024 * 1024 * 4; // Receive queue buffer size (4 MiB)
 | ||||
|     this._rQmax = this._rQbufferSize / 8; | ||||
|     // called in init: this._rQ = new Uint8Array(this._rQbufferSize);
 | ||||
|     this._rQ = null; // Receive queue
 | ||||
| 
 | ||||
|     this._sQbufferSize = 1024 * 10; // 10 KiB
 | ||||
|     // called in init: this._sQ = new Uint8Array(this._sQbufferSize);
 | ||||
|     this._sQlen = 0; | ||||
|     this._sQ = null; // Send queue
 | ||||
| 
 | ||||
|     this._eventHandlers = { | ||||
|         'message': function () {}, | ||||
|         'open': function () {}, | ||||
|         'close': function () {}, | ||||
|         'error': function () {} | ||||
|     }; | ||||
| } /* | ||||
|    * Websock: high-performance binary WebSockets | ||||
|    * Copyright (C) 2012 Joel Martin | ||||
|    * Licensed under MPL 2.0 (see LICENSE.txt) | ||||
|    * | ||||
|    * Websock is similar to the standard WebSocket object but with extra | ||||
|    * buffer handling. | ||||
|    * | ||||
|    * Websock has built-in receive queue buffering; the message event | ||||
|    * does not contain actual data but is simply a notification that | ||||
|    * there is new data available. Several rQ* methods are available to | ||||
|    * read binary data off of the receive queue. | ||||
|    */ | ||||
| 
 | ||||
| ; | ||||
| 
 | ||||
| // this has performance issues in some versions Chromium, and
 | ||||
| // doesn't gain a tremendous amount of performance increase in Firefox
 | ||||
| // at the moment.  It may be valuable to turn it on in the future.
 | ||||
| var ENABLE_COPYWITHIN = false; | ||||
| 
 | ||||
| var MAX_RQ_GROW_SIZE = 40 * 1024 * 1024; // 40 MiB
 | ||||
| 
 | ||||
| var typedArrayToString = function () { | ||||
|     // This is only for PhantomJS, which doesn't like apply-ing
 | ||||
|     // with Typed Arrays
 | ||||
|     try { | ||||
|         var arr = new Uint8Array([1, 2, 3]); | ||||
|         String.fromCharCode.apply(null, arr); | ||||
|         return function (a) { | ||||
|             return String.fromCharCode.apply(null, a); | ||||
|         }; | ||||
|     } catch (ex) { | ||||
|         return function (a) { | ||||
|             return String.fromCharCode.apply(null, Array.prototype.slice.call(a)); | ||||
|         }; | ||||
|     } | ||||
| }(); | ||||
| 
 | ||||
| Websock.prototype = { | ||||
|     // Getters and Setters
 | ||||
|     get_sQ: function () { | ||||
|         return this._sQ; | ||||
|     }, | ||||
| 
 | ||||
|     get_rQ: function () { | ||||
|         return this._rQ; | ||||
|     }, | ||||
| 
 | ||||
|     get_rQi: function () { | ||||
|         return this._rQi; | ||||
|     }, | ||||
| 
 | ||||
|     set_rQi: function (val) { | ||||
|         this._rQi = val; | ||||
|     }, | ||||
| 
 | ||||
|     // Receive Queue
 | ||||
|     rQlen: function () { | ||||
|         return this._rQlen - this._rQi; | ||||
|     }, | ||||
| 
 | ||||
|     rQpeek8: function () { | ||||
|         return this._rQ[this._rQi]; | ||||
|     }, | ||||
| 
 | ||||
|     rQshift8: function () { | ||||
|         return this._rQ[this._rQi++]; | ||||
|     }, | ||||
| 
 | ||||
|     rQskip8: function () { | ||||
|         this._rQi++; | ||||
|     }, | ||||
| 
 | ||||
|     rQskipBytes: function (num) { | ||||
|         this._rQi += num; | ||||
|     }, | ||||
| 
 | ||||
|     // TODO(directxman12): test performance with these vs a DataView
 | ||||
|     rQshift16: function () { | ||||
|         return (this._rQ[this._rQi++] << 8) + this._rQ[this._rQi++]; | ||||
|     }, | ||||
| 
 | ||||
|     rQshift32: function () { | ||||
|         return (this._rQ[this._rQi++] << 24) + (this._rQ[this._rQi++] << 16) + (this._rQ[this._rQi++] << 8) + this._rQ[this._rQi++]; | ||||
|     }, | ||||
| 
 | ||||
|     rQshiftStr: function (len) { | ||||
|         if (typeof len === 'undefined') { | ||||
|             len = this.rQlen(); | ||||
|         } | ||||
|         var arr = new Uint8Array(this._rQ.buffer, this._rQi, len); | ||||
|         this._rQi += len; | ||||
|         return typedArrayToString(arr); | ||||
|     }, | ||||
| 
 | ||||
|     rQshiftBytes: function (len) { | ||||
|         if (typeof len === 'undefined') { | ||||
|             len = this.rQlen(); | ||||
|         } | ||||
|         this._rQi += len; | ||||
|         return new Uint8Array(this._rQ.buffer, this._rQi - len, len); | ||||
|     }, | ||||
| 
 | ||||
|     rQshiftTo: function (target, len) { | ||||
|         if (len === undefined) { | ||||
|             len = this.rQlen(); | ||||
|         } | ||||
|         // TODO: make this just use set with views when using a ArrayBuffer to store the rQ
 | ||||
|         target.set(new Uint8Array(this._rQ.buffer, this._rQi, len)); | ||||
|         this._rQi += len; | ||||
|     }, | ||||
| 
 | ||||
|     rQwhole: function () { | ||||
|         return new Uint8Array(this._rQ.buffer, 0, this._rQlen); | ||||
|     }, | ||||
| 
 | ||||
|     rQslice: function (start, end) { | ||||
|         if (end) { | ||||
|             return new Uint8Array(this._rQ.buffer, this._rQi + start, end - start); | ||||
|         } else { | ||||
|             return new Uint8Array(this._rQ.buffer, this._rQi + start, this._rQlen - this._rQi - start); | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     // Check to see if we must wait for 'num' bytes (default to FBU.bytes)
 | ||||
|     // to be available in the receive queue. Return true if we need to
 | ||||
|     // wait (and possibly print a debug message), otherwise false.
 | ||||
|     rQwait: function (msg, num, goback) { | ||||
|         var rQlen = this._rQlen - this._rQi; // Skip rQlen() function call
 | ||||
|         if (rQlen < num) { | ||||
|             if (goback) { | ||||
|                 if (this._rQi < goback) { | ||||
|                     throw new Error("rQwait cannot backup " + goback + " bytes"); | ||||
|                 } | ||||
|                 this._rQi -= goback; | ||||
|             } | ||||
|             return true; // true means need more data
 | ||||
|         } | ||||
|         return false; | ||||
|     }, | ||||
| 
 | ||||
|     // Send Queue
 | ||||
| 
 | ||||
|     flush: function () { | ||||
|         if (this._sQlen > 0 && this._websocket.readyState === WebSocket.OPEN) { | ||||
|             this._websocket.send(this._encode_message()); | ||||
|             this._sQlen = 0; | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     send: function (arr) { | ||||
|         this._sQ.set(arr, this._sQlen); | ||||
|         this._sQlen += arr.length; | ||||
|         this.flush(); | ||||
|     }, | ||||
| 
 | ||||
|     send_string: function (str) { | ||||
|         this.send(str.split('').map(function (chr) { | ||||
|             return chr.charCodeAt(0); | ||||
|         })); | ||||
|     }, | ||||
| 
 | ||||
|     // Event Handlers
 | ||||
|     off: function (evt) { | ||||
|         this._eventHandlers[evt] = function () {}; | ||||
|     }, | ||||
| 
 | ||||
|     on: function (evt, handler) { | ||||
|         this._eventHandlers[evt] = handler; | ||||
|     }, | ||||
| 
 | ||||
|     _allocate_buffers: function () { | ||||
|         this._rQ = new Uint8Array(this._rQbufferSize); | ||||
|         this._sQ = new Uint8Array(this._sQbufferSize); | ||||
|     }, | ||||
| 
 | ||||
|     init: function () { | ||||
|         this._allocate_buffers(); | ||||
|         this._rQi = 0; | ||||
|         this._websocket = null; | ||||
|     }, | ||||
| 
 | ||||
|     open: function (uri, protocols) { | ||||
|         var ws_schema = uri.match(/^([a-z]+):\/\//)[1]; | ||||
|         this.init(); | ||||
| 
 | ||||
|         this._websocket = new WebSocket(uri, protocols); | ||||
|         this._websocket.binaryType = 'arraybuffer'; | ||||
| 
 | ||||
|         this._websocket.onmessage = this._recv_message.bind(this); | ||||
|         this._websocket.onopen = function () { | ||||
|             Log.Debug('>> WebSock.onopen'); | ||||
|             if (this._websocket.protocol) { | ||||
|                 Log.Info("Server choose sub-protocol: " + this._websocket.protocol); | ||||
|             } | ||||
| 
 | ||||
|             this._eventHandlers.open(); | ||||
|             Log.Debug("<< WebSock.onopen"); | ||||
|         }.bind(this); | ||||
|         this._websocket.onclose = function (e) { | ||||
|             Log.Debug(">> WebSock.onclose"); | ||||
|             this._eventHandlers.close(e); | ||||
|             Log.Debug("<< WebSock.onclose"); | ||||
|         }.bind(this); | ||||
|         this._websocket.onerror = function (e) { | ||||
|             Log.Debug(">> WebSock.onerror: " + e); | ||||
|             this._eventHandlers.error(e); | ||||
|             Log.Debug("<< WebSock.onerror: " + e); | ||||
|         }.bind(this); | ||||
|     }, | ||||
| 
 | ||||
|     close: function () { | ||||
|         if (this._websocket) { | ||||
|             if (this._websocket.readyState === WebSocket.OPEN || this._websocket.readyState === WebSocket.CONNECTING) { | ||||
|                 Log.Info("Closing WebSocket connection"); | ||||
|                 this._websocket.close(); | ||||
|             } | ||||
| 
 | ||||
|             this._websocket.onmessage = function (e) { | ||||
|                 return; | ||||
|             }; | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     // private methods
 | ||||
|     _encode_message: function () { | ||||
|         // Put in a binary arraybuffer
 | ||||
|         // according to the spec, you can send ArrayBufferViews with the send method
 | ||||
|         return new Uint8Array(this._sQ.buffer, 0, this._sQlen); | ||||
|     }, | ||||
| 
 | ||||
|     _expand_compact_rQ: function (min_fit) { | ||||
|         var resizeNeeded = min_fit || this._rQlen - this._rQi > this._rQbufferSize / 2; | ||||
|         if (resizeNeeded) { | ||||
|             if (!min_fit) { | ||||
|                 // just double the size if we need to do compaction
 | ||||
|                 this._rQbufferSize *= 2; | ||||
|             } else { | ||||
|                 // otherwise, make sure we satisy rQlen - rQi + min_fit < rQbufferSize / 8
 | ||||
|                 this._rQbufferSize = (this._rQlen - this._rQi + min_fit) * 8; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // we don't want to grow unboundedly
 | ||||
|         if (this._rQbufferSize > MAX_RQ_GROW_SIZE) { | ||||
|             this._rQbufferSize = MAX_RQ_GROW_SIZE; | ||||
|             if (this._rQbufferSize - this._rQlen - this._rQi < min_fit) { | ||||
|                 throw new Exception("Receive Queue buffer exceeded " + MAX_RQ_GROW_SIZE + " bytes, and the new message could not fit"); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (resizeNeeded) { | ||||
|             var old_rQbuffer = this._rQ.buffer; | ||||
|             this._rQmax = this._rQbufferSize / 8; | ||||
|             this._rQ = new Uint8Array(this._rQbufferSize); | ||||
|             this._rQ.set(new Uint8Array(old_rQbuffer, this._rQi)); | ||||
|         } else { | ||||
|             if (ENABLE_COPYWITHIN) { | ||||
|                 this._rQ.copyWithin(0, this._rQi); | ||||
|             } else { | ||||
|                 this._rQ.set(new Uint8Array(this._rQ.buffer, this._rQi)); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         this._rQlen = this._rQlen - this._rQi; | ||||
|         this._rQi = 0; | ||||
|     }, | ||||
| 
 | ||||
|     _decode_message: function (data) { | ||||
|         // push arraybuffer values onto the end
 | ||||
|         var u8 = new Uint8Array(data); | ||||
|         if (u8.length > this._rQbufferSize - this._rQlen) { | ||||
|             this._expand_compact_rQ(u8.length); | ||||
|         } | ||||
|         this._rQ.set(u8, this._rQlen); | ||||
|         this._rQlen += u8.length; | ||||
|     }, | ||||
| 
 | ||||
|     _recv_message: function (e) { | ||||
|         this._decode_message(e.data); | ||||
|         if (this.rQlen() > 0) { | ||||
|             this._eventHandlers.message(); | ||||
|             // Compact the receive queue
 | ||||
|             if (this._rQlen == this._rQi) { | ||||
|                 this._rQlen = 0; | ||||
|                 this._rQi = 0; | ||||
|             } else if (this._rQlen > this._rQmax) { | ||||
|                 this._expand_compact_rQ(); | ||||
|             } | ||||
|         } else { | ||||
|             Log.Debug("Ignoring empty message"); | ||||
|         } | ||||
|     } | ||||
| }; | ||||
|  | @ -1,273 +0,0 @@ | |||
| /* | ||||
|  * Ported from Flashlight VNC ActionScript implementation: | ||||
|  *     http://www.wizhelp.com/flashlight-vnc/
 | ||||
|  * | ||||
|  * Full attribution follows: | ||||
|  * | ||||
|  * ------------------------------------------------------------------------- | ||||
|  * | ||||
|  * This DES class has been extracted from package Acme.Crypto for use in VNC. | ||||
|  * The unnecessary odd parity code has been removed. | ||||
|  * | ||||
|  * These changes are: | ||||
|  *  Copyright (C) 1999 AT&T Laboratories Cambridge.  All Rights Reserved. | ||||
|  * | ||||
|  * This software is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||||
|  * | ||||
| 
 | ||||
|  * DesCipher - the DES encryption method | ||||
|  * | ||||
|  * The meat of this code is by Dave Zimmerman <dzimm@widget.com>, and is: | ||||
|  * | ||||
|  * Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this software | ||||
|  * and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and | ||||
|  * without fee is hereby granted, provided that this copyright notice is kept  | ||||
|  * intact.  | ||||
|  *  | ||||
|  * WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY | ||||
|  * OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED | ||||
|  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A | ||||
|  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE LIABLE | ||||
|  * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR | ||||
|  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. | ||||
|  *  | ||||
|  * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE | ||||
|  * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE | ||||
|  * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT | ||||
|  * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE | ||||
|  * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE | ||||
|  * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE | ||||
|  * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").  WIDGET WORKSHOP | ||||
|  * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR | ||||
|  * HIGH RISK ACTIVITIES. | ||||
|  * | ||||
|  * | ||||
|  * The rest is: | ||||
|  * | ||||
|  * Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>.  All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  * | ||||
|  * Visit the ACME Labs Java page for up-to-date versions of this and other | ||||
|  * fine Java utilities: http://www.acme.com/java/
 | ||||
|  */ | ||||
| 
 | ||||
| "use strict"; | ||||
| /*jslint white: false, bitwise: false, plusplus: false */ | ||||
| 
 | ||||
| function DES(passwd) { | ||||
| 
 | ||||
| // Tables, permutations, S-boxes, etc.
 | ||||
| var PC2 = [13,16,10,23, 0, 4, 2,27,14, 5,20, 9,22,18,11, 3, | ||||
|            25, 7,15, 6,26,19,12, 1,40,51,30,36,46,54,29,39, | ||||
|            50,44,32,47,43,48,38,55,33,52,45,41,49,35,28,31 ], | ||||
|     totrot = [ 1, 2, 4, 6, 8,10,12,14,15,17,19,21,23,25,27,28], | ||||
|     z = 0x0, a,b,c,d,e,f, SP1,SP2,SP3,SP4,SP5,SP6,SP7,SP8, | ||||
|     keys = []; | ||||
| 
 | ||||
| a=1<<16; b=1<<24; c=a|b; d=1<<2; e=1<<10; f=d|e; | ||||
| SP1 = [c|e,z|z,a|z,c|f,c|d,a|f,z|d,a|z,z|e,c|e,c|f,z|e,b|f,c|d,b|z,z|d, | ||||
|        z|f,b|e,b|e,a|e,a|e,c|z,c|z,b|f,a|d,b|d,b|d,a|d,z|z,z|f,a|f,b|z, | ||||
|        a|z,c|f,z|d,c|z,c|e,b|z,b|z,z|e,c|d,a|z,a|e,b|d,z|e,z|d,b|f,a|f, | ||||
|        c|f,a|d,c|z,b|f,b|d,z|f,a|f,c|e,z|f,b|e,b|e,z|z,a|d,a|e,z|z,c|d]; | ||||
| a=1<<20; b=1<<31; c=a|b; d=1<<5; e=1<<15; f=d|e; | ||||
| SP2 = [c|f,b|e,z|e,a|f,a|z,z|d,c|d,b|f,b|d,c|f,c|e,b|z,b|e,a|z,z|d,c|d, | ||||
|        a|e,a|d,b|f,z|z,b|z,z|e,a|f,c|z,a|d,b|d,z|z,a|e,z|f,c|e,c|z,z|f, | ||||
|        z|z,a|f,c|d,a|z,b|f,c|z,c|e,z|e,c|z,b|e,z|d,c|f,a|f,z|d,z|e,b|z, | ||||
|        z|f,c|e,a|z,b|d,a|d,b|f,b|d,a|d,a|e,z|z,b|e,z|f,b|z,c|d,c|f,a|e]; | ||||
| a=1<<17; b=1<<27; c=a|b; d=1<<3; e=1<<9; f=d|e; | ||||
| SP3 = [z|f,c|e,z|z,c|d,b|e,z|z,a|f,b|e,a|d,b|d,b|d,a|z,c|f,a|d,c|z,z|f, | ||||
|        b|z,z|d,c|e,z|e,a|e,c|z,c|d,a|f,b|f,a|e,a|z,b|f,z|d,c|f,z|e,b|z, | ||||
|        c|e,b|z,a|d,z|f,a|z,c|e,b|e,z|z,z|e,a|d,c|f,b|e,b|d,z|e,z|z,c|d, | ||||
|        b|f,a|z,b|z,c|f,z|d,a|f,a|e,b|d,c|z,b|f,z|f,c|z,a|f,z|d,c|d,a|e]; | ||||
| a=1<<13; b=1<<23; c=a|b; d=1<<0; e=1<<7; f=d|e; | ||||
| SP4 = [c|d,a|f,a|f,z|e,c|e,b|f,b|d,a|d,z|z,c|z,c|z,c|f,z|f,z|z,b|e,b|d, | ||||
|        z|d,a|z,b|z,c|d,z|e,b|z,a|d,a|e,b|f,z|d,a|e,b|e,a|z,c|e,c|f,z|f, | ||||
|        b|e,b|d,c|z,c|f,z|f,z|z,z|z,c|z,a|e,b|e,b|f,z|d,c|d,a|f,a|f,z|e, | ||||
|        c|f,z|f,z|d,a|z,b|d,a|d,c|e,b|f,a|d,a|e,b|z,c|d,z|e,b|z,a|z,c|e]; | ||||
| a=1<<25; b=1<<30; c=a|b; d=1<<8; e=1<<19; f=d|e; | ||||
| SP5 = [z|d,a|f,a|e,c|d,z|e,z|d,b|z,a|e,b|f,z|e,a|d,b|f,c|d,c|e,z|f,b|z, | ||||
|        a|z,b|e,b|e,z|z,b|d,c|f,c|f,a|d,c|e,b|d,z|z,c|z,a|f,a|z,c|z,z|f, | ||||
|        z|e,c|d,z|d,a|z,b|z,a|e,c|d,b|f,a|d,b|z,c|e,a|f,b|f,z|d,a|z,c|e, | ||||
|        c|f,z|f,c|z,c|f,a|e,z|z,b|e,c|z,z|f,a|d,b|d,z|e,z|z,b|e,a|f,b|d]; | ||||
| a=1<<22; b=1<<29; c=a|b; d=1<<4; e=1<<14; f=d|e; | ||||
| SP6 = [b|d,c|z,z|e,c|f,c|z,z|d,c|f,a|z,b|e,a|f,a|z,b|d,a|d,b|e,b|z,z|f, | ||||
|        z|z,a|d,b|f,z|e,a|e,b|f,z|d,c|d,c|d,z|z,a|f,c|e,z|f,a|e,c|e,b|z, | ||||
|        b|e,z|d,c|d,a|e,c|f,a|z,z|f,b|d,a|z,b|e,b|z,z|f,b|d,c|f,a|e,c|z, | ||||
|        a|f,c|e,z|z,c|d,z|d,z|e,c|z,a|f,z|e,a|d,b|f,z|z,c|e,b|z,a|d,b|f]; | ||||
| a=1<<21; b=1<<26; c=a|b; d=1<<1; e=1<<11; f=d|e; | ||||
| SP7 = [a|z,c|d,b|f,z|z,z|e,b|f,a|f,c|e,c|f,a|z,z|z,b|d,z|d,b|z,c|d,z|f, | ||||
|        b|e,a|f,a|d,b|e,b|d,c|z,c|e,a|d,c|z,z|e,z|f,c|f,a|e,z|d,b|z,a|e, | ||||
|        b|z,a|e,a|z,b|f,b|f,c|d,c|d,z|d,a|d,b|z,b|e,a|z,c|e,z|f,a|f,c|e, | ||||
|        z|f,b|d,c|f,c|z,a|e,z|z,z|d,c|f,z|z,a|f,c|z,z|e,b|d,b|e,z|e,a|d]; | ||||
| a=1<<18; b=1<<28; c=a|b; d=1<<6; e=1<<12; f=d|e; | ||||
| SP8 = [b|f,z|e,a|z,c|f,b|z,b|f,z|d,b|z,a|d,c|z,c|f,a|e,c|e,a|f,z|e,z|d, | ||||
|        c|z,b|d,b|e,z|f,a|e,a|d,c|d,c|e,z|f,z|z,z|z,c|d,b|d,b|e,a|f,a|z, | ||||
|        a|f,a|z,c|e,z|e,z|d,c|d,z|e,a|f,b|e,z|d,b|d,c|z,c|d,b|z,a|z,b|f, | ||||
|        z|z,c|f,a|d,b|d,c|z,b|e,b|f,z|z,c|f,a|e,a|e,z|f,z|f,a|d,b|z,c|e]; | ||||
| 
 | ||||
| // Set the key.
 | ||||
| function setKeys(keyBlock) { | ||||
|     var i, j, l, m, n, o, pc1m = [], pcr = [], kn = [], | ||||
|         raw0, raw1, rawi, KnLi; | ||||
| 
 | ||||
|     for (j = 0, l = 56; j < 56; ++j, l-=8) { | ||||
|         l += l<-5 ? 65 : l<-3 ? 31 : l<-1 ? 63 : l===27 ? 35 : 0; // PC1
 | ||||
|         m = l & 0x7; | ||||
|         pc1m[j] = ((keyBlock[l >>> 3] & (1<<m)) !== 0) ? 1: 0; | ||||
|     } | ||||
| 
 | ||||
|     for (i = 0; i < 16; ++i) { | ||||
|         m = i << 1; | ||||
|         n = m + 1; | ||||
|         kn[m] = kn[n] = 0; | ||||
|         for (o=28; o<59; o+=28) { | ||||
|             for (j = o-28; j < o; ++j) { | ||||
|                 l = j + totrot[i]; | ||||
|                 if (l < o) { | ||||
|                     pcr[j] = pc1m[l]; | ||||
|                 } else { | ||||
|                     pcr[j] = pc1m[l - 28]; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         for (j = 0; j < 24; ++j) { | ||||
|             if (pcr[PC2[j]] !== 0) { | ||||
|                 kn[m] |= 1<<(23-j); | ||||
|             } | ||||
|             if (pcr[PC2[j + 24]] !== 0) { | ||||
|                 kn[n] |= 1<<(23-j); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     // cookey
 | ||||
|     for (i = 0, rawi = 0, KnLi = 0; i < 16; ++i) { | ||||
|         raw0 = kn[rawi++]; | ||||
|         raw1 = kn[rawi++]; | ||||
|         keys[KnLi] = (raw0 & 0x00fc0000) << 6; | ||||
|         keys[KnLi] |= (raw0 & 0x00000fc0) << 10; | ||||
|         keys[KnLi] |= (raw1 & 0x00fc0000) >>> 10; | ||||
|         keys[KnLi] |= (raw1 & 0x00000fc0) >>> 6; | ||||
|         ++KnLi; | ||||
|         keys[KnLi] = (raw0 & 0x0003f000) << 12; | ||||
|         keys[KnLi] |= (raw0 & 0x0000003f) << 16; | ||||
|         keys[KnLi] |= (raw1 & 0x0003f000) >>> 4; | ||||
|         keys[KnLi] |= (raw1 & 0x0000003f); | ||||
|         ++KnLi; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // Encrypt 8 bytes of text
 | ||||
| function enc8(text) { | ||||
|     var i = 0, b = text.slice(), fval, keysi = 0, | ||||
|         l, r, x; // left, right, accumulator
 | ||||
| 
 | ||||
|     // Squash 8 bytes to 2 ints
 | ||||
|     l = b[i++]<<24 | b[i++]<<16 | b[i++]<<8 | b[i++]; | ||||
|     r = b[i++]<<24 | b[i++]<<16 | b[i++]<<8 | b[i++]; | ||||
| 
 | ||||
|     x = ((l >>> 4) ^ r) & 0x0f0f0f0f; | ||||
|     r ^= x; | ||||
|     l ^= (x << 4); | ||||
|     x = ((l >>> 16) ^ r) & 0x0000ffff; | ||||
|     r ^= x; | ||||
|     l ^= (x << 16); | ||||
|     x = ((r >>> 2) ^ l) & 0x33333333; | ||||
|     l ^= x; | ||||
|     r ^= (x << 2); | ||||
|     x = ((r >>> 8) ^ l) & 0x00ff00ff; | ||||
|     l ^= x; | ||||
|     r ^= (x << 8); | ||||
|     r = (r << 1) | ((r >>> 31) & 1); | ||||
|     x = (l ^ r) & 0xaaaaaaaa; | ||||
|     l ^= x; | ||||
|     r ^= x; | ||||
|     l = (l << 1) | ((l >>> 31) & 1); | ||||
| 
 | ||||
|     for (i = 0; i < 8; ++i) { | ||||
|         x = (r << 28) | (r >>> 4); | ||||
|         x ^= keys[keysi++]; | ||||
|         fval =  SP7[x & 0x3f]; | ||||
|         fval |= SP5[(x >>> 8) & 0x3f]; | ||||
|         fval |= SP3[(x >>> 16) & 0x3f]; | ||||
|         fval |= SP1[(x >>> 24) & 0x3f]; | ||||
|         x = r ^ keys[keysi++]; | ||||
|         fval |= SP8[x & 0x3f]; | ||||
|         fval |= SP6[(x >>> 8) & 0x3f]; | ||||
|         fval |= SP4[(x >>> 16) & 0x3f]; | ||||
|         fval |= SP2[(x >>> 24) & 0x3f]; | ||||
|         l ^= fval; | ||||
|         x = (l << 28) | (l >>> 4); | ||||
|         x ^= keys[keysi++]; | ||||
|         fval =  SP7[x & 0x3f]; | ||||
|         fval |= SP5[(x >>> 8) & 0x3f]; | ||||
|         fval |= SP3[(x >>> 16) & 0x3f]; | ||||
|         fval |= SP1[(x >>> 24) & 0x3f]; | ||||
|         x = l ^ keys[keysi++]; | ||||
|         fval |= SP8[x & 0x0000003f]; | ||||
|         fval |= SP6[(x >>> 8) & 0x3f]; | ||||
|         fval |= SP4[(x >>> 16) & 0x3f]; | ||||
|         fval |= SP2[(x >>> 24) & 0x3f]; | ||||
|         r ^= fval; | ||||
|     } | ||||
| 
 | ||||
|     r = (r << 31) | (r >>> 1); | ||||
|     x = (l ^ r) & 0xaaaaaaaa; | ||||
|     l ^= x; | ||||
|     r ^= x; | ||||
|     l = (l << 31) | (l >>> 1); | ||||
|     x = ((l >>> 8) ^ r) & 0x00ff00ff; | ||||
|     r ^= x; | ||||
|     l ^= (x << 8); | ||||
|     x = ((l >>> 2) ^ r) & 0x33333333; | ||||
|     r ^= x; | ||||
|     l ^= (x << 2); | ||||
|     x = ((r >>> 16) ^ l) & 0x0000ffff; | ||||
|     l ^= x; | ||||
|     r ^= (x << 16); | ||||
|     x = ((r >>> 4) ^ l) & 0x0f0f0f0f; | ||||
|     l ^= x; | ||||
|     r ^= (x << 4); | ||||
| 
 | ||||
|     // Spread ints to bytes
 | ||||
|     x = [r, l]; | ||||
|     for (i = 0; i < 8; i++) { | ||||
|         b[i] = (x[i>>>2] >>> (8*(3 - (i%4)))) % 256; | ||||
|         if (b[i] < 0) { b[i] += 256; } // unsigned
 | ||||
|     } | ||||
|     return b; | ||||
| } | ||||
| 
 | ||||
| // Encrypt 16 bytes of text using passwd as key
 | ||||
| function encrypt(t) { | ||||
|     return enc8(t.slice(0,8)).concat(enc8(t.slice(8,16))); | ||||
| } | ||||
| 
 | ||||
| setKeys(passwd);             // Setup keys
 | ||||
| return {'encrypt': encrypt}; // Public interface
 | ||||
| 
 | ||||
| } // function DES
 | ||||
|  | @ -1,770 +0,0 @@ | |||
| /* | ||||
|  * noVNC: HTML5 VNC client | ||||
|  * Copyright (C) 2012 Joel Martin | ||||
|  * Licensed under MPL 2.0 (see LICENSE.txt) | ||||
|  * | ||||
|  * See README.md for usage and integration instructions. | ||||
|  */ | ||||
| 
 | ||||
| /*jslint browser: true, white: false, bitwise: false */ | ||||
| /*global Util, Base64, changeCursor */ | ||||
| 
 | ||||
| function Display(defaults) { | ||||
| "use strict"; | ||||
| 
 | ||||
| var that           = {},  // Public API methods
 | ||||
|     conf           = {},  // Configuration attributes
 | ||||
| 
 | ||||
|     // Private Display namespace variables
 | ||||
|     c_ctx          = null, | ||||
|     c_forceCanvas  = false, | ||||
| 
 | ||||
|     // Queued drawing actions for in-order rendering
 | ||||
|     renderQ        = [], | ||||
| 
 | ||||
|     // Predefine function variables (jslint)
 | ||||
|     imageDataGet, rgbImageData, bgrxImageData, cmapImageData, | ||||
|     setFillColor, rescale, scan_renderQ, | ||||
| 
 | ||||
|     // The full frame buffer (logical canvas) size
 | ||||
|     fb_width        = 0, | ||||
|     fb_height       = 0, | ||||
|     // The visible "physical canvas" viewport
 | ||||
|     viewport       = {'x': 0, 'y': 0, 'w' : 0, 'h' : 0 }, | ||||
|     cleanRect      = {'x1': 0, 'y1': 0, 'x2': -1, 'y2': -1}, | ||||
| 
 | ||||
|     c_prevStyle    = "", | ||||
|     tile           = null, | ||||
|     tile16x16      = null, | ||||
|     tile_x         = 0, | ||||
|     tile_y         = 0; | ||||
| 
 | ||||
| 
 | ||||
| // Configuration attributes
 | ||||
| Util.conf_defaults(conf, that, defaults, [ | ||||
|     ['target',      'wo', 'dom',  null, 'Canvas element for rendering'], | ||||
|     ['context',     'ro', 'raw',  null, 'Canvas 2D context for rendering (read-only)'], | ||||
|     ['logo',        'rw', 'raw',  null, 'Logo to display when cleared: {"width": width, "height": height, "data": data}'], | ||||
|     ['true_color',  'rw', 'bool', true, 'Use true-color pixel data'], | ||||
|     ['colourMap',   'rw', 'arr',  [], 'Colour map array (when not true-color)'], | ||||
|     ['scale',       'rw', 'float', 1.0, 'Display area scale factor 0.0 - 1.0'], | ||||
|     ['viewport',    'rw', 'bool', false, 'Use a viewport set with viewportChange()'], | ||||
|     ['width',       'rw', 'int', null, 'Display area width'], | ||||
|     ['height',      'rw', 'int', null, 'Display area height'], | ||||
| 
 | ||||
|     ['render_mode', 'ro', 'str', '', 'Canvas rendering mode (read-only)'], | ||||
| 
 | ||||
|     ['prefer_js',   'rw', 'str', null, 'Prefer Javascript over canvas methods'], | ||||
|     ['cursor_uri',  'rw', 'raw', null, 'Can we render cursor using data URI'] | ||||
|     ]); | ||||
| 
 | ||||
| // Override some specific getters/setters
 | ||||
| that.get_context = function () { return c_ctx; }; | ||||
| 
 | ||||
| that.set_scale = function(scale) { rescale(scale); }; | ||||
| 
 | ||||
| that.set_width = function (val) { that.resize(val, fb_height); }; | ||||
| that.get_width = function() { return fb_width; }; | ||||
| 
 | ||||
| that.set_height = function (val) { that.resize(fb_width, val); }; | ||||
| that.get_height = function() { return fb_height; }; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| //
 | ||||
| // Private functions
 | ||||
| //
 | ||||
| 
 | ||||
| // Create the public API interface
 | ||||
| function constructor() { | ||||
|     Util.Debug(">> Display.constructor"); | ||||
| 
 | ||||
|     var c, func, i, curDat, curSave, | ||||
|         has_imageData = false, UE = Util.Engine; | ||||
| 
 | ||||
|     if (! conf.target) { throw("target must be set"); } | ||||
| 
 | ||||
|     if (typeof conf.target === 'string') { | ||||
|         throw("target must be a DOM element"); | ||||
|     } | ||||
| 
 | ||||
|     c = conf.target; | ||||
| 
 | ||||
|     if (! c.getContext) { throw("no getContext method"); } | ||||
| 
 | ||||
|     if (! c_ctx) { c_ctx = c.getContext('2d'); } | ||||
| 
 | ||||
|     Util.Debug("User Agent: " + navigator.userAgent); | ||||
|     if (UE.gecko) { Util.Debug("Browser: gecko " + UE.gecko); } | ||||
|     if (UE.webkit) { Util.Debug("Browser: webkit " + UE.webkit); } | ||||
|     if (UE.trident) { Util.Debug("Browser: trident " + UE.trident); } | ||||
|     if (UE.presto) { Util.Debug("Browser: presto " + UE.presto); } | ||||
| 
 | ||||
|     that.clear(); | ||||
| 
 | ||||
|     // Check canvas features
 | ||||
|     if ('createImageData' in c_ctx) { | ||||
|         conf.render_mode = "canvas rendering"; | ||||
|     } else { | ||||
|         throw("Canvas does not support createImageData"); | ||||
|     } | ||||
|     if (conf.prefer_js === null) { | ||||
|         Util.Info("Prefering javascript operations"); | ||||
|         conf.prefer_js = true; | ||||
|     } | ||||
| 
 | ||||
|     // Initialize cached tile imageData
 | ||||
|     tile16x16 = c_ctx.createImageData(16, 16); | ||||
| 
 | ||||
|     /* | ||||
|      * Determine browser support for setting the cursor via data URI | ||||
|      * scheme | ||||
|      */ | ||||
|     curDat = []; | ||||
|     for (i=0; i < 8 * 8 * 4; i += 1) { | ||||
|         curDat.push(255); | ||||
|     } | ||||
|     try { | ||||
|         curSave = c.style.cursor; | ||||
|         changeCursor(conf.target, curDat, curDat, 2, 2, 8, 8); | ||||
|         if (c.style.cursor) { | ||||
|             if (conf.cursor_uri === null) { | ||||
|                 conf.cursor_uri = true; | ||||
|             } | ||||
|             Util.Info("Data URI scheme cursor supported"); | ||||
|         } else { | ||||
|             if (conf.cursor_uri === null) { | ||||
|                 conf.cursor_uri = false; | ||||
|             } | ||||
|             Util.Warn("Data URI scheme cursor not supported"); | ||||
|         } | ||||
|         c.style.cursor = curSave; | ||||
|     } catch (exc2) {  | ||||
|         Util.Error("Data URI scheme cursor test exception: " + exc2); | ||||
|         conf.cursor_uri = false; | ||||
|     } | ||||
| 
 | ||||
|     Util.Debug("<< Display.constructor"); | ||||
|     return that ; | ||||
| } | ||||
| 
 | ||||
| rescale = function(factor) { | ||||
|     var c, tp, x, y,  | ||||
|         properties = ['transform', 'WebkitTransform', 'MozTransform', null]; | ||||
|     c = conf.target; | ||||
|     tp = properties.shift(); | ||||
|     while (tp) { | ||||
|         if (typeof c.style[tp] !== 'undefined') { | ||||
|             break; | ||||
|         } | ||||
|         tp = properties.shift(); | ||||
|     } | ||||
| 
 | ||||
|     if (tp === null) { | ||||
|         Util.Debug("No scaling support"); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     if (typeof(factor) === "undefined") { | ||||
|         factor = conf.scale; | ||||
|     } else if (factor > 1.0) { | ||||
|         factor = 1.0; | ||||
|     } else if (factor < 0.1) { | ||||
|         factor = 0.1; | ||||
|     } | ||||
| 
 | ||||
|     if (conf.scale === factor) { | ||||
|         //Util.Debug("Display already scaled to '" + factor + "'");
 | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     conf.scale = factor; | ||||
|     x = c.width - c.width * factor; | ||||
|     y = c.height - c.height * factor; | ||||
|     c.style[tp] = "scale(" + conf.scale + ") translate(-" + x + "px, -" + y + "px)"; | ||||
| }; | ||||
| 
 | ||||
| setFillColor = function(color) { | ||||
|     var bgr, newStyle; | ||||
|     if (conf.true_color) { | ||||
|         bgr = color; | ||||
|     } else { | ||||
|         bgr = conf.colourMap[color[0]]; | ||||
|     } | ||||
|     newStyle = "rgb(" + bgr[2] + "," + bgr[1] + "," + bgr[0] + ")"; | ||||
|     if (newStyle !== c_prevStyle) { | ||||
|         c_ctx.fillStyle = newStyle; | ||||
|         c_prevStyle = newStyle; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| //
 | ||||
| // Public API interface functions
 | ||||
| //
 | ||||
| 
 | ||||
| // Shift and/or resize the visible viewport
 | ||||
| that.viewportChange = function(deltaX, deltaY, width, height) { | ||||
|     var c = conf.target, v = viewport, cr = cleanRect, | ||||
|         saveImg = null, saveStyle, x1, y1, vx2, vy2, w, h; | ||||
| 
 | ||||
|     if (!conf.viewport) { | ||||
|         Util.Debug("Setting viewport to full display region"); | ||||
|         deltaX = -v.w; // Clamped later if out of bounds
 | ||||
|         deltaY = -v.h; // Clamped later if out of bounds
 | ||||
|         width = fb_width; | ||||
|         height = fb_height; | ||||
|     } | ||||
| 
 | ||||
|     if (typeof(deltaX) === "undefined") { deltaX = 0; } | ||||
|     if (typeof(deltaY) === "undefined") { deltaY = 0; } | ||||
|     if (typeof(width) === "undefined") { width = v.w; } | ||||
|     if (typeof(height) === "undefined") { height = v.h; } | ||||
| 
 | ||||
|     // Size change
 | ||||
| 
 | ||||
|     if (width > fb_width) { width = fb_width; } | ||||
|     if (height > fb_height) { height = fb_height; } | ||||
| 
 | ||||
|     if ((v.w !== width) || (v.h !== height)) { | ||||
|         // Change width
 | ||||
|         if ((width < v.w) && (cr.x2 > v.x + width -1)) { | ||||
|             cr.x2 = v.x + width - 1; | ||||
|         } | ||||
|         v.w = width; | ||||
| 
 | ||||
|         // Change height
 | ||||
|         if ((height < v.h) && (cr.y2 > v.y + height -1)) { | ||||
|             cr.y2 = v.y + height - 1; | ||||
|         } | ||||
|         v.h = height; | ||||
| 
 | ||||
| 
 | ||||
|         if (v.w > 0 && v.h > 0 && c.width > 0 && c.height > 0) { | ||||
|             saveImg = c_ctx.getImageData(0, 0, | ||||
|                     (c.width < v.w) ? c.width : v.w, | ||||
|                     (c.height < v.h) ? c.height : v.h); | ||||
|         } | ||||
| 
 | ||||
|         c.width = v.w; | ||||
|         c.height = v.h; | ||||
| 
 | ||||
|         if (saveImg) { | ||||
|             c_ctx.putImageData(saveImg, 0, 0); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     vx2 = v.x + v.w - 1; | ||||
|     vy2 = v.y + v.h - 1; | ||||
| 
 | ||||
| 
 | ||||
|     // Position change
 | ||||
| 
 | ||||
|     if ((deltaX < 0) && ((v.x + deltaX) < 0)) { | ||||
|         deltaX = - v.x; | ||||
|     } | ||||
|     if ((vx2 + deltaX) >= fb_width) { | ||||
|         deltaX -= ((vx2 + deltaX) - fb_width + 1); | ||||
|     } | ||||
| 
 | ||||
|     if ((v.y + deltaY) < 0) { | ||||
|         deltaY = - v.y; | ||||
|     } | ||||
|     if ((vy2 + deltaY) >= fb_height) { | ||||
|         deltaY -= ((vy2 + deltaY) - fb_height + 1); | ||||
|     } | ||||
| 
 | ||||
|     if ((deltaX === 0) && (deltaY === 0)) { | ||||
|         //Util.Debug("skipping viewport change");
 | ||||
|         return; | ||||
|     } | ||||
|     Util.Debug("viewportChange deltaX: " + deltaX + ", deltaY: " + deltaY); | ||||
| 
 | ||||
|     v.x += deltaX; | ||||
|     vx2 += deltaX; | ||||
|     v.y += deltaY; | ||||
|     vy2 += deltaY; | ||||
| 
 | ||||
|     // Update the clean rectangle
 | ||||
|     if (v.x > cr.x1) { | ||||
|         cr.x1 = v.x; | ||||
|     } | ||||
|     if (vx2 < cr.x2) { | ||||
|         cr.x2 = vx2; | ||||
|     } | ||||
|     if (v.y > cr.y1) { | ||||
|         cr.y1 = v.y; | ||||
|     } | ||||
|     if (vy2 < cr.y2) { | ||||
|         cr.y2 = vy2; | ||||
|     } | ||||
| 
 | ||||
|     if (deltaX < 0) { | ||||
|         // Shift viewport left, redraw left section
 | ||||
|         x1 = 0; | ||||
|         w = - deltaX; | ||||
|     } else { | ||||
|         // Shift viewport right, redraw right section
 | ||||
|         x1 = v.w - deltaX; | ||||
|         w = deltaX; | ||||
|     } | ||||
|     if (deltaY < 0) { | ||||
|         // Shift viewport up, redraw top section
 | ||||
|         y1 = 0; | ||||
|         h = - deltaY; | ||||
|     } else { | ||||
|         // Shift viewport down, redraw bottom section
 | ||||
|         y1 = v.h - deltaY; | ||||
|         h = deltaY; | ||||
|     } | ||||
| 
 | ||||
|     // Copy the valid part of the viewport to the shifted location
 | ||||
|     saveStyle = c_ctx.fillStyle; | ||||
|     c_ctx.fillStyle = "rgb(255,255,255)"; | ||||
|     if (deltaX !== 0) { | ||||
|         //that.copyImage(0, 0, -deltaX, 0, v.w, v.h);
 | ||||
|         //that.fillRect(x1, 0, w, v.h, [255,255,255]);
 | ||||
|         c_ctx.drawImage(c, 0, 0, v.w, v.h, -deltaX, 0, v.w, v.h); | ||||
|         c_ctx.fillRect(x1, 0, w, v.h); | ||||
|     } | ||||
|     if (deltaY !== 0) { | ||||
|         //that.copyImage(0, 0, 0, -deltaY, v.w, v.h);
 | ||||
|         //that.fillRect(0, y1, v.w, h, [255,255,255]);
 | ||||
|         c_ctx.drawImage(c, 0, 0, v.w, v.h, 0, -deltaY, v.w, v.h); | ||||
|         c_ctx.fillRect(0, y1, v.w, h); | ||||
|     } | ||||
|     c_ctx.fillStyle = saveStyle; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // Return a map of clean and dirty areas of the viewport and reset the
 | ||||
| // tracking of clean and dirty areas.
 | ||||
| //
 | ||||
| // Returns: {'cleanBox':   {'x': x, 'y': y, 'w': w, 'h': h},
 | ||||
| //           'dirtyBoxes': [{'x': x, 'y': y, 'w': w, 'h': h}, ...]}
 | ||||
| that.getCleanDirtyReset = function() { | ||||
|     var v = viewport, c = cleanRect, cleanBox, dirtyBoxes = [], | ||||
|         vx2 = v.x + v.w - 1, vy2 = v.y + v.h - 1; | ||||
| 
 | ||||
| 
 | ||||
|     // Copy the cleanRect
 | ||||
|     cleanBox = {'x': c.x1, 'y': c.y1, | ||||
|                 'w': c.x2 - c.x1 + 1, 'h': c.y2 - c.y1 + 1}; | ||||
| 
 | ||||
|     if ((c.x1 >= c.x2) || (c.y1 >= c.y2)) { | ||||
|         // Whole viewport is dirty
 | ||||
|         dirtyBoxes.push({'x': v.x, 'y': v.y, 'w': v.w, 'h': v.h}); | ||||
|     } else { | ||||
|         // Redraw dirty regions
 | ||||
|         if (v.x < c.x1) { | ||||
|             // left side dirty region
 | ||||
|             dirtyBoxes.push({'x': v.x, 'y': v.y, | ||||
|                              'w': c.x1 - v.x + 1, 'h': v.h}); | ||||
|         } | ||||
|         if (vx2 > c.x2) { | ||||
|             // right side dirty region
 | ||||
|             dirtyBoxes.push({'x': c.x2 + 1, 'y': v.y, | ||||
|                              'w': vx2 - c.x2, 'h': v.h}); | ||||
|         } | ||||
|         if (v.y < c.y1) { | ||||
|             // top/middle dirty region
 | ||||
|             dirtyBoxes.push({'x': c.x1, 'y': v.y, | ||||
|                              'w': c.x2 - c.x1 + 1, 'h': c.y1 - v.y}); | ||||
|         } | ||||
|         if (vy2 > c.y2) { | ||||
|             // bottom/middle dirty region
 | ||||
|             dirtyBoxes.push({'x': c.x1, 'y': c.y2 + 1, | ||||
|                              'w': c.x2 - c.x1 + 1, 'h': vy2 - c.y2}); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     // Reset the cleanRect to the whole viewport
 | ||||
|     cleanRect = {'x1': v.x, 'y1': v.y, | ||||
|                  'x2': v.x + v.w - 1, 'y2': v.y + v.h - 1}; | ||||
| 
 | ||||
|     return {'cleanBox': cleanBox, 'dirtyBoxes': dirtyBoxes}; | ||||
| }; | ||||
| 
 | ||||
| // Translate viewport coordinates to absolute coordinates
 | ||||
| that.absX = function(x) { | ||||
|     return x + viewport.x; | ||||
| }; | ||||
| that.absY = function(y) { | ||||
|     return y + viewport.y; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| that.resize = function(width, height) { | ||||
|     c_prevStyle    = ""; | ||||
| 
 | ||||
|     fb_width = width; | ||||
|     fb_height = height; | ||||
| 
 | ||||
|     rescale(conf.scale); | ||||
|     that.viewportChange(); | ||||
| }; | ||||
| 
 | ||||
| that.clear = function() { | ||||
| 
 | ||||
|     if (conf.logo) { | ||||
|         that.resize(conf.logo.width, conf.logo.height); | ||||
|         that.blitStringImage(conf.logo.data, 0, 0); | ||||
|     } else { | ||||
|         that.resize(640, 20); | ||||
|         c_ctx.clearRect(0, 0, viewport.w, viewport.h); | ||||
|     } | ||||
| 
 | ||||
|     renderQ = []; | ||||
| 
 | ||||
|     // No benefit over default ("source-over") in Chrome and firefox
 | ||||
|     //c_ctx.globalCompositeOperation = "copy";
 | ||||
| }; | ||||
| 
 | ||||
| that.fillRect = function(x, y, width, height, color) { | ||||
|     setFillColor(color); | ||||
|     c_ctx.fillRect(x - viewport.x, y - viewport.y, width, height); | ||||
| }; | ||||
| 
 | ||||
| that.copyImage = function(old_x, old_y, new_x, new_y, w, h) { | ||||
|     var x1 = old_x - viewport.x, y1 = old_y - viewport.y, | ||||
|         x2 = new_x - viewport.x, y2 = new_y  - viewport.y; | ||||
|     c_ctx.drawImage(conf.target, x1, y1, w, h, x2, y2, w, h); | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // Start updating a tile
 | ||||
| that.startTile = function(x, y, width, height, color) { | ||||
|     var data, bgr, red, green, blue, i; | ||||
|     tile_x = x; | ||||
|     tile_y = y; | ||||
|     if ((width === 16) && (height === 16)) { | ||||
|         tile = tile16x16; | ||||
|     } else { | ||||
|         tile = c_ctx.createImageData(width, height); | ||||
|     } | ||||
|     data = tile.data; | ||||
|     if (conf.prefer_js) { | ||||
|         if (conf.true_color) { | ||||
|             bgr = color; | ||||
|         } else { | ||||
|             bgr = conf.colourMap[color[0]]; | ||||
|         } | ||||
|         red = bgr[2]; | ||||
|         green = bgr[1]; | ||||
|         blue = bgr[0]; | ||||
|         for (i = 0; i < (width * height * 4); i+=4) { | ||||
|             data[i    ] = red; | ||||
|             data[i + 1] = green; | ||||
|             data[i + 2] = blue; | ||||
|             data[i + 3] = 255; | ||||
|         } | ||||
|     } else { | ||||
|         that.fillRect(x, y, width, height, color); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| // Update sub-rectangle of the current tile
 | ||||
| that.subTile = function(x, y, w, h, color) { | ||||
|     var data, p, bgr, red, green, blue, width, j, i, xend, yend; | ||||
|     if (conf.prefer_js) { | ||||
|         data = tile.data; | ||||
|         width = tile.width; | ||||
|         if (conf.true_color) { | ||||
|             bgr = color; | ||||
|         } else { | ||||
|             bgr = conf.colourMap[color[0]]; | ||||
|         } | ||||
|         red = bgr[2]; | ||||
|         green = bgr[1]; | ||||
|         blue = bgr[0]; | ||||
|         xend = x + w; | ||||
|         yend = y + h; | ||||
|         for (j = y; j < yend; j += 1) { | ||||
|             for (i = x; i < xend; i += 1) { | ||||
|                 p = (i + (j * width) ) * 4; | ||||
|                 data[p    ] = red; | ||||
|                 data[p + 1] = green; | ||||
|                 data[p + 2] = blue; | ||||
|                 data[p + 3] = 255; | ||||
|             }    | ||||
|         }  | ||||
|     } else { | ||||
|         that.fillRect(tile_x + x, tile_y + y, w, h, color); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| // Draw the current tile to the screen
 | ||||
| that.finishTile = function() { | ||||
|     if (conf.prefer_js) { | ||||
|         c_ctx.putImageData(tile, tile_x - viewport.x, tile_y - viewport.y); | ||||
|     } | ||||
|     // else: No-op, if not prefer_js then already done by setSubTile
 | ||||
| }; | ||||
| 
 | ||||
| rgbImageData = function(x, y, vx, vy, width, height, arr, offset) { | ||||
|     var img, i, j, data; | ||||
|     /* | ||||
|     if ((x - v.x >= v.w) || (y - v.y >= v.h) || | ||||
|         (x - v.x + width < 0) || (y - v.y + height < 0)) { | ||||
|         // Skipping because outside of viewport
 | ||||
|         return; | ||||
|     } | ||||
|     */ | ||||
|     img = c_ctx.createImageData(width, height); | ||||
|     data = img.data; | ||||
|     for (i=0, j=offset; i < (width * height * 4); i=i+4, j=j+3) { | ||||
|         data[i    ] = arr[j    ]; | ||||
|         data[i + 1] = arr[j + 1]; | ||||
|         data[i + 2] = arr[j + 2]; | ||||
|         data[i + 3] = 255; // Set Alpha
 | ||||
|     } | ||||
|     c_ctx.putImageData(img, x - vx, y - vy); | ||||
| }; | ||||
| 
 | ||||
| bgrxImageData = function(x, y, vx, vy, width, height, arr, offset) { | ||||
|     var img, i, j, data; | ||||
|     /* | ||||
|     if ((x - v.x >= v.w) || (y - v.y >= v.h) || | ||||
|         (x - v.x + width < 0) || (y - v.y + height < 0)) { | ||||
|         // Skipping because outside of viewport
 | ||||
|         return; | ||||
|     } | ||||
|     */ | ||||
|     img = c_ctx.createImageData(width, height); | ||||
|     data = img.data; | ||||
|     for (i=0, j=offset; i < (width * height * 4); i=i+4, j=j+4) { | ||||
|         data[i    ] = arr[j + 2]; | ||||
|         data[i + 1] = arr[j + 1]; | ||||
|         data[i + 2] = arr[j    ]; | ||||
|         data[i + 3] = 255; // Set Alpha
 | ||||
|     } | ||||
|     c_ctx.putImageData(img, x - vx, y - vy); | ||||
| }; | ||||
| 
 | ||||
| cmapImageData = function(x, y, vx, vy, width, height, arr, offset) { | ||||
|     var img, i, j, data, bgr, cmap; | ||||
|     img = c_ctx.createImageData(width, height); | ||||
|     data = img.data; | ||||
|     cmap = conf.colourMap; | ||||
|     for (i=0, j=offset; i < (width * height * 4); i+=4, j+=1) { | ||||
|         bgr = cmap[arr[j]]; | ||||
|         data[i    ] = bgr[2]; | ||||
|         data[i + 1] = bgr[1]; | ||||
|         data[i + 2] = bgr[0]; | ||||
|         data[i + 3] = 255; // Set Alpha
 | ||||
|     } | ||||
|     c_ctx.putImageData(img, x - vx, y - vy); | ||||
| }; | ||||
| 
 | ||||
| that.blitImage = function(x, y, width, height, arr, offset) { | ||||
|     if (conf.true_color) { | ||||
|         bgrxImageData(x, y, viewport.x, viewport.y, width, height, arr, offset); | ||||
|     } else { | ||||
|         cmapImageData(x, y, viewport.x, viewport.y, width, height, arr, offset); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| that.blitRgbImage = function(x, y, width, height, arr, offset) { | ||||
|     if (conf.true_color) { | ||||
|         rgbImageData(x, y, viewport.x, viewport.y, width, height, arr, offset); | ||||
|     } else { | ||||
|         // prolly wrong...
 | ||||
|         cmapImageData(x, y, viewport.x, viewport.y, width, height, arr, offset); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| that.blitStringImage = function(str, x, y) { | ||||
|     var img = new Image(); | ||||
|     img.onload = function () { | ||||
|         c_ctx.drawImage(img, x - viewport.x, y - viewport.y); | ||||
|     }; | ||||
|     img.src = str; | ||||
| }; | ||||
| 
 | ||||
| // Wrap ctx.drawImage but relative to viewport
 | ||||
| that.drawImage = function(img, x, y) { | ||||
|     c_ctx.drawImage(img, x - viewport.x, y - viewport.y); | ||||
| }; | ||||
| 
 | ||||
| that.renderQ_push = function(action) { | ||||
|     renderQ.push(action); | ||||
|     if (renderQ.length === 1) { | ||||
|         // If this can be rendered immediately it will be, otherwise
 | ||||
|         // the scanner will start polling the queue (every
 | ||||
|         // requestAnimationFrame interval)
 | ||||
|         scan_renderQ(); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| scan_renderQ = function() { | ||||
|     var a, ready = true; | ||||
|     while (ready && renderQ.length > 0) { | ||||
|         a = renderQ[0]; | ||||
|         switch (a.type) { | ||||
|             case 'copy': | ||||
|                 that.copyImage(a.old_x, a.old_y, a.x, a.y, a.width, a.height); | ||||
|                 break; | ||||
|             case 'fill': | ||||
|                 that.fillRect(a.x, a.y, a.width, a.height, a.color); | ||||
|                 break; | ||||
|             case 'blit': | ||||
|                 that.blitImage(a.x, a.y, a.width, a.height, a.data, 0); | ||||
|                 break; | ||||
|             case 'blitRgb': | ||||
|                 that.blitRgbImage(a.x, a.y, a.width, a.height, a.data, 0); | ||||
|                 break; | ||||
|             case 'img':     | ||||
|                 if (a.img.complete) { | ||||
|                     that.drawImage(a.img, a.x, a.y); | ||||
|                 } else { | ||||
|                     // We need to wait for this image to 'load'
 | ||||
|                     // to keep things in-order
 | ||||
|                     ready = false; | ||||
|                 } | ||||
|                 break; | ||||
|         } | ||||
|         if (ready) { | ||||
|             a = renderQ.shift(); | ||||
|         } | ||||
|     } | ||||
|     if (renderQ.length > 0) { | ||||
|         requestAnimFrame(scan_renderQ); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| that.changeCursor = function(pixels, mask, hotx, hoty, w, h) { | ||||
|     if (conf.cursor_uri === false) { | ||||
|         Util.Warn("changeCursor called but no cursor data URI support"); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     if (conf.true_color) { | ||||
|         changeCursor(conf.target, pixels, mask, hotx, hoty, w, h); | ||||
|     } else { | ||||
|         changeCursor(conf.target, pixels, mask, hotx, hoty, w, h, conf.colourMap); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| that.defaultCursor = function() { | ||||
|     conf.target.style.cursor = "default"; | ||||
| }; | ||||
| 
 | ||||
| return constructor();  // Return the public API interface
 | ||||
| 
 | ||||
| }  // End of Display()
 | ||||
| 
 | ||||
| 
 | ||||
| /* Set CSS cursor property using data URI encoded cursor file */ | ||||
| function changeCursor(target, pixels, mask, hotx, hoty, w0, h0, cmap) { | ||||
|     "use strict"; | ||||
|     var cur = [], rgb, IHDRsz, RGBsz, ANDsz, XORsz, url, idx, alpha, x, y; | ||||
|     //Util.Debug(">> changeCursor, x: " + hotx + ", y: " + hoty + ", w0: " + w0 + ", h0: " + h0);
 | ||||
| 
 | ||||
|     var w = w0; | ||||
|     var h = h0; | ||||
|     if (h < w) | ||||
|         h = w;                 // increase h to make it square
 | ||||
|     else | ||||
|         w = h;                 // increace w to make it square
 | ||||
| 
 | ||||
|     // Push multi-byte little-endian values
 | ||||
|     cur.push16le = function (num) { | ||||
|         this.push((num     ) & 0xFF, | ||||
|                   (num >> 8) & 0xFF  ); | ||||
|     }; | ||||
|     cur.push32le = function (num) { | ||||
|         this.push((num      ) & 0xFF, | ||||
|                   (num >>  8) & 0xFF, | ||||
|                   (num >> 16) & 0xFF, | ||||
|                   (num >> 24) & 0xFF  ); | ||||
|     }; | ||||
| 
 | ||||
|     IHDRsz = 40; | ||||
|     RGBsz = w * h * 4; | ||||
|     XORsz = Math.ceil( (w * h) / 8.0 ); | ||||
|     ANDsz = Math.ceil( (w * h) / 8.0 ); | ||||
| 
 | ||||
|     // Main header
 | ||||
|     cur.push16le(0);      // 0: Reserved
 | ||||
|     cur.push16le(2);      // 2: .CUR type
 | ||||
|     cur.push16le(1);      // 4: Number of images, 1 for non-animated ico
 | ||||
| 
 | ||||
|     // Cursor #1 header (ICONDIRENTRY)
 | ||||
|     cur.push(w);          // 6: width
 | ||||
|     cur.push(h);          // 7: height
 | ||||
|     cur.push(0);          // 8: colors, 0 -> true-color
 | ||||
|     cur.push(0);          // 9: reserved
 | ||||
|     cur.push16le(hotx);   // 10: hotspot x coordinate
 | ||||
|     cur.push16le(hoty);   // 12: hotspot y coordinate
 | ||||
|     cur.push32le(IHDRsz + RGBsz + XORsz + ANDsz); | ||||
|                           // 14: cursor data byte size
 | ||||
|     cur.push32le(22);     // 18: offset of cursor data in the file
 | ||||
| 
 | ||||
| 
 | ||||
|     // Cursor #1 InfoHeader (ICONIMAGE/BITMAPINFO)
 | ||||
|     cur.push32le(IHDRsz); // 22: Infoheader size
 | ||||
|     cur.push32le(w);      // 26: Cursor width
 | ||||
|     cur.push32le(h*2);    // 30: XOR+AND height
 | ||||
|     cur.push16le(1);      // 34: number of planes
 | ||||
|     cur.push16le(32);     // 36: bits per pixel
 | ||||
|     cur.push32le(0);      // 38: Type of compression
 | ||||
| 
 | ||||
|     cur.push32le(XORsz + ANDsz); // 43: Size of Image
 | ||||
|                                  // Gimp leaves this as 0
 | ||||
| 
 | ||||
|     cur.push32le(0);      // 46: reserved
 | ||||
|     cur.push32le(0);      // 50: reserved
 | ||||
|     cur.push32le(0);      // 54: reserved
 | ||||
|     cur.push32le(0);      // 58: reserved
 | ||||
| 
 | ||||
|     // 62: color data (RGBQUAD icColors[])
 | ||||
|     for (y = h-1; y >= 0; y -= 1) { | ||||
|         for (x = 0; x < w; x += 1) { | ||||
|             if (x >= w0 || y >= h0) { | ||||
|                 cur.push(0);          // blue
 | ||||
|                 cur.push(0);          // green
 | ||||
|                 cur.push(0);          // red
 | ||||
|                 cur.push(0);          // alpha
 | ||||
|             } else { | ||||
|                 idx = y * Math.ceil(w0 / 8) + Math.floor(x/8); | ||||
|                 alpha = (mask[idx] << (x % 8)) & 0x80 ? 255 : 0; | ||||
|                 if (cmap) { | ||||
|                     idx = (w0 * y) + x; | ||||
|                     rgb = cmap[pixels[idx]]; | ||||
|                     cur.push(rgb[2]);          // blue
 | ||||
|                     cur.push(rgb[1]);          // green
 | ||||
|                     cur.push(rgb[0]);          // red
 | ||||
|                     cur.push(alpha);           // alpha
 | ||||
|                 } else { | ||||
|                     idx = ((w0 * y) + x) * 4; | ||||
|                     cur.push(pixels[idx + 2]); // blue
 | ||||
|                     cur.push(pixels[idx + 1]); // green
 | ||||
|                     cur.push(pixels[idx    ]); // red
 | ||||
|                     cur.push(alpha);           // alpha
 | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     // XOR/bitmask data (BYTE icXOR[])
 | ||||
|     // (ignored, just needs to be right size)
 | ||||
|     for (y = 0; y < h; y += 1) { | ||||
|         for (x = 0; x < Math.ceil(w / 8); x += 1) { | ||||
|             cur.push(0x00); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     // AND/bitmask data (BYTE icAND[])
 | ||||
|     // (ignored, just needs to be right size)
 | ||||
|     for (y = 0; y < h; y += 1) { | ||||
|         for (x = 0; x < Math.ceil(w / 8); x += 1) { | ||||
|             cur.push(0x00); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     url = "data:image/x-icon;base64," + Base64.encode(cur); | ||||
|     target.style.cursor = "url(" + url + ") " + hotx + " " + hoty + ", default"; | ||||
|     //Util.Debug("<< changeCursor, cur.length: " + cur.length);
 | ||||
| } | ||||
|  | @ -1,676 +0,0 @@ | |||
| /* | ||||
|  * JSUnzip | ||||
|  * | ||||
|  * Copyright (c) 2011 by Erik Moller | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * This software is provided 'as-is', without any express | ||||
|  * or implied warranty.  In no event will the authors be | ||||
|  * held liable for any damages arising from the use of | ||||
|  * this software. | ||||
|  * | ||||
|  * Permission is granted to anyone to use this software | ||||
|  * for any purpose, including commercial applications, | ||||
|  * and to alter it and redistribute it freely, subject to | ||||
|  * the following restrictions: | ||||
|  * | ||||
|  * 1. The origin of this software must not be | ||||
|  *    misrepresented; you must not claim that you | ||||
|  *    wrote the original software. If you use this | ||||
|  *    software in a product, an acknowledgment in | ||||
|  *    the product documentation would be appreciated | ||||
|  *    but is not required. | ||||
|  * | ||||
|  * 2. Altered source versions must be plainly marked | ||||
|  *    as such, and must not be misrepresented as | ||||
|  *    being the original software. | ||||
|  * | ||||
|  * 3. This notice may not be removed or altered from | ||||
|  *    any source distribution. | ||||
|  */ | ||||
|   | ||||
| var tinf; | ||||
| 
 | ||||
| function JSUnzip() { | ||||
| 
 | ||||
|     this.getInt = function(offset, size) { | ||||
|         switch (size) { | ||||
|         case 4: | ||||
|             return  (this.data.charCodeAt(offset + 3) & 0xff) << 24 |  | ||||
|                     (this.data.charCodeAt(offset + 2) & 0xff) << 16 |  | ||||
|                     (this.data.charCodeAt(offset + 1) & 0xff) << 8 |  | ||||
|                     (this.data.charCodeAt(offset + 0) & 0xff); | ||||
|             break; | ||||
|         case 2: | ||||
|             return  (this.data.charCodeAt(offset + 1) & 0xff) << 8 |  | ||||
|                     (this.data.charCodeAt(offset + 0) & 0xff); | ||||
|             break; | ||||
|         default: | ||||
|             return this.data.charCodeAt(offset) & 0xff; | ||||
|             break; | ||||
|         } | ||||
|     }; | ||||
| 
 | ||||
|     this.getDOSDate = function(dosdate, dostime) { | ||||
|         var day = dosdate & 0x1f; | ||||
|         var month = ((dosdate >> 5) & 0xf) - 1; | ||||
|         var year = 1980 + ((dosdate >> 9) & 0x7f) | ||||
|         var second = (dostime & 0x1f) * 2; | ||||
|         var minute = (dostime >> 5) & 0x3f; | ||||
|         hour = (dostime >> 11) & 0x1f; | ||||
|         return new Date(year, month, day, hour, minute, second); | ||||
|     } | ||||
| 
 | ||||
|     this.open = function(data) { | ||||
|         this.data = data; | ||||
|         this.files = []; | ||||
| 
 | ||||
|         if (this.data.length < 22) | ||||
|             return { 'status' : false, 'error' : 'Invalid data' }; | ||||
|         var endOfCentralDirectory = this.data.length - 22; | ||||
|         while (endOfCentralDirectory >= 0 && this.getInt(endOfCentralDirectory, 4) != 0x06054b50) | ||||
|             --endOfCentralDirectory; | ||||
|         if (endOfCentralDirectory < 0) | ||||
|             return { 'status' : false, 'error' : 'Invalid data' }; | ||||
|         if (this.getInt(endOfCentralDirectory + 4, 2) != 0 || this.getInt(endOfCentralDirectory + 6, 2) != 0) | ||||
|             return { 'status' : false, 'error' : 'No multidisk support' }; | ||||
| 
 | ||||
|         var entriesInThisDisk = this.getInt(endOfCentralDirectory + 8, 2); | ||||
|         var centralDirectoryOffset = this.getInt(endOfCentralDirectory + 16, 4); | ||||
|         var globalCommentLength = this.getInt(endOfCentralDirectory + 20, 2); | ||||
|         this.comment = this.data.slice(endOfCentralDirectory + 22, endOfCentralDirectory + 22 + globalCommentLength); | ||||
| 
 | ||||
|         var fileOffset = centralDirectoryOffset; | ||||
| 
 | ||||
|         for (var i = 0; i < entriesInThisDisk; ++i) { | ||||
|             if (this.getInt(fileOffset + 0, 4) != 0x02014b50) | ||||
|                 return { 'status' : false, 'error' : 'Invalid data' }; | ||||
|             if (this.getInt(fileOffset + 6, 2) > 20) | ||||
|                 return { 'status' : false, 'error' : 'Unsupported version' }; | ||||
|             if (this.getInt(fileOffset + 8, 2) & 1) | ||||
|                 return { 'status' : false, 'error' : 'Encryption not implemented' }; | ||||
| 
 | ||||
|             var compressionMethod = this.getInt(fileOffset + 10, 2); | ||||
|             if (compressionMethod != 0 && compressionMethod != 8) | ||||
|                 return { 'status' : false, 'error' : 'Unsupported compression method' }; | ||||
| 
 | ||||
|             var lastModFileTime = this.getInt(fileOffset + 12, 2); | ||||
|             var lastModFileDate = this.getInt(fileOffset + 14, 2); | ||||
|             var lastModifiedDate = this.getDOSDate(lastModFileDate, lastModFileTime); | ||||
| 
 | ||||
|             var crc = this.getInt(fileOffset + 16, 4); | ||||
|             // TODO: crc
 | ||||
| 
 | ||||
|             var compressedSize = this.getInt(fileOffset + 20, 4); | ||||
|             var uncompressedSize = this.getInt(fileOffset + 24, 4); | ||||
| 
 | ||||
|             var fileNameLength = this.getInt(fileOffset + 28, 2); | ||||
|             var extraFieldLength = this.getInt(fileOffset + 30, 2); | ||||
|             var fileCommentLength = this.getInt(fileOffset + 32, 2); | ||||
| 
 | ||||
|             var relativeOffsetOfLocalHeader = this.getInt(fileOffset + 42, 4); | ||||
| 
 | ||||
|             var fileName = this.data.slice(fileOffset + 46, fileOffset + 46 + fileNameLength); | ||||
|             var fileComment = this.data.slice(fileOffset + 46 + fileNameLength + extraFieldLength, fileOffset + 46 + fileNameLength + extraFieldLength + fileCommentLength); | ||||
| 
 | ||||
|             if (this.getInt(relativeOffsetOfLocalHeader + 0, 4) != 0x04034b50) | ||||
|                 return { 'status' : false, 'error' : 'Invalid data' }; | ||||
|             var localFileNameLength = this.getInt(relativeOffsetOfLocalHeader + 26, 2); | ||||
|             var localExtraFieldLength = this.getInt(relativeOffsetOfLocalHeader + 28, 2); | ||||
|             var localFileContent = relativeOffsetOfLocalHeader + 30 + localFileNameLength + localExtraFieldLength; | ||||
| 
 | ||||
|             this.files[fileName] =  | ||||
|             { | ||||
|                 'fileComment' : fileComment, | ||||
|                 'compressionMethod' : compressionMethod, | ||||
|                 'compressedSize' : compressedSize, | ||||
|                 'uncompressedSize' : uncompressedSize, | ||||
|                 'localFileContent' : localFileContent, | ||||
|                 'lastModifiedDate' : lastModifiedDate | ||||
|             }; | ||||
| 
 | ||||
|             fileOffset += 46 + fileNameLength + extraFieldLength + fileCommentLength; | ||||
|         } | ||||
|         return { 'status' : true } | ||||
|     };      | ||||
|      | ||||
| 
 | ||||
|     this.read = function(fileName) { | ||||
|         var fileInfo = this.files[fileName]; | ||||
|         if (fileInfo) { | ||||
|             if (fileInfo.compressionMethod == 8) { | ||||
|                 if (!tinf) { | ||||
|                     tinf = new TINF(); | ||||
|                     tinf.init(); | ||||
|                 } | ||||
|                 var result = tinf.uncompress(this.data, fileInfo.localFileContent); | ||||
|                 if (result.status == tinf.OK) | ||||
|                     return { 'status' : true, 'data' : result.data }; | ||||
|                 else | ||||
|                     return { 'status' : false, 'error' : result.error }; | ||||
|             } else { | ||||
|                 return { 'status' : true, 'data' : this.data.slice(fileInfo.localFileContent, fileInfo.localFileContent + fileInfo.uncompressedSize) }; | ||||
|             } | ||||
|         } | ||||
|         return { 'status' : false, 'error' : "File '" + fileName + "' doesn't exist in zip" }; | ||||
|     }; | ||||
|      | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* | ||||
|  * tinflate  -  tiny inflate | ||||
|  * | ||||
|  * Copyright (c) 2003 by Joergen Ibsen / Jibz | ||||
|  * All Rights Reserved | ||||
|  * | ||||
|  * http://www.ibsensoftware.com/
 | ||||
|  * | ||||
|  * This software is provided 'as-is', without any express | ||||
|  * or implied warranty.  In no event will the authors be | ||||
|  * held liable for any damages arising from the use of | ||||
|  * this software. | ||||
|  * | ||||
|  * Permission is granted to anyone to use this software | ||||
|  * for any purpose, including commercial applications, | ||||
|  * and to alter it and redistribute it freely, subject to | ||||
|  * the following restrictions: | ||||
|  * | ||||
|  * 1. The origin of this software must not be | ||||
|  *    misrepresented; you must not claim that you | ||||
|  *    wrote the original software. If you use this | ||||
|  *    software in a product, an acknowledgment in | ||||
|  *    the product documentation would be appreciated | ||||
|  *    but is not required. | ||||
|  * | ||||
|  * 2. Altered source versions must be plainly marked | ||||
|  *    as such, and must not be misrepresented as | ||||
|  *    being the original software. | ||||
|  * | ||||
|  * 3. This notice may not be removed or altered from | ||||
|  *    any source distribution. | ||||
|  */ | ||||
| 
 | ||||
| /* | ||||
|  * tinflate javascript port by Erik Moller in May 2011. | ||||
|  * emoller@opera.com | ||||
|  *  | ||||
|  * read_bits() patched by mike@imidio.com to allow | ||||
|  * reading more then 8 bits (needed in some zlib streams) | ||||
|  */ | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| function TINF() { | ||||
|      | ||||
| this.OK = 0; | ||||
| this.DATA_ERROR = (-3); | ||||
| this.WINDOW_SIZE = 32768; | ||||
| 
 | ||||
| /* ------------------------------ * | ||||
|  * -- internal data structures -- * | ||||
|  * ------------------------------ */ | ||||
| 
 | ||||
| this.TREE = function() { | ||||
|    this.table = new Array(16);  /* table of code length counts */ | ||||
|    this.trans = new Array(288); /* code -> symbol translation table */ | ||||
| }; | ||||
| 
 | ||||
| this.DATA = function(that) { | ||||
|    this.source = ''; | ||||
|    this.sourceIndex = 0; | ||||
|    this.tag = 0; | ||||
|    this.bitcount = 0; | ||||
| 
 | ||||
|    this.dest = []; | ||||
|     | ||||
|    this.history = []; | ||||
| 
 | ||||
|    this.ltree = new that.TREE(); /* dynamic length/symbol tree */ | ||||
|    this.dtree = new that.TREE(); /* dynamic distance tree */ | ||||
| }; | ||||
| 
 | ||||
| /* --------------------------------------------------- * | ||||
|  * -- uninitialized global data (static structures) -- * | ||||
|  * --------------------------------------------------- */ | ||||
| 
 | ||||
| this.sltree = new this.TREE(); /* fixed length/symbol tree */ | ||||
| this.sdtree = new this.TREE(); /* fixed distance tree */ | ||||
| 
 | ||||
| /* extra bits and base tables for length codes */ | ||||
| this.length_bits = new Array(30); | ||||
| this.length_base = new Array(30); | ||||
| 
 | ||||
| /* extra bits and base tables for distance codes */ | ||||
| this.dist_bits = new Array(30); | ||||
| this.dist_base = new Array(30); | ||||
| 
 | ||||
| /* special ordering of code length codes */ | ||||
| this.clcidx = [ | ||||
|    16, 17, 18, 0, 8, 7, 9, 6, | ||||
|    10, 5, 11, 4, 12, 3, 13, 2, | ||||
|    14, 1, 15 | ||||
| ]; | ||||
| 
 | ||||
| /* ----------------------- * | ||||
|  * -- utility functions -- * | ||||
|  * ----------------------- */ | ||||
| 
 | ||||
| /* build extra bits and base tables */ | ||||
| this.build_bits_base = function(bits, base, delta, first) | ||||
| { | ||||
|    var i, sum; | ||||
| 
 | ||||
|    /* build bits table */ | ||||
|    for (i = 0; i < delta; ++i) bits[i] = 0; | ||||
|    for (i = 0; i < 30 - delta; ++i) bits[i + delta] = Math.floor(i / delta); | ||||
| 
 | ||||
|    /* build base table */ | ||||
|    for (sum = first, i = 0; i < 30; ++i) | ||||
|    { | ||||
|       base[i] = sum; | ||||
|       sum += 1 << bits[i]; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| /* build the fixed huffman trees */ | ||||
| this.build_fixed_trees = function(lt, dt) | ||||
| { | ||||
|    var i; | ||||
| 
 | ||||
|    /* build fixed length tree */ | ||||
|    for (i = 0; i < 7; ++i) lt.table[i] = 0; | ||||
| 
 | ||||
|    lt.table[7] = 24; | ||||
|    lt.table[8] = 152; | ||||
|    lt.table[9] = 112; | ||||
| 
 | ||||
|    for (i = 0; i < 24; ++i) lt.trans[i] = 256 + i; | ||||
|    for (i = 0; i < 144; ++i) lt.trans[24 + i] = i; | ||||
|    for (i = 0; i < 8; ++i) lt.trans[24 + 144 + i] = 280 + i; | ||||
|    for (i = 0; i < 112; ++i) lt.trans[24 + 144 + 8 + i] = 144 + i; | ||||
| 
 | ||||
|    /* build fixed distance tree */ | ||||
|    for (i = 0; i < 5; ++i) dt.table[i] = 0; | ||||
| 
 | ||||
|    dt.table[5] = 32; | ||||
| 
 | ||||
|    for (i = 0; i < 32; ++i) dt.trans[i] = i; | ||||
| } | ||||
| 
 | ||||
| /* given an array of code lengths, build a tree */ | ||||
| this.build_tree = function(t, lengths, loffset, num) | ||||
| { | ||||
|    var offs = new Array(16); | ||||
|    var i, sum; | ||||
| 
 | ||||
|    /* clear code length count table */ | ||||
|    for (i = 0; i < 16; ++i) t.table[i] = 0; | ||||
| 
 | ||||
|    /* scan symbol lengths, and sum code length counts */ | ||||
|    for (i = 0; i < num; ++i) t.table[lengths[loffset + i]]++; | ||||
| 
 | ||||
|    t.table[0] = 0; | ||||
| 
 | ||||
|    /* compute offset table for distribution sort */ | ||||
|    for (sum = 0, i = 0; i < 16; ++i) | ||||
|    { | ||||
|       offs[i] = sum; | ||||
|       sum += t.table[i]; | ||||
|    } | ||||
| 
 | ||||
|    /* create code->symbol translation table (symbols sorted by code) */ | ||||
|    for (i = 0; i < num; ++i) | ||||
|    { | ||||
|       if (lengths[loffset + i]) t.trans[offs[lengths[loffset + i]]++] = i; | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| /* ---------------------- * | ||||
|  * -- decode functions -- * | ||||
|  * ---------------------- */ | ||||
| 
 | ||||
| /* get one bit from source stream */ | ||||
| this.getbit = function(d) | ||||
| { | ||||
|    var bit; | ||||
| 
 | ||||
|    /* check if tag is empty */ | ||||
|    if (!d.bitcount--) | ||||
|    { | ||||
|       /* load next tag */ | ||||
|       d.tag = d.source[d.sourceIndex++] & 0xff; | ||||
|       d.bitcount = 7; | ||||
|    } | ||||
| 
 | ||||
|    /* shift bit out of tag */ | ||||
|    bit = d.tag & 0x01; | ||||
|    d.tag >>= 1; | ||||
| 
 | ||||
|    return bit; | ||||
| } | ||||
| 
 | ||||
| /* read a num bit value from a stream and add base */ | ||||
| function read_bits_direct(source, bitcount, tag, idx, num) | ||||
| { | ||||
|     var val = 0; | ||||
|     while (bitcount < 24) { | ||||
|         tag = tag | (source[idx++] & 0xff) << bitcount; | ||||
|         bitcount += 8; | ||||
|     } | ||||
|     val = tag & (0xffff >> (16 - num)); | ||||
|     tag >>= num; | ||||
|     bitcount -= num; | ||||
|     return [bitcount, tag, idx, val]; | ||||
| } | ||||
| this.read_bits = function(d, num, base) | ||||
| { | ||||
|     if (!num) | ||||
|         return base; | ||||
| 
 | ||||
|     var ret = read_bits_direct(d.source, d.bitcount, d.tag, d.sourceIndex, num); | ||||
|     d.bitcount = ret[0]; | ||||
|     d.tag = ret[1]; | ||||
|     d.sourceIndex = ret[2]; | ||||
|     return ret[3] + base; | ||||
| } | ||||
| 
 | ||||
| /* given a data stream and a tree, decode a symbol */ | ||||
| this.decode_symbol = function(d, t) | ||||
| { | ||||
|     while (d.bitcount < 16) { | ||||
|         d.tag = d.tag | (d.source[d.sourceIndex++] & 0xff) << d.bitcount; | ||||
|         d.bitcount += 8; | ||||
|     } | ||||
|      | ||||
|     var sum = 0, cur = 0, len = 0; | ||||
|     do { | ||||
|         cur = 2 * cur + ((d.tag & (1 << len)) >> len); | ||||
| 
 | ||||
|         ++len; | ||||
| 
 | ||||
|         sum += t.table[len]; | ||||
|         cur -= t.table[len]; | ||||
| 
 | ||||
|     } while (cur >= 0); | ||||
| 
 | ||||
|     d.tag >>= len; | ||||
|     d.bitcount -= len; | ||||
| 
 | ||||
|     return t.trans[sum + cur]; | ||||
| } | ||||
| 
 | ||||
| /* given a data stream, decode dynamic trees from it */ | ||||
| this.decode_trees = function(d, lt, dt) | ||||
| { | ||||
|    var code_tree = new this.TREE(); | ||||
|    var lengths = new Array(288+32); | ||||
|    var hlit, hdist, hclen; | ||||
|    var i, num, length; | ||||
| 
 | ||||
|    /* get 5 bits HLIT (257-286) */ | ||||
|    hlit = this.read_bits(d, 5, 257); | ||||
| 
 | ||||
|    /* get 5 bits HDIST (1-32) */ | ||||
|    hdist = this.read_bits(d, 5, 1); | ||||
| 
 | ||||
|    /* get 4 bits HCLEN (4-19) */ | ||||
|    hclen = this.read_bits(d, 4, 4); | ||||
| 
 | ||||
|    for (i = 0; i < 19; ++i) lengths[i] = 0; | ||||
| 
 | ||||
|    /* read code lengths for code length alphabet */ | ||||
|    for (i = 0; i < hclen; ++i) | ||||
|    { | ||||
|       /* get 3 bits code length (0-7) */ | ||||
|       var clen = this.read_bits(d, 3, 0); | ||||
| 
 | ||||
|       lengths[this.clcidx[i]] = clen; | ||||
|    } | ||||
| 
 | ||||
|    /* build code length tree */ | ||||
|    this.build_tree(code_tree, lengths, 0, 19); | ||||
| 
 | ||||
|    /* decode code lengths for the dynamic trees */ | ||||
|    for (num = 0; num < hlit + hdist; ) | ||||
|    { | ||||
|       var sym = this.decode_symbol(d, code_tree); | ||||
| 
 | ||||
|       switch (sym) | ||||
|       { | ||||
|       case 16: | ||||
|          /* copy previous code length 3-6 times (read 2 bits) */ | ||||
|          { | ||||
|             var prev = lengths[num - 1]; | ||||
|             for (length = this.read_bits(d, 2, 3); length; --length) | ||||
|             { | ||||
|                lengths[num++] = prev; | ||||
|             } | ||||
|          } | ||||
|          break; | ||||
|       case 17: | ||||
|          /* repeat code length 0 for 3-10 times (read 3 bits) */ | ||||
|          for (length = this.read_bits(d, 3, 3); length; --length) | ||||
|          { | ||||
|             lengths[num++] = 0; | ||||
|          } | ||||
|          break; | ||||
|       case 18: | ||||
|          /* repeat code length 0 for 11-138 times (read 7 bits) */ | ||||
|          for (length = this.read_bits(d, 7, 11); length; --length) | ||||
|          { | ||||
|             lengths[num++] = 0; | ||||
|          } | ||||
|          break; | ||||
|       default: | ||||
|          /* values 0-15 represent the actual code lengths */ | ||||
|          lengths[num++] = sym; | ||||
|          break; | ||||
|       } | ||||
|    } | ||||
| 
 | ||||
|    /* build dynamic trees */ | ||||
|    this.build_tree(lt, lengths, 0, hlit); | ||||
|    this.build_tree(dt, lengths, hlit, hdist); | ||||
| } | ||||
| 
 | ||||
| /* ----------------------------- * | ||||
|  * -- block inflate functions -- * | ||||
|  * ----------------------------- */ | ||||
| 
 | ||||
| /* given a stream and two trees, inflate a block of data */ | ||||
| this.inflate_block_data = function(d, lt, dt) | ||||
| { | ||||
|    // js optimization.
 | ||||
|    var ddest = d.dest; | ||||
|    var ddestlength = ddest.length; | ||||
| 
 | ||||
|    while (1) | ||||
|    { | ||||
|       var sym = this.decode_symbol(d, lt); | ||||
| 
 | ||||
|       /* check for end of block */ | ||||
|       if (sym == 256) | ||||
|       { | ||||
|          return this.OK; | ||||
|       } | ||||
| 
 | ||||
|       if (sym < 256) | ||||
|       { | ||||
|          ddest[ddestlength++] = sym; // ? String.fromCharCode(sym);
 | ||||
|          d.history.push(sym); | ||||
|       } else { | ||||
| 
 | ||||
|          var length, dist, offs; | ||||
|          var i; | ||||
| 
 | ||||
|          sym -= 257; | ||||
| 
 | ||||
|          /* possibly get more bits from length code */ | ||||
|          length = this.read_bits(d, this.length_bits[sym], this.length_base[sym]); | ||||
| 
 | ||||
|          dist = this.decode_symbol(d, dt); | ||||
| 
 | ||||
|          /* possibly get more bits from distance code */ | ||||
|          offs = d.history.length - this.read_bits(d, this.dist_bits[dist], this.dist_base[dist]); | ||||
| 
 | ||||
|          if (offs < 0) | ||||
|              throw ("Invalid zlib offset " + offs); | ||||
|           | ||||
|          /* copy match */ | ||||
|          for (i = offs; i < offs + length; ++i) { | ||||
|             //ddest[ddestlength++] = ddest[i];
 | ||||
|             ddest[ddestlength++] = d.history[i]; | ||||
|             d.history.push(d.history[i]); | ||||
|          } | ||||
|       } | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| /* inflate an uncompressed block of data */ | ||||
| this.inflate_uncompressed_block = function(d) | ||||
| { | ||||
|    var length, invlength; | ||||
|    var i; | ||||
| 
 | ||||
|    if (d.bitcount > 7) { | ||||
|        var overflow = Math.floor(d.bitcount / 8); | ||||
|        d.sourceIndex -= overflow; | ||||
|        d.bitcount = 0; | ||||
|        d.tag = 0; | ||||
|    } | ||||
|     | ||||
|    /* get length */ | ||||
|    length = d.source[d.sourceIndex+1]; | ||||
|    length = 256*length + d.source[d.sourceIndex]; | ||||
| 
 | ||||
|    /* get one's complement of length */ | ||||
|    invlength = d.source[d.sourceIndex+3]; | ||||
|    invlength = 256*invlength + d.source[d.sourceIndex+2]; | ||||
| 
 | ||||
|    /* check length */ | ||||
|    if (length != (~invlength & 0x0000ffff)) return this.DATA_ERROR; | ||||
| 
 | ||||
|    d.sourceIndex += 4; | ||||
| 
 | ||||
|    /* copy block */ | ||||
|    for (i = length; i; --i) { | ||||
|        d.history.push(d.source[d.sourceIndex]); | ||||
|        d.dest[d.dest.length] = d.source[d.sourceIndex++]; | ||||
|    } | ||||
| 
 | ||||
|    /* make sure we start next block on a byte boundary */ | ||||
|    d.bitcount = 0; | ||||
| 
 | ||||
|    return this.OK; | ||||
| } | ||||
| 
 | ||||
| /* inflate a block of data compressed with fixed huffman trees */ | ||||
| this.inflate_fixed_block = function(d) | ||||
| { | ||||
|    /* decode block using fixed trees */ | ||||
|    return this.inflate_block_data(d, this.sltree, this.sdtree); | ||||
| } | ||||
| 
 | ||||
| /* inflate a block of data compressed with dynamic huffman trees */ | ||||
| this.inflate_dynamic_block = function(d) | ||||
| { | ||||
|    /* decode trees from stream */ | ||||
|    this.decode_trees(d, d.ltree, d.dtree); | ||||
| 
 | ||||
|    /* decode block using decoded trees */ | ||||
|    return this.inflate_block_data(d, d.ltree, d.dtree); | ||||
| } | ||||
| 
 | ||||
| /* ---------------------- * | ||||
|  * -- public functions -- * | ||||
|  * ---------------------- */ | ||||
| 
 | ||||
| /* initialize global (static) data */ | ||||
| this.init = function() | ||||
| { | ||||
|    /* build fixed huffman trees */ | ||||
|    this.build_fixed_trees(this.sltree, this.sdtree); | ||||
| 
 | ||||
|    /* build extra bits and base tables */ | ||||
|    this.build_bits_base(this.length_bits, this.length_base, 4, 3); | ||||
|    this.build_bits_base(this.dist_bits, this.dist_base, 2, 1); | ||||
| 
 | ||||
|    /* fix a special case */ | ||||
|    this.length_bits[28] = 0; | ||||
|    this.length_base[28] = 258; | ||||
| 
 | ||||
|    this.reset();    | ||||
| } | ||||
| 
 | ||||
| this.reset = function() | ||||
| { | ||||
|    this.d = new this.DATA(this); | ||||
|    delete this.header; | ||||
| } | ||||
| 
 | ||||
| /* inflate stream from source to dest */ | ||||
| this.uncompress = function(source, offset) | ||||
| { | ||||
| 
 | ||||
|    var d = this.d; | ||||
|    var bfinal; | ||||
| 
 | ||||
|    /* initialise data */ | ||||
|    d.source = source; | ||||
|    d.sourceIndex = offset; | ||||
|    d.bitcount = 0; | ||||
| 
 | ||||
|    d.dest = []; | ||||
| 
 | ||||
|    // Skip zlib header at start of stream
 | ||||
|    if (typeof this.header == 'undefined') { | ||||
|        this.header = this.read_bits(d, 16, 0); | ||||
|        /* byte 0: 0x78, 7 = 32k window size, 8 = deflate */ | ||||
|        /* byte 1: check bits for header and other flags */ | ||||
|    } | ||||
| 
 | ||||
|    var blocks = 0; | ||||
|     | ||||
|    do { | ||||
| 
 | ||||
|       var btype; | ||||
|       var res; | ||||
| 
 | ||||
|       /* read final block flag */ | ||||
|       bfinal = this.getbit(d); | ||||
| 
 | ||||
|       /* read block type (2 bits) */ | ||||
|       btype = this.read_bits(d, 2, 0); | ||||
| 
 | ||||
|       /* decompress block */ | ||||
|       switch (btype) | ||||
|       { | ||||
|       case 0: | ||||
|          /* decompress uncompressed block */ | ||||
|          res = this.inflate_uncompressed_block(d); | ||||
|          break; | ||||
|       case 1: | ||||
|          /* decompress block with fixed huffman trees */ | ||||
|          res = this.inflate_fixed_block(d); | ||||
|          break; | ||||
|       case 2: | ||||
|          /* decompress block with dynamic huffman trees */ | ||||
|          res = this.inflate_dynamic_block(d); | ||||
|          break; | ||||
|       default: | ||||
|          return { 'status' : this.DATA_ERROR }; | ||||
|       } | ||||
| 
 | ||||
|       if (res != this.OK) return { 'status' : this.DATA_ERROR }; | ||||
|       blocks++; | ||||
|        | ||||
|    } while (!bfinal && d.sourceIndex < d.source.length); | ||||
| 
 | ||||
|    d.history = d.history.slice(-this.WINDOW_SIZE); | ||||
|     | ||||
|    return { 'status' : this.OK, 'data' : d.dest }; | ||||
| } | ||||
| 
 | ||||
| }; | ||||