feat: upgrade noVNC
|
|
@ -1,4 +1,4 @@
|
||||||
FROM ubuntu:14.04.3
|
FROM ubuntu:14.04
|
||||||
MAINTAINER Doro Wu <fcwu.tw@gmail.com>
|
MAINTAINER Doro Wu <fcwu.tw@gmail.com>
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND noninteractive
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
|
|
|
||||||
1
noVNC/.gitlastcommit
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
56d97524807b125d047730331031ddd00f9c61f
|
||||||
3
noVNC/.gitmodules
vendored
|
|
@ -1,3 +0,0 @@
|
||||||
[submodule "include/web-socket-js-project"]
|
|
||||||
path = include/web-socket-js-project
|
|
||||||
url = https://github.com/gimite/web-socket-js.git
|
|
||||||
20
noVNC/.npmignore
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
app
|
||||||
|
core
|
||||||
|
.gitmodules
|
||||||
|
node_modules
|
||||||
|
.*
|
||||||
|
*~
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
tests
|
||||||
|
.travis.yml
|
||||||
|
utils
|
||||||
|
docs/notes
|
||||||
|
docs/links
|
||||||
|
docs/release.txt
|
||||||
|
docs/rfb_notes
|
||||||
|
docs/*.pdf
|
||||||
|
vnc.html
|
||||||
|
vnc_auto.html
|
||||||
|
karma.conf.js
|
||||||
|
docs/flash_policy.txt
|
||||||
|
|
@ -1,15 +1,17 @@
|
||||||
language: node_js
|
language: node_js
|
||||||
|
sudo: false
|
||||||
|
cache:
|
||||||
|
directories:
|
||||||
|
- node_modules
|
||||||
node_js:
|
node_js:
|
||||||
- '0.11.13'
|
- '6.1'
|
||||||
env:
|
env:
|
||||||
matrix:
|
matrix:
|
||||||
- TEST_BROWSER_NAME=PhantomJS
|
- TEST_BROWSER_NAME=PhantomJS
|
||||||
- TEST_BROWSER_NAME=chrome TEST_BROWSER_OS='Windows 7,Linux'
|
- TEST_BROWSER_NAME=chrome TEST_BROWSER_OS='Windows 10,Linux,OS X 10.11'
|
||||||
- TEST_BROWSER_NAME=firefox TEST_BROWSER_OS='Windows 7,Linux' TEST_BROWSER_VERSION='30,26'
|
- TEST_BROWSER_NAME=firefox TEST_BROWSER_OS='Windows 10,Linux,OS X 10.11'
|
||||||
- TEST_BROWSER_NAME='internet explorer' TEST_BROWSER_OS='Windows 7' TEST_BROWSER_VERSION=10
|
- TEST_BROWSER_NAME='internet explorer' TEST_BROWSER_OS='Windows 10'
|
||||||
- TEST_BROWSER_NAME='internet explorer' TEST_BROWSER_OS='Windows 8.1' TEST_BROWSER_VERSION=11
|
- TEST_BROWSER_NAME=safari TEST_BROWSER_OS='OS X 10.11'
|
||||||
- TEST_BROWSER_NAME=safari TEST_BROWSER_OS='OS X 10.8' TEST_BROWSER_VERSION=6
|
|
||||||
- TEST_BROWSER_NAME=safari TEST_BROWSER_OS='OS X 10.9' TEST_BROWSER_VERSION=7
|
|
||||||
global:
|
global:
|
||||||
- secure: QE5GqGd2hrpQsIgd8dlv3oRUUHqZayomzzQjNXOB81VQi241uz/ru+3GtBZLB5WLZCq/Gj89vbLnR0LN4ixlmPaWv3/WJQGyDGuRD/vMnccVl+rBUP/Hh2zdYwiISIGcrywNAE+KLus/lyt/ahVgzbaRaDSzrM1HaZFT/rndGck=
|
- secure: QE5GqGd2hrpQsIgd8dlv3oRUUHqZayomzzQjNXOB81VQi241uz/ru+3GtBZLB5WLZCq/Gj89vbLnR0LN4ixlmPaWv3/WJQGyDGuRD/vMnccVl+rBUP/Hh2zdYwiISIGcrywNAE+KLus/lyt/ahVgzbaRaDSzrM1HaZFT/rndGck=
|
||||||
- secure: g75sdctEwj0hoLW0Y08Tdv8s5scNzplB6a9EtaJ2vJD9S/bK+AsPqbWesGv1UlrFPCWdbV7Vg61vkmoUjcmb5xhqFIjcM9TlYJoKWeOTsOmnQoSIkIq6gMF1k02+LmKInbPgIzrp3m3jluS1qaOs/EzFpDnJp9hWBiAfXa12Jxk=
|
- secure: g75sdctEwj0hoLW0Y08Tdv8s5scNzplB6a9EtaJ2vJD9S/bK+AsPqbWesGv1UlrFPCWdbV7Vg61vkmoUjcmb5xhqFIjcM9TlYJoKWeOTsOmnQoSIkIq6gMF1k02+LmKInbPgIzrp3m3jluS1qaOs/EzFpDnJp9hWBiAfXa12Jxk=
|
||||||
|
|
|
||||||
|
|
@ -5,19 +5,19 @@ Public License 2.0). The noVNC core library is composed of the
|
||||||
Javascript code necessary for full noVNC operation. This includes (but
|
Javascript code necessary for full noVNC operation. This includes (but
|
||||||
is not limited to):
|
is not limited to):
|
||||||
|
|
||||||
include/base64.js
|
core/base64.js
|
||||||
include/des.js
|
core/des.js
|
||||||
include/display.js
|
core/display.js
|
||||||
include/input.js
|
core/input/devices.js
|
||||||
include/jsunzip.js
|
core/input/keysym.js
|
||||||
include/keysym.js
|
core/logo.js
|
||||||
include/logo.js
|
core/playback.js
|
||||||
include/playback.js
|
core/rfb.js
|
||||||
include/rfb.js
|
app/ui.js
|
||||||
include/ui.js
|
core/util.js
|
||||||
include/util.js
|
core/websock.js
|
||||||
include/websock.js
|
app/webutil.js
|
||||||
include/webutil.js
|
core/input/xtscancodes.js
|
||||||
|
|
||||||
The HTML, CSS, font and images files that included with the noVNC
|
The HTML, CSS, font and images files that included with the noVNC
|
||||||
source distibution (or repository) are not considered part of the
|
source distibution (or repository) are not considered part of the
|
||||||
|
|
@ -29,12 +29,12 @@ The HTML, CSS, font and image files are licensed as follows:
|
||||||
|
|
||||||
*.html : 2-Clause BSD license
|
*.html : 2-Clause BSD license
|
||||||
|
|
||||||
include/*.css : 2-Clause BSD license
|
app/styles/*.css : 2-Clause BSD license
|
||||||
|
|
||||||
include/Orbitron* : SIL Open Font License 1.1
|
app/styles/Orbitron* : SIL Open Font License 1.1
|
||||||
(Copyright 2009 Matt McInerney)
|
(Copyright 2009 Matt McInerney)
|
||||||
|
|
||||||
images/ : Creative Commons Attribution-ShareAlike
|
app/images/ : Creative Commons Attribution-ShareAlike
|
||||||
http://creativecommons.org/licenses/by-sa/3.0/
|
http://creativecommons.org/licenses/by-sa/3.0/
|
||||||
|
|
||||||
Some portions of noVNC are copyright to their individual authors.
|
Some portions of noVNC are copyright to their individual authors.
|
||||||
|
|
@ -45,20 +45,16 @@ The are several files and projects that have been incorporated into
|
||||||
the noVNC core library. Here is a list of those files and the original
|
the noVNC core library. Here is a list of those files and the original
|
||||||
licenses (all MPL 2.0 compatible):
|
licenses (all MPL 2.0 compatible):
|
||||||
|
|
||||||
include/base64.js : MPL 2.0
|
core/base64.js : MPL 2.0
|
||||||
|
|
||||||
include/des.js : Various BSD style licenses
|
core/des.js : Various BSD style licenses
|
||||||
|
|
||||||
include/jsunzip.js : zlib/libpng license
|
utils/inflator.mod.js
|
||||||
|
include/inflator.js : MIT (for pako)
|
||||||
|
|
||||||
include/web-socket-js/ : New BSD license (3-clause). Source code at
|
Any other files not mentioned above are typically marked with
|
||||||
http://github.com/gimite/web-socket-js
|
a copyright/license header at the top of the file. The default noVNC
|
||||||
|
license is MPL-2.0.
|
||||||
include/chrome-app/tcp-stream.js
|
|
||||||
: Apache 2.0 license
|
|
||||||
|
|
||||||
utils/websockify
|
|
||||||
utils/websocket.py : LGPL 3
|
|
||||||
|
|
||||||
The following license texts are included:
|
The following license texts are included:
|
||||||
|
|
||||||
|
|
@ -70,6 +66,7 @@ The following license texts are included:
|
||||||
docs/LICENSE.BSD-2-Clause (Simplified BSD / FreeBSD)
|
docs/LICENSE.BSD-2-Clause (Simplified BSD / FreeBSD)
|
||||||
docs/LICENSE.zlib
|
docs/LICENSE.zlib
|
||||||
docs/LICENSE.Apache-2.0
|
docs/LICENSE.Apache-2.0
|
||||||
|
docs/LICENSE.pako
|
||||||
|
|
||||||
Or alternatively the license texts may be found here:
|
Or alternatively the license texts may be found here:
|
||||||
|
|
||||||
|
|
|
||||||
128
noVNC/README.md
|
|
@ -1,45 +1,45 @@
|
||||||
## noVNC: HTML5 VNC Client
|
## noVNC: HTML5 VNC Client
|
||||||
|
|
||||||
[](https://travis-ci.org/kanaka/noVNC)
|
[](https://travis-ci.org/novnc/noVNC)
|
||||||
|
|
||||||
### Description
|
### Description
|
||||||
|
|
||||||
noVNC is a HTML5 VNC client that runs well in any modern browser
|
noVNC is a HTML5 VNC client that runs well in any modern browser including
|
||||||
including mobile browsers (iPhone/iPad and Android).
|
mobile browsers (iOS and Android).
|
||||||
|
|
||||||
Many companies/projects have integrated noVNC including [Ganeti Web
|
Many companies, projects and products have integrated noVNC including
|
||||||
Manager](http://code.osuosl.org/projects/ganeti-webmgr),
|
[Ganeti Web Manager](http://code.osuosl.org/projects/ganeti-webmgr),
|
||||||
[OpenStack](http://www.openstack.org),
|
[OpenStack](http://www.openstack.org),
|
||||||
[OpenNebula](http://opennebula.org/), and
|
[OpenNebula](http://opennebula.org/),
|
||||||
[LibVNCServer](http://libvncserver.sourceforge.net). See [the Projects
|
[LibVNCServer](http://libvncserver.sourceforge.net), and
|
||||||
and Companies wiki
|
[ThinLinc](https://cendio.com/thinlinc). See
|
||||||
page](https://github.com/kanaka/noVNC/wiki/ProjectsCompanies-using-noVNC)
|
[the Projects and Companies wiki page](https://github.com/novnc/noVNC/wiki/Projects-and-companies-using-noVNC)
|
||||||
for a more complete list with additional info and links.
|
for a more complete list with additional info and links.
|
||||||
|
|
||||||
### News/help/contact
|
### News/help/contact
|
||||||
|
|
||||||
Notable commits, announcements and news are posted to
|
Notable commits, announcements and news are posted to
|
||||||
<a href="http://www.twitter.com/noVNC">@noVNC</a>
|
<a href="http://www.twitter.com/noVNC">@noVNC</a>.
|
||||||
|
|
||||||
If you are a noVNC developer/integrator/user (or want to be) please
|
If you are a noVNC developer/integrator/user (or want to be) please join the
|
||||||
join the <a
|
<a href="https://groups.google.com/forum/?fromgroups#!forum/novnc">
|
||||||
href="https://groups.google.com/forum/?fromgroups#!forum/novnc">noVNC
|
noVNC discussion group</a>.
|
||||||
discussion group</a>
|
|
||||||
|
|
||||||
Bugs and feature requests can be submitted via [github
|
Bugs and feature requests can be submitted via
|
||||||
issues](https://github.com/kanaka/noVNC/issues). If you are looking
|
[github issues](https://github.com/novnc/noVNC/issues).
|
||||||
for a place to start contributing to noVNC, a good place to start
|
If you are looking for a place to start contributing to noVNC, a good place to
|
||||||
would be the issues that are marked as
|
start would be the issues that are marked as
|
||||||
["patchwelcome"](https://github.com/kanaka/noVNC/issues?labels=patchwelcome).
|
["patchwelcome"](https://github.com/novnc/noVNC/issues?labels=patchwelcome).
|
||||||
|
|
||||||
If you want to show appreciation for noVNC you could donate to a great
|
If you want to show appreciation for noVNC you could donate to a great non-
|
||||||
non-profits such as: [Compassion
|
profits such as:
|
||||||
International](http://www.compassion.com/), [SIL](http://www.sil.org),
|
[Compassion International](http://www.compassion.com/),
|
||||||
[Habitat for Humanity](http://www.habitat.org), [Electronic Frontier
|
[SIL](http://www.sil.org),
|
||||||
Foundation](https://www.eff.org/), [Against Malaria
|
[Habitat for Humanity](http://www.habitat.org),
|
||||||
Foundation](http://www.againstmalaria.com/), [Nothing But
|
[Electronic Frontier Foundation](https://www.eff.org/),
|
||||||
Nets](http://www.nothingbutnets.net/), etc. Please tweet <a
|
[Against Malaria Foundation](http://www.againstmalaria.com/),
|
||||||
href="http://www.twitter.com/noVNC">@noVNC</a> if you do.
|
[Nothing But Nets](http://www.nothingbutnets.net/), etc.
|
||||||
|
Please tweet <a href="http://www.twitter.com/noVNC">@noVNC</a> if you do.
|
||||||
|
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
@ -59,61 +59,72 @@ href="http://www.twitter.com/noVNC">@noVNC</a> if you do.
|
||||||
|
|
||||||
Running in Chrome before and after connecting:
|
Running in Chrome before and after connecting:
|
||||||
|
|
||||||
<img src="http://kanaka.github.com/noVNC/img/noVNC-5.png" width=400> <img src="http://kanaka.github.com/noVNC/img/noVNC-7.jpg" width=400>
|
<img src="http://novnc.com/img/noVNC-5.png" width=400>
|
||||||
|
<img src="http://novnc.com/img/noVNC-7.jpg" width=400>
|
||||||
|
|
||||||
See more screenshots <a href="http://kanaka.github.com/noVNC/screenshots.html">here</a>.
|
See more screenshots
|
||||||
|
<a href="http://novnc.com/screenshots.html">here</a>.
|
||||||
|
|
||||||
|
|
||||||
### Browser Requirements
|
### Browser Requirements
|
||||||
|
|
||||||
* HTML5 Canvas (with createImageData): Chrome, Firefox 3.6+, iOS
|
* Chrome 8, Firefox 4, Safari 6, Opera 12, IE 11, Edge 12, etc.
|
||||||
Safari, Opera 11+, Internet Explorer 9+, etc.
|
|
||||||
|
|
||||||
* HTML5 WebSockets: For browsers that do not have builtin
|
* HTML5 Canvas, WebSockets and Typed Arrays
|
||||||
WebSockets support, the project includes
|
|
||||||
<a href="http://github.com/gimite/web-socket-js">web-socket-js</a>,
|
|
||||||
a WebSockets emulator using Adobe Flash. iOS 4.2+ has built-in
|
|
||||||
WebSocket support.
|
|
||||||
|
|
||||||
* Fast Javascript Engine: this is not strictly a requirement, but
|
* Fast Javascript Engine: this is not strictly a requirement, but without a
|
||||||
without a fast Javascript engine, noVNC might be painfully slow.
|
fast Javascript engine, noVNC might be painfully slow.
|
||||||
|
|
||||||
* See the more detailed [browser compatibility wiki page](https://github.com/kanaka/noVNC/wiki/Browser-support).
|
* See the more detailed
|
||||||
|
[browser compatibility wiki page](https://github.com/novnc/noVNC/wiki/Browser-support).
|
||||||
|
|
||||||
|
|
||||||
### Server Requirements
|
### Server Requirements
|
||||||
|
|
||||||
Unless you are using a VNC server with support for WebSockets
|
Unless you are using a VNC server with support for WebSockets connections (such
|
||||||
connections (such as
|
as [x11vnc/libvncserver](http://libvncserver.sourceforge.net/),
|
||||||
[x11vnc/libvncserver](http://libvncserver.sourceforge.net/),
|
|
||||||
[QEMU](http://www.qemu.org/), or
|
[QEMU](http://www.qemu.org/), or
|
||||||
[PocketVNC](http://www.pocketvnc.com/blog/?page_id=866)), you need to
|
[MobileVNC](http://www.smartlab.at/mobilevnc/)), you need to use a
|
||||||
use a WebSockets to TCP socket proxy. There is a python proxy included
|
WebSockets to TCP socket proxy. There is a python proxy included
|
||||||
('websockify').
|
('websockify').
|
||||||
|
|
||||||
|
|
||||||
### Quick Start
|
### Quick Start
|
||||||
|
|
||||||
* Use the launch script to start a mini-webserver and the WebSockets
|
* Use the launch script to start a mini-webserver and the WebSockets proxy
|
||||||
proxy (websockify). The `--vnc` option is used to specify the location of
|
(websockify). The `--vnc` option is used to specify the location of a running
|
||||||
a running VNC server:
|
VNC server:
|
||||||
|
|
||||||
`./utils/launch.sh --vnc localhost:5901`
|
`./utils/launch.sh --vnc localhost:5901`
|
||||||
|
|
||||||
* Point your browser to the cut-and-paste URL that is output by the
|
* Point your browser to the cut-and-paste URL that is output by the launch
|
||||||
launch script. Enter a password if the VNC server has one
|
script. Enter a password if the VNC server has one configured. Hit the
|
||||||
configured. Hit the Connect button and enjoy!
|
Connect button and enjoy!
|
||||||
|
|
||||||
|
|
||||||
### Other Pages
|
### Other Pages
|
||||||
|
|
||||||
* [Encrypted Connections](https://github.com/kanaka/websockify/wiki/Encrypted-Connections). How to setup websockify so that you can use encrypted connections from noVNC.
|
* [Modules/API](https://github.com/novnc/noVNC/wiki/Modules-API) - The library
|
||||||
|
modules and their Javascript API.
|
||||||
|
|
||||||
* [Advanced Usage](https://github.com/kanaka/noVNC/wiki/Advanced-usage). Starting a VNC server, advanced websockify usage, etc.
|
* [Integration](https://github.com/novnc/noVNC/wiki/Integration) - Get noVNC
|
||||||
|
to work in existing projects.
|
||||||
|
|
||||||
* [Integrating noVNC](https://github.com/kanaka/noVNC/wiki/Integration) into existing projects.
|
* [Troubleshooting](https://github.com/novnc/noVNC/wiki/Troubleshooting) - How
|
||||||
|
to troubleshoot problems.
|
||||||
|
|
||||||
* [Troubleshooting noVNC](https://github.com/kanaka/noVNC/wiki/Troubleshooting) problems.
|
* [Encrypted Connections](https://github.com/novnc/websockify/wiki/Encrypted-Connections) -
|
||||||
|
Setup websockify so that you can use encrypted connections from noVNC.
|
||||||
|
|
||||||
|
* [Advanced Usage](https://github.com/novnc/noVNC/wiki/Advanced-usage) -
|
||||||
|
Generating an SSL certificate, starting a VNC server, advanced websockify
|
||||||
|
usage, etc.
|
||||||
|
|
||||||
|
* [Testing](https://github.com/novnc/noVNC/wiki/Testing) - Run and write
|
||||||
|
tests.
|
||||||
|
|
||||||
|
* [Translations](https://github.com/novnc/noVNC/wiki/Translations) - Add and
|
||||||
|
modify localization for JavaScript and HTML.
|
||||||
|
|
||||||
|
|
||||||
### Authors/Contributors
|
### Authors/Contributors
|
||||||
|
|
@ -123,16 +134,17 @@ use a WebSockets to TCP socket proxy. There is a python proxy included
|
||||||
* [Samuel Mannehed](https://github.com/samhed) (Cendio)
|
* [Samuel Mannehed](https://github.com/samhed) (Cendio)
|
||||||
* [Peter Åstrand](https://github.com/astrand) (Cendio)
|
* [Peter Åstrand](https://github.com/astrand) (Cendio)
|
||||||
* [Solly Ross](https://github.com/DirectXMan12) (Red Hat / OpenStack)
|
* [Solly Ross](https://github.com/DirectXMan12) (Red Hat / OpenStack)
|
||||||
|
* [Pierre Ossman](https://github.com/CendioOssman) (Cendio)
|
||||||
|
|
||||||
* Notable contributions:
|
* Notable contributions:
|
||||||
* UI and Icons : Chris Gordon
|
* UI and Icons : Pierre Ossman, Chris Gordon
|
||||||
* Original Logo : Michael Sersen
|
* Original Logo : Michael Sersen
|
||||||
* tight encoding : Michael Tinglof (Mercuri.ca)
|
* tight encoding : Michael Tinglof (Mercuri.ca)
|
||||||
|
|
||||||
* Included libraries:
|
* Included libraries:
|
||||||
* web-socket-js : Hiroshi Ichikawa (github.com/gimite/web-socket-js)
|
|
||||||
* as3crypto : Henri Torgemane (code.google.com/p/as3crypto)
|
* as3crypto : Henri Torgemane (code.google.com/p/as3crypto)
|
||||||
* base64 : Martijn Pieters (Digital Creations 2), Samuel Sieb (sieb.net)
|
* base64 : Martijn Pieters (Digital Creations 2), Samuel Sieb (sieb.net)
|
||||||
* jsunzip : Erik Moller (github.com/operasoftware/jsunzip),
|
|
||||||
* tinflate : Joergen Ibsen (ibsensoftware.com)
|
|
||||||
* DES : Dave Zimmerman (Widget Workshop), Jef Poskanzer (ACME Labs)
|
* DES : Dave Zimmerman (Widget Workshop), Jef Poskanzer (ACME Labs)
|
||||||
|
* Pako : Vitaly Puzrin (https://github.com/nodeca/pako)
|
||||||
|
|
||||||
|
* [Contribution guide](https://github.com/novnc/noVNC/wiki/Contributing)
|
||||||
|
|
|
||||||
92
noVNC/app/images/alt.svg
Normal 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
noVNC/app/images/clipboard.svg
Normal 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
noVNC/app/images/connect.svg
Normal 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
noVNC/app/images/ctrl.svg
Normal 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
noVNC/app/images/ctrlaltdel.svg
Normal 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
noVNC/app/images/disconnect.svg
Normal 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
noVNC/app/images/drag.svg
Normal 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
noVNC/app/images/error.svg
Normal 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
noVNC/app/images/esc.svg
Normal 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
noVNC/app/images/expander.svg
Normal 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
noVNC/app/images/fullscreen.svg
Normal 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
noVNC/app/images/handle.svg
Normal 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
noVNC/app/images/handle_bg.svg
Normal 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
noVNC/app/images/icons/Makefile
Normal 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
noVNC/app/images/icons/novnc-120x120.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
noVNC/app/images/icons/novnc-144x144.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
noVNC/app/images/icons/novnc-152x152.png
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
noVNC/app/images/icons/novnc-16x16.png
Normal file
|
After Width: | Height: | Size: 675 B |
BIN
noVNC/app/images/icons/novnc-192x192.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
noVNC/app/images/icons/novnc-24x24.png
Normal file
|
After Width: | Height: | Size: 1,000 B |
BIN
noVNC/app/images/icons/novnc-32x32.png
Normal file
|
After Width: | Height: | Size: 1 KiB |
BIN
noVNC/app/images/icons/novnc-48x48.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
noVNC/app/images/icons/novnc-60x60.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
noVNC/app/images/icons/novnc-64x64.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
noVNC/app/images/icons/novnc-72x72.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
noVNC/app/images/icons/novnc-76x76.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
noVNC/app/images/icons/novnc-96x96.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
163
noVNC/app/images/icons/novnc-icon-sm.svg
Normal 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
noVNC/app/images/icons/novnc-icon.svg
Normal 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
noVNC/app/images/info.svg
Normal 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
noVNC/app/images/keyboard.svg
Normal 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
noVNC/app/images/mouse_left.svg
Normal 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
noVNC/app/images/mouse_middle.svg
Normal 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
noVNC/app/images/mouse_none.svg
Normal 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
noVNC/app/images/mouse_right.svg
Normal 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
noVNC/app/images/power.svg
Normal 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
noVNC/app/images/settings.svg
Normal 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
noVNC/app/images/tab.svg
Normal 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
noVNC/app/images/toggleextrakeys.svg
Normal 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
noVNC/app/images/warning.svg
Normal 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 |
18
noVNC/app/locale/de.js
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
* Translations for de
|
||||||
|
*
|
||||||
|
* This file was autotomatically generated from de.po
|
||||||
|
* DO NOT EDIT!
|
||||||
|
*/
|
||||||
|
|
||||||
|
Language = {
|
||||||
|
"Connecting...": "Verbunden...",
|
||||||
|
"Connected (encrypted) to ": "Verbunden mit (verschlüsselt) ",
|
||||||
|
"Connected (unencrypted) to ": "Verbunden mit (unverschlüsselt) ",
|
||||||
|
"Disconnecting...": "Verbindung trennen...",
|
||||||
|
"Disconnected": "Verbindung zum Server getrennt",
|
||||||
|
"Must set host and port": "Richten Sie Host und Port ein",
|
||||||
|
"Password is required": "Passwort ist erforderlich",
|
||||||
|
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "'Clipping-Modus' aktiviert, Scrollbalken in 'IE-Vollbildmodus' werden nicht unterstützt",
|
||||||
|
"Disconnect timeout": "Timeout beim trennen",
|
||||||
|
};
|
||||||
74
noVNC/app/locale/el.js
Normal file
|
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
* Translations for el
|
||||||
|
*
|
||||||
|
* This file was autotomatically generated from el.po
|
||||||
|
* DO NOT EDIT!
|
||||||
|
*/
|
||||||
|
|
||||||
|
Language = {
|
||||||
|
"Connecting...": "Συνδέεται...",
|
||||||
|
"Connected (encrypted) to ": "Συνδέθηκε (κρυπτογραφημένα) με το ",
|
||||||
|
"Connected (unencrypted) to ": "Συνδέθηκε (μη κρυπτογραφημένα) με το ",
|
||||||
|
"Disconnecting...": "Aποσυνδέεται...",
|
||||||
|
"Disconnected": "Αποσυνδέθηκε",
|
||||||
|
"Must set host and port": "Πρέπει να οριστεί το όνομα και η πόρτα του διακομιστή",
|
||||||
|
"Password is required": "Απαιτείται ο κωδικός πρόσβασης",
|
||||||
|
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "Εφαρμογή λειτουργίας αποκοπής αφού δεν υποστηρίζονται οι λωρίδες κύλισης σε πλήρη οθόνη στον IE",
|
||||||
|
"Disconnect timeout": "Παρέλευση χρονικού ορίου αποσύνδεσης",
|
||||||
|
"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": "Ρυθμίσεις",
|
||||||
|
"Encrypt": "Κρυπτογράφηση",
|
||||||
|
"True Color": "Πραγματικά Χρώματα",
|
||||||
|
"Local Cursor": "Τοπικός Δρομέας",
|
||||||
|
"Clip to Window": "Αποκοπή στο όριο του Παράθυρου",
|
||||||
|
"Shared Mode": "Κοινόχρηστη Λειτουργία",
|
||||||
|
"View Only": "Μόνο Θέαση",
|
||||||
|
"Path:": "Διαδρομή:",
|
||||||
|
"Scaling Mode:": "Λειτουργία Κλιμάκωσης:",
|
||||||
|
"None": "Καμία",
|
||||||
|
"Local Scaling": "Τοπική Κλιμάκωση",
|
||||||
|
"Local Downscaling": "Τοπική Συρρίκνωση",
|
||||||
|
"Remote Resizing": "Απομακρυσμένη Αλλαγή μεγέθους",
|
||||||
|
"Repeater ID:": "Repeater ID:",
|
||||||
|
"Style:": "Στυλ:",
|
||||||
|
"default": "προεπιλεγμένο",
|
||||||
|
"Logging:": "Καταγραφή:",
|
||||||
|
"Apply": "Εφαρμογή",
|
||||||
|
"Host:": "Όνομα διακομιστή:",
|
||||||
|
"Port:": "Πόρτα διακομιστή:",
|
||||||
|
"Password:": "Κωδικός Πρόσβασης:",
|
||||||
|
"Token:": "Διακριτικό:",
|
||||||
|
"Send Password": "Αποστολή Κωδικού Πρόσβασης",
|
||||||
|
"Canvas not supported.": "Δεν υποστηρίζεται το στοιχείο Canvas",
|
||||||
|
};
|
||||||
18
noVNC/app/locale/nl.js
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
* Translations for nl
|
||||||
|
*
|
||||||
|
* This file was autotomatically generated from nl.po
|
||||||
|
* DO NOT EDIT!
|
||||||
|
*/
|
||||||
|
|
||||||
|
Language = {
|
||||||
|
"Connecting...": "Verbinden...",
|
||||||
|
"Connected (encrypted) to ": "Verbonden (versleuteld) met ",
|
||||||
|
"Connected (unencrypted) to ": "Verbonden (onversleuteld) met ",
|
||||||
|
"Disconnecting...": "Verbinding verbreken...",
|
||||||
|
"Disconnected": "Verbinding verbroken",
|
||||||
|
"Must set host and port": "Host en poort moeten worden ingesteld",
|
||||||
|
"Password is required": "Wachtwoord is vereist",
|
||||||
|
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "''Clipping mode' ingeschakeld, omdat schuifbalken in volledige-scherm-modus in IE niet worden ondersteund",
|
||||||
|
"Disconnect timeout": "Timeout tijdens verbreken van verbinding",
|
||||||
|
};
|
||||||
77
noVNC/app/locale/sv.js
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
* Translations for sv
|
||||||
|
*
|
||||||
|
* This file was autotomatically generated from sv.po
|
||||||
|
* DO NOT EDIT!
|
||||||
|
*/
|
||||||
|
|
||||||
|
Language = {
|
||||||
|
"Connecting...": "Ansluter...",
|
||||||
|
"Connected (encrypted) to ": "Ansluten (krypterat) till ",
|
||||||
|
"Connected (unencrypted) to ": "Ansluten (okrypterat) till ",
|
||||||
|
"Disconnecting...": "Kopplar ner...",
|
||||||
|
"Disconnected": "Frånkopplad",
|
||||||
|
"Must set host and port": "Du måste specifiera en host och port",
|
||||||
|
"Password is required": "Lösenord krävs",
|
||||||
|
"Forcing clipping mode since scrollbars aren't supported by IE in fullscreen": "Tvingar 'Clipping mode' eftersom skrollning inte stödjs av IE i fullskärm",
|
||||||
|
"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",
|
||||||
|
"Encrypt": "Kryptera",
|
||||||
|
"True Color": "Fullfärg",
|
||||||
|
"Local Cursor": "Lokal Muspekare",
|
||||||
|
"Clip to Window": "Begränsa till Fönster",
|
||||||
|
"Shared Mode": "Delat Läge",
|
||||||
|
"View Only": "Endast Visning",
|
||||||
|
"Path:": "Sökväg:",
|
||||||
|
"Scaling Mode:": "Skalningsläge:",
|
||||||
|
"None": "Ingen",
|
||||||
|
"Local Scaling": "Lokal Skalning",
|
||||||
|
"Local Downscaling": "Lokal Nedskalning",
|
||||||
|
"Remote Resizing": "Ändra Storlek",
|
||||||
|
"Repeater ID:": "Repeater-ID:",
|
||||||
|
"Style:": "Stil:",
|
||||||
|
"default": "standard",
|
||||||
|
"Logging:": "Loggning:",
|
||||||
|
"Apply": "Verkställ",
|
||||||
|
"Connect": "Anslut",
|
||||||
|
"Disconnect": "Koppla från",
|
||||||
|
"Connection": "Uppkoppling",
|
||||||
|
"Host:": "Värd:",
|
||||||
|
"Port:": "Port:",
|
||||||
|
"Password:": "Lösenord:",
|
||||||
|
"Token:": "Token:",
|
||||||
|
"Send Password": "Skicka Lösenord",
|
||||||
|
"Canvas not supported.": "Canvas stöds ej",
|
||||||
|
};
|
||||||
4
noVNC/app/sounds/CREDITS
Normal 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
noVNC/app/sounds/bell.mp3
Normal file
BIN
noVNC/app/sounds/bell.oga
Normal file
89
noVNC/app/styles/auto.css
Normal file
|
|
@ -0,0 +1,89 @@
|
||||||
|
/*
|
||||||
|
* noVNC auto CSS
|
||||||
|
* Copyright (C) 2012 Joel Martin
|
||||||
|
* Copyright (C) 2016 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;
|
||||||
|
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_container {
|
||||||
|
display: table;
|
||||||
|
width:100%;
|
||||||
|
height:100%;
|
||||||
|
background-color:#313131;
|
||||||
|
border-bottom-right-radius: 800px 600px;
|
||||||
|
/*border-top-left-radius: 800px 600px;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
#noVNC_status {
|
||||||
|
font-size: 12px;
|
||||||
|
padding-top: 4px;
|
||||||
|
height:32px;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #fff;
|
||||||
|
z-index: 0;
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
margin-left: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.noVNC_status_normal {
|
||||||
|
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 */
|
||||||
|
}
|
||||||
|
|
||||||
|
.noVNC_status_error {
|
||||||
|
background: #f04040; /* Old browsers */
|
||||||
|
background: -moz-linear-gradient(top, #f04040 0%, #899cb3 49%, #7e93af 51%, #6e84a3 100%); /* FF3.6+ */
|
||||||
|
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f04040), color-stop(49%,#899cb3), color-stop(51%,#7e93af), color-stop(100%,#6e84a3)); /* Chrome,Safari4+ */
|
||||||
|
background: -webkit-linear-gradient(top, #f04040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Chrome10+,Safari5.1+ */
|
||||||
|
background: -o-linear-gradient(top, #f04040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Opera11.10+ */
|
||||||
|
background: -ms-linear-gradient(top, #f04040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* IE10+ */
|
||||||
|
background: linear-gradient(top, #f04040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* W3C */
|
||||||
|
}
|
||||||
|
|
||||||
|
.noVNC_status_warn {
|
||||||
|
background: #f0f040; /* Old browsers */
|
||||||
|
background: -moz-linear-gradient(top, #f0f040 0%, #899cb3 49%, #7e93af 51%, #6e84a3 100%); /* FF3.6+ */
|
||||||
|
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f0f040), color-stop(49%,#899cb3), color-stop(51%,#7e93af), color-stop(100%,#6e84a3)); /* Chrome,Safari4+ */
|
||||||
|
background: -webkit-linear-gradient(top, #f0f040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Chrome10+,Safari5.1+ */
|
||||||
|
background: -o-linear-gradient(top, #f0f040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* Opera11.10+ */
|
||||||
|
background: -ms-linear-gradient(top, #f0f040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* IE10+ */
|
||||||
|
background: linear-gradient(top, #f0f040 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%); /* W3C */
|
||||||
|
}
|
||||||
|
|
||||||
|
#noVNC_buttons {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do not set width/height for VNC_canvas or incorrect
|
||||||
|
* scaling will occur. Canvas size depends on remote VNC
|
||||||
|
* settings and noVNC settings. */
|
||||||
|
#noVNC_canvas {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
876
noVNC/app/styles/base.css
Normal file
|
|
@ -0,0 +1,876 @@
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
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 {
|
||||||
|
position: fixed;
|
||||||
|
z-index: 1000;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, -50px);
|
||||||
|
transition: 0.5s ease-in-out;
|
||||||
|
|
||||||
|
visibility: hidden;
|
||||||
|
opacity: 0;
|
||||||
|
|
||||||
|
top: 60px;
|
||||||
|
padding: 15px;
|
||||||
|
width: auto;
|
||||||
|
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
word-wrap: break-word;
|
||||||
|
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 {
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
visibility: visible;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#noVNC_fallback_errormsg {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
#noVNC_fallback_error .noVNC_location {
|
||||||
|
font-style: italic;
|
||||||
|
font-size: 0.8em;
|
||||||
|
color: rgba(255, 255, 255, 0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
#noVNC_fallback_error .noVNC_stack {
|
||||||
|
padding: 10px;
|
||||||
|
margin: 10px;
|
||||||
|
font-size: 0.8em;
|
||||||
|
text-align: left;
|
||||||
|
white-space: pre;
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.5);
|
||||||
|
background: rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
}
|
||||||
|
:root:not(.noVNC_touch) .noVNC_button.noVNC_selected:hover {
|
||||||
|
border-color: rgba(0, 0, 0, 0.4);
|
||||||
|
background: rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
:root:not(.noVNC_touch) .noVNC_button:hover {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* XVP Shutdown/Reboot */
|
||||||
|
:root:not(.noVNC_connected) #noVNC_xvp_button {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
#noVNC_xvp {
|
||||||
|
}
|
||||||
|
#noVNC_xvp_buttons {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#noVNC_xvp 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_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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* HTML5 Canvas */
|
||||||
|
#noVNC_screen {
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: auto;
|
||||||
|
background-color: rgb(40, 40, 40);
|
||||||
|
}
|
||||||
|
:root:not(.noVNC_connected) #noVNC_screen {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do not set width/height for VNC_canvas or incorrect
|
||||||
|
* scaling will occur. Canvas size depends on remote VNC
|
||||||
|
* settings and noVNC settings. */
|
||||||
|
#noVNC_canvas {
|
||||||
|
margin: auto;
|
||||||
|
/* IE miscalculates width without this :( */
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*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;
|
||||||
|
}
|
||||||
|
}
|
||||||
1761
noVNC/app/ui.js
Normal file
|
|
@ -10,25 +10,12 @@
|
||||||
/*jslint bitwise: false, white: false, browser: true, devel: true */
|
/*jslint bitwise: false, white: false, browser: true, devel: true */
|
||||||
/*global Util, window, document */
|
/*global Util, window, document */
|
||||||
|
|
||||||
// Globals defined here
|
/* [module]
|
||||||
var WebUtil = {}, $D;
|
* import Util from "../core/util";
|
||||||
|
|
||||||
/*
|
|
||||||
* Simple DOM selector by ID
|
|
||||||
*/
|
*/
|
||||||
if (!window.$D) {
|
|
||||||
window.$D = function (id) {
|
|
||||||
if (document.getElementById) {
|
|
||||||
return document.getElementById(id);
|
|
||||||
} else if (document.all) {
|
|
||||||
return document.all[id];
|
|
||||||
} else if (document.layers) {
|
|
||||||
return document.layers[id];
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Globals defined here
|
||||||
|
var WebUtil = {};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
|
|
@ -90,6 +77,29 @@ WebUtil.getQueryVar = function (name, defVal) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Read a hash fragment variable
|
||||||
|
WebUtil.getHashVar = function (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
|
||||||
|
WebUtil.getConfigVar = function (name, defVal) {
|
||||||
|
"use strict";
|
||||||
|
var val = WebUtil.getHashVar(name);
|
||||||
|
if (val === null) {
|
||||||
|
val = WebUtil.getQueryVar(name, defVal);
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Cookie handling. Dervied from: http://www.quirksmode.org/js/cookies.html
|
* Cookie handling. Dervied from: http://www.quirksmode.org/js/cookies.html
|
||||||
|
|
@ -199,41 +209,103 @@ WebUtil.eraseSetting = function (name) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
WebUtil.injectParamIfMissing = function (path, param, value) {
|
||||||
* Alternate stylesheet selection
|
// force pretend that we're dealing with a relative path
|
||||||
*/
|
// (assume that we wanted an extra if we pass one in)
|
||||||
WebUtil.getStylesheets = function () {
|
path = "/" + path;
|
||||||
"use strict";
|
|
||||||
var links = document.getElementsByTagName("link");
|
|
||||||
var sheets = [];
|
|
||||||
|
|
||||||
for (var i = 0; i < links.length; i += 1) {
|
var elem = document.createElement('a');
|
||||||
if (links[i].title &&
|
elem.href = path;
|
||||||
links[i].rel.toUpperCase().indexOf("STYLESHEET") > -1) {
|
|
||||||
sheets.push(links[i]);
|
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;
|
||||||
}
|
}
|
||||||
return sheets;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// No sheet means try and use value from cookie, null sheet used to
|
// Dynamically load scripts without using document.write()
|
||||||
// clear all alternates.
|
// Reference: http://unixpapa.com/js/dyna.html
|
||||||
WebUtil.selectStylesheet = function (sheet) {
|
//
|
||||||
|
// Handles the case where load_scripts is invoked from a script that
|
||||||
|
// itself is loaded via load_scripts. Once all scripts are loaded the
|
||||||
|
// window.onscriptsloaded handler is called (if set).
|
||||||
|
WebUtil.get_include_uri = function (root_dir) {
|
||||||
|
return (typeof INCLUDE_URI !== "undefined") ? INCLUDE_URI + root_dir + '/' : root_dir + '/';
|
||||||
|
};
|
||||||
|
WebUtil._loading_scripts = [];
|
||||||
|
WebUtil._pending_scripts = [];
|
||||||
|
WebUtil.load_scripts = function (files_by_dir) {
|
||||||
"use strict";
|
"use strict";
|
||||||
if (typeof sheet === 'undefined') {
|
var head = document.getElementsByTagName('head')[0], script,
|
||||||
sheet = 'default';
|
ls = WebUtil._loading_scripts, ps = WebUtil._pending_scripts;
|
||||||
}
|
|
||||||
|
|
||||||
var sheets = WebUtil.getStylesheets();
|
var loadFunc = function (e) {
|
||||||
for (var i = 0; i < sheets.length; i += 1) {
|
while (ls.length > 0 && (ls[0].readyState === 'loaded' ||
|
||||||
var link = sheets[i];
|
ls[0].readyState === 'complete')) {
|
||||||
if (link.title === sheet) {
|
// For IE, append the script to trigger execution
|
||||||
Util.Debug("Using stylesheet " + sheet);
|
var s = ls.shift();
|
||||||
link.disabled = false;
|
//console.log("loaded script: " + s.src);
|
||||||
} else {
|
head.appendChild(s);
|
||||||
//Util.Debug("Skipping stylesheet " + link.title);
|
}
|
||||||
link.disabled = true;
|
if (!this.readyState ||
|
||||||
|
(Util.Engine.presto && this.readyState === 'loaded') ||
|
||||||
|
this.readyState === 'complete') {
|
||||||
|
if (ps.indexOf(this) >= 0) {
|
||||||
|
this.onload = this.onreadystatechange = null;
|
||||||
|
//console.log("completed script: " + this.src);
|
||||||
|
ps.splice(ps.indexOf(this), 1);
|
||||||
|
|
||||||
|
// Call window.onscriptsload after last script loads
|
||||||
|
if (ps.length === 0 && window.onscriptsload) {
|
||||||
|
window.onscriptsload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var root_dirs = Object.keys(files_by_dir);
|
||||||
|
|
||||||
|
for (var d = 0; d < root_dirs.length; d++) {
|
||||||
|
var root_dir = root_dirs[d];
|
||||||
|
var files = files_by_dir[root_dir];
|
||||||
|
|
||||||
|
for (var f = 0; f < files.length; f++) {
|
||||||
|
script = document.createElement('script');
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.src = WebUtil.get_include_uri(root_dir) + files[f];
|
||||||
|
//console.log("loading script: " + script.src);
|
||||||
|
script.onload = script.onreadystatechange = loadFunc;
|
||||||
|
// In-order script execution tricks
|
||||||
|
if (Util.Engine.trident) {
|
||||||
|
// For IE wait until readyState is 'loaded' before
|
||||||
|
// appending it which will trigger execution
|
||||||
|
// http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order
|
||||||
|
ls.push(script);
|
||||||
|
} else {
|
||||||
|
// For webkit and firefox set async=false and append now
|
||||||
|
// https://developer.mozilla.org/en-US/docs/HTML/Element/script
|
||||||
|
script.async = false;
|
||||||
|
head.appendChild(script);
|
||||||
|
}
|
||||||
|
ps.push(script);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return sheet;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* [module] export default WebUtil; */
|
||||||
|
|
@ -111,3 +111,5 @@ var Base64 = {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}; /* End of Base64 namespace */
|
}; /* End of Base64 namespace */
|
||||||
|
|
||||||
|
/* [module] export default Base64; */
|
||||||
|
|
@ -77,7 +77,7 @@
|
||||||
|
|
||||||
/* jslint white: false */
|
/* jslint white: false */
|
||||||
|
|
||||||
function DES(passwd) {
|
/* [module] export default */ function DES(passwd) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
// Tables, permutations, S-boxes, etc.
|
// Tables, permutations, S-boxes, etc.
|
||||||
|
|
@ -273,4 +273,4 @@ function DES(passwd) {
|
||||||
setKeys(passwd); // Setup keys
|
setKeys(passwd); // Setup keys
|
||||||
return {'encrypt': encrypt}; // Public interface
|
return {'encrypt': encrypt}; // Public interface
|
||||||
|
|
||||||
} // function DES
|
}; // function DES
|
||||||
872
noVNC/core/display.js
Normal file
|
|
@ -0,0 +1,872 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*jslint browser: true, white: false */
|
||||||
|
/*global Util, Base64, changeCursor */
|
||||||
|
|
||||||
|
/* [module]
|
||||||
|
* import Util from "./util";
|
||||||
|
* import Base64 from "./base64";
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* [module] export default */ function Display(defaults) {
|
||||||
|
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;
|
||||||
|
|
||||||
|
Util.set_defaults(this, defaults, {
|
||||||
|
'true_color': true,
|
||||||
|
'colourMap': [],
|
||||||
|
'scale': 1.0,
|
||||||
|
'viewport': false,
|
||||||
|
'render_mode': '',
|
||||||
|
"onFlush": function () {},
|
||||||
|
});
|
||||||
|
|
||||||
|
Util.Debug(">> Display.constructor");
|
||||||
|
|
||||||
|
// The visible canvas
|
||||||
|
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 };
|
||||||
|
|
||||||
|
Util.Debug("User Agent: " + navigator.userAgent);
|
||||||
|
if (Util.Engine.gecko) { Util.Debug("Browser: gecko " + Util.Engine.gecko); }
|
||||||
|
if (Util.Engine.webkit) { Util.Debug("Browser: webkit " + Util.Engine.webkit); }
|
||||||
|
if (Util.Engine.trident) { Util.Debug("Browser: trident " + Util.Engine.trident); }
|
||||||
|
if (Util.Engine.presto) { Util.Debug("Browser: presto " + Util.Engine.presto); }
|
||||||
|
|
||||||
|
this.clear();
|
||||||
|
|
||||||
|
// Check canvas features
|
||||||
|
if ('createImageData' in this._drawCtx) {
|
||||||
|
this._render_mode = 'canvas rendering';
|
||||||
|
} else {
|
||||||
|
throw new Error("Canvas does not support createImageData");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._prefer_js === null) {
|
||||||
|
Util.Info("Prefering javascript operations");
|
||||||
|
this._prefer_js = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine browser support for setting the cursor via data URI scheme
|
||||||
|
if (this._cursor_uri || this._cursor_uri === null ||
|
||||||
|
this._cursor_uri === undefined) {
|
||||||
|
this._cursor_uri = Util.browserSupportsCursorURIs();
|
||||||
|
}
|
||||||
|
|
||||||
|
Util.Debug("<< Display.constructor");
|
||||||
|
};
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var SUPPORTS_IMAGEDATA_CONSTRUCTOR = false;
|
||||||
|
try {
|
||||||
|
new ImageData(new Uint8ClampedArray(4), 1, 1);
|
||||||
|
SUPPORTS_IMAGEDATA_CONSTRUCTOR = true;
|
||||||
|
} catch (ex) {
|
||||||
|
// ignore failure
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Display.prototype = {
|
||||||
|
// Public methods
|
||||||
|
viewportChangePos: function (deltaX, deltaY) {
|
||||||
|
var vp = this._viewportLoc;
|
||||||
|
deltaX = Math.floor(deltaX);
|
||||||
|
deltaY = Math.floor(deltaY);
|
||||||
|
|
||||||
|
if (!this._viewport) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
Util.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._viewport ||
|
||||||
|
typeof(width) === "undefined" ||
|
||||||
|
typeof(height) === "undefined") {
|
||||||
|
|
||||||
|
Util.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," + Base64.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);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._prefer_js) {
|
||||||
|
var bgr;
|
||||||
|
if (this._true_color) {
|
||||||
|
bgr = color;
|
||||||
|
} else {
|
||||||
|
bgr = this._colourMap[color[0]];
|
||||||
|
}
|
||||||
|
var red = bgr[2];
|
||||||
|
var green = bgr[1];
|
||||||
|
var blue = bgr[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;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.fillRect(x, y, width, height, color, true);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// update sub-rectangle of the current tile
|
||||||
|
subTile: function (x, y, w, h, color) {
|
||||||
|
if (this._prefer_js) {
|
||||||
|
var bgr;
|
||||||
|
if (this._true_color) {
|
||||||
|
bgr = color;
|
||||||
|
} else {
|
||||||
|
bgr = this._colourMap[color[0]];
|
||||||
|
}
|
||||||
|
var red = bgr[2];
|
||||||
|
var green = bgr[1];
|
||||||
|
var blue = bgr[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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.fillRect(this._tile_x + x, this._tile_y + y, w, h, color, true);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// draw the current tile to the screen
|
||||||
|
finishTile: function () {
|
||||||
|
if (this._prefer_js) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
// else: No-op -- already done by setSubTile
|
||||||
|
},
|
||||||
|
|
||||||
|
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 if (this._true_color) {
|
||||||
|
this._bgrxImageData(x, y, width, height, arr, offset);
|
||||||
|
} else {
|
||||||
|
this._cmapImageData(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 if (this._true_color) {
|
||||||
|
this._rgbImageData(x, y, width, height, arr, offset);
|
||||||
|
} else {
|
||||||
|
// probably wrong?
|
||||||
|
this._cmapImageData(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) {
|
||||||
|
if (this._cursor_uri === false) {
|
||||||
|
Util.Warn("changeCursor called but no cursor data URI support");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._true_color) {
|
||||||
|
Display.changeCursor(this._target, pixels, mask, hotx, hoty, w, h);
|
||||||
|
} else {
|
||||||
|
Display.changeCursor(this._target, pixels, mask, hotx, hoty, w, h, this._colourMap);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
defaultCursor: function () {
|
||||||
|
this._target.style.cursor = "default";
|
||||||
|
},
|
||||||
|
|
||||||
|
disableLocalCursor: function () {
|
||||||
|
this._target.style.cursor = "none";
|
||||||
|
},
|
||||||
|
|
||||||
|
clippingDisplay: function () {
|
||||||
|
var vp = this._viewportLoc;
|
||||||
|
return this._fb_width > vp.w || this._fb_height > vp.h;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Overridden getters/setters
|
||||||
|
set_scale: function (scale) {
|
||||||
|
this._rescale(scale);
|
||||||
|
},
|
||||||
|
|
||||||
|
set_viewport: function (viewport) {
|
||||||
|
this._viewport = viewport;
|
||||||
|
// May need to readjust the viewport dimensions
|
||||||
|
var vp = this._viewportLoc;
|
||||||
|
this.viewportChangeSize(vp.w, vp.h);
|
||||||
|
this.viewportChangePos(0, 0);
|
||||||
|
},
|
||||||
|
|
||||||
|
get_width: function () {
|
||||||
|
return this._fb_width;
|
||||||
|
},
|
||||||
|
get_height: function () {
|
||||||
|
return this._fb_height;
|
||||||
|
},
|
||||||
|
|
||||||
|
autoscale: function (containerWidth, containerHeight, downscaleOnly) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scaleRatio > 1.0 && downscaleOnly) {
|
||||||
|
scaleRatio = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 bgr;
|
||||||
|
if (this._true_color) {
|
||||||
|
bgr = color;
|
||||||
|
} else {
|
||||||
|
bgr = this._colourMap[color];
|
||||||
|
}
|
||||||
|
|
||||||
|
var newStyle = 'rgb(' + bgr[2] + ',' + bgr[1] + ',' + bgr[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);
|
||||||
|
},
|
||||||
|
|
||||||
|
_cmapImageData: function (x, y, width, height, arr, offset) {
|
||||||
|
var img = this._drawCtx.createImageData(width, height);
|
||||||
|
var data = img.data;
|
||||||
|
var cmap = this._colourMap;
|
||||||
|
for (var i = 0, j = offset; i < width * height * 4; i += 4, j++) {
|
||||||
|
var bgr = cmap[arr[j]];
|
||||||
|
data[i] = bgr[2];
|
||||||
|
data[i + 1] = bgr[1];
|
||||||
|
data[i + 2] = bgr[0];
|
||||||
|
data[i + 3] = 255; // Alpha
|
||||||
|
}
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
Util.make_properties(Display, [
|
||||||
|
['target', 'wo', 'dom'], // Canvas element for rendering
|
||||||
|
['context', 'ro', 'raw'], // Canvas 2D context for rendering (read-only)
|
||||||
|
['logo', 'rw', 'raw'], // Logo to display when cleared: {"width": w, "height": h, "type": mime-type, "data": data}
|
||||||
|
['true_color', 'rw', 'bool'], // Use true-color pixel data
|
||||||
|
['colourMap', 'rw', 'arr'], // Colour map array (when not true-color)
|
||||||
|
['scale', 'rw', 'float'], // Display area scale factor 0.0 - 1.0
|
||||||
|
['viewport', 'rw', 'bool'], // Use viewport clipping
|
||||||
|
['width', 'ro', 'int'], // Display area width
|
||||||
|
['height', 'ro', 'int'], // Display area height
|
||||||
|
|
||||||
|
['render_mode', 'ro', 'str'], // Canvas rendering mode (read-only)
|
||||||
|
|
||||||
|
['prefer_js', 'rw', 'str'], // Prefer Javascript over canvas methods
|
||||||
|
['cursor_uri', 'rw', 'raw'], // Can we render cursor using data URI
|
||||||
|
|
||||||
|
['onFlush', 'rw', 'func'], // onFlush(): A flush request has finished
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Class Methods
|
||||||
|
Display.changeCursor = function (target, pixels, mask, hotx, hoty, w0, h0, cmap) {
|
||||||
|
var w = w0;
|
||||||
|
var h = h0;
|
||||||
|
if (h < w) {
|
||||||
|
h = w; // increase h to make it square
|
||||||
|
} else {
|
||||||
|
w = h; // increase w to make it square
|
||||||
|
}
|
||||||
|
|
||||||
|
var cur = [];
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
};
|
||||||
|
|
||||||
|
var IHDRsz = 40;
|
||||||
|
var RGBsz = w * h * 4;
|
||||||
|
var XORsz = Math.ceil((w * h) / 8.0);
|
||||||
|
var ANDsz = Math.ceil((w * h) / 8.0);
|
||||||
|
|
||||||
|
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);
|
||||||
|
// 42: Size of Image
|
||||||
|
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[])
|
||||||
|
var y, x;
|
||||||
|
for (y = h - 1; y >= 0; y--) {
|
||||||
|
for (x = 0; x < w; x++) {
|
||||||
|
if (x >= w0 || y >= h0) {
|
||||||
|
cur.push(0); // blue
|
||||||
|
cur.push(0); // green
|
||||||
|
cur.push(0); // red
|
||||||
|
cur.push(0); // alpha
|
||||||
|
} else {
|
||||||
|
var idx = y * Math.ceil(w0 / 8) + Math.floor(x / 8);
|
||||||
|
var alpha = (mask[idx] << (x % 8)) & 0x80 ? 255 : 0;
|
||||||
|
if (cmap) {
|
||||||
|
idx = (w0 * y) + x;
|
||||||
|
var 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]); // blue
|
||||||
|
cur.push(pixels[idx + 1]); // green
|
||||||
|
cur.push(pixels[idx + 2]); // red
|
||||||
|
cur.push(alpha); // alpha
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// XOR/bitmask data (BYTE icXOR[])
|
||||||
|
// (ignored, just needs to be the right size)
|
||||||
|
for (y = 0; y < h; y++) {
|
||||||
|
for (x = 0; x < Math.ceil(w / 8); x++) {
|
||||||
|
cur.push(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AND/bitmask data (BYTE icAND[])
|
||||||
|
// (ignored, just needs to be the right size)
|
||||||
|
for (y = 0; y < h; y++) {
|
||||||
|
for (x = 0; x < Math.ceil(w / 8); x++) {
|
||||||
|
cur.push(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var url = 'data:image/x-icon;base64,' + Base64.encode(cur);
|
||||||
|
target.style.cursor = 'url(' + url + ')' + hotx + ' ' + hoty + ', default';
|
||||||
|
};
|
||||||
|
})();
|
||||||
2453
noVNC/core/inflator.js
Normal file
40
noVNC/core/inflator.mod.js
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
var zlib = require('pako/lib/zlib/inflate.js');
|
||||||
|
var ZStream = require('pako/lib/zlib/zstream.js');
|
||||||
|
|
||||||
|
function Inflate() {
|
||||||
|
this.strm = new ZStream();
|
||||||
|
this.chunkSize = 1024 * 10 * 10;
|
||||||
|
this.strm.output = new Uint8Array(this.chunkSize);
|
||||||
|
this.windowBits = 5;
|
||||||
|
|
||||||
|
zlib.inflateInit(this.strm, this.windowBits);
|
||||||
|
};
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
zlib.inflate(this.strm, flush);
|
||||||
|
|
||||||
|
return new Uint8Array(this.strm.output.buffer, 0, this.strm.next_out);
|
||||||
|
},
|
||||||
|
|
||||||
|
reset: function () {
|
||||||
|
zlib.inflateReset(this.strm);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = { Inflate: Inflate };
|
||||||
|
|
@ -8,7 +8,12 @@
|
||||||
/*jslint browser: true, white: false */
|
/*jslint browser: true, white: false */
|
||||||
/*global window, Util */
|
/*global window, Util */
|
||||||
|
|
||||||
var Keyboard, Mouse;
|
/* [module]
|
||||||
|
* import Util from "../util";
|
||||||
|
* import KeyboardUtil from "./util";
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* [module] export */ var Keyboard;
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
@ -27,10 +32,10 @@ var Keyboard, Mouse;
|
||||||
});
|
});
|
||||||
|
|
||||||
// create the keyboard handler
|
// create the keyboard handler
|
||||||
this._handler = new KeyEventDecoder(kbdUtil.ModifierSync(),
|
this._handler = new KeyboardUtil.KeyEventDecoder(KeyboardUtil.ModifierSync(),
|
||||||
VerifyCharModifier( /* jshint newcap: false */
|
KeyboardUtil.VerifyCharModifier( /* jshint newcap: false */
|
||||||
TrackKeyState(
|
KeyboardUtil.TrackKeyState(
|
||||||
EscapeModifiers(this._handleRfbEvent.bind(this))
|
KeyboardUtil.EscapeModifiers(this._handleRfbEvent.bind(this))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
); /* jshint newcap: true */
|
); /* jshint newcap: true */
|
||||||
|
|
@ -51,49 +56,45 @@ var Keyboard, Mouse;
|
||||||
if (this._onKeyPress) {
|
if (this._onKeyPress) {
|
||||||
Util.Debug("onKeyPress " + (e.type == 'keydown' ? "down" : "up") +
|
Util.Debug("onKeyPress " + (e.type == 'keydown' ? "down" : "up") +
|
||||||
", keysym: " + e.keysym.keysym + "(" + e.keysym.keyname + ")");
|
", keysym: " + e.keysym.keysym + "(" + e.keysym.keyname + ")");
|
||||||
this._onKeyPress(e.keysym.keysym, e.type == 'keydown');
|
this._onKeyPress(e);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
setQEMUVNCKeyboardHandler: function () {
|
||||||
|
this._handler = new KeyboardUtil.QEMUKeyEventDecoder(KeyboardUtil.ModifierSync(),
|
||||||
|
KeyboardUtil.TrackQEMUKeyState(
|
||||||
|
this._handleRfbEvent.bind(this)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
_handleKeyDown: function (e) {
|
_handleKeyDown: function (e) {
|
||||||
if (!this._focused) { return true; }
|
if (!this._focused) { return; }
|
||||||
|
|
||||||
if (this._handler.keydown(e)) {
|
if (this._handler.keydown(e)) {
|
||||||
// Suppress bubbling/default actions
|
// Suppress bubbling/default actions
|
||||||
Util.stopEvent(e);
|
Util.stopEvent(e);
|
||||||
return false;
|
|
||||||
} else {
|
} else {
|
||||||
// Allow the event to bubble and become a keyPress event which
|
// Allow the event to bubble and become a keyPress event which
|
||||||
// will have the character code translated
|
// will have the character code translated
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_handleKeyPress: function (e) {
|
_handleKeyPress: function (e) {
|
||||||
if (!this._focused) { return true; }
|
if (!this._focused) { return; }
|
||||||
|
|
||||||
if (this._handler.keypress(e)) {
|
if (this._handler.keypress(e)) {
|
||||||
// Suppress bubbling/default actions
|
// Suppress bubbling/default actions
|
||||||
Util.stopEvent(e);
|
Util.stopEvent(e);
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
// Allow the event to bubble and become a keyPress event which
|
|
||||||
// will have the character code translated
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_handleKeyUp: function (e) {
|
_handleKeyUp: function (e) {
|
||||||
if (!this._focused) { return true; }
|
if (!this._focused) { return; }
|
||||||
|
|
||||||
if (this._handler.keyup(e)) {
|
if (this._handler.keyup(e)) {
|
||||||
// Suppress bubbling/default actions
|
// Suppress bubbling/default actions
|
||||||
Util.stopEvent(e);
|
Util.stopEvent(e);
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
// Allow the event to bubble and become a keyPress event which
|
|
||||||
// will have the character code translated
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -109,12 +110,12 @@ var Keyboard, Mouse;
|
||||||
//Util.Debug(">> Keyboard.grab");
|
//Util.Debug(">> Keyboard.grab");
|
||||||
var c = this._target;
|
var c = this._target;
|
||||||
|
|
||||||
Util.addEvent(c, 'keydown', this._eventHandlers.keydown);
|
c.addEventListener('keydown', this._eventHandlers.keydown);
|
||||||
Util.addEvent(c, 'keyup', this._eventHandlers.keyup);
|
c.addEventListener('keyup', this._eventHandlers.keyup);
|
||||||
Util.addEvent(c, 'keypress', this._eventHandlers.keypress);
|
c.addEventListener('keypress', this._eventHandlers.keypress);
|
||||||
|
|
||||||
// Release (key up) if window loses focus
|
// Release (key up) if window loses focus
|
||||||
Util.addEvent(window, 'blur', this._eventHandlers.blur);
|
window.addEventListener('blur', this._eventHandlers.blur);
|
||||||
|
|
||||||
//Util.Debug("<< Keyboard.grab");
|
//Util.Debug("<< Keyboard.grab");
|
||||||
},
|
},
|
||||||
|
|
@ -123,10 +124,10 @@ var Keyboard, Mouse;
|
||||||
//Util.Debug(">> Keyboard.ungrab");
|
//Util.Debug(">> Keyboard.ungrab");
|
||||||
var c = this._target;
|
var c = this._target;
|
||||||
|
|
||||||
Util.removeEvent(c, 'keydown', this._eventHandlers.keydown);
|
c.removeEventListener('keydown', this._eventHandlers.keydown);
|
||||||
Util.removeEvent(c, 'keyup', this._eventHandlers.keyup);
|
c.removeEventListener('keyup', this._eventHandlers.keyup);
|
||||||
Util.removeEvent(c, 'keypress', this._eventHandlers.keypress);
|
c.removeEventListener('keypress', this._eventHandlers.keypress);
|
||||||
Util.removeEvent(window, 'blur', this._eventHandlers.blur);
|
window.removeEventListener('blur', this._eventHandlers.blur);
|
||||||
|
|
||||||
// Release (key up) all keys that are in a down state
|
// Release (key up) all keys that are in a down state
|
||||||
this._allKeysUp();
|
this._allKeysUp();
|
||||||
|
|
@ -145,11 +146,11 @@ var Keyboard, Mouse;
|
||||||
|
|
||||||
['onKeyPress', 'rw', 'func'] // Handler for key press/release
|
['onKeyPress', 'rw', 'func'] // Handler for key press/release
|
||||||
]);
|
]);
|
||||||
|
})();
|
||||||
|
|
||||||
//
|
/* [module] export */ var Mouse;
|
||||||
// Mouse event handler
|
|
||||||
//
|
|
||||||
|
|
||||||
|
(function () {
|
||||||
Mouse = function (defaults) {
|
Mouse = function (defaults) {
|
||||||
this._mouseCaptured = false;
|
this._mouseCaptured = false;
|
||||||
|
|
||||||
|
|
@ -160,7 +161,6 @@ var Keyboard, Mouse;
|
||||||
Util.set_defaults(this, defaults, {
|
Util.set_defaults(this, defaults, {
|
||||||
'target': document,
|
'target': document,
|
||||||
'focused': true,
|
'focused': true,
|
||||||
'scale': 1.0,
|
|
||||||
'touchButton': 1
|
'touchButton': 1
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -177,9 +177,7 @@ var Keyboard, Mouse;
|
||||||
// private methods
|
// private methods
|
||||||
_captureMouse: function () {
|
_captureMouse: function () {
|
||||||
// capturing the mouse ensures we get the mouseup event
|
// capturing the mouse ensures we get the mouseup event
|
||||||
if (this._target.setCapture) {
|
Util.setCapture(this._target);
|
||||||
this._target.setCapture();
|
|
||||||
}
|
|
||||||
|
|
||||||
// some browsers give us mouseup events regardless,
|
// some browsers give us mouseup events regardless,
|
||||||
// so if we never captured the mouse, we can disregard the event
|
// so if we never captured the mouse, we can disregard the event
|
||||||
|
|
@ -187,9 +185,7 @@ var Keyboard, Mouse;
|
||||||
},
|
},
|
||||||
|
|
||||||
_releaseMouse: function () {
|
_releaseMouse: function () {
|
||||||
if (this._target.releaseCapture) {
|
Util.releaseCapture();
|
||||||
this._target.releaseCapture();
|
|
||||||
}
|
|
||||||
this._mouseCaptured = false;
|
this._mouseCaptured = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -198,21 +194,20 @@ var Keyboard, Mouse;
|
||||||
},
|
},
|
||||||
|
|
||||||
_handleMouseButton: function (e, down) {
|
_handleMouseButton: function (e, down) {
|
||||||
if (!this._focused) { return true; }
|
if (!this._focused) { return; }
|
||||||
|
|
||||||
if (this._notify) {
|
if (this._notify) {
|
||||||
this._notify(e);
|
this._notify(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
var evt = (e ? e : window.event);
|
var pos = this._getMousePosition(e);
|
||||||
var pos = Util.getEventPosition(e, this._target, this._scale);
|
|
||||||
|
|
||||||
var bmask;
|
var bmask;
|
||||||
if (e.touches || e.changedTouches) {
|
if (e.touches || e.changedTouches) {
|
||||||
// Touch device
|
// Touch device
|
||||||
|
|
||||||
// When two touches occur within 500 ms of each other and are
|
// When two touches occur within 500 ms of each other and are
|
||||||
// closer than 20 pixels together a double click is triggered.
|
// close enough together a double click is triggered.
|
||||||
if (down == 1) {
|
if (down == 1) {
|
||||||
if (this._doubleClickTimer === null) {
|
if (this._doubleClickTimer === null) {
|
||||||
this._lastTouchPos = pos;
|
this._lastTouchPos = pos;
|
||||||
|
|
@ -229,7 +224,8 @@ var Keyboard, Mouse;
|
||||||
|
|
||||||
// The goal is to trigger on a certain physical width, the
|
// The goal is to trigger on a certain physical width, the
|
||||||
// devicePixelRatio brings us a bit closer but is not optimal.
|
// devicePixelRatio brings us a bit closer but is not optimal.
|
||||||
if (d < 20 * window.devicePixelRatio) {
|
var threshold = 20 * (window.devicePixelRatio || 1);
|
||||||
|
if (d < threshold) {
|
||||||
pos = this._lastTouchPos;
|
pos = this._lastTouchPos;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -237,14 +233,14 @@ var Keyboard, Mouse;
|
||||||
}
|
}
|
||||||
bmask = this._touchButton;
|
bmask = this._touchButton;
|
||||||
// If bmask is set
|
// If bmask is set
|
||||||
} else if (evt.which) {
|
} else if (e.which) {
|
||||||
/* everything except IE */
|
/* everything except IE */
|
||||||
bmask = 1 << evt.button;
|
bmask = 1 << e.button;
|
||||||
} else {
|
} else {
|
||||||
/* IE including 9 */
|
/* IE including 9 */
|
||||||
bmask = (evt.button & 0x1) + // Left
|
bmask = (e.button & 0x1) + // Left
|
||||||
(evt.button & 0x2) * 2 + // Right
|
(e.button & 0x2) * 2 + // Right
|
||||||
(evt.button & 0x4) / 2; // Middle
|
(e.button & 0x4) / 2; // Middle
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._onMouseButton) {
|
if (this._onMouseButton) {
|
||||||
|
|
@ -253,7 +249,6 @@ var Keyboard, Mouse;
|
||||||
this._onMouseButton(pos.x, pos.y, down, bmask);
|
this._onMouseButton(pos.x, pos.y, down, bmask);
|
||||||
}
|
}
|
||||||
Util.stopEvent(e);
|
Util.stopEvent(e);
|
||||||
return false;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_handleMouseDown: function (e) {
|
_handleMouseDown: function (e) {
|
||||||
|
|
@ -269,62 +264,85 @@ var Keyboard, Mouse;
|
||||||
},
|
},
|
||||||
|
|
||||||
_handleMouseWheel: function (e) {
|
_handleMouseWheel: function (e) {
|
||||||
if (!this._focused) { return true; }
|
if (!this._focused) { return; }
|
||||||
|
|
||||||
if (this._notify) {
|
if (this._notify) {
|
||||||
this._notify(e);
|
this._notify(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
var evt = (e ? e : window.event);
|
var pos = this._getMousePosition(e);
|
||||||
var pos = Util.getEventPosition(e, this._target, this._scale);
|
|
||||||
var wheelData = evt.detail ? evt.detail * -1 : evt.wheelDelta / 40;
|
|
||||||
var bmask;
|
|
||||||
if (wheelData > 0) {
|
|
||||||
bmask = 1 << 3;
|
|
||||||
} else {
|
|
||||||
bmask = 1 << 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._onMouseButton) {
|
if (this._onMouseButton) {
|
||||||
this._onMouseButton(pos.x, pos.y, 1, bmask);
|
if (e.deltaX < 0) {
|
||||||
this._onMouseButton(pos.x, pos.y, 0, bmask);
|
this._onMouseButton(pos.x, pos.y, 1, 1 << 5);
|
||||||
|
this._onMouseButton(pos.x, pos.y, 0, 1 << 5);
|
||||||
|
} else if (e.deltaX > 0) {
|
||||||
|
this._onMouseButton(pos.x, pos.y, 1, 1 << 6);
|
||||||
|
this._onMouseButton(pos.x, pos.y, 0, 1 << 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.deltaY < 0) {
|
||||||
|
this._onMouseButton(pos.x, pos.y, 1, 1 << 3);
|
||||||
|
this._onMouseButton(pos.x, pos.y, 0, 1 << 3);
|
||||||
|
} else if (e.deltaY > 0) {
|
||||||
|
this._onMouseButton(pos.x, pos.y, 1, 1 << 4);
|
||||||
|
this._onMouseButton(pos.x, pos.y, 0, 1 << 4);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Util.stopEvent(e);
|
Util.stopEvent(e);
|
||||||
return false;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_handleMouseMove: function (e) {
|
_handleMouseMove: function (e) {
|
||||||
if (! this._focused) { return true; }
|
if (! this._focused) { return; }
|
||||||
|
|
||||||
if (this._notify) {
|
if (this._notify) {
|
||||||
this._notify(e);
|
this._notify(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
var evt = (e ? e : window.event);
|
var pos = this._getMousePosition(e);
|
||||||
var pos = Util.getEventPosition(e, this._target, this._scale);
|
|
||||||
if (this._onMouseMove) {
|
if (this._onMouseMove) {
|
||||||
this._onMouseMove(pos.x, pos.y);
|
this._onMouseMove(pos.x, pos.y);
|
||||||
}
|
}
|
||||||
Util.stopEvent(e);
|
Util.stopEvent(e);
|
||||||
return false;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_handleMouseDisable: function (e) {
|
_handleMouseDisable: function (e) {
|
||||||
if (!this._focused) { return true; }
|
if (!this._focused) { return; }
|
||||||
|
|
||||||
var evt = (e ? e : window.event);
|
/*
|
||||||
var pos = Util.getEventPosition(e, this._target, this._scale);
|
* Stop propagation if inside canvas area
|
||||||
|
* Note: This is only needed for the 'click' event as it fails
|
||||||
/* Stop propagation if inside canvas area */
|
* to fire properly for the target element so we have
|
||||||
if ((pos.realx >= 0) && (pos.realy >= 0) &&
|
* to listen on the document element instead.
|
||||||
(pos.realx < this._target.offsetWidth) &&
|
*/
|
||||||
(pos.realy < this._target.offsetHeight)) {
|
if (e.target == this._target) {
|
||||||
//Util.Debug("mouse event disabled");
|
//Util.Debug("mouse event disabled");
|
||||||
Util.stopEvent(e);
|
Util.stopEvent(e);
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
return true;
|
// Return coordinates relative to target
|
||||||
|
_getMousePosition: function(e) {
|
||||||
|
e = Util.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;
|
||||||
|
}
|
||||||
|
return {x:x, y:y};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -332,46 +350,44 @@ var Keyboard, Mouse;
|
||||||
grab: function () {
|
grab: function () {
|
||||||
var c = this._target;
|
var c = this._target;
|
||||||
|
|
||||||
if ('ontouchstart' in document.documentElement) {
|
if (Util.isTouchDevice) {
|
||||||
Util.addEvent(c, 'touchstart', this._eventHandlers.mousedown);
|
c.addEventListener('touchstart', this._eventHandlers.mousedown);
|
||||||
Util.addEvent(window, 'touchend', this._eventHandlers.mouseup);
|
window.addEventListener('touchend', this._eventHandlers.mouseup);
|
||||||
Util.addEvent(c, 'touchend', this._eventHandlers.mouseup);
|
c.addEventListener('touchend', this._eventHandlers.mouseup);
|
||||||
Util.addEvent(c, 'touchmove', this._eventHandlers.mousemove);
|
c.addEventListener('touchmove', this._eventHandlers.mousemove);
|
||||||
} else {
|
|
||||||
Util.addEvent(c, 'mousedown', this._eventHandlers.mousedown);
|
|
||||||
Util.addEvent(window, 'mouseup', this._eventHandlers.mouseup);
|
|
||||||
Util.addEvent(c, 'mouseup', this._eventHandlers.mouseup);
|
|
||||||
Util.addEvent(c, 'mousemove', this._eventHandlers.mousemove);
|
|
||||||
Util.addEvent(c, (Util.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel',
|
|
||||||
this._eventHandlers.mousewheel);
|
|
||||||
}
|
}
|
||||||
|
c.addEventListener('mousedown', this._eventHandlers.mousedown);
|
||||||
|
window.addEventListener('mouseup', this._eventHandlers.mouseup);
|
||||||
|
c.addEventListener('mouseup', this._eventHandlers.mouseup);
|
||||||
|
c.addEventListener('mousemove', this._eventHandlers.mousemove);
|
||||||
|
c.addEventListener('wheel', this._eventHandlers.mousewheel);
|
||||||
|
|
||||||
/* Work around right and middle click browser behaviors */
|
/* Prevent middle-click pasting (see above for why we bind to document) */
|
||||||
Util.addEvent(document, 'click', this._eventHandlers.mousedisable);
|
document.addEventListener('click', this._eventHandlers.mousedisable);
|
||||||
Util.addEvent(document.body, 'contextmenu', 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 () {
|
ungrab: function () {
|
||||||
var c = this._target;
|
var c = this._target;
|
||||||
|
|
||||||
if ('ontouchstart' in document.documentElement) {
|
if (Util.isTouchDevice) {
|
||||||
Util.removeEvent(c, 'touchstart', this._eventHandlers.mousedown);
|
c.removeEventListener('touchstart', this._eventHandlers.mousedown);
|
||||||
Util.removeEvent(window, 'touchend', this._eventHandlers.mouseup);
|
window.removeEventListener('touchend', this._eventHandlers.mouseup);
|
||||||
Util.removeEvent(c, 'touchend', this._eventHandlers.mouseup);
|
c.removeEventListener('touchend', this._eventHandlers.mouseup);
|
||||||
Util.removeEvent(c, 'touchmove', this._eventHandlers.mousemove);
|
c.removeEventListener('touchmove', this._eventHandlers.mousemove);
|
||||||
} else {
|
|
||||||
Util.removeEvent(c, 'mousedown', this._eventHandlers.mousedown);
|
|
||||||
Util.removeEvent(window, 'mouseup', this._eventHandlers.mouseup);
|
|
||||||
Util.removeEvent(c, 'mouseup', this._eventHandlers.mouseup);
|
|
||||||
Util.removeEvent(c, 'mousemove', this._eventHandlers.mousemove);
|
|
||||||
Util.removeEvent(c, (Util.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel',
|
|
||||||
this._eventHandlers.mousewheel);
|
|
||||||
}
|
}
|
||||||
|
c.removeEventListener('mousedown', this._eventHandlers.mousedown);
|
||||||
|
window.removeEventListener('mouseup', this._eventHandlers.mouseup);
|
||||||
|
c.removeEventListener('mouseup', this._eventHandlers.mouseup);
|
||||||
|
c.removeEventListener('mousemove', this._eventHandlers.mousemove);
|
||||||
|
c.removeEventListener('wheel', this._eventHandlers.mousewheel);
|
||||||
|
|
||||||
/* Work around right and middle click browser behaviors */
|
document.removeEventListener('click', this._eventHandlers.mousedisable);
|
||||||
Util.removeEvent(document, 'click', this._eventHandlers.mousedisable);
|
|
||||||
Util.removeEvent(document.body, 'contextmenu', this._eventHandlers.mousedisable);
|
|
||||||
|
|
||||||
|
c.removeEventListener('contextmenu', this._eventHandlers.mousedisable);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -379,7 +395,6 @@ var Keyboard, Mouse;
|
||||||
['target', 'ro', 'dom'], // DOM element that captures mouse input
|
['target', 'ro', 'dom'], // DOM element that captures mouse input
|
||||||
['notify', 'ro', 'func'], // Function to call to notify whenever a mouse event is received
|
['notify', 'ro', 'func'], // Function to call to notify whenever a mouse event is received
|
||||||
['focused', 'rw', 'bool'], // Capture and send mouse clicks/movement
|
['focused', 'rw', 'bool'], // Capture and send mouse clicks/movement
|
||||||
['scale', 'rw', 'float'], // Viewport scale factor 0.0 - 1.0
|
|
||||||
|
|
||||||
['onMouseButton', 'rw', 'func'], // Handler for mouse button click/release
|
['onMouseButton', 'rw', 'func'], // Handler for mouse button click/release
|
||||||
['onMouseMove', 'rw', 'func'], // Handler for mouse movement
|
['onMouseMove', 'rw', 'func'], // Handler for mouse movement
|
||||||
382
noVNC/core/input/keysym.js
Normal file
|
|
@ -0,0 +1,382 @@
|
||||||
|
var KeyTable = {
|
||||||
|
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 */
|
||||||
|
|
||||||
|
/* 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 */
|
||||||
|
|
||||||
|
XK_ISO_Level3_Shift: 0xfe03, /* AltGr */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* [module] export default KeyTable; */
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
// (and optionally, key names) expected by the RFB protocol
|
// (and optionally, key names) expected by the RFB protocol
|
||||||
// How this file was generated:
|
// How this file was generated:
|
||||||
// node /Users/jalf/dev/mi/novnc/utils/parse.js /opt/X11/include/X11/keysymdef.h
|
// node /Users/jalf/dev/mi/novnc/utils/parse.js /opt/X11/include/X11/keysymdef.h
|
||||||
|
|
||||||
var keysyms = (function(){
|
var keysyms = (function(){
|
||||||
"use strict";
|
"use strict";
|
||||||
var keynames = null;
|
var keynames = null;
|
||||||
|
|
@ -9,7 +10,15 @@ var keysyms = (function(){
|
||||||
|
|
||||||
function lookup(k) { return k ? {keysym: k, keyname: keynames ? keynames[k] : k} : undefined; }
|
function lookup(k) { return k ? {keysym: k, keyname: keynames ? keynames[k] : k} : undefined; }
|
||||||
return {
|
return {
|
||||||
fromUnicode : function(u) { return lookup(codepoints[u]); },
|
fromUnicode : function(u) {
|
||||||
|
var keysym = codepoints[u];
|
||||||
|
if (keysym === undefined) {
|
||||||
|
keysym = 0x01000000 | u;
|
||||||
|
}
|
||||||
|
return lookup(keysym);
|
||||||
|
},
|
||||||
lookup : lookup
|
lookup : lookup
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
/* [module] export default keysyms */
|
||||||
|
|
@ -1,4 +1,11 @@
|
||||||
var kbdUtil = (function() {
|
/* [module]
|
||||||
|
* import KeyTable from "./keysym";
|
||||||
|
* import keysyms from "./keysymdef";
|
||||||
|
*/
|
||||||
|
|
||||||
|
var KeyboardUtil = {};
|
||||||
|
|
||||||
|
(function() {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function substituteCodepoint(cp) {
|
function substituteCodepoint(cp) {
|
||||||
|
|
@ -31,7 +38,7 @@ var kbdUtil = (function() {
|
||||||
function hasShortcutModifier(charModifier, currentModifiers) {
|
function hasShortcutModifier(charModifier, currentModifiers) {
|
||||||
var mods = {};
|
var mods = {};
|
||||||
for (var key in currentModifiers) {
|
for (var key in currentModifiers) {
|
||||||
if (parseInt(key) !== XK_Shift_L) {
|
if (parseInt(key) !== KeyTable.XK_Shift_L) {
|
||||||
mods[key] = currentModifiers[key];
|
mods[key] = currentModifiers[key];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -68,15 +75,15 @@ var kbdUtil = (function() {
|
||||||
if (!charModifier) {
|
if (!charModifier) {
|
||||||
if (isMac()) {
|
if (isMac()) {
|
||||||
// on Mac, Option (AKA Alt) is used as a char modifier
|
// on Mac, Option (AKA Alt) is used as a char modifier
|
||||||
charModifier = [XK_Alt_L];
|
charModifier = [KeyTable.XK_Alt_L];
|
||||||
}
|
}
|
||||||
else if (isWindows()) {
|
else if (isWindows()) {
|
||||||
// on Windows, Ctrl+Alt is used as a char modifier
|
// on Windows, Ctrl+Alt is used as a char modifier
|
||||||
charModifier = [XK_Alt_L, XK_Control_L];
|
charModifier = [KeyTable.XK_Alt_L, KeyTable.XK_Control_L];
|
||||||
}
|
}
|
||||||
else if (isLinux()) {
|
else if (isLinux()) {
|
||||||
// on Linux, ISO Level 3 Shift (AltGr) is used as a char modifier
|
// on Linux, ISO Level 3 Shift (AltGr) is used as a char modifier
|
||||||
charModifier = [XK_ISO_Level3_Shift];
|
charModifier = [KeyTable.XK_ISO_Level3_Shift];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
charModifier = [];
|
charModifier = [];
|
||||||
|
|
@ -84,11 +91,11 @@ var kbdUtil = (function() {
|
||||||
}
|
}
|
||||||
|
|
||||||
var state = {};
|
var state = {};
|
||||||
state[XK_Control_L] = false;
|
state[KeyTable.XK_Control_L] = false;
|
||||||
state[XK_Alt_L] = false;
|
state[KeyTable.XK_Alt_L] = false;
|
||||||
state[XK_ISO_Level3_Shift] = false;
|
state[KeyTable.XK_ISO_Level3_Shift] = false;
|
||||||
state[XK_Shift_L] = false;
|
state[KeyTable.XK_Shift_L] = false;
|
||||||
state[XK_Meta_L] = false;
|
state[KeyTable.XK_Meta_L] = false;
|
||||||
|
|
||||||
function sync(evt, keysym) {
|
function sync(evt, keysym) {
|
||||||
var result = [];
|
var result = [];
|
||||||
|
|
@ -97,29 +104,29 @@ var kbdUtil = (function() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (evt.ctrlKey !== undefined &&
|
if (evt.ctrlKey !== undefined &&
|
||||||
evt.ctrlKey !== state[XK_Control_L] && keysym !== XK_Control_L) {
|
evt.ctrlKey !== state[KeyTable.XK_Control_L] && keysym !== KeyTable.XK_Control_L) {
|
||||||
state[XK_Control_L] = evt.ctrlKey;
|
state[KeyTable.XK_Control_L] = evt.ctrlKey;
|
||||||
result.push(syncKey(XK_Control_L));
|
result.push(syncKey(KeyTable.XK_Control_L));
|
||||||
}
|
}
|
||||||
if (evt.altKey !== undefined &&
|
if (evt.altKey !== undefined &&
|
||||||
evt.altKey !== state[XK_Alt_L] && keysym !== XK_Alt_L) {
|
evt.altKey !== state[KeyTable.XK_Alt_L] && keysym !== KeyTable.XK_Alt_L) {
|
||||||
state[XK_Alt_L] = evt.altKey;
|
state[KeyTable.XK_Alt_L] = evt.altKey;
|
||||||
result.push(syncKey(XK_Alt_L));
|
result.push(syncKey(KeyTable.XK_Alt_L));
|
||||||
}
|
}
|
||||||
if (evt.altGraphKey !== undefined &&
|
if (evt.altGraphKey !== undefined &&
|
||||||
evt.altGraphKey !== state[XK_ISO_Level3_Shift] && keysym !== XK_ISO_Level3_Shift) {
|
evt.altGraphKey !== state[KeyTable.XK_ISO_Level3_Shift] && keysym !== KeyTable.XK_ISO_Level3_Shift) {
|
||||||
state[XK_ISO_Level3_Shift] = evt.altGraphKey;
|
state[KeyTable.XK_ISO_Level3_Shift] = evt.altGraphKey;
|
||||||
result.push(syncKey(XK_ISO_Level3_Shift));
|
result.push(syncKey(KeyTable.XK_ISO_Level3_Shift));
|
||||||
}
|
}
|
||||||
if (evt.shiftKey !== undefined &&
|
if (evt.shiftKey !== undefined &&
|
||||||
evt.shiftKey !== state[XK_Shift_L] && keysym !== XK_Shift_L) {
|
evt.shiftKey !== state[KeyTable.XK_Shift_L] && keysym !== KeyTable.XK_Shift_L) {
|
||||||
state[XK_Shift_L] = evt.shiftKey;
|
state[KeyTable.XK_Shift_L] = evt.shiftKey;
|
||||||
result.push(syncKey(XK_Shift_L));
|
result.push(syncKey(KeyTable.XK_Shift_L));
|
||||||
}
|
}
|
||||||
if (evt.metaKey !== undefined &&
|
if (evt.metaKey !== undefined &&
|
||||||
evt.metaKey !== state[XK_Meta_L] && keysym !== XK_Meta_L) {
|
evt.metaKey !== state[KeyTable.XK_Meta_L] && keysym !== KeyTable.XK_Meta_L) {
|
||||||
state[XK_Meta_L] = evt.metaKey;
|
state[KeyTable.XK_Meta_L] = evt.metaKey;
|
||||||
result.push(syncKey(XK_Meta_L));
|
result.push(syncKey(KeyTable.XK_Meta_L));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
@ -177,10 +184,7 @@ var kbdUtil = (function() {
|
||||||
codepoint = evt.keyCode;
|
codepoint = evt.keyCode;
|
||||||
}
|
}
|
||||||
if (codepoint) {
|
if (codepoint) {
|
||||||
var res = keysyms.fromUnicode(substituteCodepoint(codepoint));
|
return keysyms.fromUnicode(substituteCodepoint(codepoint));
|
||||||
if (res) {
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// we could check evt.key here.
|
// we could check evt.key here.
|
||||||
// Legal values are defined in http://www.w3.org/TR/DOM-Level-3-Events/#key-values-list,
|
// Legal values are defined in http://www.w3.org/TR/DOM-Level-3-Events/#key-values-list,
|
||||||
|
|
@ -210,21 +214,21 @@ var kbdUtil = (function() {
|
||||||
return shiftPressed ? keycode : keycode + 32; // A-Z
|
return shiftPressed ? keycode : keycode + 32; // A-Z
|
||||||
}
|
}
|
||||||
if (keycode >= 0x60 && keycode <= 0x69) {
|
if (keycode >= 0x60 && keycode <= 0x69) {
|
||||||
return XK_KP_0 + (keycode - 0x60); // numpad 0-9
|
return KeyTable.XK_KP_0 + (keycode - 0x60); // numpad 0-9
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(keycode) {
|
switch(keycode) {
|
||||||
case 0x20: return XK_space;
|
case 0x20: return KeyTable.XK_space;
|
||||||
case 0x6a: return XK_KP_Multiply;
|
case 0x6a: return KeyTable.XK_KP_Multiply;
|
||||||
case 0x6b: return XK_KP_Add;
|
case 0x6b: return KeyTable.XK_KP_Add;
|
||||||
case 0x6c: return XK_KP_Separator;
|
case 0x6c: return KeyTable.XK_KP_Separator;
|
||||||
case 0x6d: return XK_KP_Subtract;
|
case 0x6d: return KeyTable.XK_KP_Subtract;
|
||||||
case 0x6e: return XK_KP_Decimal;
|
case 0x6e: return KeyTable.XK_KP_Decimal;
|
||||||
case 0x6f: return XK_KP_Divide;
|
case 0x6f: return KeyTable.XK_KP_Divide;
|
||||||
case 0xbb: return XK_plus;
|
case 0xbb: return KeyTable.XK_plus;
|
||||||
case 0xbc: return XK_comma;
|
case 0xbc: return KeyTable.XK_comma;
|
||||||
case 0xbd: return XK_minus;
|
case 0xbd: return KeyTable.XK_minus;
|
||||||
case 0xbe: return XK_period;
|
case 0xbe: return KeyTable.XK_period;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nonCharacterKey({keyCode: keycode});
|
return nonCharacterKey({keyCode: keycode});
|
||||||
|
|
@ -238,53 +242,183 @@ var kbdUtil = (function() {
|
||||||
var keycode = evt.keyCode;
|
var keycode = evt.keyCode;
|
||||||
|
|
||||||
if (keycode >= 0x70 && keycode <= 0x87) {
|
if (keycode >= 0x70 && keycode <= 0x87) {
|
||||||
return XK_F1 + keycode - 0x70; // F1-F24
|
return KeyTable.XK_F1 + keycode - 0x70; // F1-F24
|
||||||
}
|
}
|
||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
|
|
||||||
case 8 : return XK_BackSpace;
|
case 8 : return KeyTable.XK_BackSpace;
|
||||||
case 13 : return XK_Return;
|
case 13 : return KeyTable.XK_Return;
|
||||||
|
|
||||||
case 9 : return XK_Tab;
|
case 9 : return KeyTable.XK_Tab;
|
||||||
|
|
||||||
case 27 : return XK_Escape;
|
case 27 : return KeyTable.XK_Escape;
|
||||||
case 46 : return XK_Delete;
|
case 46 : return KeyTable.XK_Delete;
|
||||||
|
|
||||||
case 36 : return XK_Home;
|
case 36 : return KeyTable.XK_Home;
|
||||||
case 35 : return XK_End;
|
case 35 : return KeyTable.XK_End;
|
||||||
case 33 : return XK_Page_Up;
|
case 33 : return KeyTable.XK_Page_Up;
|
||||||
case 34 : return XK_Page_Down;
|
case 34 : return KeyTable.XK_Page_Down;
|
||||||
case 45 : return XK_Insert;
|
case 45 : return KeyTable.XK_Insert;
|
||||||
|
|
||||||
case 37 : return XK_Left;
|
case 37 : return KeyTable.XK_Left;
|
||||||
case 38 : return XK_Up;
|
case 38 : return KeyTable.XK_Up;
|
||||||
case 39 : return XK_Right;
|
case 39 : return KeyTable.XK_Right;
|
||||||
case 40 : return XK_Down;
|
case 40 : return KeyTable.XK_Down;
|
||||||
|
|
||||||
case 16 : return XK_Shift_L;
|
case 16 : return KeyTable.XK_Shift_L;
|
||||||
case 17 : return XK_Control_L;
|
case 17 : return KeyTable.XK_Control_L;
|
||||||
case 18 : return XK_Alt_L; // also: Option-key on Mac
|
case 18 : return KeyTable.XK_Alt_L; // also: Option-key on Mac
|
||||||
|
|
||||||
case 224 : return XK_Meta_L;
|
case 224 : return KeyTable.XK_Meta_L;
|
||||||
case 225 : return XK_ISO_Level3_Shift; // AltGr
|
case 225 : return KeyTable.XK_ISO_Level3_Shift; // AltGr
|
||||||
case 91 : return XK_Super_L; // also: Windows-key
|
case 91 : return KeyTable.XK_Super_L; // also: Windows-key
|
||||||
case 92 : return XK_Super_R; // also: Windows-key
|
case 92 : return KeyTable.XK_Super_R; // also: Windows-key
|
||||||
case 93 : return XK_Menu; // also: Windows-Menu, Command on Mac
|
case 93 : return KeyTable.XK_Menu; // also: Windows-Menu, Command on Mac
|
||||||
default: return null;
|
default: return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {
|
|
||||||
hasShortcutModifier : hasShortcutModifier,
|
KeyboardUtil.hasShortcutModifier = hasShortcutModifier;
|
||||||
hasCharModifier : hasCharModifier,
|
KeyboardUtil.hasCharModifier = hasCharModifier;
|
||||||
ModifierSync : ModifierSync,
|
KeyboardUtil.ModifierSync = ModifierSync;
|
||||||
getKey : getKey,
|
KeyboardUtil.getKey = getKey;
|
||||||
getKeysym : getKeysym,
|
KeyboardUtil.getKeysym = getKeysym;
|
||||||
keysymFromKeyCode : keysymFromKeyCode,
|
KeyboardUtil.keysymFromKeyCode = keysymFromKeyCode;
|
||||||
nonCharacterKey : nonCharacterKey,
|
KeyboardUtil.nonCharacterKey = nonCharacterKey;
|
||||||
substituteCodepoint : substituteCodepoint
|
KeyboardUtil.substituteCodepoint = substituteCodepoint;
|
||||||
};
|
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
KeyboardUtil.QEMUKeyEventDecoder = function(modifierState, next) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
function sendAll(evts) {
|
||||||
|
for (var i = 0; i < evts.length; ++i) {
|
||||||
|
next(evts[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var numPadCodes = ["Numpad0", "Numpad1", "Numpad2",
|
||||||
|
"Numpad3", "Numpad4", "Numpad5", "Numpad6",
|
||||||
|
"Numpad7", "Numpad8", "Numpad9", "NumpadDecimal"];
|
||||||
|
|
||||||
|
var numLockOnKeySyms = {
|
||||||
|
"Numpad0": 0xffb0, "Numpad1": 0xffb1, "Numpad2": 0xffb2,
|
||||||
|
"Numpad3": 0xffb3, "Numpad4": 0xffb4, "Numpad5": 0xffb5,
|
||||||
|
"Numpad6": 0xffb6, "Numpad7": 0xffb7, "Numpad8": 0xffb8,
|
||||||
|
"Numpad9": 0xffb9, "NumpadDecimal": 0xffac
|
||||||
|
};
|
||||||
|
|
||||||
|
var numLockOnKeyCodes = [96, 97, 98, 99, 100, 101, 102,
|
||||||
|
103, 104, 105, 108, 110];
|
||||||
|
|
||||||
|
function isNumPadMultiKey(evt) {
|
||||||
|
return (numPadCodes.indexOf(evt.code) !== -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNumPadKeySym(evt) {
|
||||||
|
if (numLockOnKeyCodes.indexOf(evt.keyCode) !== -1) {
|
||||||
|
return numLockOnKeySyms[evt.code];
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function process(evt, type) {
|
||||||
|
var result = {type: type};
|
||||||
|
result.code = evt.code;
|
||||||
|
result.keysym = 0;
|
||||||
|
|
||||||
|
if (isNumPadMultiKey(evt)) {
|
||||||
|
result.keysym = getNumPadKeySym(evt);
|
||||||
|
}
|
||||||
|
|
||||||
|
var hasModifier = modifierState.hasShortcutModifier() || !!modifierState.activeCharModifier();
|
||||||
|
var isShift = evt.keyCode === 0x10 || evt.key === 'Shift';
|
||||||
|
|
||||||
|
var suppress = !isShift && (type !== 'keydown' || modifierState.hasShortcutModifier() || !!KeyboardUtil.nonCharacterKey(evt));
|
||||||
|
|
||||||
|
next(result);
|
||||||
|
return suppress;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
keydown: function(evt) {
|
||||||
|
sendAll(modifierState.keydown(evt));
|
||||||
|
return process(evt, 'keydown');
|
||||||
|
},
|
||||||
|
keypress: function(evt) {
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
keyup: function(evt) {
|
||||||
|
sendAll(modifierState.keyup(evt));
|
||||||
|
return process(evt, 'keyup');
|
||||||
|
},
|
||||||
|
syncModifiers: function(evt) {
|
||||||
|
sendAll(modifierState.syncAny(evt));
|
||||||
|
},
|
||||||
|
releaseAll: function() { next({type: 'releaseall'}); }
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
KeyboardUtil.TrackQEMUKeyState = function(next) {
|
||||||
|
"use strict";
|
||||||
|
var state = [];
|
||||||
|
|
||||||
|
return function (evt) {
|
||||||
|
var last = state.length !== 0 ? state[state.length-1] : null;
|
||||||
|
|
||||||
|
switch (evt.type) {
|
||||||
|
case 'keydown':
|
||||||
|
|
||||||
|
if (!last || last.code !== evt.code) {
|
||||||
|
last = {code: evt.code};
|
||||||
|
|
||||||
|
if (state.length > 0 && state[state.length-1].code == 'ControlLeft') {
|
||||||
|
if (evt.code !== 'AltRight') {
|
||||||
|
next({code: 'ControlLeft', type: 'keydown', keysym: 0});
|
||||||
|
} else {
|
||||||
|
state.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
state.push(last);
|
||||||
|
}
|
||||||
|
if (evt.code !== 'ControlLeft') {
|
||||||
|
next(evt);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'keyup':
|
||||||
|
if (state.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var idx = null;
|
||||||
|
// do we have a matching key tracked as being down?
|
||||||
|
for (var i = 0; i !== state.length; ++i) {
|
||||||
|
if (state[i].code === evt.code) {
|
||||||
|
idx = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if we couldn't find a match (it happens), assume it was the last key pressed
|
||||||
|
if (idx === null) {
|
||||||
|
if (evt.code === 'ControlLeft') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
idx = state.length - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.splice(idx, 1);
|
||||||
|
next(evt);
|
||||||
|
break;
|
||||||
|
case 'releaseall':
|
||||||
|
/* jshint shadow: true */
|
||||||
|
for (var i = 0; i < state.length; ++i) {
|
||||||
|
next({code: state[i].code, keysym: 0, type: 'keyup'});
|
||||||
|
}
|
||||||
|
/* jshint shadow: false */
|
||||||
|
state = [];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
// Takes a DOM keyboard event and:
|
// Takes a DOM keyboard event and:
|
||||||
// - determines which keysym it represents
|
// - determines which keysym it represents
|
||||||
// - determines a keyId identifying the key that was pressed (corresponding to the key/keyCode properties on the DOM event)
|
// - determines a keyId identifying the key that was pressed (corresponding to the key/keyCode properties on the DOM event)
|
||||||
|
|
@ -292,7 +426,7 @@ var kbdUtil = (function() {
|
||||||
// - marks each event with an 'escape' property if a modifier was down which should be "escaped"
|
// - marks each event with an 'escape' property if a modifier was down which should be "escaped"
|
||||||
// - generates a "stall" event in cases where it might be necessary to wait and see if a keypress event follows a keydown
|
// - generates a "stall" event in cases where it might be necessary to wait and see if a keypress event follows a keydown
|
||||||
// This information is collected into an object which is passed to the next() function. (one call per event)
|
// This information is collected into an object which is passed to the next() function. (one call per event)
|
||||||
function KeyEventDecoder(modifierState, next) {
|
KeyboardUtil.KeyEventDecoder = function(modifierState, next) {
|
||||||
"use strict";
|
"use strict";
|
||||||
function sendAll(evts) {
|
function sendAll(evts) {
|
||||||
for (var i = 0; i < evts.length; ++i) {
|
for (var i = 0; i < evts.length; ++i) {
|
||||||
|
|
@ -301,18 +435,18 @@ function KeyEventDecoder(modifierState, next) {
|
||||||
}
|
}
|
||||||
function process(evt, type) {
|
function process(evt, type) {
|
||||||
var result = {type: type};
|
var result = {type: type};
|
||||||
var keyId = kbdUtil.getKey(evt);
|
var keyId = KeyboardUtil.getKey(evt);
|
||||||
if (keyId) {
|
if (keyId) {
|
||||||
result.keyId = keyId;
|
result.keyId = keyId;
|
||||||
}
|
}
|
||||||
|
|
||||||
var keysym = kbdUtil.getKeysym(evt);
|
var keysym = KeyboardUtil.getKeysym(evt);
|
||||||
|
|
||||||
var hasModifier = modifierState.hasShortcutModifier() || !!modifierState.activeCharModifier();
|
var hasModifier = modifierState.hasShortcutModifier() || !!modifierState.activeCharModifier();
|
||||||
// Is this a case where we have to decide on the keysym right away, rather than waiting for the keypress?
|
// Is this a case where we have to decide on the keysym right away, rather than waiting for the keypress?
|
||||||
// "special" keys like enter, tab or backspace don't send keypress events,
|
// "special" keys like enter, tab or backspace don't send keypress events,
|
||||||
// and some browsers don't send keypresses at all if a modifier is down
|
// and some browsers don't send keypresses at all if a modifier is down
|
||||||
if (keysym && (type !== 'keydown' || kbdUtil.nonCharacterKey(evt) || hasModifier)) {
|
if (keysym && (type !== 'keydown' || KeyboardUtil.nonCharacterKey(evt) || hasModifier)) {
|
||||||
result.keysym = keysym;
|
result.keysym = keysym;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -321,11 +455,11 @@ function KeyEventDecoder(modifierState, next) {
|
||||||
// Should we prevent the browser from handling the event?
|
// Should we prevent the browser from handling the event?
|
||||||
// Doing so on a keydown (in most browsers) prevents keypress from being generated
|
// Doing so on a keydown (in most browsers) prevents keypress from being generated
|
||||||
// so only do that if we have to.
|
// so only do that if we have to.
|
||||||
var suppress = !isShift && (type !== 'keydown' || modifierState.hasShortcutModifier() || !!kbdUtil.nonCharacterKey(evt));
|
var suppress = !isShift && (type !== 'keydown' || modifierState.hasShortcutModifier() || !!KeyboardUtil.nonCharacterKey(evt));
|
||||||
|
|
||||||
// If a char modifier is down on a keydown, we need to insert a stall,
|
// If a char modifier is down on a keydown, we need to insert a stall,
|
||||||
// so VerifyCharModifier knows to wait and see if a keypress is comnig
|
// so VerifyCharModifier knows to wait and see if a keypress is comnig
|
||||||
var stall = type === 'keydown' && modifierState.activeCharModifier() && !kbdUtil.nonCharacterKey(evt);
|
var stall = type === 'keydown' && modifierState.activeCharModifier() && !KeyboardUtil.nonCharacterKey(evt);
|
||||||
|
|
||||||
// if a char modifier is pressed, get the keys it consists of (on Windows, AltGr is equivalent to Ctrl+Alt)
|
// if a char modifier is pressed, get the keys it consists of (on Windows, AltGr is equivalent to Ctrl+Alt)
|
||||||
var active = modifierState.activeCharModifier();
|
var active = modifierState.activeCharModifier();
|
||||||
|
|
@ -371,7 +505,7 @@ function KeyEventDecoder(modifierState, next) {
|
||||||
},
|
},
|
||||||
releaseAll: function() { next({type: 'releaseall'}); }
|
releaseAll: function() { next({type: 'releaseall'}); }
|
||||||
};
|
};
|
||||||
}
|
};
|
||||||
|
|
||||||
// Combines keydown and keypress events where necessary to handle char modifiers.
|
// Combines keydown and keypress events where necessary to handle char modifiers.
|
||||||
// On some OS'es, a char modifier is sometimes used as a shortcut modifier.
|
// On some OS'es, a char modifier is sometimes used as a shortcut modifier.
|
||||||
|
|
@ -379,7 +513,7 @@ function KeyEventDecoder(modifierState, next) {
|
||||||
// so when used with the '2' key, Ctrl-Alt counts as a char modifier (and should be escaped), but when used with 'D', it does not.
|
// so when used with the '2' key, Ctrl-Alt counts as a char modifier (and should be escaped), but when used with 'D', it does not.
|
||||||
// The only way we can distinguish these cases is to wait and see if a keypress event arrives
|
// The only way we can distinguish these cases is to wait and see if a keypress event arrives
|
||||||
// When we receive a "stall" event, wait a few ms before processing the next keydown. If a keypress has also arrived, merge the two
|
// When we receive a "stall" event, wait a few ms before processing the next keydown. If a keypress has also arrived, merge the two
|
||||||
function VerifyCharModifier(next) {
|
KeyboardUtil.VerifyCharModifier = function(next) {
|
||||||
"use strict";
|
"use strict";
|
||||||
var queue = [];
|
var queue = [];
|
||||||
var timer = null;
|
var timer = null;
|
||||||
|
|
@ -429,14 +563,14 @@ function VerifyCharModifier(next) {
|
||||||
queue.push(evt);
|
queue.push(evt);
|
||||||
process();
|
process();
|
||||||
};
|
};
|
||||||
}
|
};
|
||||||
|
|
||||||
// Keeps track of which keys we (and the server) believe are down
|
// Keeps track of which keys we (and the server) believe are down
|
||||||
// When a keyup is received, match it against this list, to determine the corresponding keysym(s)
|
// When a keyup is received, match it against this list, to determine the corresponding keysym(s)
|
||||||
// in some cases, a single key may produce multiple keysyms, so the corresponding keyup event must release all of these chars
|
// in some cases, a single key may produce multiple keysyms, so the corresponding keyup event must release all of these chars
|
||||||
// key repeat events should be merged into a single entry.
|
// key repeat events should be merged into a single entry.
|
||||||
// Because we can't always identify which entry a keydown or keyup event corresponds to, we sometimes have to guess
|
// Because we can't always identify which entry a keydown or keyup event corresponds to, we sometimes have to guess
|
||||||
function TrackKeyState(next) {
|
KeyboardUtil.TrackKeyState = function(next) {
|
||||||
"use strict";
|
"use strict";
|
||||||
var state = [];
|
var state = [];
|
||||||
|
|
||||||
|
|
@ -516,11 +650,11 @@ function TrackKeyState(next) {
|
||||||
state = [];
|
state = [];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
};
|
||||||
|
|
||||||
// Handles "escaping" of modifiers: if a char modifier is used to produce a keysym (such as AltGr-2 to generate an @),
|
// Handles "escaping" of modifiers: if a char modifier is used to produce a keysym (such as AltGr-2 to generate an @),
|
||||||
// then the modifier must be "undone" before sending the @, and "redone" afterwards.
|
// then the modifier must be "undone" before sending the @, and "redone" afterwards.
|
||||||
function EscapeModifiers(next) {
|
KeyboardUtil.EscapeModifiers = function(next) {
|
||||||
"use strict";
|
"use strict";
|
||||||
return function(evt) {
|
return function(evt) {
|
||||||
if (evt.type !== 'keydown' || evt.escape === undefined) {
|
if (evt.type !== 'keydown' || evt.escape === undefined) {
|
||||||
|
|
@ -540,4 +674,6 @@ function EscapeModifiers(next) {
|
||||||
}
|
}
|
||||||
/* jshint shadow: false */
|
/* jshint shadow: false */
|
||||||
};
|
};
|
||||||
}
|
};
|
||||||
|
|
||||||
|
/* [module] export default KeyboardUtil; */
|
||||||
151
noVNC/core/input/xtscancodes.js
Normal file
|
|
@ -0,0 +1,151 @@
|
||||||
|
var XtScancode = {
|
||||||
|
"Escape": 0x0001,
|
||||||
|
"Digit1": 0x0002,
|
||||||
|
"Digit2": 0x0003,
|
||||||
|
"Digit3": 0x0004,
|
||||||
|
"Digit4": 0x0005,
|
||||||
|
"Digit5": 0x0006,
|
||||||
|
"Digit6": 0x0007,
|
||||||
|
"Digit7": 0x0008,
|
||||||
|
"Digit8": 0x0009,
|
||||||
|
"Digit9": 0x000A,
|
||||||
|
"Digit0": 0x000B,
|
||||||
|
"Minus": 0x000C,
|
||||||
|
"Equal": 0x000D,
|
||||||
|
"Backspace": 0x000E,
|
||||||
|
"Tab": 0x000F,
|
||||||
|
"KeyQ": 0x0010,
|
||||||
|
"KeyW": 0x0011,
|
||||||
|
"KeyE": 0x0012,
|
||||||
|
"KeyR": 0x0013,
|
||||||
|
"KeyT": 0x0014,
|
||||||
|
"KeyY": 0x0015,
|
||||||
|
"KeyU": 0x0016,
|
||||||
|
"KeyI": 0x0017,
|
||||||
|
"KeyO": 0x0018,
|
||||||
|
"KeyP": 0x0019,
|
||||||
|
"BracketLeft": 0x001A,
|
||||||
|
"BracketRight": 0x001B,
|
||||||
|
"Enter": 0x001C,
|
||||||
|
"ControlLeft": 0x001D,
|
||||||
|
"KeyA": 0x001E,
|
||||||
|
"KeyS": 0x001F,
|
||||||
|
"KeyD": 0x0020,
|
||||||
|
"KeyF": 0x0021,
|
||||||
|
"KeyG": 0x0022,
|
||||||
|
"KeyH": 0x0023,
|
||||||
|
"KeyJ": 0x0024,
|
||||||
|
"KeyK": 0x0025,
|
||||||
|
"KeyL": 0x0026,
|
||||||
|
"Semicolon": 0x0027,
|
||||||
|
"Quote": 0x0028,
|
||||||
|
"Backquote": 0x0029,
|
||||||
|
"ShiftLeft": 0x002A,
|
||||||
|
"Backslash": 0x002B,
|
||||||
|
"KeyZ": 0x002C,
|
||||||
|
"KeyX": 0x002D,
|
||||||
|
"KeyC": 0x002E,
|
||||||
|
"KeyV": 0x002F,
|
||||||
|
"KeyB": 0x0030,
|
||||||
|
"KeyN": 0x0031,
|
||||||
|
"KeyM": 0x0032,
|
||||||
|
"Comma": 0x0033,
|
||||||
|
"Period": 0x0034,
|
||||||
|
"Slash": 0x0035,
|
||||||
|
"ShiftRight": 0x0036,
|
||||||
|
"NumpadMultiply": 0x0037,
|
||||||
|
"AltLeft": 0x0038,
|
||||||
|
"Space": 0x0039,
|
||||||
|
"CapsLock": 0x003A,
|
||||||
|
"F1": 0x003B,
|
||||||
|
"F2": 0x003C,
|
||||||
|
"F3": 0x003D,
|
||||||
|
"F4": 0x003E,
|
||||||
|
"F5": 0x003F,
|
||||||
|
"F6": 0x0040,
|
||||||
|
"F7": 0x0041,
|
||||||
|
"F8": 0x0042,
|
||||||
|
"F9": 0x0043,
|
||||||
|
"F10": 0x0044,
|
||||||
|
"Pause": 0xE045,
|
||||||
|
"ScrollLock": 0x0046,
|
||||||
|
"Numpad7": 0x0047,
|
||||||
|
"Numpad8": 0x0048,
|
||||||
|
"Numpad9": 0x0049,
|
||||||
|
"NumpadSubtract": 0x004A,
|
||||||
|
"Numpad4": 0x004B,
|
||||||
|
"Numpad5": 0x004C,
|
||||||
|
"Numpad6": 0x004D,
|
||||||
|
"NumpadAdd": 0x004E,
|
||||||
|
"Numpad1": 0x004F,
|
||||||
|
"Numpad2": 0x0050,
|
||||||
|
"Numpad3": 0x0051,
|
||||||
|
"Numpad0": 0x0052,
|
||||||
|
"NumpadDecimal": 0x0053,
|
||||||
|
"IntlBackslash": 0x0056,
|
||||||
|
"F11": 0x0057,
|
||||||
|
"F12": 0x0058,
|
||||||
|
"IntlYen": 0x007D,
|
||||||
|
"MediaTrackPrevious": 0xE010,
|
||||||
|
"MediaTrackNext": 0xE019,
|
||||||
|
"NumpadEnter": 0xE01C,
|
||||||
|
"ControlRight": 0xE01D,
|
||||||
|
"VolumeMute": 0xE020,
|
||||||
|
"MediaPlayPause": 0xE022,
|
||||||
|
"MediaStop": 0xE024,
|
||||||
|
"VolumeDown": 0xE02E,
|
||||||
|
"VolumeUp": 0xE030,
|
||||||
|
"BrowserHome": 0xE032,
|
||||||
|
"NumpadDivide": 0xE035,
|
||||||
|
"PrintScreen": 0xE037,
|
||||||
|
"AltRight": 0xE038,
|
||||||
|
"NumLock": 0x0045,
|
||||||
|
"Home": 0xE047,
|
||||||
|
"ArrowUp": 0xE048,
|
||||||
|
"PageUp": 0xE049,
|
||||||
|
"ArrowLeft": 0xE04B,
|
||||||
|
"ArrowRight": 0xE04D,
|
||||||
|
"End": 0xE04F,
|
||||||
|
"ArrowDown": 0xE050,
|
||||||
|
"PageDown": 0xE051,
|
||||||
|
"Insert": 0xE052,
|
||||||
|
"Delete": 0xE053,
|
||||||
|
"MetaLeft": 0xE05B,
|
||||||
|
"MetaRight": 0xE05C,
|
||||||
|
"OSLeft": 0xE05B, // OSLeft and OSRight are kept for compatability since
|
||||||
|
"OSRight": 0xE05C, // Firefox haven't updated to MetaLeft and MetaRight yet
|
||||||
|
"ContextMenu": 0xE05D,
|
||||||
|
"BrowserSearch": 0xE065,
|
||||||
|
"BrowserFavorites": 0xE066,
|
||||||
|
"BrowserRefresh": 0xE067,
|
||||||
|
"BrowserStop": 0xE068,
|
||||||
|
"BrowserForward": 0xE069,
|
||||||
|
"BrowserBack": 0xE06A,
|
||||||
|
"NumpadComma": 0x007E,
|
||||||
|
"NumpadEqual": 0x0059,
|
||||||
|
"F13": 0x0064,
|
||||||
|
"F14": 0x0065,
|
||||||
|
"F15": 0x0066,
|
||||||
|
"F16": 0x0067,
|
||||||
|
"F17": 0x0068,
|
||||||
|
"F18": 0x0069,
|
||||||
|
"F19": 0x006A,
|
||||||
|
"F20": 0x006B,
|
||||||
|
"F21": 0x006C,
|
||||||
|
"F22": 0x006D,
|
||||||
|
"F23": 0x006E,
|
||||||
|
"F24": 0x0076,
|
||||||
|
"KanaMode": 0x0070,
|
||||||
|
"Lang2": 0x0071,
|
||||||
|
"Lang1": 0x0072,
|
||||||
|
"IntlRo": 0x0073,
|
||||||
|
"Convert": 0x0079,
|
||||||
|
"NonConvert": 0x007B,
|
||||||
|
"LaunchApp2": 0xE021,
|
||||||
|
"Power": 0xE05E,
|
||||||
|
"LaunchApp1": 0xE06B,
|
||||||
|
"LaunchMail": 0xE06C,
|
||||||
|
"MediaSelect": 0xE06D,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* [module] export default XtScancode */
|
||||||
621
noVNC/core/util.js
Normal file
|
|
@ -0,0 +1,621 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* jshint white: false, nonstandard: true */
|
||||||
|
/*global window, console, document, navigator, ActiveXObject, INCLUDE_URI */
|
||||||
|
|
||||||
|
var Util = {};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Namespaced in Util
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Logging/debug routines
|
||||||
|
*/
|
||||||
|
|
||||||
|
Util._log_level = 'warn';
|
||||||
|
Util.init_logging = function (level) {
|
||||||
|
"use strict";
|
||||||
|
if (typeof level === 'undefined') {
|
||||||
|
level = Util._log_level;
|
||||||
|
} else {
|
||||||
|
Util._log_level = level;
|
||||||
|
}
|
||||||
|
|
||||||
|
Util.Debug = Util.Info = Util.Warn = Util.Error = function (msg) {};
|
||||||
|
if (typeof window.console !== "undefined") {
|
||||||
|
/* jshint -W086 */
|
||||||
|
switch (level) {
|
||||||
|
case 'debug':
|
||||||
|
Util.Debug = console.debug.bind(window.console);
|
||||||
|
case 'info':
|
||||||
|
Util.Info = console.info.bind(window.console);
|
||||||
|
case 'warn':
|
||||||
|
Util.Warn = console.warn.bind(window.console);
|
||||||
|
case 'error':
|
||||||
|
Util.Error = console.error.bind(window.console);
|
||||||
|
case 'none':
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error("invalid logging type '" + level + "'");
|
||||||
|
}
|
||||||
|
/* jshint +W086 */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Util.get_logging = function () {
|
||||||
|
return Util._log_level;
|
||||||
|
};
|
||||||
|
// Initialize logging level
|
||||||
|
Util.init_logging();
|
||||||
|
|
||||||
|
Util.make_property = function (proto, name, mode, type) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var getter;
|
||||||
|
if (type === 'arr') {
|
||||||
|
getter = function (idx) {
|
||||||
|
if (typeof idx !== 'undefined') {
|
||||||
|
return this['_' + name][idx];
|
||||||
|
} else {
|
||||||
|
return this['_' + name];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
getter = function () {
|
||||||
|
return this['_' + name];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var make_setter = function (process_val) {
|
||||||
|
if (process_val) {
|
||||||
|
return function (val, idx) {
|
||||||
|
if (typeof idx !== 'undefined') {
|
||||||
|
this['_' + name][idx] = process_val(val);
|
||||||
|
} else {
|
||||||
|
this['_' + name] = process_val(val);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return function (val, idx) {
|
||||||
|
if (typeof idx !== 'undefined') {
|
||||||
|
this['_' + name][idx] = val;
|
||||||
|
} else {
|
||||||
|
this['_' + name] = val;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var setter;
|
||||||
|
if (type === 'bool') {
|
||||||
|
setter = make_setter(function (val) {
|
||||||
|
if (!val || (val in {'0': 1, 'no': 1, 'false': 1})) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if (type === 'int') {
|
||||||
|
setter = make_setter(function (val) { return parseInt(val, 10); });
|
||||||
|
} else if (type === 'float') {
|
||||||
|
setter = make_setter(parseFloat);
|
||||||
|
} else if (type === 'str') {
|
||||||
|
setter = make_setter(String);
|
||||||
|
} else if (type === 'func') {
|
||||||
|
setter = make_setter(function (val) {
|
||||||
|
if (!val) {
|
||||||
|
return function () {};
|
||||||
|
} else {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if (type === 'arr' || type === 'dom' || type == 'raw') {
|
||||||
|
setter = make_setter();
|
||||||
|
} else {
|
||||||
|
throw new Error('Unknown property type ' + type); // some sanity checking
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the getter
|
||||||
|
if (typeof proto['get_' + name] === 'undefined') {
|
||||||
|
proto['get_' + name] = getter;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the setter if needed
|
||||||
|
if (typeof proto['set_' + name] === 'undefined') {
|
||||||
|
if (mode === 'rw') {
|
||||||
|
proto['set_' + name] = setter;
|
||||||
|
} else if (mode === 'wo') {
|
||||||
|
proto['set_' + name] = function (val, idx) {
|
||||||
|
if (typeof this['_' + name] !== 'undefined') {
|
||||||
|
throw new Error(name + " can only be set once");
|
||||||
|
}
|
||||||
|
setter.call(this, val, idx);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// make a special setter that we can use in set defaults
|
||||||
|
proto['_raw_set_' + name] = function (val, idx) {
|
||||||
|
setter.call(this, val, idx);
|
||||||
|
//delete this['_init_set_' + name]; // remove it after use
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
Util.make_properties = function (constructor, arr) {
|
||||||
|
"use strict";
|
||||||
|
for (var i = 0; i < arr.length; i++) {
|
||||||
|
Util.make_property(constructor.prototype, arr[i][0], arr[i][1], arr[i][2]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Util.set_defaults = function (obj, conf, defaults) {
|
||||||
|
var defaults_keys = Object.keys(defaults);
|
||||||
|
var conf_keys = Object.keys(conf);
|
||||||
|
var keys_obj = {};
|
||||||
|
var i;
|
||||||
|
for (i = 0; i < defaults_keys.length; i++) { keys_obj[defaults_keys[i]] = 1; }
|
||||||
|
for (i = 0; i < conf_keys.length; i++) { keys_obj[conf_keys[i]] = 1; }
|
||||||
|
var keys = Object.keys(keys_obj);
|
||||||
|
|
||||||
|
for (i = 0; i < keys.length; i++) {
|
||||||
|
var setter = obj['_raw_set_' + keys[i]];
|
||||||
|
if (!setter) {
|
||||||
|
Util.Warn('Invalid property ' + keys[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keys[i] in conf) {
|
||||||
|
setter.call(obj, conf[keys[i]]);
|
||||||
|
} else {
|
||||||
|
setter.call(obj, defaults[keys[i]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Decode from UTF-8
|
||||||
|
*/
|
||||||
|
Util.decodeUTF8 = function (utf8string) {
|
||||||
|
"use strict";
|
||||||
|
return decodeURIComponent(escape(utf8string));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Cross-browser routines
|
||||||
|
*/
|
||||||
|
|
||||||
|
Util.getPointerEvent = function (e) {
|
||||||
|
return e.changedTouches ? e.changedTouches[0] : e.touches ? e.touches[0] : e;
|
||||||
|
};
|
||||||
|
|
||||||
|
Util.stopEvent = function (e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
e.preventDefault();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Touch detection
|
||||||
|
Util.isTouchDevice = ('ontouchstart' in document.documentElement) ||
|
||||||
|
// requried for Chrome debugger
|
||||||
|
(document.ontouchstart !== undefined) ||
|
||||||
|
// required for MS Surface
|
||||||
|
(navigator.maxTouchPoints > 0) ||
|
||||||
|
(navigator.msMaxTouchPoints > 0);
|
||||||
|
window.addEventListener('touchstart', function onFirstTouch() {
|
||||||
|
Util.isTouchDevice = true;
|
||||||
|
window.removeEventListener('touchstart', onFirstTouch, false);
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
Util._cursor_uris_supported = null;
|
||||||
|
|
||||||
|
Util.browserSupportsCursorURIs = function () {
|
||||||
|
if (Util._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) {
|
||||||
|
Util.Info("Data URI scheme cursor supported");
|
||||||
|
Util._cursor_uris_supported = true;
|
||||||
|
} else {
|
||||||
|
Util.Warn("Data URI scheme cursor not supported");
|
||||||
|
Util._cursor_uris_supported = false;
|
||||||
|
}
|
||||||
|
} catch (exc) {
|
||||||
|
Util.Error("Data URI scheme cursor test exception: " + exc);
|
||||||
|
Util._cursor_uris_supported = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Util._cursor_uris_supported;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Set browser engine versions. Based on mootools.
|
||||||
|
Util.Features = {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)};
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
"use strict";
|
||||||
|
// 'presto': (function () { return (!window.opera) ? false : true; }()),
|
||||||
|
var detectPresto = function () {
|
||||||
|
return !!window.opera;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 'trident': (function () { return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? ((document.querySelectorAll) ? 6 : 5) : 4);
|
||||||
|
var detectTrident = function () {
|
||||||
|
if (!window.ActiveXObject) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
if (window.XMLHttpRequest) {
|
||||||
|
return (document.querySelectorAll) ? 6 : 5;
|
||||||
|
} else {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 'webkit': (function () { try { return (navigator.taintEnabled) ? false : ((Util.Features.xpath) ? ((Util.Features.query) ? 525 : 420) : 419); } catch (e) { return false; } }()),
|
||||||
|
var detectInitialWebkit = function () {
|
||||||
|
try {
|
||||||
|
if (navigator.taintEnabled) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
if (Util.Features.xpath) {
|
||||||
|
return (Util.Features.query) ? 525 : 420;
|
||||||
|
} else {
|
||||||
|
return 419;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var detectActualWebkit = function (initial_ver) {
|
||||||
|
var re = /WebKit\/([0-9\.]*) /;
|
||||||
|
var str_ver = (navigator.userAgent.match(re) || ['', initial_ver])[1];
|
||||||
|
return parseFloat(str_ver, 10);
|
||||||
|
};
|
||||||
|
|
||||||
|
// 'gecko': (function () { return (!document.getBoxObjectFor && window.mozInnerScreenX == null) ? false : ((document.getElementsByClassName) ? 19ssName) ? 19 : 18 : 18); }())
|
||||||
|
var detectGecko = function () {
|
||||||
|
/* jshint -W041 */
|
||||||
|
if (!document.getBoxObjectFor && window.mozInnerScreenX == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return (document.getElementsByClassName) ? 19 : 18;
|
||||||
|
}
|
||||||
|
/* jshint +W041 */
|
||||||
|
};
|
||||||
|
|
||||||
|
Util.Engine = {
|
||||||
|
// Version detection break in Opera 11.60 (errors on arguments.callee.caller reference)
|
||||||
|
//'presto': (function() {
|
||||||
|
// return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925)); }()),
|
||||||
|
'presto': detectPresto(),
|
||||||
|
'trident': detectTrident(),
|
||||||
|
'webkit': detectInitialWebkit(),
|
||||||
|
'gecko': detectGecko()
|
||||||
|
};
|
||||||
|
|
||||||
|
if (Util.Engine.webkit) {
|
||||||
|
// Extract actual webkit version if available
|
||||||
|
Util.Engine.webkit = detectActualWebkit(Util.Engine.webkit);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
|
Util.Flash = (function () {
|
||||||
|
"use strict";
|
||||||
|
var v, version;
|
||||||
|
try {
|
||||||
|
v = navigator.plugins['Shockwave Flash'].description;
|
||||||
|
} catch (err1) {
|
||||||
|
try {
|
||||||
|
v = new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
|
||||||
|
} catch (err2) {
|
||||||
|
v = '0 r0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
version = v.match(/\d+/g);
|
||||||
|
return {version: parseInt(version[0] || 0 + '.' + version[1], 10) || 0, build: parseInt(version[2], 10) || 0};
|
||||||
|
}());
|
||||||
|
|
||||||
|
|
||||||
|
Util.Localisation = {
|
||||||
|
// Currently configured language
|
||||||
|
language: 'en',
|
||||||
|
|
||||||
|
// Configure suitable language based on user preferences
|
||||||
|
setup: function (supportedLanguages) {
|
||||||
|
var userLanguages;
|
||||||
|
|
||||||
|
Util.Localisation.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;
|
||||||
|
|
||||||
|
Util.Localisation.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;
|
||||||
|
|
||||||
|
Util.Localisation.language = supportedLanguages[j];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Retrieve localised text
|
||||||
|
get: function (id) {
|
||||||
|
if (typeof Language !== 'undefined' && Language[id]) {
|
||||||
|
return Language[id];
|
||||||
|
} else {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Traverses the DOM and translates relevant fields
|
||||||
|
// See https://html.spec.whatwg.org/multipage/dom.html#attr-translate
|
||||||
|
translateDOM: function () {
|
||||||
|
function process(elem, enabled) {
|
||||||
|
function isAnyOf(searchElement, items) {
|
||||||
|
return items.indexOf(searchElement) !== -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function translateAttribute(elem, attr) {
|
||||||
|
var str = elem.getAttribute(attr);
|
||||||
|
str = Util.Localisation.get(str);
|
||||||
|
elem.setAttribute(attr, str);
|
||||||
|
}
|
||||||
|
|
||||||
|
function translateTextNode(node) {
|
||||||
|
var str = node.data.trim();
|
||||||
|
str = Util.Localisation.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"])) {
|
||||||
|
translateAttribute(elem, "value");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0;i < elem.childNodes.length;i++) {
|
||||||
|
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);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// Emulate Element.setCapture() when not supported
|
||||||
|
|
||||||
|
Util._captureRecursion = false;
|
||||||
|
Util._captureProxy = function (e) {
|
||||||
|
// Recursion protection as we'll see our own event
|
||||||
|
if (Util._captureRecursion) return;
|
||||||
|
|
||||||
|
// Clone the event as we cannot dispatch an already dispatched event
|
||||||
|
var newEv = new e.constructor(e.type, e);
|
||||||
|
|
||||||
|
Util._captureRecursion = true;
|
||||||
|
Util._captureElem.dispatchEvent(newEv);
|
||||||
|
Util._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") || (e.type === "touchend")) {
|
||||||
|
Util.releaseCapture();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Follow cursor style of target element
|
||||||
|
Util._captureElemChanged = function() {
|
||||||
|
var captureElem = document.getElementById("noVNC_mouse_capture_elem");
|
||||||
|
captureElem.style.cursor = window.getComputedStyle(Util._captureElem).cursor;
|
||||||
|
};
|
||||||
|
Util._captureObserver = new MutationObserver(Util._captureElemChanged);
|
||||||
|
|
||||||
|
Util._captureIndex = 0;
|
||||||
|
|
||||||
|
Util.setCapture = function (elem) {
|
||||||
|
if (elem.setCapture) {
|
||||||
|
|
||||||
|
elem.setCapture();
|
||||||
|
|
||||||
|
// IE releases capture on 'click' events which might not trigger
|
||||||
|
elem.addEventListener('mouseup', Util.releaseCapture);
|
||||||
|
elem.addEventListener('touchend', Util.releaseCapture);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Release any existing capture in case this method is
|
||||||
|
// called multiple times without coordination
|
||||||
|
Util.releaseCapture();
|
||||||
|
|
||||||
|
// Safari on iOS 9 has a broken constructor for TouchEvent.
|
||||||
|
// We are fine in this case however, since Safari seems to
|
||||||
|
// have some sort of implicit setCapture magic anyway.
|
||||||
|
if (window.TouchEvent !== undefined) {
|
||||||
|
try {
|
||||||
|
new TouchEvent("touchstart");
|
||||||
|
} catch (TypeError) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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', Util._captureProxy);
|
||||||
|
|
||||||
|
captureElem.addEventListener('mousemove', Util._captureProxy);
|
||||||
|
captureElem.addEventListener('mouseup', Util._captureProxy);
|
||||||
|
|
||||||
|
captureElem.addEventListener('touchmove', Util._captureProxy);
|
||||||
|
captureElem.addEventListener('touchend', Util._captureProxy);
|
||||||
|
}
|
||||||
|
|
||||||
|
Util._captureElem = elem;
|
||||||
|
Util._captureIndex++;
|
||||||
|
|
||||||
|
// Track cursor and get initial cursor
|
||||||
|
Util._captureObserver.observe(elem, {attributes:true});
|
||||||
|
Util._captureElemChanged();
|
||||||
|
|
||||||
|
captureElem.style.display = null;
|
||||||
|
|
||||||
|
// We listen to events on window in order to keep tracking if it
|
||||||
|
// happens to leave the viewport
|
||||||
|
window.addEventListener('mousemove', Util._captureProxy);
|
||||||
|
window.addEventListener('mouseup', Util._captureProxy);
|
||||||
|
|
||||||
|
window.addEventListener('touchmove', Util._captureProxy);
|
||||||
|
window.addEventListener('touchend', Util._captureProxy);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Util.releaseCapture = function () {
|
||||||
|
if (document.releaseCapture) {
|
||||||
|
|
||||||
|
document.releaseCapture();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (!Util._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 (Util._captureIndex === expected) {
|
||||||
|
Util._captureElem = null;
|
||||||
|
}
|
||||||
|
}, 0, Util._captureIndex);
|
||||||
|
|
||||||
|
Util._captureObserver.disconnect();
|
||||||
|
|
||||||
|
var captureElem = document.getElementById("noVNC_mouse_capture_elem");
|
||||||
|
captureElem.style.display = "none";
|
||||||
|
|
||||||
|
window.removeEventListener('mousemove', Util._captureProxy);
|
||||||
|
window.removeEventListener('mouseup', Util._captureProxy);
|
||||||
|
|
||||||
|
window.removeEventListener('touchmove', Util._captureProxy);
|
||||||
|
window.removeEventListener('touchend', Util._captureProxy);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* [module] export default Util; */
|
||||||
|
|
@ -3,10 +3,8 @@
|
||||||
* Copyright (C) 2012 Joel Martin
|
* Copyright (C) 2012 Joel Martin
|
||||||
* Licensed under MPL 2.0 (see LICENSE.txt)
|
* Licensed under MPL 2.0 (see LICENSE.txt)
|
||||||
*
|
*
|
||||||
* Websock is similar to the standard WebSocket object but Websock
|
* Websock is similar to the standard WebSocket object but with extra
|
||||||
* enables communication with raw TCP sockets (i.e. the binary stream)
|
* buffer handling.
|
||||||
* via websockify. This is accomplished by base64 encoding the data
|
|
||||||
* stream between Websock and websockify.
|
|
||||||
*
|
*
|
||||||
* Websock has built-in receive queue buffering; the message event
|
* Websock has built-in receive queue buffering; the message event
|
||||||
* does not contain actual data but is simply a notification that
|
* does not contain actual data but is simply a notification that
|
||||||
|
|
@ -14,50 +12,29 @@
|
||||||
* read binary data off of the receive queue.
|
* read binary data off of the receive queue.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* [module]
|
||||||
|
* import Util from "./util";
|
||||||
|
*/
|
||||||
|
|
||||||
/*jslint browser: true, bitwise: true */
|
/*jslint browser: true, bitwise: true */
|
||||||
/*global Util, Base64 */
|
/*global Util*/
|
||||||
|
|
||||||
|
/* [module] export default */ function Websock() {
|
||||||
// Load Flash WebSocket emulator if needed
|
|
||||||
|
|
||||||
// To force WebSocket emulator even when native WebSocket available
|
|
||||||
//window.WEB_SOCKET_FORCE_FLASH = true;
|
|
||||||
// To enable WebSocket emulator debug:
|
|
||||||
//window.WEB_SOCKET_DEBUG=1;
|
|
||||||
|
|
||||||
if (window.WebSocket && !window.WEB_SOCKET_FORCE_FLASH) {
|
|
||||||
Websock_native = true;
|
|
||||||
} else if (window.MozWebSocket && !window.WEB_SOCKET_FORCE_FLASH) {
|
|
||||||
Websock_native = true;
|
|
||||||
window.WebSocket = window.MozWebSocket;
|
|
||||||
} else {
|
|
||||||
/* no builtin WebSocket so load web_socket.js */
|
|
||||||
|
|
||||||
Websock_native = false;
|
|
||||||
(function () {
|
|
||||||
window.WEB_SOCKET_SWF_LOCATION = Util.get_include_uri() +
|
|
||||||
"web-socket-js/WebSocketMain.swf";
|
|
||||||
if (Util.Engine.trident) {
|
|
||||||
Util.Debug("Forcing uncached load of WebSocketMain.swf");
|
|
||||||
window.WEB_SOCKET_SWF_LOCATION += "?" + Math.random();
|
|
||||||
}
|
|
||||||
Util.load_scripts(["web-socket-js/swfobject.js",
|
|
||||||
"web-socket-js/web_socket.js"]);
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function Websock() {
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
this._websocket = null; // WebSocket object
|
this._websocket = null; // WebSocket object
|
||||||
this._rQ = []; // Receive queue
|
|
||||||
this._rQi = 0; // Receive queue index
|
|
||||||
this._rQmax = 10000; // Max receive queue size before compacting
|
|
||||||
this._sQ = []; // Send queue
|
|
||||||
|
|
||||||
this._mode = 'base64'; // Current WebSocket mode: 'binary', 'base64'
|
this._rQi = 0; // Receive queue index
|
||||||
this.maxBufferedAmount = 200;
|
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 = {
|
this._eventHandlers = {
|
||||||
'message': function () {},
|
'message': function () {},
|
||||||
|
|
@ -65,10 +42,32 @@ function Websock() {
|
||||||
'close': function () {},
|
'close': function () {},
|
||||||
'error': function () {}
|
'error': function () {}
|
||||||
};
|
};
|
||||||
}
|
};
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
// 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 = {
|
Websock.prototype = {
|
||||||
// Getters and Setters
|
// Getters and Setters
|
||||||
get_sQ: function () {
|
get_sQ: function () {
|
||||||
|
|
@ -89,7 +88,7 @@ function Websock() {
|
||||||
|
|
||||||
// Receive Queue
|
// Receive Queue
|
||||||
rQlen: function () {
|
rQlen: function () {
|
||||||
return this._rQ.length - this._rQi;
|
return this._rQlen - this._rQi;
|
||||||
},
|
},
|
||||||
|
|
||||||
rQpeek8: function () {
|
rQpeek8: function () {
|
||||||
|
|
@ -108,15 +107,7 @@ function Websock() {
|
||||||
this._rQi += num;
|
this._rQi += num;
|
||||||
},
|
},
|
||||||
|
|
||||||
rQunshift8: function (num) {
|
// TODO(directxman12): test performance with these vs a DataView
|
||||||
if (this._rQi === 0) {
|
|
||||||
this._rQ.unshift(num);
|
|
||||||
} else {
|
|
||||||
this._rQi--;
|
|
||||||
this._rQ[this._rQi] = num;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
rQshift16: function () {
|
rQshift16: function () {
|
||||||
return (this._rQ[this._rQi++] << 8) +
|
return (this._rQ[this._rQi++] << 8) +
|
||||||
this._rQ[this._rQi++];
|
this._rQ[this._rQi++];
|
||||||
|
|
@ -131,22 +122,33 @@ function Websock() {
|
||||||
|
|
||||||
rQshiftStr: function (len) {
|
rQshiftStr: function (len) {
|
||||||
if (typeof(len) === 'undefined') { len = this.rQlen(); }
|
if (typeof(len) === 'undefined') { len = this.rQlen(); }
|
||||||
var arr = this._rQ.slice(this._rQi, this._rQi + len);
|
var arr = new Uint8Array(this._rQ.buffer, this._rQi, len);
|
||||||
this._rQi += len;
|
this._rQi += len;
|
||||||
return String.fromCharCode.apply(null, arr);
|
return typedArrayToString(arr);
|
||||||
},
|
},
|
||||||
|
|
||||||
rQshiftBytes: function (len) {
|
rQshiftBytes: function (len) {
|
||||||
if (typeof(len) === 'undefined') { len = this.rQlen(); }
|
if (typeof(len) === 'undefined') { len = this.rQlen(); }
|
||||||
this._rQi += len;
|
this._rQi += len;
|
||||||
return this._rQ.slice(this._rQi - len, this._rQi);
|
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) {
|
rQslice: function (start, end) {
|
||||||
if (end) {
|
if (end) {
|
||||||
return this._rQ.slice(this._rQi + start, this._rQi + end);
|
return new Uint8Array(this._rQ.buffer, this._rQi + start, end - start);
|
||||||
} else {
|
} else {
|
||||||
return this._rQ.slice(this._rQi + start);
|
return new Uint8Array(this._rQ.buffer, this._rQi + start, this._rQlen - this._rQi - start);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -154,7 +156,7 @@ function Websock() {
|
||||||
// to be available in the receive queue. Return true if we need to
|
// to be available in the receive queue. Return true if we need to
|
||||||
// wait (and possibly print a debug message), otherwise false.
|
// wait (and possibly print a debug message), otherwise false.
|
||||||
rQwait: function (msg, num, goback) {
|
rQwait: function (msg, num, goback) {
|
||||||
var rQlen = this._rQ.length - this._rQi; // Skip rQlen() function call
|
var rQlen = this._rQlen - this._rQi; // Skip rQlen() function call
|
||||||
if (rQlen < num) {
|
if (rQlen < num) {
|
||||||
if (goback) {
|
if (goback) {
|
||||||
if (this._rQi < goback) {
|
if (this._rQi < goback) {
|
||||||
|
|
@ -174,23 +176,16 @@ function Websock() {
|
||||||
Util.Debug("bufferedAmount: " + this._websocket.bufferedAmount);
|
Util.Debug("bufferedAmount: " + this._websocket.bufferedAmount);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._websocket.bufferedAmount < this.maxBufferedAmount) {
|
if (this._sQlen > 0 && this._websocket.readyState === WebSocket.OPEN) {
|
||||||
if (this._sQ.length > 0) {
|
this._websocket.send(this._encode_message());
|
||||||
this._websocket.send(this._encode_message());
|
this._sQlen = 0;
|
||||||
this._sQ = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
Util.Info("Delaying send, bufferedAmount: " +
|
|
||||||
this._websocket.bufferedAmount);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
send: function (arr) {
|
send: function (arr) {
|
||||||
this._sQ = this._sQ.concat(arr);
|
this._sQ.set(arr, this._sQlen);
|
||||||
return this.flush();
|
this._sQlen += arr.length;
|
||||||
|
this.flush();
|
||||||
},
|
},
|
||||||
|
|
||||||
send_string: function (str) {
|
send_string: function (str) {
|
||||||
|
|
@ -208,90 +203,31 @@ function Websock() {
|
||||||
this._eventHandlers[evt] = handler;
|
this._eventHandlers[evt] = handler;
|
||||||
},
|
},
|
||||||
|
|
||||||
init: function (protocols, ws_schema) {
|
_allocate_buffers: function () {
|
||||||
this._rQ = [];
|
this._rQ = new Uint8Array(this._rQbufferSize);
|
||||||
|
this._sQ = new Uint8Array(this._sQbufferSize);
|
||||||
|
},
|
||||||
|
|
||||||
|
init: function () {
|
||||||
|
this._allocate_buffers();
|
||||||
this._rQi = 0;
|
this._rQi = 0;
|
||||||
this._sQ = [];
|
|
||||||
this._websocket = null;
|
this._websocket = null;
|
||||||
|
|
||||||
// Check for full typed array support
|
|
||||||
var bt = false;
|
|
||||||
if (('Uint8Array' in window) &&
|
|
||||||
('set' in Uint8Array.prototype)) {
|
|
||||||
bt = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for full binary type support in WebSockets
|
|
||||||
// Inspired by:
|
|
||||||
// https://github.com/Modernizr/Modernizr/issues/370
|
|
||||||
// https://github.com/Modernizr/Modernizr/blob/master/feature-detects/websockets/binary.js
|
|
||||||
var wsbt = false;
|
|
||||||
try {
|
|
||||||
if (bt && ('binaryType' in WebSocket.prototype ||
|
|
||||||
!!(new WebSocket(ws_schema + '://.').binaryType))) {
|
|
||||||
Util.Info("Detected binaryType support in WebSockets");
|
|
||||||
wsbt = true;
|
|
||||||
}
|
|
||||||
} catch (exc) {
|
|
||||||
// Just ignore failed test localhost connection
|
|
||||||
}
|
|
||||||
|
|
||||||
// Default protocols if not specified
|
|
||||||
if (typeof(protocols) === "undefined") {
|
|
||||||
if (wsbt) {
|
|
||||||
protocols = ['binary', 'base64'];
|
|
||||||
} else {
|
|
||||||
protocols = 'base64';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!wsbt) {
|
|
||||||
if (protocols === 'binary') {
|
|
||||||
throw new Error('WebSocket binary sub-protocol requested but not supported');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof(protocols) === 'object') {
|
|
||||||
var new_protocols = [];
|
|
||||||
|
|
||||||
for (var i = 0; i < protocols.length; i++) {
|
|
||||||
if (protocols[i] === 'binary') {
|
|
||||||
Util.Error('Skipping unsupported WebSocket binary sub-protocol');
|
|
||||||
} else {
|
|
||||||
new_protocols.push(protocols[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (new_protocols.length > 0) {
|
|
||||||
protocols = new_protocols;
|
|
||||||
} else {
|
|
||||||
throw new Error("Only WebSocket binary sub-protocol was requested and is not supported.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return protocols;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
open: function (uri, protocols) {
|
open: function (uri, protocols) {
|
||||||
var ws_schema = uri.match(/^([a-z]+):\/\//)[1];
|
var ws_schema = uri.match(/^([a-z]+):\/\//)[1];
|
||||||
protocols = this.init(protocols, ws_schema);
|
this.init();
|
||||||
|
|
||||||
this._websocket = new WebSocket(uri, protocols);
|
this._websocket = new WebSocket(uri, protocols);
|
||||||
|
this._websocket.binaryType = 'arraybuffer';
|
||||||
if (protocols.indexOf('binary') >= 0) {
|
|
||||||
this._websocket.binaryType = 'arraybuffer';
|
|
||||||
}
|
|
||||||
|
|
||||||
this._websocket.onmessage = this._recv_message.bind(this);
|
this._websocket.onmessage = this._recv_message.bind(this);
|
||||||
this._websocket.onopen = (function () {
|
this._websocket.onopen = (function () {
|
||||||
Util.Debug('>> WebSock.onopen');
|
Util.Debug('>> WebSock.onopen');
|
||||||
if (this._websocket.protocol) {
|
if (this._websocket.protocol) {
|
||||||
this._mode = this._websocket.protocol;
|
|
||||||
Util.Info("Server choose sub-protocol: " + this._websocket.protocol);
|
Util.Info("Server choose sub-protocol: " + this._websocket.protocol);
|
||||||
} else {
|
|
||||||
this._mode = 'base64';
|
|
||||||
Util.Error('Server select no sub-protocol!: ' + this._websocket.protocol);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this._eventHandlers.open();
|
this._eventHandlers.open();
|
||||||
Util.Debug("<< WebSock.onopen");
|
Util.Debug("<< WebSock.onopen");
|
||||||
}).bind(this);
|
}).bind(this);
|
||||||
|
|
@ -321,26 +257,56 @@ function Websock() {
|
||||||
|
|
||||||
// private methods
|
// private methods
|
||||||
_encode_message: function () {
|
_encode_message: function () {
|
||||||
if (this._mode === 'binary') {
|
// Put in a binary arraybuffer
|
||||||
// Put in a binary arraybuffer
|
// according to the spec, you can send ArrayBufferViews with the send method
|
||||||
return (new Uint8Array(this._sQ)).buffer;
|
return new Uint8Array(this._sQ.buffer, 0, this._sQlen);
|
||||||
} else {
|
},
|
||||||
// base64 encode
|
|
||||||
return Base64.encode(this._sQ);
|
_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) {
|
_decode_message: function (data) {
|
||||||
if (this._mode === 'binary') {
|
// push arraybuffer values onto the end
|
||||||
// push arraybuffer values onto the end
|
var u8 = new Uint8Array(data);
|
||||||
var u8 = new Uint8Array(data);
|
if (u8.length > this._rQbufferSize - this._rQlen) {
|
||||||
for (var i = 0; i < u8.length; i++) {
|
this._expand_compact_rQ(u8.length);
|
||||||
this._rQ.push(u8[i]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// base64 decode and concat to end
|
|
||||||
this._rQ = this._rQ.concat(Base64.decode(data, 0));
|
|
||||||
}
|
}
|
||||||
|
this._rQ.set(u8, this._rQlen);
|
||||||
|
this._rQlen += u8.length;
|
||||||
},
|
},
|
||||||
|
|
||||||
_recv_message: function (e) {
|
_recv_message: function (e) {
|
||||||
|
|
@ -349,9 +315,11 @@ function Websock() {
|
||||||
if (this.rQlen() > 0) {
|
if (this.rQlen() > 0) {
|
||||||
this._eventHandlers.message();
|
this._eventHandlers.message();
|
||||||
// Compact the receive queue
|
// Compact the receive queue
|
||||||
if (this._rQ.length > this._rQmax) {
|
if (this._rQlen == this._rQi) {
|
||||||
this._rQ = this._rQ.slice(this._rQi);
|
this._rQlen = 0;
|
||||||
this._rQi = 0;
|
this._rQi = 0;
|
||||||
|
} else if (this._rQlen > this._rQmax) {
|
||||||
|
this._expand_compact_rQ();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Util.Debug("Ignoring empty message");
|
Util.Debug("Ignoring empty message");
|
||||||
116
noVNC/custom.css
|
|
@ -1,116 +0,0 @@
|
||||||
.custom_toolbar {
|
|
||||||
position: absolute;
|
|
||||||
width: 52px;
|
|
||||||
height: 99.5%;
|
|
||||||
top: 0px;
|
|
||||||
left: -65px;
|
|
||||||
z-index: 100;
|
|
||||||
padding: 2px;
|
|
||||||
background-color: #EEEEEE;
|
|
||||||
box-shadow: 1px 0 5px #000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom_toolbar_divider1 {
|
|
||||||
width: 40px;
|
|
||||||
height: 1px;
|
|
||||||
margin: 5px;
|
|
||||||
background-color: #000;
|
|
||||||
opacity: 0.1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom_toolbar_divider2 {
|
|
||||||
width: 40px;
|
|
||||||
height: 1px;
|
|
||||||
margin: 5px;
|
|
||||||
background-color: #000;
|
|
||||||
opacity: 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom_toolbar_clicker {
|
|
||||||
position: absolute;
|
|
||||||
width: 43px;
|
|
||||||
height: 36px;
|
|
||||||
margin-top: -2px;
|
|
||||||
margin-left: 54px;
|
|
||||||
line-height: 60px;
|
|
||||||
text-align: center;
|
|
||||||
opacity: 1.0;
|
|
||||||
cursor: pointer;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: center;
|
|
||||||
background-image: url(images/pop_more.png);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom_toolbar_btn {
|
|
||||||
width: 40px;
|
|
||||||
height: 20px;
|
|
||||||
|
|
||||||
font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace;
|
|
||||||
font-size: 13px;
|
|
||||||
line-height: 20px;
|
|
||||||
text-align: center;
|
|
||||||
margin: 15px 5px 15px 5px;
|
|
||||||
|
|
||||||
border: 1px solid #bbbbbb;
|
|
||||||
border-radius: 4px;
|
|
||||||
color: #33444E;
|
|
||||||
background-color: #EEEEEE;
|
|
||||||
box-shadow: 0px 0px 3px #bbbbbb;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom_toolbar_btn_hover {
|
|
||||||
-webkit-box-shadow: inset 0px 0px 5px 2px rgba(0,0,0,0.3);
|
|
||||||
-moz-box-shadow: inset 0px 0px 5px 2px rgba(0,0,0,0.3);
|
|
||||||
box-shadow: inset 0px 0px 5px 2px rgba(0,0,0,0.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom_toolbar_btn_selected {
|
|
||||||
background-color: #bfbfbf;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom_mask {
|
|
||||||
top: 0px;
|
|
||||||
left: 0px;
|
|
||||||
display: none;;
|
|
||||||
position: absolute;
|
|
||||||
background-color: #000;
|
|
||||||
opacity: 0.5;
|
|
||||||
z-index: 200;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom_pause_icon {
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: center;
|
|
||||||
background-image: url("images/pause.png");
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom_resume_icon {
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: center;
|
|
||||||
background-image: url("images/resume.png");
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom_scale_icon {
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: center;
|
|
||||||
background-image: url("images/scale.png");
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom_not_scale_icon {
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: center;
|
|
||||||
background-image: url("images/not_scale.png");
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom_quality_icon {
|
|
||||||
margin: 3px 0px 0px 8px;
|
|
||||||
width: 24px;
|
|
||||||
height: 14px;
|
|
||||||
border-radius: 12px;
|
|
||||||
color: #fff;
|
|
||||||
background-color: #4d4d4d;
|
|
||||||
font-size: 12px;
|
|
||||||
line-height: 14px;
|
|
||||||
font-weight: bolder;
|
|
||||||
}
|
|
||||||
21
noVNC/docs/LICENSE.pako
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
(The MIT License)
|
||||||
|
|
||||||
|
Copyright (C) 2014 by Vitaly Puzrin
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
@ -1 +1 @@
|
||||||
0.4
|
0.6.1
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,5 @@
|
||||||
Some implementation notes:
|
Rebuilding inflator.js
|
||||||
|
|
||||||
There is an included flash object (web-socket-js) that is used to
|
- Download pako from npm
|
||||||
emulate websocket support on browsers without websocket support
|
- Install browserify using npm
|
||||||
(currently only Chrome has WebSocket support).
|
- browserify core/inflator.mod.js -o core/inflator.js -s Inflator
|
||||||
|
|
||||||
Javascript doesn't have a bytearray type, so what you get out of
|
|
||||||
a WebSocket object is just Javascript strings. Javascript has UTF-16
|
|
||||||
unicode strings and anything sent through the WebSocket gets converted
|
|
||||||
to UTF-8 and vice-versa. So, one additional (and necessary) function
|
|
||||||
of websockify is base64 encoding/decoding what is sent to/from the
|
|
||||||
browser.
|
|
||||||
|
|
||||||
Building web-socket-js emulator:
|
|
||||||
|
|
||||||
cd include/web-socket-js/flash-src
|
|
||||||
mxmlc -static-link-runtime-shared-libraries WebSocketMain.as
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,34 @@
|
||||||
- Update and commit docs/VERSION
|
- Decide a new version number X.Y.Z (follow SemVer)
|
||||||
- Create version tag and tarball from tag
|
- Update version in package.json
|
||||||
WVER=0.3
|
- Update version in docs/VERSION
|
||||||
git tag v${WVER}
|
- Commit the change with a commit like "Release X.Y.Z"
|
||||||
git push origin master
|
- Add a new release on GitHub called "vX.Y.Z", and populate it with
|
||||||
git push origin v${WVER}
|
release notes of the following form (where A.B.C is the last release):
|
||||||
git archive --format=tar --prefix=novnc-${WVER}/ v${WVER} > novnc-${WVER}.tar
|
|
||||||
gzip novnc-${WVER}.tar
|
Major Changes Since A.B.C
|
||||||
- Upload tarball to repo
|
=========================
|
||||||
|
|
||||||
|
*Insert warnings here about incompatibilities*
|
||||||
|
|
||||||
|
*Thanks to all the contributors who filed bugs, added features, and fixed bugs
|
||||||
|
during this release :tada:*
|
||||||
|
|
||||||
|
App-visible Changes
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
- *feature* a feature which improves the app usage (#PRNUM)
|
||||||
|
- *bugfix* a bug fix which fixes the app usage (#PRNUM)
|
||||||
|
- *refactor* a refactor which changes the app usage (#PRNUM)
|
||||||
|
|
||||||
|
Library-visible Changes
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
- *feature* a feature which improves the noVNC APIs (#PRNUM)
|
||||||
|
- *bugfix* a bug fix which fixes the noVNC APIs (#PRNUM)
|
||||||
|
- *refactor* a refactor which changes the noVNC APIs (#PRNUM)
|
||||||
|
|
||||||
|
App-internals Changes
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
- *bugfix* a bug fix with affects the internals of noVNC only (#PRNUM)
|
||||||
|
- *refactor* a refactor which affects the internals of noVNC only (#PRNUM)
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
images/favicon.ico
|
|
||||||
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 339 B |
|
Before Width: | Height: | Size: 501 B |
|
Before Width: | Height: | Size: 404 B |
|
Before Width: | Height: | Size: 354 B |
|
Before Width: | Height: | Size: 317 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 963 B |
|
Before Width: | Height: | Size: 385 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 453 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 511 B |
|
Before Width: | Height: | Size: 517 B |
|
Before Width: | Height: | Size: 497 B |
|
Before Width: | Height: | Size: 513 B |