feat: support video mode
1
.dockerignore
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
web/node_modules
|
||||||
3
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
*.pyc
|
||||||
|
tags
|
||||||
|
cscope*
|
||||||
6
.gitmodules
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[submodule "web/static/novnc"]
|
||||||
|
path = web/static/novnc
|
||||||
|
url = https://github.com/novnc/noVNC
|
||||||
|
[submodule "web/static/websockify"]
|
||||||
|
path = web/static/websockify
|
||||||
|
url = https://github.com/novnc/websockify
|
||||||
20
DEVELOPMENT.md
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
# Run in local
|
||||||
|
```
|
||||||
|
make build
|
||||||
|
make run
|
||||||
|
```
|
||||||
|
|
||||||
|
## develop backend
|
||||||
|
```
|
||||||
|
make shell
|
||||||
|
supervisorctl stop web
|
||||||
|
cd /src/image/usr/local/lib/web/backend
|
||||||
|
./run.py --debug
|
||||||
|
```
|
||||||
|
|
||||||
|
## develop frontend
|
||||||
|
```
|
||||||
|
cd web
|
||||||
|
yarn add
|
||||||
|
BACKEND=http://127.0.0.1:6080 npm run dev
|
||||||
|
```
|
||||||
85
Dockerfile
|
|
@ -1,7 +1,10 @@
|
||||||
FROM ubuntu:16.04
|
################################################################################
|
||||||
LABEL maintainer="fcwu.tw@gmail.com"
|
# base system
|
||||||
|
################################################################################
|
||||||
|
FROM ubuntu:16.04 as system
|
||||||
|
|
||||||
RUN sed -i 's#http://archive.ubuntu.com/#http://tw.archive.ubuntu.com/#' /etc/apt/sources.list
|
ARG localbuild
|
||||||
|
RUN if [ "x$localbuild" != "x" ]; then sed -i 's#http://archive.ubuntu.com/#http://qnap.dorowu.com/#' /etc/apt/sources.list; fi
|
||||||
|
|
||||||
# built-in packages
|
# built-in packages
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
|
|
@ -9,23 +12,19 @@ RUN apt-get update \
|
||||||
&& add-apt-repository ppa:fcwu-tw/apps \
|
&& add-apt-repository ppa:fcwu-tw/apps \
|
||||||
&& apt-get update \
|
&& apt-get update \
|
||||||
&& apt-get install -y --no-install-recommends --allow-unauthenticated \
|
&& apt-get install -y --no-install-recommends --allow-unauthenticated \
|
||||||
supervisor \
|
supervisor nginx sudo vim-tiny net-tools zenity xz-utils \
|
||||||
sudo vim-tiny \
|
dbus-x11 x11-utils alsa-utils \
|
||||||
net-tools \
|
|
||||||
lxde x11vnc xvfb \
|
|
||||||
gtk2-engines-murrine ttf-ubuntu-font-family \
|
|
||||||
libreoffice firefox \
|
|
||||||
fonts-wqy-microhei \
|
|
||||||
language-pack-zh-hant language-pack-gnome-zh-hant firefox-locale-zh-hant libreoffice-l10n-zh-tw \
|
|
||||||
nginx \
|
|
||||||
python-pip python-dev build-essential \
|
|
||||||
mesa-utils libgl1-mesa-dri \
|
mesa-utils libgl1-mesa-dri \
|
||||||
gnome-themes-standard gtk2-engines-pixbuf gtk2-engines-murrine pinta arc-theme \
|
lxde x11vnc xvfb \
|
||||||
dbus-x11 x11-utils \
|
gtk2-engines-murrine gnome-themes-standard gtk2-engines-pixbuf gtk2-engines-murrine arc-theme \
|
||||||
|
firefox chromium-browser \
|
||||||
|
ttf-ubuntu-font-family ttf-wqy-zenhei \
|
||||||
|
&& add-apt-repository -r ppa:fcwu-tw/apps \
|
||||||
&& apt-get autoclean \
|
&& apt-get autoclean \
|
||||||
&& apt-get autoremove \
|
&& apt-get autoremove \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
# Additional packages require ~600MB
|
||||||
|
# libreoffice pinta language-pack-zh-hant language-pack-gnome-zh-hant firefox-locale-zh-hant libreoffice-l10n-zh-tw
|
||||||
|
|
||||||
# tini for subreap
|
# tini for subreap
|
||||||
ARG TINI_VERSION=v0.9.0
|
ARG TINI_VERSION=v0.9.0
|
||||||
|
|
@ -36,9 +35,57 @@ RUN chmod +x /bin/tini
|
||||||
RUN mkdir -p /usr/local/ffmpeg \
|
RUN mkdir -p /usr/local/ffmpeg \
|
||||||
&& curl -sSL https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz | tar xJvf - -C /usr/local/ffmpeg/ --strip 1
|
&& curl -sSL https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz | tar xJvf - -C /usr/local/ffmpeg/ --strip 1
|
||||||
|
|
||||||
ADD image/usr/local/lib/web/backend/requirements.txt /tmp/
|
# python library
|
||||||
RUN pip install setuptools wheel && pip install -r /tmp/requirements.txt
|
COPY image/usr/local/lib/web/backend/requirements.txt /tmp/
|
||||||
ADD image /
|
RUN apt-get update \
|
||||||
|
&& dpkg-query -W -f='${Package}\n' > /tmp/a.txt \
|
||||||
|
&& apt-get install -y python-pip python-dev build-essential \
|
||||||
|
&& pip install setuptools wheel && pip install -r /tmp/requirements.txt \
|
||||||
|
&& dpkg-query -W -f='${Package}\n' > /tmp/b.txt \
|
||||||
|
&& apt-get remove -y `diff --changed-group-format='%>' --unchanged-group-format='' /tmp/a.txt /tmp/b.txt | xargs` \
|
||||||
|
&& apt-get autoclean -y \
|
||||||
|
&& apt-get autoremove -y \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
|
&& rm -rf /var/cache/apt/* /tmp/a.txt /tmp/b.txt
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# builder
|
||||||
|
################################################################################
|
||||||
|
FROM ubuntu:16.04 as builder
|
||||||
|
|
||||||
|
ARG localbuild
|
||||||
|
RUN if [ "x$localbuild" != "x" ]; then sed -i 's#http://archive.ubuntu.com/#http://qnap.dorowu.com/#' /etc/apt/sources.list; fi
|
||||||
|
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends curl ca-certificates
|
||||||
|
|
||||||
|
# nodejs
|
||||||
|
RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - \
|
||||||
|
&& apt-get install -y nodejs
|
||||||
|
|
||||||
|
# yarn
|
||||||
|
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
|
||||||
|
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
|
||||||
|
&& apt-get update \
|
||||||
|
&& apt-get install -y yarn
|
||||||
|
|
||||||
|
# build frontend
|
||||||
|
COPY web /src/web
|
||||||
|
RUN cd /src/web \
|
||||||
|
&& yarn \
|
||||||
|
&& npm run build
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# merge
|
||||||
|
################################################################################
|
||||||
|
FROM scratch
|
||||||
|
LABEL maintainer="fcwu.tw@gmail.com"
|
||||||
|
|
||||||
|
COPY --from=system / /
|
||||||
|
COPY --from=builder /src/web/dist/ /usr/local/lib/web/frontend/
|
||||||
|
COPY image /
|
||||||
|
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
WORKDIR /root
|
WORKDIR /root
|
||||||
|
|
|
||||||
4
Makefile
|
|
@ -4,7 +4,7 @@ REPO ?= dorowu/ubuntu-desktop-lxde-vnc
|
||||||
TAG ?= latest
|
TAG ?= latest
|
||||||
|
|
||||||
build:
|
build:
|
||||||
docker build -t $(REPO):$(TAG) .
|
docker build -t $(REPO):$(TAG) --build-arg localbuild=1 .
|
||||||
|
|
||||||
run:
|
run:
|
||||||
docker run --rm \
|
docker run --rm \
|
||||||
|
|
@ -13,8 +13,8 @@ run:
|
||||||
-e USER=doro -e PASSWORD=mypassword \
|
-e USER=doro -e PASSWORD=mypassword \
|
||||||
-e ALSADEV=hw:2,0 \
|
-e ALSADEV=hw:2,0 \
|
||||||
-e SSL_PORT=443 \
|
-e SSL_PORT=443 \
|
||||||
-e HTTP_PASSWORD=mypassword \
|
|
||||||
-v ${PWD}/ssl:/etc/nginx/ssl \
|
-v ${PWD}/ssl:/etc/nginx/ssl \
|
||||||
|
--device /dev/snd \
|
||||||
--name ubuntu-desktop-lxde-test \
|
--name ubuntu-desktop-lxde-test \
|
||||||
$(REPO):$(TAG)
|
$(REPO):$(TAG)
|
||||||
|
|
||||||
|
|
|
||||||
25
README.md
|
|
@ -72,7 +72,6 @@ The Resolution of virtual desktop adapts browser window size when first connecti
|
||||||
docker run -p 6080:80 -e RESOLUTION=1920x1080 dorowu/ubuntu-desktop-lxde-vnc
|
docker run -p 6080:80 -e RESOLUTION=1920x1080 dorowu/ubuntu-desktop-lxde-vnc
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
Default Desktop User
|
Default Desktop User
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
|
|
@ -82,6 +81,30 @@ The default user is `root`. You may change the user and password respectively by
|
||||||
docker run -p 6080:80 -e USER=doro -e PASSWORD=password dorowu/ubuntu-desktop-lxde-vnc
|
docker run -p 6080:80 -e USER=doro -e PASSWORD=password dorowu/ubuntu-desktop-lxde-vnc
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Sound (Preview version and Linux only)
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
It only works in Linux.
|
||||||
|
|
||||||
|
First of all, insert kernel module `snd-aloop` and specify `2` as the index of sound loop device
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo modprobe snd-aloop index=2
|
||||||
|
```
|
||||||
|
|
||||||
|
Start the container
|
||||||
|
|
||||||
|
```
|
||||||
|
docker run -it --rm -p 6080:80 --device /dev/snd -e ALSADEV=hw:2,0 dorowu/ubuntu-desktop-lxde-vnc
|
||||||
|
```
|
||||||
|
|
||||||
|
where `--device /dev/snd -e ALSADEV=hw:2,0` means to grant sound device to container and set basic ASLA config to use card 2.
|
||||||
|
|
||||||
|
Launch a browser with URL http://127.0.0.1:6080/#/?video, where `video` means to start with video mode. Now you can start Chromium in start menu (Internet -> Chromium Web Browser Sound) and try to play some video.
|
||||||
|
|
||||||
|
[](http://www.youtube.com/watch?v=Kv9FGClP1-k)
|
||||||
|
|
||||||
|
|
||||||
Troubleshooting and FAQ
|
Troubleshooting and FAQ
|
||||||
==================
|
==================
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,26 +10,21 @@ server {
|
||||||
#_HTTP_PASSWORD_#auth_basic "Private Property";
|
#_HTTP_PASSWORD_#auth_basic "Private Property";
|
||||||
#_HTTP_PASSWORD_#auth_basic_user_file /etc/nginx/.htpasswd;
|
#_HTTP_PASSWORD_#auth_basic_user_file /etc/nginx/.htpasswd;
|
||||||
|
|
||||||
root /usr/share/nginx/html;
|
root /usr/local/lib/web/frontend/;
|
||||||
index index.html index.htm;
|
index index.html index.htm;
|
||||||
|
|
||||||
location / {
|
|
||||||
try_files $uri @proxy;
|
|
||||||
}
|
|
||||||
|
|
||||||
location = / {
|
|
||||||
try_files $uri @proxy2;
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~ ^/api {
|
location ~ ^/api {
|
||||||
try_files $uri @proxy2;
|
try_files $uri @api;
|
||||||
}
|
}
|
||||||
|
|
||||||
location = /redirect.html {
|
location = /websockify {
|
||||||
try_files $uri @proxy2;
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_pass http://127.0.0.1:6081;
|
||||||
}
|
}
|
||||||
|
|
||||||
location @proxy2 {
|
location @api {
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
proxy_set_header X-Forwarded-For $remote_addr;
|
proxy_set_header X-Forwarded-For $remote_addr;
|
||||||
proxy_set_header Host $host;
|
proxy_set_header Host $host;
|
||||||
|
|
@ -44,11 +39,4 @@ server {
|
||||||
proxy_pass http://127.0.0.1:6081;
|
proxy_pass http://127.0.0.1:6081;
|
||||||
max_ranges 0;
|
max_ranges 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
location = /websockify {
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
|
||||||
proxy_set_header Connection "upgrade";
|
|
||||||
proxy_pass http://127.0.0.1:6081;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,8 @@ directory=/usr/local/lib/web/backend
|
||||||
command=/usr/local/lib/web/backend/run.py
|
command=/usr/local/lib/web/backend/run.py
|
||||||
stdout_logfile=/dev/fd/1
|
stdout_logfile=/dev/fd/1
|
||||||
stdout_logfile_maxbytes=0
|
stdout_logfile_maxbytes=0
|
||||||
|
stderr_logfile=/dev/fd/1
|
||||||
|
stderr_logfile_maxbytes=0
|
||||||
|
|
||||||
[group:x]
|
[group:x]
|
||||||
programs=xvfb,wm,lxpanel,pcmanfm,x11vnc,novnc
|
programs=xvfb,wm,lxpanel,pcmanfm,x11vnc,novnc
|
||||||
|
|
@ -48,6 +50,6 @@ command=x11vnc -display :1 -xkb -forever -shared -repeat
|
||||||
|
|
||||||
[program:novnc]
|
[program:novnc]
|
||||||
priority=25
|
priority=25
|
||||||
directory=/usr/local/lib/novnc/
|
directory=/usr/local/lib/web/frontend/static/novnc
|
||||||
command=/usr/local/lib/novnc/utils/launch.sh --listen 6081
|
command=bash /usr/local/lib/web/frontend/static/novnc/utils/launch.sh --listen 6081
|
||||||
stopasgroup=true
|
stopasgroup=true
|
||||||
|
|
|
||||||
4
image/root/.asoundrc
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
pcm.loop {
|
||||||
|
type plug
|
||||||
|
slave.pcm "hw:Loopback,2,0"
|
||||||
|
}
|
||||||
|
|
@ -23,7 +23,8 @@ if [ "$USER" != "root" ]; then
|
||||||
fi
|
fi
|
||||||
HOME=/home/$USER
|
HOME=/home/$USER
|
||||||
echo "$USER:$PASSWORD" | chpasswd
|
echo "$USER:$PASSWORD" | chpasswd
|
||||||
cp -r /root/.* ${HOME}
|
cp -r /root/{.gtkrc-2.0,.asoundrc} ${HOME}
|
||||||
|
[ -d "/dev/snd" ] && chgrp -R adm /dev/snd
|
||||||
fi
|
fi
|
||||||
sed -i "s|%USER%|$USER|" /etc/supervisor/conf.d/supervisord.conf
|
sed -i "s|%USER%|$USER|" /etc/supervisor/conf.d/supervisord.conf
|
||||||
sed -i "s|%HOME%|$HOME|" /etc/supervisor/conf.d/supervisord.conf
|
sed -i "s|%HOME%|$HOME|" /etc/supervisor/conf.d/supervisord.conf
|
||||||
|
|
@ -50,6 +51,10 @@ if [ -n "$HTTP_PASSWORD" ]; then
|
||||||
sed -i 's|#_HTTP_PASSWORD_#||' /etc/nginx/sites-enabled/default
|
sed -i 's|#_HTTP_PASSWORD_#||' /etc/nginx/sites-enabled/default
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# novnc websockify
|
||||||
|
ln -s /usr/local/lib/web/frontend/static/websockify /usr/local/lib/web/frontend/static/novnc/utils/websockify
|
||||||
|
chmod +x /usr/local/lib/web/frontend/static/websockify/run
|
||||||
|
|
||||||
# clearup
|
# clearup
|
||||||
PASSWORD=
|
PASSWORD=
|
||||||
HTTP_PASSWORD=
|
HTTP_PASSWORD=
|
||||||
|
|
|
||||||
8
image/usr/local/bin/chromium-browser-sound.sh
Executable file
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [ -z "$ALSADEV" ]; then
|
||||||
|
zenity --error --text "To support audio, please read README.md and run container with --device /dev/snd -e ALSADEV=..."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec /usr/bin/chromium-browser --no-sandbox --alsa-output-device="$ALSADEV" "$@"
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
56d97524807b125d047730331031ddd00f9c61f
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
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,20 +0,0 @@
|
||||||
language: node_js
|
|
||||||
sudo: false
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- node_modules
|
|
||||||
node_js:
|
|
||||||
- '6.1'
|
|
||||||
env:
|
|
||||||
matrix:
|
|
||||||
- TEST_BROWSER_NAME=PhantomJS
|
|
||||||
- TEST_BROWSER_NAME=chrome TEST_BROWSER_OS='Windows 10,Linux,OS X 10.11'
|
|
||||||
- TEST_BROWSER_NAME=firefox TEST_BROWSER_OS='Windows 10,Linux,OS X 10.11'
|
|
||||||
- TEST_BROWSER_NAME='internet explorer' TEST_BROWSER_OS='Windows 10'
|
|
||||||
- TEST_BROWSER_NAME=safari TEST_BROWSER_OS='OS X 10.11'
|
|
||||||
global:
|
|
||||||
- secure: QE5GqGd2hrpQsIgd8dlv3oRUUHqZayomzzQjNXOB81VQi241uz/ru+3GtBZLB5WLZCq/Gj89vbLnR0LN4ixlmPaWv3/WJQGyDGuRD/vMnccVl+rBUP/Hh2zdYwiISIGcrywNAE+KLus/lyt/ahVgzbaRaDSzrM1HaZFT/rndGck=
|
|
||||||
- secure: g75sdctEwj0hoLW0Y08Tdv8s5scNzplB6a9EtaJ2vJD9S/bK+AsPqbWesGv1UlrFPCWdbV7Vg61vkmoUjcmb5xhqFIjcM9TlYJoKWeOTsOmnQoSIkIq6gMF1k02+LmKInbPgIzrp3m3jluS1qaOs/EzFpDnJp9hWBiAfXa12Jxk=
|
|
||||||
before_script: npm install -g karma-cli
|
|
||||||
addons:
|
|
||||||
sauce_connect: true
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
||||||
How to contribute to noVNC
|
|
||||||
==========================
|
|
||||||
|
|
||||||
We accept code via pull requests on GitHub. There are several guidelines that
|
|
||||||
we expect contributors submitting code requests to follow. If you have issues
|
|
||||||
following any of these guidelines, feel free to drop us a line by leaving a
|
|
||||||
comment in the code request or sending us an email.
|
|
||||||
|
|
||||||
Contributing Guidelines
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
* While we don't have an official coding style guide, please try to follow
|
|
||||||
the general coding style of the existing code.
|
|
||||||
** Use four spaces instead of tabs
|
|
||||||
** prefix private variables and functions with an `_`
|
|
||||||
|
|
||||||
* Please try to include unit tests for your code. For instance, if you
|
|
||||||
introduce a new encoding, add a test to `tests/test.rfb.js` under the
|
|
||||||
"Encoding Handlers" section (basically, input a small pattern in your
|
|
||||||
encoding and make sure the pattern gets displayed correctly). If you
|
|
||||||
fix a bug, try to add a unit test that would have caught that bug
|
|
||||||
(if possible -- some bugs, especially visual ones, are hard to test for).
|
|
||||||
|
|
||||||
* Squash your commits down in to a clean commit history. For instance, there
|
|
||||||
should not be "cleanup" commits where you fix issues in previous commits in
|
|
||||||
the same pull request. Before you go to commit, use `git rebase -i` to
|
|
||||||
squash these changes into the relevant commits. For instance, a good commit
|
|
||||||
history might look like "Added support for FOO encoding, Added support for
|
|
||||||
BAR message, Placed Button in UI to Trigger BAR" (where each comma denotes
|
|
||||||
a separate commit).
|
|
||||||
|
|
||||||
* Add both a title and description to your commit, if possible. Place more
|
|
||||||
detail on what you did in the description.
|
|
||||||
|
|
||||||
Running the unit tests
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
There are two ways to run the unit tests. For both ways, you should first run
|
|
||||||
`npm install` (not as root).
|
|
||||||
|
|
||||||
The first way to run the tests is to run `npm test`. This will run all the
|
|
||||||
tests in the headless PhantomJS browser (which uses WebKit).
|
|
||||||
|
|
||||||
The second way to run the tests is using the `tests/run_from_console.js` file.
|
|
||||||
This way is a bit more flexible, and can provide more information about what
|
|
||||||
went wrong. To run all the tests, simply run `tests/run_from_console.js`.
|
|
||||||
To run a specific test file, you can use the `-t path/to/test/file.js` option.
|
|
||||||
If you wish to simply generate the HTML for the test, use the `-g` option, and
|
|
||||||
the path to the temporary HTML file will be written to standard out. To open
|
|
||||||
this file in your default browser automatically, pass the `-o` option as well.
|
|
||||||
More information can be found by passing the `--help` or `-h` option.
|
|
||||||
|
|
||||||
|
|
||||||
Thanks, and happy coding!
|
|
||||||
|
|
@ -1,79 +0,0 @@
|
||||||
noVNC is Copyright (C) 2011 Joel Martin <github@martintribe.org>
|
|
||||||
|
|
||||||
The noVNC core library files are licensed under the MPL 2.0 (Mozilla
|
|
||||||
Public License 2.0). The noVNC core library is composed of the
|
|
||||||
Javascript code necessary for full noVNC operation. This includes (but
|
|
||||||
is not limited to):
|
|
||||||
|
|
||||||
core/base64.js
|
|
||||||
core/des.js
|
|
||||||
core/display.js
|
|
||||||
core/input/devices.js
|
|
||||||
core/input/keysym.js
|
|
||||||
core/logo.js
|
|
||||||
core/playback.js
|
|
||||||
core/rfb.js
|
|
||||||
app/ui.js
|
|
||||||
core/util.js
|
|
||||||
core/websock.js
|
|
||||||
app/webutil.js
|
|
||||||
core/input/xtscancodes.js
|
|
||||||
|
|
||||||
The HTML, CSS, font and images files that included with the noVNC
|
|
||||||
source distibution (or repository) are not considered part of the
|
|
||||||
noVNC core library and are licensed under more permissive licenses.
|
|
||||||
The intent is to allow easy integration of noVNC into existing web
|
|
||||||
sites and web applications.
|
|
||||||
|
|
||||||
The HTML, CSS, font and image files are licensed as follows:
|
|
||||||
|
|
||||||
*.html : 2-Clause BSD license
|
|
||||||
|
|
||||||
app/styles/*.css : 2-Clause BSD license
|
|
||||||
|
|
||||||
app/styles/Orbitron* : SIL Open Font License 1.1
|
|
||||||
(Copyright 2009 Matt McInerney)
|
|
||||||
|
|
||||||
app/images/ : Creative Commons Attribution-ShareAlike
|
|
||||||
http://creativecommons.org/licenses/by-sa/3.0/
|
|
||||||
|
|
||||||
Some portions of noVNC are copyright to their individual authors.
|
|
||||||
Please refer to the individual source files and/or to the noVNC commit
|
|
||||||
history: https://github.com/kanaka/noVNC/commits/master
|
|
||||||
|
|
||||||
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
|
|
||||||
licenses (all MPL 2.0 compatible):
|
|
||||||
|
|
||||||
core/base64.js : MPL 2.0
|
|
||||||
|
|
||||||
core/des.js : Various BSD style licenses
|
|
||||||
|
|
||||||
utils/inflator.mod.js
|
|
||||||
include/inflator.js : MIT (for pako)
|
|
||||||
|
|
||||||
Any other files not mentioned above are typically marked with
|
|
||||||
a copyright/license header at the top of the file. The default noVNC
|
|
||||||
license is MPL-2.0.
|
|
||||||
|
|
||||||
The following license texts are included:
|
|
||||||
|
|
||||||
docs/LICENSE.MPL-2.0
|
|
||||||
docs/LICENSE.LGPL-3 and
|
|
||||||
docs/LICENSE.GPL-3
|
|
||||||
docs/LICENSE.OFL-1.1
|
|
||||||
docs/LICENSE.BSD-3-Clause (New BSD)
|
|
||||||
docs/LICENSE.BSD-2-Clause (Simplified BSD / FreeBSD)
|
|
||||||
docs/LICENSE.zlib
|
|
||||||
docs/LICENSE.Apache-2.0
|
|
||||||
docs/LICENSE.pako
|
|
||||||
|
|
||||||
Or alternatively the license texts may be found here:
|
|
||||||
|
|
||||||
http://www.mozilla.org/MPL/2.0/
|
|
||||||
http://www.gnu.org/licenses/lgpl.html and
|
|
||||||
http://www.gnu.org/licenses/gpl.html
|
|
||||||
http://scripts.sil.org/OFL
|
|
||||||
http://en.wikipedia.org/wiki/BSD_licenses
|
|
||||||
http://www.gzip.org/zlib/zlib_license.html
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0.html
|
|
||||||
|
|
@ -1,150 +0,0 @@
|
||||||
## noVNC: HTML5 VNC Client
|
|
||||||
|
|
||||||
[](https://travis-ci.org/novnc/noVNC)
|
|
||||||
|
|
||||||
### Description
|
|
||||||
|
|
||||||
noVNC is a HTML5 VNC client that runs well in any modern browser including
|
|
||||||
mobile browsers (iOS and Android).
|
|
||||||
|
|
||||||
Many companies, projects and products have integrated noVNC including
|
|
||||||
[Ganeti Web Manager](http://code.osuosl.org/projects/ganeti-webmgr),
|
|
||||||
[OpenStack](http://www.openstack.org),
|
|
||||||
[OpenNebula](http://opennebula.org/),
|
|
||||||
[LibVNCServer](http://libvncserver.sourceforge.net), and
|
|
||||||
[ThinLinc](https://cendio.com/thinlinc). See
|
|
||||||
[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.
|
|
||||||
|
|
||||||
### News/help/contact
|
|
||||||
|
|
||||||
Notable commits, announcements and news are posted to
|
|
||||||
<a href="http://www.twitter.com/noVNC">@noVNC</a>.
|
|
||||||
|
|
||||||
If you are a noVNC developer/integrator/user (or want to be) please join the
|
|
||||||
<a href="https://groups.google.com/forum/?fromgroups#!forum/novnc">
|
|
||||||
noVNC discussion group</a>.
|
|
||||||
|
|
||||||
Bugs and feature requests can be submitted via
|
|
||||||
[github issues](https://github.com/novnc/noVNC/issues).
|
|
||||||
If you are looking for a place to start contributing to noVNC, a good place to
|
|
||||||
start would be the issues that are marked as
|
|
||||||
["patchwelcome"](https://github.com/novnc/noVNC/issues?labels=patchwelcome).
|
|
||||||
|
|
||||||
If you want to show appreciation for noVNC you could donate to a great non-
|
|
||||||
profits such as:
|
|
||||||
[Compassion International](http://www.compassion.com/),
|
|
||||||
[SIL](http://www.sil.org),
|
|
||||||
[Habitat for Humanity](http://www.habitat.org),
|
|
||||||
[Electronic Frontier Foundation](https://www.eff.org/),
|
|
||||||
[Against Malaria Foundation](http://www.againstmalaria.com/),
|
|
||||||
[Nothing But Nets](http://www.nothingbutnets.net/), etc.
|
|
||||||
Please tweet <a href="http://www.twitter.com/noVNC">@noVNC</a> if you do.
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* Supports all modern browsers including mobile (iOS, Android)
|
|
||||||
* Supported VNC encodings: raw, copyrect, rre, hextile, tight, tightPNG
|
|
||||||
* WebSocket SSL/TLS encryption (i.e. "wss://") support
|
|
||||||
* 24-bit true color and 8 bit colour mapped
|
|
||||||
* Supports desktop resize notification/pseudo-encoding
|
|
||||||
* Local or remote cursor
|
|
||||||
* Clipboard copy/paste
|
|
||||||
* Clipping or scolling modes for large remote screens
|
|
||||||
* Easy site integration and theming (3 example themes included)
|
|
||||||
* Licensed under the [MPL 2.0](http://www.mozilla.org/MPL/2.0/)
|
|
||||||
|
|
||||||
### Screenshots
|
|
||||||
|
|
||||||
Running in Chrome before and after connecting:
|
|
||||||
|
|
||||||
<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://novnc.com/screenshots.html">here</a>.
|
|
||||||
|
|
||||||
|
|
||||||
### Browser Requirements
|
|
||||||
|
|
||||||
* Chrome 8, Firefox 4, Safari 6, Opera 12, IE 11, Edge 12, etc.
|
|
||||||
|
|
||||||
* HTML5 Canvas, WebSockets and Typed Arrays
|
|
||||||
|
|
||||||
* Fast Javascript Engine: this is not strictly a requirement, but without a
|
|
||||||
fast Javascript engine, noVNC might be painfully slow.
|
|
||||||
|
|
||||||
* See the more detailed
|
|
||||||
[browser compatibility wiki page](https://github.com/novnc/noVNC/wiki/Browser-support).
|
|
||||||
|
|
||||||
|
|
||||||
### Server Requirements
|
|
||||||
|
|
||||||
Unless you are using a VNC server with support for WebSockets connections (such
|
|
||||||
as [x11vnc/libvncserver](http://libvncserver.sourceforge.net/),
|
|
||||||
[QEMU](http://www.qemu.org/), or
|
|
||||||
[MobileVNC](http://www.smartlab.at/mobilevnc/)), you need to use a
|
|
||||||
WebSockets to TCP socket proxy. There is a python proxy included
|
|
||||||
('websockify').
|
|
||||||
|
|
||||||
|
|
||||||
### Quick Start
|
|
||||||
|
|
||||||
* Use the launch script to start a mini-webserver and the WebSockets proxy
|
|
||||||
(websockify). The `--vnc` option is used to specify the location of a running
|
|
||||||
VNC server:
|
|
||||||
|
|
||||||
`./utils/launch.sh --vnc localhost:5901`
|
|
||||||
|
|
||||||
* Point your browser to the cut-and-paste URL that is output by the launch
|
|
||||||
script. Enter a password if the VNC server has one configured. Hit the
|
|
||||||
Connect button and enjoy!
|
|
||||||
|
|
||||||
|
|
||||||
### Other Pages
|
|
||||||
|
|
||||||
* [Modules/API](https://github.com/novnc/noVNC/wiki/Modules-API) - The library
|
|
||||||
modules and their Javascript API.
|
|
||||||
|
|
||||||
* [Integration](https://github.com/novnc/noVNC/wiki/Integration) - Get noVNC
|
|
||||||
to work in existing projects.
|
|
||||||
|
|
||||||
* [Troubleshooting](https://github.com/novnc/noVNC/wiki/Troubleshooting) - How
|
|
||||||
to troubleshoot 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
|
|
||||||
|
|
||||||
* Core team:
|
|
||||||
* [Joel Martin](https://github.com/kanaka)
|
|
||||||
* [Samuel Mannehed](https://github.com/samhed) (Cendio)
|
|
||||||
* [Peter Åstrand](https://github.com/astrand) (Cendio)
|
|
||||||
* [Solly Ross](https://github.com/DirectXMan12) (Red Hat / OpenStack)
|
|
||||||
* [Pierre Ossman](https://github.com/CendioOssman) (Cendio)
|
|
||||||
|
|
||||||
* Notable contributions:
|
|
||||||
* UI and Icons : Pierre Ossman, Chris Gordon
|
|
||||||
* Original Logo : Michael Sersen
|
|
||||||
* tight encoding : Michael Tinglof (Mercuri.ca)
|
|
||||||
|
|
||||||
* Included libraries:
|
|
||||||
* as3crypto : Henri Torgemane (code.google.com/p/as3crypto)
|
|
||||||
* base64 : Martijn Pieters (Digital Creations 2), Samuel Sieb (sieb.net)
|
|
||||||
* 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)
|
|
||||||
|
|
@ -1,92 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 3.5 KiB |
|
|
@ -1,106 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 3.9 KiB |
|
|
@ -1,96 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 3.3 KiB |
|
|
@ -1,96 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 4.3 KiB |
|
|
@ -1,100 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 3.2 KiB |
|
|
@ -1,94 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 4.9 KiB |
|
|
@ -1,76 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 4.6 KiB |
|
|
@ -1,81 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 3 KiB |
|
|
@ -1,92 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 4.4 KiB |
|
|
@ -1,69 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 3 KiB |
|
|
@ -1,93 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 3.1 KiB |
|
|
@ -1,82 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 2.5 KiB |
|
|
@ -1,172 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 6.2 KiB |
|
|
@ -1,42 +0,0 @@
|
||||||
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
|
|
||||||
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 675 B |
|
Before Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 1,000 B |
|
Before Width: | Height: | Size: 1 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
|
@ -1,163 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 11 KiB |
|
|
@ -1,163 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 11 KiB |
|
|
@ -1,81 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 3.1 KiB |
|
|
@ -1,88 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 6.3 KiB |
|
|
@ -1,92 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 6.8 KiB |
|
|
@ -1,92 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 6.8 KiB |
|
|
@ -1,92 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 6.8 KiB |
|
|
@ -1,92 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 6.8 KiB |
|
|
@ -1,87 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 3.9 KiB |
|
|
@ -1,76 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 3 KiB |
|
|
@ -1,86 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 2.9 KiB |
|
|
@ -1,90 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 4.3 KiB |
|
|
@ -1,81 +0,0 @@
|
||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 3.8 KiB |
|
|
@ -1,18 +0,0 @@
|
||||||
/*
|
|
||||||
* 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",
|
|
||||||
};
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
||||||
/*
|
|
||||||
* 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",
|
|
||||||
};
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
/*
|
|
||||||
* 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",
|
|
||||||
};
|
|
||||||
|
|
@ -1,77 +0,0 @@
|
||||||
/*
|
|
||||||
* 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",
|
|
||||||
};
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
bell
|
|
||||||
Copyright: Dr. Richard Boulanger et al
|
|
||||||
URL: http://www.archive.org/details/Berklee44v12
|
|
||||||
License: CC-BY Attribution 3.0 Unported
|
|
||||||
|
|
@ -1,89 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
@ -1,876 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,311 +0,0 @@
|
||||||
/*
|
|
||||||
* noVNC: HTML5 VNC client
|
|
||||||
* Copyright (C) 2012 Joel Martin
|
|
||||||
* Copyright (C) 2013 NTT corp.
|
|
||||||
* Licensed under MPL 2.0 (see LICENSE.txt)
|
|
||||||
*
|
|
||||||
* See README.md for usage and integration instructions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*jslint bitwise: false, white: false, browser: true, devel: true */
|
|
||||||
/*global Util, window, document */
|
|
||||||
|
|
||||||
/* [module]
|
|
||||||
* import Util from "../core/util";
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Globals defined here
|
|
||||||
var WebUtil = {};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ------------------------------------------------------
|
|
||||||
* Namespaced in WebUtil
|
|
||||||
* ------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
// init log level reading the logging HTTP param
|
|
||||||
WebUtil.init_logging = function (level) {
|
|
||||||
"use strict";
|
|
||||||
if (typeof level !== "undefined") {
|
|
||||||
Util._log_level = level;
|
|
||||||
} else {
|
|
||||||
var param = document.location.href.match(/logging=([A-Za-z0-9\._\-]*)/);
|
|
||||||
Util._log_level = (param || ['', Util._log_level])[1];
|
|
||||||
}
|
|
||||||
Util.init_logging();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
WebUtil.dirObj = function (obj, depth, parent) {
|
|
||||||
"use strict";
|
|
||||||
if (! depth) { depth = 2; }
|
|
||||||
if (! parent) { parent = ""; }
|
|
||||||
|
|
||||||
// Print the properties of the passed-in object
|
|
||||||
var msg = "";
|
|
||||||
for (var i in obj) {
|
|
||||||
if ((depth > 1) && (typeof obj[i] === "object")) {
|
|
||||||
// Recurse attributes that are objects
|
|
||||||
msg += WebUtil.dirObj(obj[i], depth - 1, parent + "." + i);
|
|
||||||
} else {
|
|
||||||
//val = new String(obj[i]).replace("\n", " ");
|
|
||||||
var val = "";
|
|
||||||
if (typeof(obj[i]) === "undefined") {
|
|
||||||
val = "undefined";
|
|
||||||
} else {
|
|
||||||
val = obj[i].toString().replace("\n", " ");
|
|
||||||
}
|
|
||||||
if (val.length > 30) {
|
|
||||||
val = val.substr(0, 30) + "...";
|
|
||||||
}
|
|
||||||
msg += parent + "." + i + ": " + val + "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return msg;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Read a query string variable
|
|
||||||
WebUtil.getQueryVar = function (name, defVal) {
|
|
||||||
"use strict";
|
|
||||||
var re = new RegExp('.*[?&]' + name + '=([^&#]*)'),
|
|
||||||
match = document.location.href.match(re);
|
|
||||||
if (typeof defVal === 'undefined') { defVal = null; }
|
|
||||||
if (match) {
|
|
||||||
return decodeURIComponent(match[1]);
|
|
||||||
} else {
|
|
||||||
return defVal;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Read a hash fragment variable
|
|
||||||
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
|
|
||||||
*/
|
|
||||||
|
|
||||||
// No days means only for this browser session
|
|
||||||
WebUtil.createCookie = function (name, value, days) {
|
|
||||||
"use strict";
|
|
||||||
var date, expires;
|
|
||||||
if (days) {
|
|
||||||
date = new Date();
|
|
||||||
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
|
|
||||||
expires = "; expires=" + date.toGMTString();
|
|
||||||
} else {
|
|
||||||
expires = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
var secure;
|
|
||||||
if (document.location.protocol === "https:") {
|
|
||||||
secure = "; secure";
|
|
||||||
} else {
|
|
||||||
secure = "";
|
|
||||||
}
|
|
||||||
document.cookie = name + "=" + value + expires + "; path=/" + secure;
|
|
||||||
};
|
|
||||||
|
|
||||||
WebUtil.readCookie = function (name, defaultValue) {
|
|
||||||
"use strict";
|
|
||||||
var nameEQ = name + "=",
|
|
||||||
ca = document.cookie.split(';');
|
|
||||||
|
|
||||||
for (var i = 0; i < ca.length; i += 1) {
|
|
||||||
var c = ca[i];
|
|
||||||
while (c.charAt(0) === ' ') { c = c.substring(1, c.length); }
|
|
||||||
if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length, c.length); }
|
|
||||||
}
|
|
||||||
return (typeof defaultValue !== 'undefined') ? defaultValue : null;
|
|
||||||
};
|
|
||||||
|
|
||||||
WebUtil.eraseCookie = function (name) {
|
|
||||||
"use strict";
|
|
||||||
WebUtil.createCookie(name, "", -1);
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setting handling.
|
|
||||||
*/
|
|
||||||
|
|
||||||
WebUtil.initSettings = function (callback /*, ...callbackArgs */) {
|
|
||||||
"use strict";
|
|
||||||
var callbackArgs = Array.prototype.slice.call(arguments, 1);
|
|
||||||
if (window.chrome && window.chrome.storage) {
|
|
||||||
window.chrome.storage.sync.get(function (cfg) {
|
|
||||||
WebUtil.settings = cfg;
|
|
||||||
console.log(WebUtil.settings);
|
|
||||||
if (callback) {
|
|
||||||
callback.apply(this, callbackArgs);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
// No-op
|
|
||||||
if (callback) {
|
|
||||||
callback.apply(this, callbackArgs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// No days means only for this browser session
|
|
||||||
WebUtil.writeSetting = function (name, value) {
|
|
||||||
"use strict";
|
|
||||||
if (window.chrome && window.chrome.storage) {
|
|
||||||
//console.log("writeSetting:", name, value);
|
|
||||||
if (WebUtil.settings[name] !== value) {
|
|
||||||
WebUtil.settings[name] = value;
|
|
||||||
window.chrome.storage.sync.set(WebUtil.settings);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
localStorage.setItem(name, value);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
WebUtil.readSetting = function (name, defaultValue) {
|
|
||||||
"use strict";
|
|
||||||
var value;
|
|
||||||
if (window.chrome && window.chrome.storage) {
|
|
||||||
value = WebUtil.settings[name];
|
|
||||||
} else {
|
|
||||||
value = localStorage.getItem(name);
|
|
||||||
}
|
|
||||||
if (typeof value === "undefined") {
|
|
||||||
value = null;
|
|
||||||
}
|
|
||||||
if (value === null && typeof defaultValue !== undefined) {
|
|
||||||
return defaultValue;
|
|
||||||
} else {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
WebUtil.eraseSetting = function (name) {
|
|
||||||
"use strict";
|
|
||||||
if (window.chrome && window.chrome.storage) {
|
|
||||||
window.chrome.storage.sync.remove(name);
|
|
||||||
delete WebUtil.settings[name];
|
|
||||||
} else {
|
|
||||||
localStorage.removeItem(name);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
WebUtil.injectParamIfMissing = function (path, param, value) {
|
|
||||||
// force pretend that we're dealing with a relative path
|
|
||||||
// (assume that we wanted an extra if we pass one in)
|
|
||||||
path = "/" + path;
|
|
||||||
|
|
||||||
var elem = document.createElement('a');
|
|
||||||
elem.href = path;
|
|
||||||
|
|
||||||
var param_eq = encodeURIComponent(param) + "=";
|
|
||||||
var query;
|
|
||||||
if (elem.search) {
|
|
||||||
query = elem.search.slice(1).split('&');
|
|
||||||
} else {
|
|
||||||
query = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!query.some(function (v) { return v.startsWith(param_eq); })) {
|
|
||||||
query.push(param_eq + encodeURIComponent(value));
|
|
||||||
elem.search = "?" + query.join("&");
|
|
||||||
}
|
|
||||||
|
|
||||||
// some browsers (e.g. IE11) may occasionally omit the leading slash
|
|
||||||
// in the elem.pathname string. Handle that case gracefully.
|
|
||||||
if (elem.pathname.charAt(0) == "/") {
|
|
||||||
return elem.pathname.slice(1) + elem.search + elem.hash;
|
|
||||||
} else {
|
|
||||||
return elem.pathname + elem.search + elem.hash;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Dynamically load scripts without using document.write()
|
|
||||||
// Reference: http://unixpapa.com/js/dyna.html
|
|
||||||
//
|
|
||||||
// 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";
|
|
||||||
var head = document.getElementsByTagName('head')[0], script,
|
|
||||||
ls = WebUtil._loading_scripts, ps = WebUtil._pending_scripts;
|
|
||||||
|
|
||||||
var loadFunc = function (e) {
|
|
||||||
while (ls.length > 0 && (ls[0].readyState === 'loaded' ||
|
|
||||||
ls[0].readyState === 'complete')) {
|
|
||||||
// For IE, append the script to trigger execution
|
|
||||||
var s = ls.shift();
|
|
||||||
//console.log("loaded script: " + s.src);
|
|
||||||
head.appendChild(s);
|
|
||||||
}
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* [module] export default WebUtil; */
|
|
||||||
|
|
@ -1,115 +0,0 @@
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
// From: http://hg.mozilla.org/mozilla-central/raw-file/ec10630b1a54/js/src/devtools/jint/sunspider/string-base64.js
|
|
||||||
|
|
||||||
/*jslint white: false */
|
|
||||||
/*global console */
|
|
||||||
|
|
||||||
var Base64 = {
|
|
||||||
/* Convert data (an array of integers) to a Base64 string. */
|
|
||||||
toBase64Table : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.split(''),
|
|
||||||
base64Pad : '=',
|
|
||||||
|
|
||||||
encode: function (data) {
|
|
||||||
"use strict";
|
|
||||||
var result = '';
|
|
||||||
var toBase64Table = Base64.toBase64Table;
|
|
||||||
var length = data.length;
|
|
||||||
var lengthpad = (length % 3);
|
|
||||||
// Convert every three bytes to 4 ascii characters.
|
|
||||||
|
|
||||||
for (var i = 0; i < (length - 2); i += 3) {
|
|
||||||
result += toBase64Table[data[i] >> 2];
|
|
||||||
result += toBase64Table[((data[i] & 0x03) << 4) + (data[i + 1] >> 4)];
|
|
||||||
result += toBase64Table[((data[i + 1] & 0x0f) << 2) + (data[i + 2] >> 6)];
|
|
||||||
result += toBase64Table[data[i + 2] & 0x3f];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert the remaining 1 or 2 bytes, pad out to 4 characters.
|
|
||||||
var j = 0;
|
|
||||||
if (lengthpad === 2) {
|
|
||||||
j = length - lengthpad;
|
|
||||||
result += toBase64Table[data[j] >> 2];
|
|
||||||
result += toBase64Table[((data[j] & 0x03) << 4) + (data[j + 1] >> 4)];
|
|
||||||
result += toBase64Table[(data[j + 1] & 0x0f) << 2];
|
|
||||||
result += toBase64Table[64];
|
|
||||||
} else if (lengthpad === 1) {
|
|
||||||
j = length - lengthpad;
|
|
||||||
result += toBase64Table[data[j] >> 2];
|
|
||||||
result += toBase64Table[(data[j] & 0x03) << 4];
|
|
||||||
result += toBase64Table[64];
|
|
||||||
result += toBase64Table[64];
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
},
|
|
||||||
|
|
||||||
/* Convert Base64 data to a string */
|
|
||||||
/* jshint -W013 */
|
|
||||||
toBinaryTable : [
|
|
||||||
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
|
|
||||||
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
|
|
||||||
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,
|
|
||||||
52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1,
|
|
||||||
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
|
|
||||||
15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
|
|
||||||
-1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
|
|
||||||
41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
|
|
||||||
],
|
|
||||||
/* jshint +W013 */
|
|
||||||
|
|
||||||
decode: function (data, offset) {
|
|
||||||
"use strict";
|
|
||||||
offset = typeof(offset) !== 'undefined' ? offset : 0;
|
|
||||||
var toBinaryTable = Base64.toBinaryTable;
|
|
||||||
var base64Pad = Base64.base64Pad;
|
|
||||||
var result, result_length;
|
|
||||||
var leftbits = 0; // number of bits decoded, but yet to be appended
|
|
||||||
var leftdata = 0; // bits decoded, but yet to be appended
|
|
||||||
var data_length = data.indexOf('=') - offset;
|
|
||||||
|
|
||||||
if (data_length < 0) { data_length = data.length - offset; }
|
|
||||||
|
|
||||||
/* Every four characters is 3 resulting numbers */
|
|
||||||
result_length = (data_length >> 2) * 3 + Math.floor((data_length % 4) / 1.5);
|
|
||||||
result = new Array(result_length);
|
|
||||||
|
|
||||||
// Convert one by one.
|
|
||||||
for (var idx = 0, i = offset; i < data.length; i++) {
|
|
||||||
var c = toBinaryTable[data.charCodeAt(i) & 0x7f];
|
|
||||||
var padding = (data.charAt(i) === base64Pad);
|
|
||||||
// Skip illegal characters and whitespace
|
|
||||||
if (c === -1) {
|
|
||||||
console.error("Illegal character code " + data.charCodeAt(i) + " at position " + i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Collect data into leftdata, update bitcount
|
|
||||||
leftdata = (leftdata << 6) | c;
|
|
||||||
leftbits += 6;
|
|
||||||
|
|
||||||
// If we have 8 or more bits, append 8 bits to the result
|
|
||||||
if (leftbits >= 8) {
|
|
||||||
leftbits -= 8;
|
|
||||||
// Append if not padding.
|
|
||||||
if (!padding) {
|
|
||||||
result[idx++] = (leftdata >> leftbits) & 0xff;
|
|
||||||
}
|
|
||||||
leftdata &= (1 << leftbits) - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If there are any bits left, the base64 string was corrupted
|
|
||||||
if (leftbits) {
|
|
||||||
err = new Error('Corrupted base64 string');
|
|
||||||
err.name = 'Base64-Error';
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}; /* End of Base64 namespace */
|
|
||||||
|
|
||||||
/* [module] export default Base64; */
|
|
||||||
|
|
@ -1,276 +0,0 @@
|
||||||
/*
|
|
||||||
* Ported from Flashlight VNC ActionScript implementation:
|
|
||||||
* http://www.wizhelp.com/flashlight-vnc/
|
|
||||||
*
|
|
||||||
* Full attribution follows:
|
|
||||||
*
|
|
||||||
* -------------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* This DES class has been extracted from package Acme.Crypto for use in VNC.
|
|
||||||
* The unnecessary odd parity code has been removed.
|
|
||||||
*
|
|
||||||
* These changes are:
|
|
||||||
* Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* This software is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
|
|
||||||
* DesCipher - the DES encryption method
|
|
||||||
*
|
|
||||||
* The meat of this code is by Dave Zimmerman <dzimm@widget.com>, and is:
|
|
||||||
*
|
|
||||||
* Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and distribute this software
|
|
||||||
* and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
|
|
||||||
* without fee is hereby granted, provided that this copyright notice is kept
|
|
||||||
* intact.
|
|
||||||
*
|
|
||||||
* WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY
|
|
||||||
* OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
||||||
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
|
||||||
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE LIABLE
|
|
||||||
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
|
|
||||||
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
|
|
||||||
* CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
|
|
||||||
* PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
|
|
||||||
* NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
|
|
||||||
* SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
|
|
||||||
* SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
|
|
||||||
* PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). WIDGET WORKSHOP
|
|
||||||
* SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
|
|
||||||
* HIGH RISK ACTIVITIES.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* The rest is:
|
|
||||||
*
|
|
||||||
* Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* Visit the ACME Labs Java page for up-to-date versions of this and other
|
|
||||||
* fine Java utilities: http://www.acme.com/java/
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* jslint white: false */
|
|
||||||
|
|
||||||
/* [module] export default */ function DES(passwd) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
// Tables, permutations, S-boxes, etc.
|
|
||||||
// jshint -W013
|
|
||||||
var PC2 = [13,16,10,23, 0, 4, 2,27,14, 5,20, 9,22,18,11, 3,
|
|
||||||
25, 7,15, 6,26,19,12, 1,40,51,30,36,46,54,29,39,
|
|
||||||
50,44,32,47,43,48,38,55,33,52,45,41,49,35,28,31 ],
|
|
||||||
totrot = [ 1, 2, 4, 6, 8,10,12,14,15,17,19,21,23,25,27,28],
|
|
||||||
z = 0x0, a,b,c,d,e,f, SP1,SP2,SP3,SP4,SP5,SP6,SP7,SP8,
|
|
||||||
keys = [];
|
|
||||||
|
|
||||||
// jshint -W015
|
|
||||||
a=1<<16; b=1<<24; c=a|b; d=1<<2; e=1<<10; f=d|e;
|
|
||||||
SP1 = [c|e,z|z,a|z,c|f,c|d,a|f,z|d,a|z,z|e,c|e,c|f,z|e,b|f,c|d,b|z,z|d,
|
|
||||||
z|f,b|e,b|e,a|e,a|e,c|z,c|z,b|f,a|d,b|d,b|d,a|d,z|z,z|f,a|f,b|z,
|
|
||||||
a|z,c|f,z|d,c|z,c|e,b|z,b|z,z|e,c|d,a|z,a|e,b|d,z|e,z|d,b|f,a|f,
|
|
||||||
c|f,a|d,c|z,b|f,b|d,z|f,a|f,c|e,z|f,b|e,b|e,z|z,a|d,a|e,z|z,c|d];
|
|
||||||
a=1<<20; b=1<<31; c=a|b; d=1<<5; e=1<<15; f=d|e;
|
|
||||||
SP2 = [c|f,b|e,z|e,a|f,a|z,z|d,c|d,b|f,b|d,c|f,c|e,b|z,b|e,a|z,z|d,c|d,
|
|
||||||
a|e,a|d,b|f,z|z,b|z,z|e,a|f,c|z,a|d,b|d,z|z,a|e,z|f,c|e,c|z,z|f,
|
|
||||||
z|z,a|f,c|d,a|z,b|f,c|z,c|e,z|e,c|z,b|e,z|d,c|f,a|f,z|d,z|e,b|z,
|
|
||||||
z|f,c|e,a|z,b|d,a|d,b|f,b|d,a|d,a|e,z|z,b|e,z|f,b|z,c|d,c|f,a|e];
|
|
||||||
a=1<<17; b=1<<27; c=a|b; d=1<<3; e=1<<9; f=d|e;
|
|
||||||
SP3 = [z|f,c|e,z|z,c|d,b|e,z|z,a|f,b|e,a|d,b|d,b|d,a|z,c|f,a|d,c|z,z|f,
|
|
||||||
b|z,z|d,c|e,z|e,a|e,c|z,c|d,a|f,b|f,a|e,a|z,b|f,z|d,c|f,z|e,b|z,
|
|
||||||
c|e,b|z,a|d,z|f,a|z,c|e,b|e,z|z,z|e,a|d,c|f,b|e,b|d,z|e,z|z,c|d,
|
|
||||||
b|f,a|z,b|z,c|f,z|d,a|f,a|e,b|d,c|z,b|f,z|f,c|z,a|f,z|d,c|d,a|e];
|
|
||||||
a=1<<13; b=1<<23; c=a|b; d=1<<0; e=1<<7; f=d|e;
|
|
||||||
SP4 = [c|d,a|f,a|f,z|e,c|e,b|f,b|d,a|d,z|z,c|z,c|z,c|f,z|f,z|z,b|e,b|d,
|
|
||||||
z|d,a|z,b|z,c|d,z|e,b|z,a|d,a|e,b|f,z|d,a|e,b|e,a|z,c|e,c|f,z|f,
|
|
||||||
b|e,b|d,c|z,c|f,z|f,z|z,z|z,c|z,a|e,b|e,b|f,z|d,c|d,a|f,a|f,z|e,
|
|
||||||
c|f,z|f,z|d,a|z,b|d,a|d,c|e,b|f,a|d,a|e,b|z,c|d,z|e,b|z,a|z,c|e];
|
|
||||||
a=1<<25; b=1<<30; c=a|b; d=1<<8; e=1<<19; f=d|e;
|
|
||||||
SP5 = [z|d,a|f,a|e,c|d,z|e,z|d,b|z,a|e,b|f,z|e,a|d,b|f,c|d,c|e,z|f,b|z,
|
|
||||||
a|z,b|e,b|e,z|z,b|d,c|f,c|f,a|d,c|e,b|d,z|z,c|z,a|f,a|z,c|z,z|f,
|
|
||||||
z|e,c|d,z|d,a|z,b|z,a|e,c|d,b|f,a|d,b|z,c|e,a|f,b|f,z|d,a|z,c|e,
|
|
||||||
c|f,z|f,c|z,c|f,a|e,z|z,b|e,c|z,z|f,a|d,b|d,z|e,z|z,b|e,a|f,b|d];
|
|
||||||
a=1<<22; b=1<<29; c=a|b; d=1<<4; e=1<<14; f=d|e;
|
|
||||||
SP6 = [b|d,c|z,z|e,c|f,c|z,z|d,c|f,a|z,b|e,a|f,a|z,b|d,a|d,b|e,b|z,z|f,
|
|
||||||
z|z,a|d,b|f,z|e,a|e,b|f,z|d,c|d,c|d,z|z,a|f,c|e,z|f,a|e,c|e,b|z,
|
|
||||||
b|e,z|d,c|d,a|e,c|f,a|z,z|f,b|d,a|z,b|e,b|z,z|f,b|d,c|f,a|e,c|z,
|
|
||||||
a|f,c|e,z|z,c|d,z|d,z|e,c|z,a|f,z|e,a|d,b|f,z|z,c|e,b|z,a|d,b|f];
|
|
||||||
a=1<<21; b=1<<26; c=a|b; d=1<<1; e=1<<11; f=d|e;
|
|
||||||
SP7 = [a|z,c|d,b|f,z|z,z|e,b|f,a|f,c|e,c|f,a|z,z|z,b|d,z|d,b|z,c|d,z|f,
|
|
||||||
b|e,a|f,a|d,b|e,b|d,c|z,c|e,a|d,c|z,z|e,z|f,c|f,a|e,z|d,b|z,a|e,
|
|
||||||
b|z,a|e,a|z,b|f,b|f,c|d,c|d,z|d,a|d,b|z,b|e,a|z,c|e,z|f,a|f,c|e,
|
|
||||||
z|f,b|d,c|f,c|z,a|e,z|z,z|d,c|f,z|z,a|f,c|z,z|e,b|d,b|e,z|e,a|d];
|
|
||||||
a=1<<18; b=1<<28; c=a|b; d=1<<6; e=1<<12; f=d|e;
|
|
||||||
SP8 = [b|f,z|e,a|z,c|f,b|z,b|f,z|d,b|z,a|d,c|z,c|f,a|e,c|e,a|f,z|e,z|d,
|
|
||||||
c|z,b|d,b|e,z|f,a|e,a|d,c|d,c|e,z|f,z|z,z|z,c|d,b|d,b|e,a|f,a|z,
|
|
||||||
a|f,a|z,c|e,z|e,z|d,c|d,z|e,a|f,b|e,z|d,b|d,c|z,c|d,b|z,a|z,b|f,
|
|
||||||
z|z,c|f,a|d,b|d,c|z,b|e,b|f,z|z,c|f,a|e,a|e,z|f,z|f,a|d,b|z,c|e];
|
|
||||||
// jshint +W013,+W015
|
|
||||||
|
|
||||||
// Set the key.
|
|
||||||
function setKeys(keyBlock) {
|
|
||||||
var i, j, l, m, n, o, pc1m = [], pcr = [], kn = [],
|
|
||||||
raw0, raw1, rawi, KnLi;
|
|
||||||
|
|
||||||
for (j = 0, l = 56; j < 56; ++j, l -= 8) {
|
|
||||||
l += l < -5 ? 65 : l < -3 ? 31 : l < -1 ? 63 : l === 27 ? 35 : 0; // PC1
|
|
||||||
m = l & 0x7;
|
|
||||||
pc1m[j] = ((keyBlock[l >>> 3] & (1<<m)) !== 0) ? 1: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < 16; ++i) {
|
|
||||||
m = i << 1;
|
|
||||||
n = m + 1;
|
|
||||||
kn[m] = kn[n] = 0;
|
|
||||||
for (o = 28; o < 59; o += 28) {
|
|
||||||
for (j = o - 28; j < o; ++j) {
|
|
||||||
l = j + totrot[i];
|
|
||||||
if (l < o) {
|
|
||||||
pcr[j] = pc1m[l];
|
|
||||||
} else {
|
|
||||||
pcr[j] = pc1m[l - 28];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (j = 0; j < 24; ++j) {
|
|
||||||
if (pcr[PC2[j]] !== 0) {
|
|
||||||
kn[m] |= 1 << (23 - j);
|
|
||||||
}
|
|
||||||
if (pcr[PC2[j + 24]] !== 0) {
|
|
||||||
kn[n] |= 1 << (23 - j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// cookey
|
|
||||||
for (i = 0, rawi = 0, KnLi = 0; i < 16; ++i) {
|
|
||||||
raw0 = kn[rawi++];
|
|
||||||
raw1 = kn[rawi++];
|
|
||||||
keys[KnLi] = (raw0 & 0x00fc0000) << 6;
|
|
||||||
keys[KnLi] |= (raw0 & 0x00000fc0) << 10;
|
|
||||||
keys[KnLi] |= (raw1 & 0x00fc0000) >>> 10;
|
|
||||||
keys[KnLi] |= (raw1 & 0x00000fc0) >>> 6;
|
|
||||||
++KnLi;
|
|
||||||
keys[KnLi] = (raw0 & 0x0003f000) << 12;
|
|
||||||
keys[KnLi] |= (raw0 & 0x0000003f) << 16;
|
|
||||||
keys[KnLi] |= (raw1 & 0x0003f000) >>> 4;
|
|
||||||
keys[KnLi] |= (raw1 & 0x0000003f);
|
|
||||||
++KnLi;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Encrypt 8 bytes of text
|
|
||||||
function enc8(text) {
|
|
||||||
var i = 0, b = text.slice(), fval, keysi = 0,
|
|
||||||
l, r, x; // left, right, accumulator
|
|
||||||
|
|
||||||
// Squash 8 bytes to 2 ints
|
|
||||||
l = b[i++]<<24 | b[i++]<<16 | b[i++]<<8 | b[i++];
|
|
||||||
r = b[i++]<<24 | b[i++]<<16 | b[i++]<<8 | b[i++];
|
|
||||||
|
|
||||||
x = ((l >>> 4) ^ r) & 0x0f0f0f0f;
|
|
||||||
r ^= x;
|
|
||||||
l ^= (x << 4);
|
|
||||||
x = ((l >>> 16) ^ r) & 0x0000ffff;
|
|
||||||
r ^= x;
|
|
||||||
l ^= (x << 16);
|
|
||||||
x = ((r >>> 2) ^ l) & 0x33333333;
|
|
||||||
l ^= x;
|
|
||||||
r ^= (x << 2);
|
|
||||||
x = ((r >>> 8) ^ l) & 0x00ff00ff;
|
|
||||||
l ^= x;
|
|
||||||
r ^= (x << 8);
|
|
||||||
r = (r << 1) | ((r >>> 31) & 1);
|
|
||||||
x = (l ^ r) & 0xaaaaaaaa;
|
|
||||||
l ^= x;
|
|
||||||
r ^= x;
|
|
||||||
l = (l << 1) | ((l >>> 31) & 1);
|
|
||||||
|
|
||||||
for (i = 0; i < 8; ++i) {
|
|
||||||
x = (r << 28) | (r >>> 4);
|
|
||||||
x ^= keys[keysi++];
|
|
||||||
fval = SP7[x & 0x3f];
|
|
||||||
fval |= SP5[(x >>> 8) & 0x3f];
|
|
||||||
fval |= SP3[(x >>> 16) & 0x3f];
|
|
||||||
fval |= SP1[(x >>> 24) & 0x3f];
|
|
||||||
x = r ^ keys[keysi++];
|
|
||||||
fval |= SP8[x & 0x3f];
|
|
||||||
fval |= SP6[(x >>> 8) & 0x3f];
|
|
||||||
fval |= SP4[(x >>> 16) & 0x3f];
|
|
||||||
fval |= SP2[(x >>> 24) & 0x3f];
|
|
||||||
l ^= fval;
|
|
||||||
x = (l << 28) | (l >>> 4);
|
|
||||||
x ^= keys[keysi++];
|
|
||||||
fval = SP7[x & 0x3f];
|
|
||||||
fval |= SP5[(x >>> 8) & 0x3f];
|
|
||||||
fval |= SP3[(x >>> 16) & 0x3f];
|
|
||||||
fval |= SP1[(x >>> 24) & 0x3f];
|
|
||||||
x = l ^ keys[keysi++];
|
|
||||||
fval |= SP8[x & 0x0000003f];
|
|
||||||
fval |= SP6[(x >>> 8) & 0x3f];
|
|
||||||
fval |= SP4[(x >>> 16) & 0x3f];
|
|
||||||
fval |= SP2[(x >>> 24) & 0x3f];
|
|
||||||
r ^= fval;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = (r << 31) | (r >>> 1);
|
|
||||||
x = (l ^ r) & 0xaaaaaaaa;
|
|
||||||
l ^= x;
|
|
||||||
r ^= x;
|
|
||||||
l = (l << 31) | (l >>> 1);
|
|
||||||
x = ((l >>> 8) ^ r) & 0x00ff00ff;
|
|
||||||
r ^= x;
|
|
||||||
l ^= (x << 8);
|
|
||||||
x = ((l >>> 2) ^ r) & 0x33333333;
|
|
||||||
r ^= x;
|
|
||||||
l ^= (x << 2);
|
|
||||||
x = ((r >>> 16) ^ l) & 0x0000ffff;
|
|
||||||
l ^= x;
|
|
||||||
r ^= (x << 16);
|
|
||||||
x = ((r >>> 4) ^ l) & 0x0f0f0f0f;
|
|
||||||
l ^= x;
|
|
||||||
r ^= (x << 4);
|
|
||||||
|
|
||||||
// Spread ints to bytes
|
|
||||||
x = [r, l];
|
|
||||||
for (i = 0; i < 8; i++) {
|
|
||||||
b[i] = (x[i>>>2] >>> (8 * (3 - (i % 4)))) % 256;
|
|
||||||
if (b[i] < 0) { b[i] += 256; } // unsigned
|
|
||||||
}
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Encrypt 16 bytes of text using passwd as key
|
|
||||||
function encrypt(t) {
|
|
||||||
return enc8(t.slice(0, 8)).concat(enc8(t.slice(8, 16)));
|
|
||||||
}
|
|
||||||
|
|
||||||
setKeys(passwd); // Setup keys
|
|
||||||
return {'encrypt': encrypt}; // Public interface
|
|
||||||
|
|
||||||
}; // function DES
|
|
||||||
|
|
@ -1,872 +0,0 @@
|
||||||
/*
|
|
||||||
* 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';
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
||||||
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 };
|
|
||||||
|
|
@ -1,403 +0,0 @@
|
||||||
/*
|
|
||||||
* noVNC: HTML5 VNC client
|
|
||||||
* Copyright (C) 2012 Joel Martin
|
|
||||||
* Copyright (C) 2013 Samuel Mannehed for Cendio AB
|
|
||||||
* Licensed under MPL 2.0 or any later version (see LICENSE.txt)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*jslint browser: true, white: false */
|
|
||||||
/*global window, Util */
|
|
||||||
|
|
||||||
/* [module]
|
|
||||||
* import Util from "../util";
|
|
||||||
* import KeyboardUtil from "./util";
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* [module] export */ var Keyboard;
|
|
||||||
|
|
||||||
(function () {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
//
|
|
||||||
// Keyboard event handler
|
|
||||||
//
|
|
||||||
|
|
||||||
Keyboard = function (defaults) {
|
|
||||||
this._keyDownList = []; // List of depressed keys
|
|
||||||
// (even if they are happy)
|
|
||||||
|
|
||||||
Util.set_defaults(this, defaults, {
|
|
||||||
'target': document,
|
|
||||||
'focused': true
|
|
||||||
});
|
|
||||||
|
|
||||||
// create the keyboard handler
|
|
||||||
this._handler = new KeyboardUtil.KeyEventDecoder(KeyboardUtil.ModifierSync(),
|
|
||||||
KeyboardUtil.VerifyCharModifier( /* jshint newcap: false */
|
|
||||||
KeyboardUtil.TrackKeyState(
|
|
||||||
KeyboardUtil.EscapeModifiers(this._handleRfbEvent.bind(this))
|
|
||||||
)
|
|
||||||
)
|
|
||||||
); /* jshint newcap: true */
|
|
||||||
|
|
||||||
// keep these here so we can refer to them later
|
|
||||||
this._eventHandlers = {
|
|
||||||
'keyup': this._handleKeyUp.bind(this),
|
|
||||||
'keydown': this._handleKeyDown.bind(this),
|
|
||||||
'keypress': this._handleKeyPress.bind(this),
|
|
||||||
'blur': this._allKeysUp.bind(this)
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
Keyboard.prototype = {
|
|
||||||
// private methods
|
|
||||||
|
|
||||||
_handleRfbEvent: function (e) {
|
|
||||||
if (this._onKeyPress) {
|
|
||||||
Util.Debug("onKeyPress " + (e.type == 'keydown' ? "down" : "up") +
|
|
||||||
", keysym: " + e.keysym.keysym + "(" + e.keysym.keyname + ")");
|
|
||||||
this._onKeyPress(e);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
setQEMUVNCKeyboardHandler: function () {
|
|
||||||
this._handler = new KeyboardUtil.QEMUKeyEventDecoder(KeyboardUtil.ModifierSync(),
|
|
||||||
KeyboardUtil.TrackQEMUKeyState(
|
|
||||||
this._handleRfbEvent.bind(this)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
},
|
|
||||||
|
|
||||||
_handleKeyDown: function (e) {
|
|
||||||
if (!this._focused) { return; }
|
|
||||||
|
|
||||||
if (this._handler.keydown(e)) {
|
|
||||||
// Suppress bubbling/default actions
|
|
||||||
Util.stopEvent(e);
|
|
||||||
} else {
|
|
||||||
// Allow the event to bubble and become a keyPress event which
|
|
||||||
// will have the character code translated
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_handleKeyPress: function (e) {
|
|
||||||
if (!this._focused) { return; }
|
|
||||||
|
|
||||||
if (this._handler.keypress(e)) {
|
|
||||||
// Suppress bubbling/default actions
|
|
||||||
Util.stopEvent(e);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_handleKeyUp: function (e) {
|
|
||||||
if (!this._focused) { return; }
|
|
||||||
|
|
||||||
if (this._handler.keyup(e)) {
|
|
||||||
// Suppress bubbling/default actions
|
|
||||||
Util.stopEvent(e);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_allKeysUp: function () {
|
|
||||||
Util.Debug(">> Keyboard.allKeysUp");
|
|
||||||
this._handler.releaseAll();
|
|
||||||
Util.Debug("<< Keyboard.allKeysUp");
|
|
||||||
},
|
|
||||||
|
|
||||||
// Public methods
|
|
||||||
|
|
||||||
grab: function () {
|
|
||||||
//Util.Debug(">> Keyboard.grab");
|
|
||||||
var c = this._target;
|
|
||||||
|
|
||||||
c.addEventListener('keydown', this._eventHandlers.keydown);
|
|
||||||
c.addEventListener('keyup', this._eventHandlers.keyup);
|
|
||||||
c.addEventListener('keypress', this._eventHandlers.keypress);
|
|
||||||
|
|
||||||
// Release (key up) if window loses focus
|
|
||||||
window.addEventListener('blur', this._eventHandlers.blur);
|
|
||||||
|
|
||||||
//Util.Debug("<< Keyboard.grab");
|
|
||||||
},
|
|
||||||
|
|
||||||
ungrab: function () {
|
|
||||||
//Util.Debug(">> Keyboard.ungrab");
|
|
||||||
var c = this._target;
|
|
||||||
|
|
||||||
c.removeEventListener('keydown', this._eventHandlers.keydown);
|
|
||||||
c.removeEventListener('keyup', this._eventHandlers.keyup);
|
|
||||||
c.removeEventListener('keypress', this._eventHandlers.keypress);
|
|
||||||
window.removeEventListener('blur', this._eventHandlers.blur);
|
|
||||||
|
|
||||||
// Release (key up) all keys that are in a down state
|
|
||||||
this._allKeysUp();
|
|
||||||
|
|
||||||
//Util.Debug(">> Keyboard.ungrab");
|
|
||||||
},
|
|
||||||
|
|
||||||
sync: function (e) {
|
|
||||||
this._handler.syncModifiers(e);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Util.make_properties(Keyboard, [
|
|
||||||
['target', 'wo', 'dom'], // DOM element that captures keyboard input
|
|
||||||
['focused', 'rw', 'bool'], // Capture and send key events
|
|
||||||
|
|
||||||
['onKeyPress', 'rw', 'func'] // Handler for key press/release
|
|
||||||
]);
|
|
||||||
})();
|
|
||||||
|
|
||||||
/* [module] export */ var Mouse;
|
|
||||||
|
|
||||||
(function () {
|
|
||||||
Mouse = function (defaults) {
|
|
||||||
this._mouseCaptured = false;
|
|
||||||
|
|
||||||
this._doubleClickTimer = null;
|
|
||||||
this._lastTouchPos = null;
|
|
||||||
|
|
||||||
// Configuration attributes
|
|
||||||
Util.set_defaults(this, defaults, {
|
|
||||||
'target': document,
|
|
||||||
'focused': true,
|
|
||||||
'touchButton': 1
|
|
||||||
});
|
|
||||||
|
|
||||||
this._eventHandlers = {
|
|
||||||
'mousedown': this._handleMouseDown.bind(this),
|
|
||||||
'mouseup': this._handleMouseUp.bind(this),
|
|
||||||
'mousemove': this._handleMouseMove.bind(this),
|
|
||||||
'mousewheel': this._handleMouseWheel.bind(this),
|
|
||||||
'mousedisable': this._handleMouseDisable.bind(this)
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
Mouse.prototype = {
|
|
||||||
// private methods
|
|
||||||
_captureMouse: function () {
|
|
||||||
// capturing the mouse ensures we get the mouseup event
|
|
||||||
Util.setCapture(this._target);
|
|
||||||
|
|
||||||
// some browsers give us mouseup events regardless,
|
|
||||||
// so if we never captured the mouse, we can disregard the event
|
|
||||||
this._mouseCaptured = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
_releaseMouse: function () {
|
|
||||||
Util.releaseCapture();
|
|
||||||
this._mouseCaptured = false;
|
|
||||||
},
|
|
||||||
|
|
||||||
_resetDoubleClickTimer: function () {
|
|
||||||
this._doubleClickTimer = null;
|
|
||||||
},
|
|
||||||
|
|
||||||
_handleMouseButton: function (e, down) {
|
|
||||||
if (!this._focused) { return; }
|
|
||||||
|
|
||||||
if (this._notify) {
|
|
||||||
this._notify(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
var pos = this._getMousePosition(e);
|
|
||||||
|
|
||||||
var bmask;
|
|
||||||
if (e.touches || e.changedTouches) {
|
|
||||||
// Touch device
|
|
||||||
|
|
||||||
// When two touches occur within 500 ms of each other and are
|
|
||||||
// close enough together a double click is triggered.
|
|
||||||
if (down == 1) {
|
|
||||||
if (this._doubleClickTimer === null) {
|
|
||||||
this._lastTouchPos = pos;
|
|
||||||
} else {
|
|
||||||
clearTimeout(this._doubleClickTimer);
|
|
||||||
|
|
||||||
// When the distance between the two touches is small enough
|
|
||||||
// force the position of the latter touch to the position of
|
|
||||||
// the first.
|
|
||||||
|
|
||||||
var xs = this._lastTouchPos.x - pos.x;
|
|
||||||
var ys = this._lastTouchPos.y - pos.y;
|
|
||||||
var d = Math.sqrt((xs * xs) + (ys * ys));
|
|
||||||
|
|
||||||
// The goal is to trigger on a certain physical width, the
|
|
||||||
// devicePixelRatio brings us a bit closer but is not optimal.
|
|
||||||
var threshold = 20 * (window.devicePixelRatio || 1);
|
|
||||||
if (d < threshold) {
|
|
||||||
pos = this._lastTouchPos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._doubleClickTimer = setTimeout(this._resetDoubleClickTimer.bind(this), 500);
|
|
||||||
}
|
|
||||||
bmask = this._touchButton;
|
|
||||||
// If bmask is set
|
|
||||||
} else if (e.which) {
|
|
||||||
/* everything except IE */
|
|
||||||
bmask = 1 << e.button;
|
|
||||||
} else {
|
|
||||||
/* IE including 9 */
|
|
||||||
bmask = (e.button & 0x1) + // Left
|
|
||||||
(e.button & 0x2) * 2 + // Right
|
|
||||||
(e.button & 0x4) / 2; // Middle
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._onMouseButton) {
|
|
||||||
Util.Debug("onMouseButton " + (down ? "down" : "up") +
|
|
||||||
", x: " + pos.x + ", y: " + pos.y + ", bmask: " + bmask);
|
|
||||||
this._onMouseButton(pos.x, pos.y, down, bmask);
|
|
||||||
}
|
|
||||||
Util.stopEvent(e);
|
|
||||||
},
|
|
||||||
|
|
||||||
_handleMouseDown: function (e) {
|
|
||||||
this._captureMouse();
|
|
||||||
this._handleMouseButton(e, 1);
|
|
||||||
},
|
|
||||||
|
|
||||||
_handleMouseUp: function (e) {
|
|
||||||
if (!this._mouseCaptured) { return; }
|
|
||||||
|
|
||||||
this._handleMouseButton(e, 0);
|
|
||||||
this._releaseMouse();
|
|
||||||
},
|
|
||||||
|
|
||||||
_handleMouseWheel: function (e) {
|
|
||||||
if (!this._focused) { return; }
|
|
||||||
|
|
||||||
if (this._notify) {
|
|
||||||
this._notify(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
var pos = this._getMousePosition(e);
|
|
||||||
|
|
||||||
if (this._onMouseButton) {
|
|
||||||
if (e.deltaX < 0) {
|
|
||||||
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);
|
|
||||||
},
|
|
||||||
|
|
||||||
_handleMouseMove: function (e) {
|
|
||||||
if (! this._focused) { return; }
|
|
||||||
|
|
||||||
if (this._notify) {
|
|
||||||
this._notify(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
var pos = this._getMousePosition(e);
|
|
||||||
if (this._onMouseMove) {
|
|
||||||
this._onMouseMove(pos.x, pos.y);
|
|
||||||
}
|
|
||||||
Util.stopEvent(e);
|
|
||||||
},
|
|
||||||
|
|
||||||
_handleMouseDisable: function (e) {
|
|
||||||
if (!this._focused) { return; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Stop propagation if inside canvas area
|
|
||||||
* Note: This is only needed for the 'click' event as it fails
|
|
||||||
* to fire properly for the target element so we have
|
|
||||||
* to listen on the document element instead.
|
|
||||||
*/
|
|
||||||
if (e.target == this._target) {
|
|
||||||
//Util.Debug("mouse event disabled");
|
|
||||||
Util.stopEvent(e);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// 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};
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
// Public methods
|
|
||||||
grab: function () {
|
|
||||||
var c = this._target;
|
|
||||||
|
|
||||||
if (Util.isTouchDevice) {
|
|
||||||
c.addEventListener('touchstart', this._eventHandlers.mousedown);
|
|
||||||
window.addEventListener('touchend', this._eventHandlers.mouseup);
|
|
||||||
c.addEventListener('touchend', this._eventHandlers.mouseup);
|
|
||||||
c.addEventListener('touchmove', this._eventHandlers.mousemove);
|
|
||||||
}
|
|
||||||
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);
|
|
||||||
|
|
||||||
/* Prevent middle-click pasting (see above for why we bind to document) */
|
|
||||||
document.addEventListener('click', this._eventHandlers.mousedisable);
|
|
||||||
|
|
||||||
/* preventDefault() on mousedown doesn't stop this event for some
|
|
||||||
reason so we have to explicitly block it */
|
|
||||||
c.addEventListener('contextmenu', this._eventHandlers.mousedisable);
|
|
||||||
},
|
|
||||||
|
|
||||||
ungrab: function () {
|
|
||||||
var c = this._target;
|
|
||||||
|
|
||||||
if (Util.isTouchDevice) {
|
|
||||||
c.removeEventListener('touchstart', this._eventHandlers.mousedown);
|
|
||||||
window.removeEventListener('touchend', this._eventHandlers.mouseup);
|
|
||||||
c.removeEventListener('touchend', this._eventHandlers.mouseup);
|
|
||||||
c.removeEventListener('touchmove', this._eventHandlers.mousemove);
|
|
||||||
}
|
|
||||||
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);
|
|
||||||
|
|
||||||
document.removeEventListener('click', this._eventHandlers.mousedisable);
|
|
||||||
|
|
||||||
c.removeEventListener('contextmenu', this._eventHandlers.mousedisable);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Util.make_properties(Mouse, [
|
|
||||||
['target', 'ro', 'dom'], // DOM element that captures mouse input
|
|
||||||
['notify', 'ro', 'func'], // Function to call to notify whenever a mouse event is received
|
|
||||||
['focused', 'rw', 'bool'], // Capture and send mouse clicks/movement
|
|
||||||
|
|
||||||
['onMouseButton', 'rw', 'func'], // Handler for mouse button click/release
|
|
||||||
['onMouseMove', 'rw', 'func'], // Handler for mouse movement
|
|
||||||
['touchButton', 'rw', 'int'] // Button mask (1, 2, 4) for touch devices (0 means ignore clicks)
|
|
||||||
]);
|
|
||||||
})();
|
|
||||||
|
|
@ -1,382 +0,0 @@
|
||||||
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; */
|
|
||||||
|
|
@ -1,679 +0,0 @@
|
||||||
/* [module]
|
|
||||||
* import KeyTable from "./keysym";
|
|
||||||
* import keysyms from "./keysymdef";
|
|
||||||
*/
|
|
||||||
|
|
||||||
var KeyboardUtil = {};
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
function substituteCodepoint(cp) {
|
|
||||||
// Any Unicode code points which do not have corresponding keysym entries
|
|
||||||
// can be swapped out for another code point by adding them to this table
|
|
||||||
var substitutions = {
|
|
||||||
// {S,s} with comma below -> {S,s} with cedilla
|
|
||||||
0x218 : 0x15e,
|
|
||||||
0x219 : 0x15f,
|
|
||||||
// {T,t} with comma below -> {T,t} with cedilla
|
|
||||||
0x21a : 0x162,
|
|
||||||
0x21b : 0x163
|
|
||||||
};
|
|
||||||
|
|
||||||
var sub = substitutions[cp];
|
|
||||||
return sub ? sub : cp;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isMac() {
|
|
||||||
return navigator && !!(/mac/i).exec(navigator.platform);
|
|
||||||
}
|
|
||||||
function isWindows() {
|
|
||||||
return navigator && !!(/win/i).exec(navigator.platform);
|
|
||||||
}
|
|
||||||
function isLinux() {
|
|
||||||
return navigator && !!(/linux/i).exec(navigator.platform);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return true if a modifier which is not the specified char modifier (and is not shift) is down
|
|
||||||
function hasShortcutModifier(charModifier, currentModifiers) {
|
|
||||||
var mods = {};
|
|
||||||
for (var key in currentModifiers) {
|
|
||||||
if (parseInt(key) !== KeyTable.XK_Shift_L) {
|
|
||||||
mods[key] = currentModifiers[key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var sum = 0;
|
|
||||||
for (var k in currentModifiers) {
|
|
||||||
if (mods[k]) {
|
|
||||||
++sum;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (hasCharModifier(charModifier, mods)) {
|
|
||||||
return sum > charModifier.length;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return sum > 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return true if the specified char modifier is currently down
|
|
||||||
function hasCharModifier(charModifier, currentModifiers) {
|
|
||||||
if (charModifier.length === 0) { return false; }
|
|
||||||
|
|
||||||
for (var i = 0; i < charModifier.length; ++i) {
|
|
||||||
if (!currentModifiers[charModifier[i]]) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Helper object tracking modifier key state
|
|
||||||
// and generates fake key events to compensate if it gets out of sync
|
|
||||||
function ModifierSync(charModifier) {
|
|
||||||
if (!charModifier) {
|
|
||||||
if (isMac()) {
|
|
||||||
// on Mac, Option (AKA Alt) is used as a char modifier
|
|
||||||
charModifier = [KeyTable.XK_Alt_L];
|
|
||||||
}
|
|
||||||
else if (isWindows()) {
|
|
||||||
// on Windows, Ctrl+Alt is used as a char modifier
|
|
||||||
charModifier = [KeyTable.XK_Alt_L, KeyTable.XK_Control_L];
|
|
||||||
}
|
|
||||||
else if (isLinux()) {
|
|
||||||
// on Linux, ISO Level 3 Shift (AltGr) is used as a char modifier
|
|
||||||
charModifier = [KeyTable.XK_ISO_Level3_Shift];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
charModifier = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var state = {};
|
|
||||||
state[KeyTable.XK_Control_L] = false;
|
|
||||||
state[KeyTable.XK_Alt_L] = false;
|
|
||||||
state[KeyTable.XK_ISO_Level3_Shift] = false;
|
|
||||||
state[KeyTable.XK_Shift_L] = false;
|
|
||||||
state[KeyTable.XK_Meta_L] = false;
|
|
||||||
|
|
||||||
function sync(evt, keysym) {
|
|
||||||
var result = [];
|
|
||||||
function syncKey(keysym) {
|
|
||||||
return {keysym: keysyms.lookup(keysym), type: state[keysym] ? 'keydown' : 'keyup'};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (evt.ctrlKey !== undefined &&
|
|
||||||
evt.ctrlKey !== state[KeyTable.XK_Control_L] && keysym !== KeyTable.XK_Control_L) {
|
|
||||||
state[KeyTable.XK_Control_L] = evt.ctrlKey;
|
|
||||||
result.push(syncKey(KeyTable.XK_Control_L));
|
|
||||||
}
|
|
||||||
if (evt.altKey !== undefined &&
|
|
||||||
evt.altKey !== state[KeyTable.XK_Alt_L] && keysym !== KeyTable.XK_Alt_L) {
|
|
||||||
state[KeyTable.XK_Alt_L] = evt.altKey;
|
|
||||||
result.push(syncKey(KeyTable.XK_Alt_L));
|
|
||||||
}
|
|
||||||
if (evt.altGraphKey !== undefined &&
|
|
||||||
evt.altGraphKey !== state[KeyTable.XK_ISO_Level3_Shift] && keysym !== KeyTable.XK_ISO_Level3_Shift) {
|
|
||||||
state[KeyTable.XK_ISO_Level3_Shift] = evt.altGraphKey;
|
|
||||||
result.push(syncKey(KeyTable.XK_ISO_Level3_Shift));
|
|
||||||
}
|
|
||||||
if (evt.shiftKey !== undefined &&
|
|
||||||
evt.shiftKey !== state[KeyTable.XK_Shift_L] && keysym !== KeyTable.XK_Shift_L) {
|
|
||||||
state[KeyTable.XK_Shift_L] = evt.shiftKey;
|
|
||||||
result.push(syncKey(KeyTable.XK_Shift_L));
|
|
||||||
}
|
|
||||||
if (evt.metaKey !== undefined &&
|
|
||||||
evt.metaKey !== state[KeyTable.XK_Meta_L] && keysym !== KeyTable.XK_Meta_L) {
|
|
||||||
state[KeyTable.XK_Meta_L] = evt.metaKey;
|
|
||||||
result.push(syncKey(KeyTable.XK_Meta_L));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
function syncKeyEvent(evt, down) {
|
|
||||||
var obj = getKeysym(evt);
|
|
||||||
var keysym = obj ? obj.keysym : null;
|
|
||||||
|
|
||||||
// first, apply the event itself, if relevant
|
|
||||||
if (keysym !== null && state[keysym] !== undefined) {
|
|
||||||
state[keysym] = down;
|
|
||||||
}
|
|
||||||
return sync(evt, keysym);
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
// sync on the appropriate keyboard event
|
|
||||||
keydown: function(evt) { return syncKeyEvent(evt, true);},
|
|
||||||
keyup: function(evt) { return syncKeyEvent(evt, false);},
|
|
||||||
// Call this with a non-keyboard event (such as mouse events) to use its modifier state to synchronize anyway
|
|
||||||
syncAny: function(evt) { return sync(evt);},
|
|
||||||
|
|
||||||
// is a shortcut modifier down?
|
|
||||||
hasShortcutModifier: function() { return hasShortcutModifier(charModifier, state); },
|
|
||||||
// if a char modifier is down, return the keys it consists of, otherwise return null
|
|
||||||
activeCharModifier: function() { return hasCharModifier(charModifier, state) ? charModifier : null; }
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get a key ID from a keyboard event
|
|
||||||
// May be a string or an integer depending on the available properties
|
|
||||||
function getKey(evt){
|
|
||||||
if ('keyCode' in evt && 'key' in evt) {
|
|
||||||
return evt.key + ':' + evt.keyCode;
|
|
||||||
}
|
|
||||||
else if ('keyCode' in evt) {
|
|
||||||
return evt.keyCode;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return evt.key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the most reliable keysym value we can get from a key event
|
|
||||||
// if char/charCode is available, prefer those, otherwise fall back to key/keyCode/which
|
|
||||||
function getKeysym(evt){
|
|
||||||
var codepoint;
|
|
||||||
if (evt.char && evt.char.length === 1) {
|
|
||||||
codepoint = evt.char.charCodeAt();
|
|
||||||
}
|
|
||||||
else if (evt.charCode) {
|
|
||||||
codepoint = evt.charCode;
|
|
||||||
}
|
|
||||||
else if (evt.keyCode && evt.type === 'keypress') {
|
|
||||||
// IE10 stores the char code as keyCode, and has no other useful properties
|
|
||||||
codepoint = evt.keyCode;
|
|
||||||
}
|
|
||||||
if (codepoint) {
|
|
||||||
return keysyms.fromUnicode(substituteCodepoint(codepoint));
|
|
||||||
}
|
|
||||||
// we could check evt.key here.
|
|
||||||
// Legal values are defined in http://www.w3.org/TR/DOM-Level-3-Events/#key-values-list,
|
|
||||||
// so we "just" need to map them to keysym, but AFAIK this is only available in IE10, which also provides evt.key
|
|
||||||
// so we don't *need* it yet
|
|
||||||
if (evt.keyCode) {
|
|
||||||
return keysyms.lookup(keysymFromKeyCode(evt.keyCode, evt.shiftKey));
|
|
||||||
}
|
|
||||||
if (evt.which) {
|
|
||||||
return keysyms.lookup(keysymFromKeyCode(evt.which, evt.shiftKey));
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Given a keycode, try to predict which keysym it might be.
|
|
||||||
// If the keycode is unknown, null is returned.
|
|
||||||
function keysymFromKeyCode(keycode, shiftPressed) {
|
|
||||||
if (typeof(keycode) !== 'number') {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
// won't be accurate for azerty
|
|
||||||
if (keycode >= 0x30 && keycode <= 0x39) {
|
|
||||||
return keycode; // digit
|
|
||||||
}
|
|
||||||
if (keycode >= 0x41 && keycode <= 0x5a) {
|
|
||||||
// remap to lowercase unless shift is down
|
|
||||||
return shiftPressed ? keycode : keycode + 32; // A-Z
|
|
||||||
}
|
|
||||||
if (keycode >= 0x60 && keycode <= 0x69) {
|
|
||||||
return KeyTable.XK_KP_0 + (keycode - 0x60); // numpad 0-9
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(keycode) {
|
|
||||||
case 0x20: return KeyTable.XK_space;
|
|
||||||
case 0x6a: return KeyTable.XK_KP_Multiply;
|
|
||||||
case 0x6b: return KeyTable.XK_KP_Add;
|
|
||||||
case 0x6c: return KeyTable.XK_KP_Separator;
|
|
||||||
case 0x6d: return KeyTable.XK_KP_Subtract;
|
|
||||||
case 0x6e: return KeyTable.XK_KP_Decimal;
|
|
||||||
case 0x6f: return KeyTable.XK_KP_Divide;
|
|
||||||
case 0xbb: return KeyTable.XK_plus;
|
|
||||||
case 0xbc: return KeyTable.XK_comma;
|
|
||||||
case 0xbd: return KeyTable.XK_minus;
|
|
||||||
case 0xbe: return KeyTable.XK_period;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nonCharacterKey({keyCode: keycode});
|
|
||||||
}
|
|
||||||
|
|
||||||
// if the key is a known non-character key (any key which doesn't generate character data)
|
|
||||||
// return its keysym value. Otherwise return null
|
|
||||||
function nonCharacterKey(evt) {
|
|
||||||
// evt.key not implemented yet
|
|
||||||
if (!evt.keyCode) { return null; }
|
|
||||||
var keycode = evt.keyCode;
|
|
||||||
|
|
||||||
if (keycode >= 0x70 && keycode <= 0x87) {
|
|
||||||
return KeyTable.XK_F1 + keycode - 0x70; // F1-F24
|
|
||||||
}
|
|
||||||
switch (keycode) {
|
|
||||||
|
|
||||||
case 8 : return KeyTable.XK_BackSpace;
|
|
||||||
case 13 : return KeyTable.XK_Return;
|
|
||||||
|
|
||||||
case 9 : return KeyTable.XK_Tab;
|
|
||||||
|
|
||||||
case 27 : return KeyTable.XK_Escape;
|
|
||||||
case 46 : return KeyTable.XK_Delete;
|
|
||||||
|
|
||||||
case 36 : return KeyTable.XK_Home;
|
|
||||||
case 35 : return KeyTable.XK_End;
|
|
||||||
case 33 : return KeyTable.XK_Page_Up;
|
|
||||||
case 34 : return KeyTable.XK_Page_Down;
|
|
||||||
case 45 : return KeyTable.XK_Insert;
|
|
||||||
|
|
||||||
case 37 : return KeyTable.XK_Left;
|
|
||||||
case 38 : return KeyTable.XK_Up;
|
|
||||||
case 39 : return KeyTable.XK_Right;
|
|
||||||
case 40 : return KeyTable.XK_Down;
|
|
||||||
|
|
||||||
case 16 : return KeyTable.XK_Shift_L;
|
|
||||||
case 17 : return KeyTable.XK_Control_L;
|
|
||||||
case 18 : return KeyTable.XK_Alt_L; // also: Option-key on Mac
|
|
||||||
|
|
||||||
case 224 : return KeyTable.XK_Meta_L;
|
|
||||||
case 225 : return KeyTable.XK_ISO_Level3_Shift; // AltGr
|
|
||||||
case 91 : return KeyTable.XK_Super_L; // also: Windows-key
|
|
||||||
case 92 : return KeyTable.XK_Super_R; // also: Windows-key
|
|
||||||
case 93 : return KeyTable.XK_Menu; // also: Windows-Menu, Command on Mac
|
|
||||||
default: return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
KeyboardUtil.hasShortcutModifier = hasShortcutModifier;
|
|
||||||
KeyboardUtil.hasCharModifier = hasCharModifier;
|
|
||||||
KeyboardUtil.ModifierSync = ModifierSync;
|
|
||||||
KeyboardUtil.getKey = getKey;
|
|
||||||
KeyboardUtil.getKeysym = getKeysym;
|
|
||||||
KeyboardUtil.keysymFromKeyCode = keysymFromKeyCode;
|
|
||||||
KeyboardUtil.nonCharacterKey = nonCharacterKey;
|
|
||||||
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:
|
|
||||||
// - determines which keysym it represents
|
|
||||||
// - determines a keyId identifying the key that was pressed (corresponding to the key/keyCode properties on the DOM event)
|
|
||||||
// - synthesizes events to synchronize modifier key state between which modifiers are actually down, and which we thought were down
|
|
||||||
// - 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
|
|
||||||
// This information is collected into an object which is passed to the next() function. (one call per event)
|
|
||||||
KeyboardUtil.KeyEventDecoder = function(modifierState, next) {
|
|
||||||
"use strict";
|
|
||||||
function sendAll(evts) {
|
|
||||||
for (var i = 0; i < evts.length; ++i) {
|
|
||||||
next(evts[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function process(evt, type) {
|
|
||||||
var result = {type: type};
|
|
||||||
var keyId = KeyboardUtil.getKey(evt);
|
|
||||||
if (keyId) {
|
|
||||||
result.keyId = keyId;
|
|
||||||
}
|
|
||||||
|
|
||||||
var keysym = KeyboardUtil.getKeysym(evt);
|
|
||||||
|
|
||||||
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?
|
|
||||||
// "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
|
|
||||||
if (keysym && (type !== 'keydown' || KeyboardUtil.nonCharacterKey(evt) || hasModifier)) {
|
|
||||||
result.keysym = keysym;
|
|
||||||
}
|
|
||||||
|
|
||||||
var isShift = evt.keyCode === 0x10 || evt.key === 'Shift';
|
|
||||||
|
|
||||||
// Should we prevent the browser from handling the event?
|
|
||||||
// Doing so on a keydown (in most browsers) prevents keypress from being generated
|
|
||||||
// so only do that if we have to.
|
|
||||||
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,
|
|
||||||
// so VerifyCharModifier knows to wait and see if a keypress is comnig
|
|
||||||
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)
|
|
||||||
var active = modifierState.activeCharModifier();
|
|
||||||
|
|
||||||
// If we have a char modifier down, and we're able to determine a keysym reliably
|
|
||||||
// then (a) we know to treat the modifier as a char modifier,
|
|
||||||
// and (b) we'll have to "escape" the modifier to undo the modifier when sending the char.
|
|
||||||
if (active && keysym) {
|
|
||||||
var isCharModifier = false;
|
|
||||||
for (var i = 0; i < active.length; ++i) {
|
|
||||||
if (active[i] === keysym.keysym) {
|
|
||||||
isCharModifier = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (type === 'keypress' && !isCharModifier) {
|
|
||||||
result.escape = modifierState.activeCharModifier();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stall) {
|
|
||||||
// insert a fake "stall" event
|
|
||||||
next({type: 'stall'});
|
|
||||||
}
|
|
||||||
next(result);
|
|
||||||
|
|
||||||
return suppress;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
keydown: function(evt) {
|
|
||||||
sendAll(modifierState.keydown(evt));
|
|
||||||
return process(evt, 'keydown');
|
|
||||||
},
|
|
||||||
keypress: function(evt) {
|
|
||||||
return process(evt, 'keypress');
|
|
||||||
},
|
|
||||||
keyup: function(evt) {
|
|
||||||
sendAll(modifierState.keyup(evt));
|
|
||||||
return process(evt, 'keyup');
|
|
||||||
},
|
|
||||||
syncModifiers: function(evt) {
|
|
||||||
sendAll(modifierState.syncAny(evt));
|
|
||||||
},
|
|
||||||
releaseAll: function() { next({type: 'releaseall'}); }
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// 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.
|
|
||||||
// For example, on Windows, AltGr is synonymous with Ctrl-Alt. On a Danish keyboard layout, AltGr-2 yields a @, but Ctrl-Alt-D does nothing
|
|
||||||
// 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
|
|
||||||
// When we receive a "stall" event, wait a few ms before processing the next keydown. If a keypress has also arrived, merge the two
|
|
||||||
KeyboardUtil.VerifyCharModifier = function(next) {
|
|
||||||
"use strict";
|
|
||||||
var queue = [];
|
|
||||||
var timer = null;
|
|
||||||
function process() {
|
|
||||||
if (timer) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var delayProcess = function () {
|
|
||||||
clearTimeout(timer);
|
|
||||||
timer = null;
|
|
||||||
process();
|
|
||||||
};
|
|
||||||
|
|
||||||
while (queue.length !== 0) {
|
|
||||||
var cur = queue[0];
|
|
||||||
queue = queue.splice(1);
|
|
||||||
switch (cur.type) {
|
|
||||||
case 'stall':
|
|
||||||
// insert a delay before processing available events.
|
|
||||||
/* jshint loopfunc: true */
|
|
||||||
timer = setTimeout(delayProcess, 5);
|
|
||||||
/* jshint loopfunc: false */
|
|
||||||
return;
|
|
||||||
case 'keydown':
|
|
||||||
// is the next element a keypress? Then we should merge the two
|
|
||||||
if (queue.length !== 0 && queue[0].type === 'keypress') {
|
|
||||||
// Firefox sends keypress even when no char is generated.
|
|
||||||
// so, if keypress keysym is the same as we'd have guessed from keydown,
|
|
||||||
// the modifier didn't have any effect, and should not be escaped
|
|
||||||
if (queue[0].escape && (!cur.keysym || cur.keysym.keysym !== queue[0].keysym.keysym)) {
|
|
||||||
cur.escape = queue[0].escape;
|
|
||||||
}
|
|
||||||
cur.keysym = queue[0].keysym;
|
|
||||||
queue = queue.splice(1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// swallow stall events, and pass all others to the next stage
|
|
||||||
if (cur.type !== 'stall') {
|
|
||||||
next(cur);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return function(evt) {
|
|
||||||
queue.push(evt);
|
|
||||||
process();
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// 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)
|
|
||||||
// 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.
|
|
||||||
// Because we can't always identify which entry a keydown or keyup event corresponds to, we sometimes have to guess
|
|
||||||
KeyboardUtil.TrackKeyState = function(next) {
|
|
||||||
"use strict";
|
|
||||||
var state = [];
|
|
||||||
|
|
||||||
return function (evt) {
|
|
||||||
var last = state.length !== 0 ? state[state.length-1] : null;
|
|
||||||
|
|
||||||
switch (evt.type) {
|
|
||||||
case 'keydown':
|
|
||||||
// insert a new entry if last seen key was different.
|
|
||||||
if (!last || !evt.keyId || last.keyId !== evt.keyId) {
|
|
||||||
last = {keyId: evt.keyId, keysyms: {}};
|
|
||||||
state.push(last);
|
|
||||||
}
|
|
||||||
if (evt.keysym) {
|
|
||||||
// make sure last event contains this keysym (a single "logical" keyevent
|
|
||||||
// can cause multiple key events to be sent to the VNC server)
|
|
||||||
last.keysyms[evt.keysym.keysym] = evt.keysym;
|
|
||||||
last.ignoreKeyPress = true;
|
|
||||||
next(evt);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'keypress':
|
|
||||||
if (!last) {
|
|
||||||
last = {keyId: evt.keyId, keysyms: {}};
|
|
||||||
state.push(last);
|
|
||||||
}
|
|
||||||
if (!evt.keysym) {
|
|
||||||
console.log('keypress with no keysym:', evt);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we didn't expect a keypress, and already sent a keydown to the VNC server
|
|
||||||
// based on the keydown, make sure to skip this event.
|
|
||||||
if (evt.keysym && !last.ignoreKeyPress) {
|
|
||||||
last.keysyms[evt.keysym.keysym] = evt.keysym;
|
|
||||||
evt.type = 'keydown';
|
|
||||||
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].keyId === evt.keyId) {
|
|
||||||
idx = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// if we couldn't find a match (it happens), assume it was the last key pressed
|
|
||||||
if (idx === null) {
|
|
||||||
idx = state.length - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
var item = state.splice(idx, 1)[0];
|
|
||||||
// for each keysym tracked by this key entry, clone the current event and override the keysym
|
|
||||||
var clone = (function(){
|
|
||||||
function Clone(){}
|
|
||||||
return function (obj) { Clone.prototype=obj; return new Clone(); };
|
|
||||||
}());
|
|
||||||
for (var key in item.keysyms) {
|
|
||||||
var out = clone(evt);
|
|
||||||
out.keysym = item.keysyms[key];
|
|
||||||
next(out);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'releaseall':
|
|
||||||
/* jshint shadow: true */
|
|
||||||
for (var i = 0; i < state.length; ++i) {
|
|
||||||
for (var key in state[i].keysyms) {
|
|
||||||
var keysym = state[i].keysyms[key];
|
|
||||||
next({keyId: 0, keysym: keysym, type: 'keyup'});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* jshint shadow: false */
|
|
||||||
state = [];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// 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.
|
|
||||||
KeyboardUtil.EscapeModifiers = function(next) {
|
|
||||||
"use strict";
|
|
||||||
return function(evt) {
|
|
||||||
if (evt.type !== 'keydown' || evt.escape === undefined) {
|
|
||||||
next(evt);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// undo modifiers
|
|
||||||
for (var i = 0; i < evt.escape.length; ++i) {
|
|
||||||
next({type: 'keyup', keyId: 0, keysym: keysyms.lookup(evt.escape[i])});
|
|
||||||
}
|
|
||||||
// send the character event
|
|
||||||
next(evt);
|
|
||||||
// redo modifiers
|
|
||||||
/* jshint shadow: true */
|
|
||||||
for (var i = 0; i < evt.escape.length; ++i) {
|
|
||||||
next({type: 'keydown', keyId: 0, keysym: keysyms.lookup(evt.escape[i])});
|
|
||||||
}
|
|
||||||
/* jshint shadow: false */
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
/* [module] export default KeyboardUtil; */
|
|
||||||
|
|
@ -1,151 +0,0 @@
|
||||||
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 */
|
|
||||||
|
|
@ -1,621 +0,0 @@
|
||||||
/*
|
|
||||||
* noVNC: HTML5 VNC client
|
|
||||||
* Copyright (C) 2012 Joel Martin
|
|
||||||
* Licensed under MPL 2.0 (see LICENSE.txt)
|
|
||||||
*
|
|
||||||
* See README.md for usage and integration instructions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* 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; */
|
|
||||||
|
|
@ -1,356 +0,0 @@
|
||||||
/*
|
|
||||||
* Websock: high-performance binary WebSockets
|
|
||||||
* Copyright (C) 2012 Joel Martin
|
|
||||||
* Licensed under MPL 2.0 (see LICENSE.txt)
|
|
||||||
*
|
|
||||||
* Websock is similar to the standard WebSocket object but with extra
|
|
||||||
* buffer handling.
|
|
||||||
*
|
|
||||||
* Websock has built-in receive queue buffering; the message event
|
|
||||||
* does not contain actual data but is simply a notification that
|
|
||||||
* there is new data available. Several rQ* methods are available to
|
|
||||||
* read binary data off of the receive queue.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* [module]
|
|
||||||
* import Util from "./util";
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*jslint browser: true, bitwise: true */
|
|
||||||
/*global Util*/
|
|
||||||
|
|
||||||
/* [module] export default */ function Websock() {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
this._websocket = null; // WebSocket object
|
|
||||||
|
|
||||||
this._rQi = 0; // Receive queue index
|
|
||||||
this._rQlen = 0; // Next write position in the receive queue
|
|
||||||
this._rQbufferSize = 1024 * 1024 * 4; // Receive queue buffer size (4 MiB)
|
|
||||||
this._rQmax = this._rQbufferSize / 8;
|
|
||||||
// called in init: this._rQ = new Uint8Array(this._rQbufferSize);
|
|
||||||
this._rQ = null; // Receive queue
|
|
||||||
|
|
||||||
this._sQbufferSize = 1024 * 10; // 10 KiB
|
|
||||||
// called in init: this._sQ = new Uint8Array(this._sQbufferSize);
|
|
||||||
this._sQlen = 0;
|
|
||||||
this._sQ = null; // Send queue
|
|
||||||
|
|
||||||
this._eventHandlers = {
|
|
||||||
'message': function () {},
|
|
||||||
'open': function () {},
|
|
||||||
'close': function () {},
|
|
||||||
'error': function () {}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
(function () {
|
|
||||||
"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 = {
|
|
||||||
// Getters and Setters
|
|
||||||
get_sQ: function () {
|
|
||||||
return this._sQ;
|
|
||||||
},
|
|
||||||
|
|
||||||
get_rQ: function () {
|
|
||||||
return this._rQ;
|
|
||||||
},
|
|
||||||
|
|
||||||
get_rQi: function () {
|
|
||||||
return this._rQi;
|
|
||||||
},
|
|
||||||
|
|
||||||
set_rQi: function (val) {
|
|
||||||
this._rQi = val;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Receive Queue
|
|
||||||
rQlen: function () {
|
|
||||||
return this._rQlen - this._rQi;
|
|
||||||
},
|
|
||||||
|
|
||||||
rQpeek8: function () {
|
|
||||||
return this._rQ[this._rQi];
|
|
||||||
},
|
|
||||||
|
|
||||||
rQshift8: function () {
|
|
||||||
return this._rQ[this._rQi++];
|
|
||||||
},
|
|
||||||
|
|
||||||
rQskip8: function () {
|
|
||||||
this._rQi++;
|
|
||||||
},
|
|
||||||
|
|
||||||
rQskipBytes: function (num) {
|
|
||||||
this._rQi += num;
|
|
||||||
},
|
|
||||||
|
|
||||||
// TODO(directxman12): test performance with these vs a DataView
|
|
||||||
rQshift16: function () {
|
|
||||||
return (this._rQ[this._rQi++] << 8) +
|
|
||||||
this._rQ[this._rQi++];
|
|
||||||
},
|
|
||||||
|
|
||||||
rQshift32: function () {
|
|
||||||
return (this._rQ[this._rQi++] << 24) +
|
|
||||||
(this._rQ[this._rQi++] << 16) +
|
|
||||||
(this._rQ[this._rQi++] << 8) +
|
|
||||||
this._rQ[this._rQi++];
|
|
||||||
},
|
|
||||||
|
|
||||||
rQshiftStr: function (len) {
|
|
||||||
if (typeof(len) === 'undefined') { len = this.rQlen(); }
|
|
||||||
var arr = new Uint8Array(this._rQ.buffer, this._rQi, len);
|
|
||||||
this._rQi += len;
|
|
||||||
return typedArrayToString(arr);
|
|
||||||
},
|
|
||||||
|
|
||||||
rQshiftBytes: function (len) {
|
|
||||||
if (typeof(len) === 'undefined') { len = this.rQlen(); }
|
|
||||||
this._rQi += len;
|
|
||||||
return new Uint8Array(this._rQ.buffer, this._rQi - len, len);
|
|
||||||
},
|
|
||||||
|
|
||||||
rQshiftTo: function (target, len) {
|
|
||||||
if (len === undefined) { len = this.rQlen(); }
|
|
||||||
// TODO: make this just use set with views when using a ArrayBuffer to store the rQ
|
|
||||||
target.set(new Uint8Array(this._rQ.buffer, this._rQi, len));
|
|
||||||
this._rQi += len;
|
|
||||||
},
|
|
||||||
|
|
||||||
rQwhole: function () {
|
|
||||||
return new Uint8Array(this._rQ.buffer, 0, this._rQlen);
|
|
||||||
},
|
|
||||||
|
|
||||||
rQslice: function (start, end) {
|
|
||||||
if (end) {
|
|
||||||
return new Uint8Array(this._rQ.buffer, this._rQi + start, end - start);
|
|
||||||
} else {
|
|
||||||
return new Uint8Array(this._rQ.buffer, this._rQi + start, this._rQlen - this._rQi - start);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// Check to see if we must wait for 'num' bytes (default to FBU.bytes)
|
|
||||||
// to be available in the receive queue. Return true if we need to
|
|
||||||
// wait (and possibly print a debug message), otherwise false.
|
|
||||||
rQwait: function (msg, num, goback) {
|
|
||||||
var rQlen = this._rQlen - this._rQi; // Skip rQlen() function call
|
|
||||||
if (rQlen < num) {
|
|
||||||
if (goback) {
|
|
||||||
if (this._rQi < goback) {
|
|
||||||
throw new Error("rQwait cannot backup " + goback + " bytes");
|
|
||||||
}
|
|
||||||
this._rQi -= goback;
|
|
||||||
}
|
|
||||||
return true; // true means need more data
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Send Queue
|
|
||||||
|
|
||||||
flush: function () {
|
|
||||||
if (this._websocket.bufferedAmount !== 0) {
|
|
||||||
Util.Debug("bufferedAmount: " + this._websocket.bufferedAmount);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._sQlen > 0 && this._websocket.readyState === WebSocket.OPEN) {
|
|
||||||
this._websocket.send(this._encode_message());
|
|
||||||
this._sQlen = 0;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
send: function (arr) {
|
|
||||||
this._sQ.set(arr, this._sQlen);
|
|
||||||
this._sQlen += arr.length;
|
|
||||||
this.flush();
|
|
||||||
},
|
|
||||||
|
|
||||||
send_string: function (str) {
|
|
||||||
this.send(str.split('').map(function (chr) {
|
|
||||||
return chr.charCodeAt(0);
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
// Event Handlers
|
|
||||||
off: function (evt) {
|
|
||||||
this._eventHandlers[evt] = function () {};
|
|
||||||
},
|
|
||||||
|
|
||||||
on: function (evt, handler) {
|
|
||||||
this._eventHandlers[evt] = handler;
|
|
||||||
},
|
|
||||||
|
|
||||||
_allocate_buffers: function () {
|
|
||||||
this._rQ = new Uint8Array(this._rQbufferSize);
|
|
||||||
this._sQ = new Uint8Array(this._sQbufferSize);
|
|
||||||
},
|
|
||||||
|
|
||||||
init: function () {
|
|
||||||
this._allocate_buffers();
|
|
||||||
this._rQi = 0;
|
|
||||||
this._websocket = null;
|
|
||||||
},
|
|
||||||
|
|
||||||
open: function (uri, protocols) {
|
|
||||||
var ws_schema = uri.match(/^([a-z]+):\/\//)[1];
|
|
||||||
this.init();
|
|
||||||
|
|
||||||
this._websocket = new WebSocket(uri, protocols);
|
|
||||||
this._websocket.binaryType = 'arraybuffer';
|
|
||||||
|
|
||||||
this._websocket.onmessage = this._recv_message.bind(this);
|
|
||||||
this._websocket.onopen = (function () {
|
|
||||||
Util.Debug('>> WebSock.onopen');
|
|
||||||
if (this._websocket.protocol) {
|
|
||||||
Util.Info("Server choose sub-protocol: " + this._websocket.protocol);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._eventHandlers.open();
|
|
||||||
Util.Debug("<< WebSock.onopen");
|
|
||||||
}).bind(this);
|
|
||||||
this._websocket.onclose = (function (e) {
|
|
||||||
Util.Debug(">> WebSock.onclose");
|
|
||||||
this._eventHandlers.close(e);
|
|
||||||
Util.Debug("<< WebSock.onclose");
|
|
||||||
}).bind(this);
|
|
||||||
this._websocket.onerror = (function (e) {
|
|
||||||
Util.Debug(">> WebSock.onerror: " + e);
|
|
||||||
this._eventHandlers.error(e);
|
|
||||||
Util.Debug("<< WebSock.onerror: " + e);
|
|
||||||
}).bind(this);
|
|
||||||
},
|
|
||||||
|
|
||||||
close: function () {
|
|
||||||
if (this._websocket) {
|
|
||||||
if ((this._websocket.readyState === WebSocket.OPEN) ||
|
|
||||||
(this._websocket.readyState === WebSocket.CONNECTING)) {
|
|
||||||
Util.Info("Closing WebSocket connection");
|
|
||||||
this._websocket.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
this._websocket.onmessage = function (e) { return; };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// private methods
|
|
||||||
_encode_message: function () {
|
|
||||||
// Put in a binary arraybuffer
|
|
||||||
// according to the spec, you can send ArrayBufferViews with the send method
|
|
||||||
return new Uint8Array(this._sQ.buffer, 0, this._sQlen);
|
|
||||||
},
|
|
||||||
|
|
||||||
_expand_compact_rQ: function (min_fit) {
|
|
||||||
var resizeNeeded = min_fit || this._rQlen - this._rQi > this._rQbufferSize / 2;
|
|
||||||
if (resizeNeeded) {
|
|
||||||
if (!min_fit) {
|
|
||||||
// just double the size if we need to do compaction
|
|
||||||
this._rQbufferSize *= 2;
|
|
||||||
} else {
|
|
||||||
// otherwise, make sure we satisy rQlen - rQi + min_fit < rQbufferSize / 8
|
|
||||||
this._rQbufferSize = (this._rQlen - this._rQi + min_fit) * 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// we don't want to grow unboundedly
|
|
||||||
if (this._rQbufferSize > MAX_RQ_GROW_SIZE) {
|
|
||||||
this._rQbufferSize = MAX_RQ_GROW_SIZE;
|
|
||||||
if (this._rQbufferSize - this._rQlen - this._rQi < min_fit) {
|
|
||||||
throw new Exception("Receive Queue buffer exceeded " + MAX_RQ_GROW_SIZE + " bytes, and the new message could not fit");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (resizeNeeded) {
|
|
||||||
var old_rQbuffer = this._rQ.buffer;
|
|
||||||
this._rQmax = this._rQbufferSize / 8;
|
|
||||||
this._rQ = new Uint8Array(this._rQbufferSize);
|
|
||||||
this._rQ.set(new Uint8Array(old_rQbuffer, this._rQi));
|
|
||||||
} else {
|
|
||||||
if (ENABLE_COPYWITHIN) {
|
|
||||||
this._rQ.copyWithin(0, this._rQi);
|
|
||||||
} else {
|
|
||||||
this._rQ.set(new Uint8Array(this._rQ.buffer, this._rQi));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this._rQlen = this._rQlen - this._rQi;
|
|
||||||
this._rQi = 0;
|
|
||||||
},
|
|
||||||
|
|
||||||
_decode_message: function (data) {
|
|
||||||
// push arraybuffer values onto the end
|
|
||||||
var u8 = new Uint8Array(data);
|
|
||||||
if (u8.length > this._rQbufferSize - this._rQlen) {
|
|
||||||
this._expand_compact_rQ(u8.length);
|
|
||||||
}
|
|
||||||
this._rQ.set(u8, this._rQlen);
|
|
||||||
this._rQlen += u8.length;
|
|
||||||
},
|
|
||||||
|
|
||||||
_recv_message: function (e) {
|
|
||||||
try {
|
|
||||||
this._decode_message(e.data);
|
|
||||||
if (this.rQlen() > 0) {
|
|
||||||
this._eventHandlers.message();
|
|
||||||
// Compact the receive queue
|
|
||||||
if (this._rQlen == this._rQi) {
|
|
||||||
this._rQlen = 0;
|
|
||||||
this._rQi = 0;
|
|
||||||
} else if (this._rQlen > this._rQmax) {
|
|
||||||
this._expand_compact_rQ();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Util.Debug("Ignoring empty message");
|
|
||||||
}
|
|
||||||
} catch (exc) {
|
|
||||||
var exception_str = "";
|
|
||||||
if (exc.name) {
|
|
||||||
exception_str += "\n name: " + exc.name + "\n";
|
|
||||||
exception_str += " message: " + exc.message + "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof exc.description !== 'undefined') {
|
|
||||||
exception_str += " description: " + exc.description + "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof exc.stack !== 'undefined') {
|
|
||||||
exception_str += exc.stack;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (exception_str.length > 0) {
|
|
||||||
Util.Error("recv_message, caught exception: " + exception_str);
|
|
||||||
} else {
|
|
||||||
Util.Error("recv_message, caught exception: " + exc);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof exc.name !== 'undefined') {
|
|
||||||
this._eventHandlers.error(exc.name + ": " + exc.message);
|
|
||||||
} else {
|
|
||||||
this._eventHandlers.error(exc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
|
|
@ -1,202 +0,0 @@
|
||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
Copyright (c) <year>, <copyright holder>
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
||||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
|
||||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
||||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
Copyright (c) <year>, <copyright holder>
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
* Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
* Neither the name of the <organization> nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
||||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
|
||||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
||||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
@ -1,621 +0,0 @@
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The GNU General Public License is a free, copyleft license for
|
|
||||||
software and other kinds of works.
|
|
||||||
|
|
||||||
The licenses for most software and other practical works are designed
|
|
||||||
to take away your freedom to share and change the works. By contrast,
|
|
||||||
the GNU General Public License is intended to guarantee your freedom to
|
|
||||||
share and change all versions of a program--to make sure it remains free
|
|
||||||
software for all its users. We, the Free Software Foundation, use the
|
|
||||||
GNU General Public License for most of our software; it applies also to
|
|
||||||
any other work released this way by its authors. You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
them if you wish), that you receive source code or can get it if you
|
|
||||||
want it, that you can change the software or use pieces of it in new
|
|
||||||
free programs, and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to prevent others from denying you
|
|
||||||
these rights or asking you to surrender the rights. Therefore, you have
|
|
||||||
certain responsibilities if you distribute copies of the software, or if
|
|
||||||
you modify it: responsibilities to respect the freedom of others.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must pass on to the recipients the same
|
|
||||||
freedoms that you received. You must make sure that they, too, receive
|
|
||||||
or can get the source code. And you must show them these terms so they
|
|
||||||
know their rights.
|
|
||||||
|
|
||||||
Developers that use the GNU GPL protect your rights with two steps:
|
|
||||||
(1) assert copyright on the software, and (2) offer you this License
|
|
||||||
giving you legal permission to copy, distribute and/or modify it.
|
|
||||||
|
|
||||||
For the developers' and authors' protection, the GPL clearly explains
|
|
||||||
that there is no warranty for this free software. For both users' and
|
|
||||||
authors' sake, the GPL requires that modified versions be marked as
|
|
||||||
changed, so that their problems will not be attributed erroneously to
|
|
||||||
authors of previous versions.
|
|
||||||
|
|
||||||
Some devices are designed to deny users access to install or run
|
|
||||||
modified versions of the software inside them, although the manufacturer
|
|
||||||
can do so. This is fundamentally incompatible with the aim of
|
|
||||||
protecting users' freedom to change the software. The systematic
|
|
||||||
pattern of such abuse occurs in the area of products for individuals to
|
|
||||||
use, which is precisely where it is most unacceptable. Therefore, we
|
|
||||||
have designed this version of the GPL to prohibit the practice for those
|
|
||||||
products. If such problems arise substantially in other domains, we
|
|
||||||
stand ready to extend this provision to those domains in future versions
|
|
||||||
of the GPL, as needed to protect the freedom of users.
|
|
||||||
|
|
||||||
Finally, every program is threatened constantly by software patents.
|
|
||||||
States should not allow patents to restrict development and use of
|
|
||||||
software on general-purpose computers, but in those that do, we wish to
|
|
||||||
avoid the special danger that patents applied to a free program could
|
|
||||||
make it effectively proprietary. To prevent this, the GPL assures that
|
|
||||||
patents cannot be used to render the program non-free.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
0. Definitions.
|
|
||||||
|
|
||||||
"This License" refers to version 3 of the GNU General Public License.
|
|
||||||
|
|
||||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
|
||||||
works, such as semiconductor masks.
|
|
||||||
|
|
||||||
"The Program" refers to any copyrightable work licensed under this
|
|
||||||
License. Each licensee is addressed as "you". "Licensees" and
|
|
||||||
"recipients" may be individuals or organizations.
|
|
||||||
|
|
||||||
To "modify" a work means to copy from or adapt all or part of the work
|
|
||||||
in a fashion requiring copyright permission, other than the making of an
|
|
||||||
exact copy. The resulting work is called a "modified version" of the
|
|
||||||
earlier work or a work "based on" the earlier work.
|
|
||||||
|
|
||||||
A "covered work" means either the unmodified Program or a work based
|
|
||||||
on the Program.
|
|
||||||
|
|
||||||
To "propagate" a work means to do anything with it that, without
|
|
||||||
permission, would make you directly or secondarily liable for
|
|
||||||
infringement under applicable copyright law, except executing it on a
|
|
||||||
computer or modifying a private copy. Propagation includes copying,
|
|
||||||
distribution (with or without modification), making available to the
|
|
||||||
public, and in some countries other activities as well.
|
|
||||||
|
|
||||||
To "convey" a work means any kind of propagation that enables other
|
|
||||||
parties to make or receive copies. Mere interaction with a user through
|
|
||||||
a computer network, with no transfer of a copy, is not conveying.
|
|
||||||
|
|
||||||
An interactive user interface displays "Appropriate Legal Notices"
|
|
||||||
to the extent that it includes a convenient and prominently visible
|
|
||||||
feature that (1) displays an appropriate copyright notice, and (2)
|
|
||||||
tells the user that there is no warranty for the work (except to the
|
|
||||||
extent that warranties are provided), that licensees may convey the
|
|
||||||
work under this License, and how to view a copy of this License. If
|
|
||||||
the interface presents a list of user commands or options, such as a
|
|
||||||
menu, a prominent item in the list meets this criterion.
|
|
||||||
|
|
||||||
1. Source Code.
|
|
||||||
|
|
||||||
The "source code" for a work means the preferred form of the work
|
|
||||||
for making modifications to it. "Object code" means any non-source
|
|
||||||
form of a work.
|
|
||||||
|
|
||||||
A "Standard Interface" means an interface that either is an official
|
|
||||||
standard defined by a recognized standards body, or, in the case of
|
|
||||||
interfaces specified for a particular programming language, one that
|
|
||||||
is widely used among developers working in that language.
|
|
||||||
|
|
||||||
The "System Libraries" of an executable work include anything, other
|
|
||||||
than the work as a whole, that (a) is included in the normal form of
|
|
||||||
packaging a Major Component, but which is not part of that Major
|
|
||||||
Component, and (b) serves only to enable use of the work with that
|
|
||||||
Major Component, or to implement a Standard Interface for which an
|
|
||||||
implementation is available to the public in source code form. A
|
|
||||||
"Major Component", in this context, means a major essential component
|
|
||||||
(kernel, window system, and so on) of the specific operating system
|
|
||||||
(if any) on which the executable work runs, or a compiler used to
|
|
||||||
produce the work, or an object code interpreter used to run it.
|
|
||||||
|
|
||||||
The "Corresponding Source" for a work in object code form means all
|
|
||||||
the source code needed to generate, install, and (for an executable
|
|
||||||
work) run the object code and to modify the work, including scripts to
|
|
||||||
control those activities. However, it does not include the work's
|
|
||||||
System Libraries, or general-purpose tools or generally available free
|
|
||||||
programs which are used unmodified in performing those activities but
|
|
||||||
which are not part of the work. For example, Corresponding Source
|
|
||||||
includes interface definition files associated with source files for
|
|
||||||
the work, and the source code for shared libraries and dynamically
|
|
||||||
linked subprograms that the work is specifically designed to require,
|
|
||||||
such as by intimate data communication or control flow between those
|
|
||||||
subprograms and other parts of the work.
|
|
||||||
|
|
||||||
The Corresponding Source need not include anything that users
|
|
||||||
can regenerate automatically from other parts of the Corresponding
|
|
||||||
Source.
|
|
||||||
|
|
||||||
The Corresponding Source for a work in source code form is that
|
|
||||||
same work.
|
|
||||||
|
|
||||||
2. Basic Permissions.
|
|
||||||
|
|
||||||
All rights granted under this License are granted for the term of
|
|
||||||
copyright on the Program, and are irrevocable provided the stated
|
|
||||||
conditions are met. This License explicitly affirms your unlimited
|
|
||||||
permission to run the unmodified Program. The output from running a
|
|
||||||
covered work is covered by this License only if the output, given its
|
|
||||||
content, constitutes a covered work. This License acknowledges your
|
|
||||||
rights of fair use or other equivalent, as provided by copyright law.
|
|
||||||
|
|
||||||
You may make, run and propagate covered works that you do not
|
|
||||||
convey, without conditions so long as your license otherwise remains
|
|
||||||
in force. You may convey covered works to others for the sole purpose
|
|
||||||
of having them make modifications exclusively for you, or provide you
|
|
||||||
with facilities for running those works, provided that you comply with
|
|
||||||
the terms of this License in conveying all material for which you do
|
|
||||||
not control copyright. Those thus making or running the covered works
|
|
||||||
for you must do so exclusively on your behalf, under your direction
|
|
||||||
and control, on terms that prohibit them from making any copies of
|
|
||||||
your copyrighted material outside their relationship with you.
|
|
||||||
|
|
||||||
Conveying under any other circumstances is permitted solely under
|
|
||||||
the conditions stated below. Sublicensing is not allowed; section 10
|
|
||||||
makes it unnecessary.
|
|
||||||
|
|
||||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
|
||||||
|
|
||||||
No covered work shall be deemed part of an effective technological
|
|
||||||
measure under any applicable law fulfilling obligations under article
|
|
||||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
|
||||||
similar laws prohibiting or restricting circumvention of such
|
|
||||||
measures.
|
|
||||||
|
|
||||||
When you convey a covered work, you waive any legal power to forbid
|
|
||||||
circumvention of technological measures to the extent such circumvention
|
|
||||||
is effected by exercising rights under this License with respect to
|
|
||||||
the covered work, and you disclaim any intention to limit operation or
|
|
||||||
modification of the work as a means of enforcing, against the work's
|
|
||||||
users, your or third parties' legal rights to forbid circumvention of
|
|
||||||
technological measures.
|
|
||||||
|
|
||||||
4. Conveying Verbatim Copies.
|
|
||||||
|
|
||||||
You may convey verbatim copies of the Program's source code as you
|
|
||||||
receive it, in any medium, provided that you conspicuously and
|
|
||||||
appropriately publish on each copy an appropriate copyright notice;
|
|
||||||
keep intact all notices stating that this License and any
|
|
||||||
non-permissive terms added in accord with section 7 apply to the code;
|
|
||||||
keep intact all notices of the absence of any warranty; and give all
|
|
||||||
recipients a copy of this License along with the Program.
|
|
||||||
|
|
||||||
You may charge any price or no price for each copy that you convey,
|
|
||||||
and you may offer support or warranty protection for a fee.
|
|
||||||
|
|
||||||
5. Conveying Modified Source Versions.
|
|
||||||
|
|
||||||
You may convey a work based on the Program, or the modifications to
|
|
||||||
produce it from the Program, in the form of source code under the
|
|
||||||
terms of section 4, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) The work must carry prominent notices stating that you modified
|
|
||||||
it, and giving a relevant date.
|
|
||||||
|
|
||||||
b) The work must carry prominent notices stating that it is
|
|
||||||
released under this License and any conditions added under section
|
|
||||||
7. This requirement modifies the requirement in section 4 to
|
|
||||||
"keep intact all notices".
|
|
||||||
|
|
||||||
c) You must license the entire work, as a whole, under this
|
|
||||||
License to anyone who comes into possession of a copy. This
|
|
||||||
License will therefore apply, along with any applicable section 7
|
|
||||||
additional terms, to the whole of the work, and all its parts,
|
|
||||||
regardless of how they are packaged. This License gives no
|
|
||||||
permission to license the work in any other way, but it does not
|
|
||||||
invalidate such permission if you have separately received it.
|
|
||||||
|
|
||||||
d) If the work has interactive user interfaces, each must display
|
|
||||||
Appropriate Legal Notices; however, if the Program has interactive
|
|
||||||
interfaces that do not display Appropriate Legal Notices, your
|
|
||||||
work need not make them do so.
|
|
||||||
|
|
||||||
A compilation of a covered work with other separate and independent
|
|
||||||
works, which are not by their nature extensions of the covered work,
|
|
||||||
and which are not combined with it such as to form a larger program,
|
|
||||||
in or on a volume of a storage or distribution medium, is called an
|
|
||||||
"aggregate" if the compilation and its resulting copyright are not
|
|
||||||
used to limit the access or legal rights of the compilation's users
|
|
||||||
beyond what the individual works permit. Inclusion of a covered work
|
|
||||||
in an aggregate does not cause this License to apply to the other
|
|
||||||
parts of the aggregate.
|
|
||||||
|
|
||||||
6. Conveying Non-Source Forms.
|
|
||||||
|
|
||||||
You may convey a covered work in object code form under the terms
|
|
||||||
of sections 4 and 5, provided that you also convey the
|
|
||||||
machine-readable Corresponding Source under the terms of this License,
|
|
||||||
in one of these ways:
|
|
||||||
|
|
||||||
a) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by the
|
|
||||||
Corresponding Source fixed on a durable physical medium
|
|
||||||
customarily used for software interchange.
|
|
||||||
|
|
||||||
b) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by a
|
|
||||||
written offer, valid for at least three years and valid for as
|
|
||||||
long as you offer spare parts or customer support for that product
|
|
||||||
model, to give anyone who possesses the object code either (1) a
|
|
||||||
copy of the Corresponding Source for all the software in the
|
|
||||||
product that is covered by this License, on a durable physical
|
|
||||||
medium customarily used for software interchange, for a price no
|
|
||||||
more than your reasonable cost of physically performing this
|
|
||||||
conveying of source, or (2) access to copy the
|
|
||||||
Corresponding Source from a network server at no charge.
|
|
||||||
|
|
||||||
c) Convey individual copies of the object code with a copy of the
|
|
||||||
written offer to provide the Corresponding Source. This
|
|
||||||
alternative is allowed only occasionally and noncommercially, and
|
|
||||||
only if you received the object code with such an offer, in accord
|
|
||||||
with subsection 6b.
|
|
||||||
|
|
||||||
d) Convey the object code by offering access from a designated
|
|
||||||
place (gratis or for a charge), and offer equivalent access to the
|
|
||||||
Corresponding Source in the same way through the same place at no
|
|
||||||
further charge. You need not require recipients to copy the
|
|
||||||
Corresponding Source along with the object code. If the place to
|
|
||||||
copy the object code is a network server, the Corresponding Source
|
|
||||||
may be on a different server (operated by you or a third party)
|
|
||||||
that supports equivalent copying facilities, provided you maintain
|
|
||||||
clear directions next to the object code saying where to find the
|
|
||||||
Corresponding Source. Regardless of what server hosts the
|
|
||||||
Corresponding Source, you remain obligated to ensure that it is
|
|
||||||
available for as long as needed to satisfy these requirements.
|
|
||||||
|
|
||||||
e) Convey the object code using peer-to-peer transmission, provided
|
|
||||||
you inform other peers where the object code and Corresponding
|
|
||||||
Source of the work are being offered to the general public at no
|
|
||||||
charge under subsection 6d.
|
|
||||||
|
|
||||||
A separable portion of the object code, whose source code is excluded
|
|
||||||
from the Corresponding Source as a System Library, need not be
|
|
||||||
included in conveying the object code work.
|
|
||||||
|
|
||||||
A "User Product" is either (1) a "consumer product", which means any
|
|
||||||
tangible personal property which is normally used for personal, family,
|
|
||||||
or household purposes, or (2) anything designed or sold for incorporation
|
|
||||||
into a dwelling. In determining whether a product is a consumer product,
|
|
||||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
|
||||||
product received by a particular user, "normally used" refers to a
|
|
||||||
typical or common use of that class of product, regardless of the status
|
|
||||||
of the particular user or of the way in which the particular user
|
|
||||||
actually uses, or expects or is expected to use, the product. A product
|
|
||||||
is a consumer product regardless of whether the product has substantial
|
|
||||||
commercial, industrial or non-consumer uses, unless such uses represent
|
|
||||||
the only significant mode of use of the product.
|
|
||||||
|
|
||||||
"Installation Information" for a User Product means any methods,
|
|
||||||
procedures, authorization keys, or other information required to install
|
|
||||||
and execute modified versions of a covered work in that User Product from
|
|
||||||
a modified version of its Corresponding Source. The information must
|
|
||||||
suffice to ensure that the continued functioning of the modified object
|
|
||||||
code is in no case prevented or interfered with solely because
|
|
||||||
modification has been made.
|
|
||||||
|
|
||||||
If you convey an object code work under this section in, or with, or
|
|
||||||
specifically for use in, a User Product, and the conveying occurs as
|
|
||||||
part of a transaction in which the right of possession and use of the
|
|
||||||
User Product is transferred to the recipient in perpetuity or for a
|
|
||||||
fixed term (regardless of how the transaction is characterized), the
|
|
||||||
Corresponding Source conveyed under this section must be accompanied
|
|
||||||
by the Installation Information. But this requirement does not apply
|
|
||||||
if neither you nor any third party retains the ability to install
|
|
||||||
modified object code on the User Product (for example, the work has
|
|
||||||
been installed in ROM).
|
|
||||||
|
|
||||||
The requirement to provide Installation Information does not include a
|
|
||||||
requirement to continue to provide support service, warranty, or updates
|
|
||||||
for a work that has been modified or installed by the recipient, or for
|
|
||||||
the User Product in which it has been modified or installed. Access to a
|
|
||||||
network may be denied when the modification itself materially and
|
|
||||||
adversely affects the operation of the network or violates the rules and
|
|
||||||
protocols for communication across the network.
|
|
||||||
|
|
||||||
Corresponding Source conveyed, and Installation Information provided,
|
|
||||||
in accord with this section must be in a format that is publicly
|
|
||||||
documented (and with an implementation available to the public in
|
|
||||||
source code form), and must require no special password or key for
|
|
||||||
unpacking, reading or copying.
|
|
||||||
|
|
||||||
7. Additional Terms.
|
|
||||||
|
|
||||||
"Additional permissions" are terms that supplement the terms of this
|
|
||||||
License by making exceptions from one or more of its conditions.
|
|
||||||
Additional permissions that are applicable to the entire Program shall
|
|
||||||
be treated as though they were included in this License, to the extent
|
|
||||||
that they are valid under applicable law. If additional permissions
|
|
||||||
apply only to part of the Program, that part may be used separately
|
|
||||||
under those permissions, but the entire Program remains governed by
|
|
||||||
this License without regard to the additional permissions.
|
|
||||||
|
|
||||||
When you convey a copy of a covered work, you may at your option
|
|
||||||
remove any additional permissions from that copy, or from any part of
|
|
||||||
it. (Additional permissions may be written to require their own
|
|
||||||
removal in certain cases when you modify the work.) You may place
|
|
||||||
additional permissions on material, added by you to a covered work,
|
|
||||||
for which you have or can give appropriate copyright permission.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, for material you
|
|
||||||
add to a covered work, you may (if authorized by the copyright holders of
|
|
||||||
that material) supplement the terms of this License with terms:
|
|
||||||
|
|
||||||
a) Disclaiming warranty or limiting liability differently from the
|
|
||||||
terms of sections 15 and 16 of this License; or
|
|
||||||
|
|
||||||
b) Requiring preservation of specified reasonable legal notices or
|
|
||||||
author attributions in that material or in the Appropriate Legal
|
|
||||||
Notices displayed by works containing it; or
|
|
||||||
|
|
||||||
c) Prohibiting misrepresentation of the origin of that material, or
|
|
||||||
requiring that modified versions of such material be marked in
|
|
||||||
reasonable ways as different from the original version; or
|
|
||||||
|
|
||||||
d) Limiting the use for publicity purposes of names of licensors or
|
|
||||||
authors of the material; or
|
|
||||||
|
|
||||||
e) Declining to grant rights under trademark law for use of some
|
|
||||||
trade names, trademarks, or service marks; or
|
|
||||||
|
|
||||||
f) Requiring indemnification of licensors and authors of that
|
|
||||||
material by anyone who conveys the material (or modified versions of
|
|
||||||
it) with contractual assumptions of liability to the recipient, for
|
|
||||||
any liability that these contractual assumptions directly impose on
|
|
||||||
those licensors and authors.
|
|
||||||
|
|
||||||
All other non-permissive additional terms are considered "further
|
|
||||||
restrictions" within the meaning of section 10. If the Program as you
|
|
||||||
received it, or any part of it, contains a notice stating that it is
|
|
||||||
governed by this License along with a term that is a further
|
|
||||||
restriction, you may remove that term. If a license document contains
|
|
||||||
a further restriction but permits relicensing or conveying under this
|
|
||||||
License, you may add to a covered work material governed by the terms
|
|
||||||
of that license document, provided that the further restriction does
|
|
||||||
not survive such relicensing or conveying.
|
|
||||||
|
|
||||||
If you add terms to a covered work in accord with this section, you
|
|
||||||
must place, in the relevant source files, a statement of the
|
|
||||||
additional terms that apply to those files, or a notice indicating
|
|
||||||
where to find the applicable terms.
|
|
||||||
|
|
||||||
Additional terms, permissive or non-permissive, may be stated in the
|
|
||||||
form of a separately written license, or stated as exceptions;
|
|
||||||
the above requirements apply either way.
|
|
||||||
|
|
||||||
8. Termination.
|
|
||||||
|
|
||||||
You may not propagate or modify a covered work except as expressly
|
|
||||||
provided under this License. Any attempt otherwise to propagate or
|
|
||||||
modify it is void, and will automatically terminate your rights under
|
|
||||||
this License (including any patent licenses granted under the third
|
|
||||||
paragraph of section 11).
|
|
||||||
|
|
||||||
However, if you cease all violation of this License, then your
|
|
||||||
license from a particular copyright holder is reinstated (a)
|
|
||||||
provisionally, unless and until the copyright holder explicitly and
|
|
||||||
finally terminates your license, and (b) permanently, if the copyright
|
|
||||||
holder fails to notify you of the violation by some reasonable means
|
|
||||||
prior to 60 days after the cessation.
|
|
||||||
|
|
||||||
Moreover, your license from a particular copyright holder is
|
|
||||||
reinstated permanently if the copyright holder notifies you of the
|
|
||||||
violation by some reasonable means, this is the first time you have
|
|
||||||
received notice of violation of this License (for any work) from that
|
|
||||||
copyright holder, and you cure the violation prior to 30 days after
|
|
||||||
your receipt of the notice.
|
|
||||||
|
|
||||||
Termination of your rights under this section does not terminate the
|
|
||||||
licenses of parties who have received copies or rights from you under
|
|
||||||
this License. If your rights have been terminated and not permanently
|
|
||||||
reinstated, you do not qualify to receive new licenses for the same
|
|
||||||
material under section 10.
|
|
||||||
|
|
||||||
9. Acceptance Not Required for Having Copies.
|
|
||||||
|
|
||||||
You are not required to accept this License in order to receive or
|
|
||||||
run a copy of the Program. Ancillary propagation of a covered work
|
|
||||||
occurring solely as a consequence of using peer-to-peer transmission
|
|
||||||
to receive a copy likewise does not require acceptance. However,
|
|
||||||
nothing other than this License grants you permission to propagate or
|
|
||||||
modify any covered work. These actions infringe copyright if you do
|
|
||||||
not accept this License. Therefore, by modifying or propagating a
|
|
||||||
covered work, you indicate your acceptance of this License to do so.
|
|
||||||
|
|
||||||
10. Automatic Licensing of Downstream Recipients.
|
|
||||||
|
|
||||||
Each time you convey a covered work, the recipient automatically
|
|
||||||
receives a license from the original licensors, to run, modify and
|
|
||||||
propagate that work, subject to this License. You are not responsible
|
|
||||||
for enforcing compliance by third parties with this License.
|
|
||||||
|
|
||||||
An "entity transaction" is a transaction transferring control of an
|
|
||||||
organization, or substantially all assets of one, or subdividing an
|
|
||||||
organization, or merging organizations. If propagation of a covered
|
|
||||||
work results from an entity transaction, each party to that
|
|
||||||
transaction who receives a copy of the work also receives whatever
|
|
||||||
licenses to the work the party's predecessor in interest had or could
|
|
||||||
give under the previous paragraph, plus a right to possession of the
|
|
||||||
Corresponding Source of the work from the predecessor in interest, if
|
|
||||||
the predecessor has it or can get it with reasonable efforts.
|
|
||||||
|
|
||||||
You may not impose any further restrictions on the exercise of the
|
|
||||||
rights granted or affirmed under this License. For example, you may
|
|
||||||
not impose a license fee, royalty, or other charge for exercise of
|
|
||||||
rights granted under this License, and you may not initiate litigation
|
|
||||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
|
||||||
any patent claim is infringed by making, using, selling, offering for
|
|
||||||
sale, or importing the Program or any portion of it.
|
|
||||||
|
|
||||||
11. Patents.
|
|
||||||
|
|
||||||
A "contributor" is a copyright holder who authorizes use under this
|
|
||||||
License of the Program or a work on which the Program is based. The
|
|
||||||
work thus licensed is called the contributor's "contributor version".
|
|
||||||
|
|
||||||
A contributor's "essential patent claims" are all patent claims
|
|
||||||
owned or controlled by the contributor, whether already acquired or
|
|
||||||
hereafter acquired, that would be infringed by some manner, permitted
|
|
||||||
by this License, of making, using, or selling its contributor version,
|
|
||||||
but do not include claims that would be infringed only as a
|
|
||||||
consequence of further modification of the contributor version. For
|
|
||||||
purposes of this definition, "control" includes the right to grant
|
|
||||||
patent sublicenses in a manner consistent with the requirements of
|
|
||||||
this License.
|
|
||||||
|
|
||||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
|
||||||
patent license under the contributor's essential patent claims, to
|
|
||||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
|
||||||
propagate the contents of its contributor version.
|
|
||||||
|
|
||||||
In the following three paragraphs, a "patent license" is any express
|
|
||||||
agreement or commitment, however denominated, not to enforce a patent
|
|
||||||
(such as an express permission to practice a patent or covenant not to
|
|
||||||
sue for patent infringement). To "grant" such a patent license to a
|
|
||||||
party means to make such an agreement or commitment not to enforce a
|
|
||||||
patent against the party.
|
|
||||||
|
|
||||||
If you convey a covered work, knowingly relying on a patent license,
|
|
||||||
and the Corresponding Source of the work is not available for anyone
|
|
||||||
to copy, free of charge and under the terms of this License, through a
|
|
||||||
publicly available network server or other readily accessible means,
|
|
||||||
then you must either (1) cause the Corresponding Source to be so
|
|
||||||
available, or (2) arrange to deprive yourself of the benefit of the
|
|
||||||
patent license for this particular work, or (3) arrange, in a manner
|
|
||||||
consistent with the requirements of this License, to extend the patent
|
|
||||||
license to downstream recipients. "Knowingly relying" means you have
|
|
||||||
actual knowledge that, but for the patent license, your conveying the
|
|
||||||
covered work in a country, or your recipient's use of the covered work
|
|
||||||
in a country, would infringe one or more identifiable patents in that
|
|
||||||
country that you have reason to believe are valid.
|
|
||||||
|
|
||||||
If, pursuant to or in connection with a single transaction or
|
|
||||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
|
||||||
covered work, and grant a patent license to some of the parties
|
|
||||||
receiving the covered work authorizing them to use, propagate, modify
|
|
||||||
or convey a specific copy of the covered work, then the patent license
|
|
||||||
you grant is automatically extended to all recipients of the covered
|
|
||||||
work and works based on it.
|
|
||||||
|
|
||||||
A patent license is "discriminatory" if it does not include within
|
|
||||||
the scope of its coverage, prohibits the exercise of, or is
|
|
||||||
conditioned on the non-exercise of one or more of the rights that are
|
|
||||||
specifically granted under this License. You may not convey a covered
|
|
||||||
work if you are a party to an arrangement with a third party that is
|
|
||||||
in the business of distributing software, under which you make payment
|
|
||||||
to the third party based on the extent of your activity of conveying
|
|
||||||
the work, and under which the third party grants, to any of the
|
|
||||||
parties who would receive the covered work from you, a discriminatory
|
|
||||||
patent license (a) in connection with copies of the covered work
|
|
||||||
conveyed by you (or copies made from those copies), or (b) primarily
|
|
||||||
for and in connection with specific products or compilations that
|
|
||||||
contain the covered work, unless you entered into that arrangement,
|
|
||||||
or that patent license was granted, prior to 28 March 2007.
|
|
||||||
|
|
||||||
Nothing in this License shall be construed as excluding or limiting
|
|
||||||
any implied license or other defenses to infringement that may
|
|
||||||
otherwise be available to you under applicable patent law.
|
|
||||||
|
|
||||||
12. No Surrender of Others' Freedom.
|
|
||||||
|
|
||||||
If conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot convey a
|
|
||||||
covered work so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you may
|
|
||||||
not convey it at all. For example, if you agree to terms that obligate you
|
|
||||||
to collect a royalty for further conveying from those to whom you convey
|
|
||||||
the Program, the only way you could satisfy both those terms and this
|
|
||||||
License would be to refrain entirely from conveying the Program.
|
|
||||||
|
|
||||||
13. Use with the GNU Affero General Public License.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, you have
|
|
||||||
permission to link or combine any covered work with a work licensed
|
|
||||||
under version 3 of the GNU Affero General Public License into a single
|
|
||||||
combined work, and to convey the resulting work. The terms of this
|
|
||||||
License will continue to apply to the part which is the covered work,
|
|
||||||
but the special requirements of the GNU Affero General Public License,
|
|
||||||
section 13, concerning interaction through a network will apply to the
|
|
||||||
combination as such.
|
|
||||||
|
|
||||||
14. Revised Versions of this License.
|
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions of
|
|
||||||
the GNU General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the
|
|
||||||
Program specifies that a certain numbered version of the GNU General
|
|
||||||
Public License "or any later version" applies to it, you have the
|
|
||||||
option of following the terms and conditions either of that numbered
|
|
||||||
version or of any later version published by the Free Software
|
|
||||||
Foundation. If the Program does not specify a version number of the
|
|
||||||
GNU General Public License, you may choose any version ever published
|
|
||||||
by the Free Software Foundation.
|
|
||||||
|
|
||||||
If the Program specifies that a proxy can decide which future
|
|
||||||
versions of the GNU General Public License can be used, that proxy's
|
|
||||||
public statement of acceptance of a version permanently authorizes you
|
|
||||||
to choose that version for the Program.
|
|
||||||
|
|
||||||
Later license versions may give you additional or different
|
|
||||||
permissions. However, no additional obligations are imposed on any
|
|
||||||
author or copyright holder as a result of your choosing to follow a
|
|
||||||
later version.
|
|
||||||
|
|
||||||
15. Disclaimer of Warranty.
|
|
||||||
|
|
||||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
|
||||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
|
||||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
|
||||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
|
||||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
|
||||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
16. Limitation of Liability.
|
|
||||||
|
|
||||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
|
||||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
|
||||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
|
||||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
|
||||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
|
||||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
|
||||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGES.
|
|
||||||
|
|
||||||
17. Interpretation of Sections 15 and 16.
|
|
||||||
|
|
||||||
If the disclaimer of warranty and limitation of liability provided
|
|
||||||
above cannot be given local legal effect according to their terms,
|
|
||||||
reviewing courts shall apply local law that most closely approximates
|
|
||||||
an absolute waiver of all civil liability in connection with the
|
|
||||||
Program, unless a warranty or assumption of liability accompanies a
|
|
||||||
copy of the Program in return for a fee.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
@ -1,165 +0,0 @@
|
||||||
GNU LESSER GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
|
|
||||||
This version of the GNU Lesser General Public License incorporates
|
|
||||||
the terms and conditions of version 3 of the GNU General Public
|
|
||||||
License, supplemented by the additional permissions listed below.
|
|
||||||
|
|
||||||
0. Additional Definitions.
|
|
||||||
|
|
||||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
|
||||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
|
||||||
General Public License.
|
|
||||||
|
|
||||||
"The Library" refers to a covered work governed by this License,
|
|
||||||
other than an Application or a Combined Work as defined below.
|
|
||||||
|
|
||||||
An "Application" is any work that makes use of an interface provided
|
|
||||||
by the Library, but which is not otherwise based on the Library.
|
|
||||||
Defining a subclass of a class defined by the Library is deemed a mode
|
|
||||||
of using an interface provided by the Library.
|
|
||||||
|
|
||||||
A "Combined Work" is a work produced by combining or linking an
|
|
||||||
Application with the Library. The particular version of the Library
|
|
||||||
with which the Combined Work was made is also called the "Linked
|
|
||||||
Version".
|
|
||||||
|
|
||||||
The "Minimal Corresponding Source" for a Combined Work means the
|
|
||||||
Corresponding Source for the Combined Work, excluding any source code
|
|
||||||
for portions of the Combined Work that, considered in isolation, are
|
|
||||||
based on the Application, and not on the Linked Version.
|
|
||||||
|
|
||||||
The "Corresponding Application Code" for a Combined Work means the
|
|
||||||
object code and/or source code for the Application, including any data
|
|
||||||
and utility programs needed for reproducing the Combined Work from the
|
|
||||||
Application, but excluding the System Libraries of the Combined Work.
|
|
||||||
|
|
||||||
1. Exception to Section 3 of the GNU GPL.
|
|
||||||
|
|
||||||
You may convey a covered work under sections 3 and 4 of this License
|
|
||||||
without being bound by section 3 of the GNU GPL.
|
|
||||||
|
|
||||||
2. Conveying Modified Versions.
|
|
||||||
|
|
||||||
If you modify a copy of the Library, and, in your modifications, a
|
|
||||||
facility refers to a function or data to be supplied by an Application
|
|
||||||
that uses the facility (other than as an argument passed when the
|
|
||||||
facility is invoked), then you may convey a copy of the modified
|
|
||||||
version:
|
|
||||||
|
|
||||||
a) under this License, provided that you make a good faith effort to
|
|
||||||
ensure that, in the event an Application does not supply the
|
|
||||||
function or data, the facility still operates, and performs
|
|
||||||
whatever part of its purpose remains meaningful, or
|
|
||||||
|
|
||||||
b) under the GNU GPL, with none of the additional permissions of
|
|
||||||
this License applicable to that copy.
|
|
||||||
|
|
||||||
3. Object Code Incorporating Material from Library Header Files.
|
|
||||||
|
|
||||||
The object code form of an Application may incorporate material from
|
|
||||||
a header file that is part of the Library. You may convey such object
|
|
||||||
code under terms of your choice, provided that, if the incorporated
|
|
||||||
material is not limited to numerical parameters, data structure
|
|
||||||
layouts and accessors, or small macros, inline functions and templates
|
|
||||||
(ten or fewer lines in length), you do both of the following:
|
|
||||||
|
|
||||||
a) Give prominent notice with each copy of the object code that the
|
|
||||||
Library is used in it and that the Library and its use are
|
|
||||||
covered by this License.
|
|
||||||
|
|
||||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
|
||||||
document.
|
|
||||||
|
|
||||||
4. Combined Works.
|
|
||||||
|
|
||||||
You may convey a Combined Work under terms of your choice that,
|
|
||||||
taken together, effectively do not restrict modification of the
|
|
||||||
portions of the Library contained in the Combined Work and reverse
|
|
||||||
engineering for debugging such modifications, if you also do each of
|
|
||||||
the following:
|
|
||||||
|
|
||||||
a) Give prominent notice with each copy of the Combined Work that
|
|
||||||
the Library is used in it and that the Library and its use are
|
|
||||||
covered by this License.
|
|
||||||
|
|
||||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
|
||||||
document.
|
|
||||||
|
|
||||||
c) For a Combined Work that displays copyright notices during
|
|
||||||
execution, include the copyright notice for the Library among
|
|
||||||
these notices, as well as a reference directing the user to the
|
|
||||||
copies of the GNU GPL and this license document.
|
|
||||||
|
|
||||||
d) Do one of the following:
|
|
||||||
|
|
||||||
0) Convey the Minimal Corresponding Source under the terms of this
|
|
||||||
License, and the Corresponding Application Code in a form
|
|
||||||
suitable for, and under terms that permit, the user to
|
|
||||||
recombine or relink the Application with a modified version of
|
|
||||||
the Linked Version to produce a modified Combined Work, in the
|
|
||||||
manner specified by section 6 of the GNU GPL for conveying
|
|
||||||
Corresponding Source.
|
|
||||||
|
|
||||||
1) Use a suitable shared library mechanism for linking with the
|
|
||||||
Library. A suitable mechanism is one that (a) uses at run time
|
|
||||||
a copy of the Library already present on the user's computer
|
|
||||||
system, and (b) will operate properly with a modified version
|
|
||||||
of the Library that is interface-compatible with the Linked
|
|
||||||
Version.
|
|
||||||
|
|
||||||
e) Provide Installation Information, but only if you would otherwise
|
|
||||||
be required to provide such information under section 6 of the
|
|
||||||
GNU GPL, and only to the extent that such information is
|
|
||||||
necessary to install and execute a modified version of the
|
|
||||||
Combined Work produced by recombining or relinking the
|
|
||||||
Application with a modified version of the Linked Version. (If
|
|
||||||
you use option 4d0, the Installation Information must accompany
|
|
||||||
the Minimal Corresponding Source and Corresponding Application
|
|
||||||
Code. If you use option 4d1, you must provide the Installation
|
|
||||||
Information in the manner specified by section 6 of the GNU GPL
|
|
||||||
for conveying Corresponding Source.)
|
|
||||||
|
|
||||||
5. Combined Libraries.
|
|
||||||
|
|
||||||
You may place library facilities that are a work based on the
|
|
||||||
Library side by side in a single library together with other library
|
|
||||||
facilities that are not Applications and are not covered by this
|
|
||||||
License, and convey such a combined library under terms of your
|
|
||||||
choice, if you do both of the following:
|
|
||||||
|
|
||||||
a) Accompany the combined library with a copy of the same work based
|
|
||||||
on the Library, uncombined with any other library facilities,
|
|
||||||
conveyed under the terms of this License.
|
|
||||||
|
|
||||||
b) Give prominent notice with the combined library that part of it
|
|
||||||
is a work based on the Library, and explaining where to find the
|
|
||||||
accompanying uncombined form of the same work.
|
|
||||||
|
|
||||||
6. Revised Versions of the GNU Lesser General Public License.
|
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the GNU Lesser General Public License from time to time. Such new
|
|
||||||
versions will be similar in spirit to the present version, but may
|
|
||||||
differ in detail to address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the
|
|
||||||
Library as you received it specifies that a certain numbered version
|
|
||||||
of the GNU Lesser General Public License "or any later version"
|
|
||||||
applies to it, you have the option of following the terms and
|
|
||||||
conditions either of that published version or of any later version
|
|
||||||
published by the Free Software Foundation. If the Library as you
|
|
||||||
received it does not specify a version number of the GNU Lesser
|
|
||||||
General Public License, you may choose any version of the GNU Lesser
|
|
||||||
General Public License ever published by the Free Software Foundation.
|
|
||||||
|
|
||||||
If the Library as you received it specifies that a proxy can decide
|
|
||||||
whether future versions of the GNU Lesser General Public License shall
|
|
||||||
apply, that proxy's public statement of acceptance of any version is
|
|
||||||
permanent authorization for you to choose that version for the
|
|
||||||
Library.
|
|
||||||
|
|
@ -1,373 +0,0 @@
|
||||||
Mozilla Public License Version 2.0
|
|
||||||
==================================
|
|
||||||
|
|
||||||
1. Definitions
|
|
||||||
--------------
|
|
||||||
|
|
||||||
1.1. "Contributor"
|
|
||||||
means each individual or legal entity that creates, contributes to
|
|
||||||
the creation of, or owns Covered Software.
|
|
||||||
|
|
||||||
1.2. "Contributor Version"
|
|
||||||
means the combination of the Contributions of others (if any) used
|
|
||||||
by a Contributor and that particular Contributor's Contribution.
|
|
||||||
|
|
||||||
1.3. "Contribution"
|
|
||||||
means Covered Software of a particular Contributor.
|
|
||||||
|
|
||||||
1.4. "Covered Software"
|
|
||||||
means Source Code Form to which the initial Contributor has attached
|
|
||||||
the notice in Exhibit A, the Executable Form of such Source Code
|
|
||||||
Form, and Modifications of such Source Code Form, in each case
|
|
||||||
including portions thereof.
|
|
||||||
|
|
||||||
1.5. "Incompatible With Secondary Licenses"
|
|
||||||
means
|
|
||||||
|
|
||||||
(a) that the initial Contributor has attached the notice described
|
|
||||||
in Exhibit B to the Covered Software; or
|
|
||||||
|
|
||||||
(b) that the Covered Software was made available under the terms of
|
|
||||||
version 1.1 or earlier of the License, but not also under the
|
|
||||||
terms of a Secondary License.
|
|
||||||
|
|
||||||
1.6. "Executable Form"
|
|
||||||
means any form of the work other than Source Code Form.
|
|
||||||
|
|
||||||
1.7. "Larger Work"
|
|
||||||
means a work that combines Covered Software with other material, in
|
|
||||||
a separate file or files, that is not Covered Software.
|
|
||||||
|
|
||||||
1.8. "License"
|
|
||||||
means this document.
|
|
||||||
|
|
||||||
1.9. "Licensable"
|
|
||||||
means having the right to grant, to the maximum extent possible,
|
|
||||||
whether at the time of the initial grant or subsequently, any and
|
|
||||||
all of the rights conveyed by this License.
|
|
||||||
|
|
||||||
1.10. "Modifications"
|
|
||||||
means any of the following:
|
|
||||||
|
|
||||||
(a) any file in Source Code Form that results from an addition to,
|
|
||||||
deletion from, or modification of the contents of Covered
|
|
||||||
Software; or
|
|
||||||
|
|
||||||
(b) any new file in Source Code Form that contains any Covered
|
|
||||||
Software.
|
|
||||||
|
|
||||||
1.11. "Patent Claims" of a Contributor
|
|
||||||
means any patent claim(s), including without limitation, method,
|
|
||||||
process, and apparatus claims, in any patent Licensable by such
|
|
||||||
Contributor that would be infringed, but for the grant of the
|
|
||||||
License, by the making, using, selling, offering for sale, having
|
|
||||||
made, import, or transfer of either its Contributions or its
|
|
||||||
Contributor Version.
|
|
||||||
|
|
||||||
1.12. "Secondary License"
|
|
||||||
means either the GNU General Public License, Version 2.0, the GNU
|
|
||||||
Lesser General Public License, Version 2.1, the GNU Affero General
|
|
||||||
Public License, Version 3.0, or any later versions of those
|
|
||||||
licenses.
|
|
||||||
|
|
||||||
1.13. "Source Code Form"
|
|
||||||
means the form of the work preferred for making modifications.
|
|
||||||
|
|
||||||
1.14. "You" (or "Your")
|
|
||||||
means an individual or a legal entity exercising rights under this
|
|
||||||
License. For legal entities, "You" includes any entity that
|
|
||||||
controls, is controlled by, or is under common control with You. For
|
|
||||||
purposes of this definition, "control" means (a) the power, direct
|
|
||||||
or indirect, to cause the direction or management of such entity,
|
|
||||||
whether by contract or otherwise, or (b) ownership of more than
|
|
||||||
fifty percent (50%) of the outstanding shares or beneficial
|
|
||||||
ownership of such entity.
|
|
||||||
|
|
||||||
2. License Grants and Conditions
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
2.1. Grants
|
|
||||||
|
|
||||||
Each Contributor hereby grants You a world-wide, royalty-free,
|
|
||||||
non-exclusive license:
|
|
||||||
|
|
||||||
(a) under intellectual property rights (other than patent or trademark)
|
|
||||||
Licensable by such Contributor to use, reproduce, make available,
|
|
||||||
modify, display, perform, distribute, and otherwise exploit its
|
|
||||||
Contributions, either on an unmodified basis, with Modifications, or
|
|
||||||
as part of a Larger Work; and
|
|
||||||
|
|
||||||
(b) under Patent Claims of such Contributor to make, use, sell, offer
|
|
||||||
for sale, have made, import, and otherwise transfer either its
|
|
||||||
Contributions or its Contributor Version.
|
|
||||||
|
|
||||||
2.2. Effective Date
|
|
||||||
|
|
||||||
The licenses granted in Section 2.1 with respect to any Contribution
|
|
||||||
become effective for each Contribution on the date the Contributor first
|
|
||||||
distributes such Contribution.
|
|
||||||
|
|
||||||
2.3. Limitations on Grant Scope
|
|
||||||
|
|
||||||
The licenses granted in this Section 2 are the only rights granted under
|
|
||||||
this License. No additional rights or licenses will be implied from the
|
|
||||||
distribution or licensing of Covered Software under this License.
|
|
||||||
Notwithstanding Section 2.1(b) above, no patent license is granted by a
|
|
||||||
Contributor:
|
|
||||||
|
|
||||||
(a) for any code that a Contributor has removed from Covered Software;
|
|
||||||
or
|
|
||||||
|
|
||||||
(b) for infringements caused by: (i) Your and any other third party's
|
|
||||||
modifications of Covered Software, or (ii) the combination of its
|
|
||||||
Contributions with other software (except as part of its Contributor
|
|
||||||
Version); or
|
|
||||||
|
|
||||||
(c) under Patent Claims infringed by Covered Software in the absence of
|
|
||||||
its Contributions.
|
|
||||||
|
|
||||||
This License does not grant any rights in the trademarks, service marks,
|
|
||||||
or logos of any Contributor (except as may be necessary to comply with
|
|
||||||
the notice requirements in Section 3.4).
|
|
||||||
|
|
||||||
2.4. Subsequent Licenses
|
|
||||||
|
|
||||||
No Contributor makes additional grants as a result of Your choice to
|
|
||||||
distribute the Covered Software under a subsequent version of this
|
|
||||||
License (see Section 10.2) or under the terms of a Secondary License (if
|
|
||||||
permitted under the terms of Section 3.3).
|
|
||||||
|
|
||||||
2.5. Representation
|
|
||||||
|
|
||||||
Each Contributor represents that the Contributor believes its
|
|
||||||
Contributions are its original creation(s) or it has sufficient rights
|
|
||||||
to grant the rights to its Contributions conveyed by this License.
|
|
||||||
|
|
||||||
2.6. Fair Use
|
|
||||||
|
|
||||||
This License is not intended to limit any rights You have under
|
|
||||||
applicable copyright doctrines of fair use, fair dealing, or other
|
|
||||||
equivalents.
|
|
||||||
|
|
||||||
2.7. Conditions
|
|
||||||
|
|
||||||
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
|
|
||||||
in Section 2.1.
|
|
||||||
|
|
||||||
3. Responsibilities
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
3.1. Distribution of Source Form
|
|
||||||
|
|
||||||
All distribution of Covered Software in Source Code Form, including any
|
|
||||||
Modifications that You create or to which You contribute, must be under
|
|
||||||
the terms of this License. You must inform recipients that the Source
|
|
||||||
Code Form of the Covered Software is governed by the terms of this
|
|
||||||
License, and how they can obtain a copy of this License. You may not
|
|
||||||
attempt to alter or restrict the recipients' rights in the Source Code
|
|
||||||
Form.
|
|
||||||
|
|
||||||
3.2. Distribution of Executable Form
|
|
||||||
|
|
||||||
If You distribute Covered Software in Executable Form then:
|
|
||||||
|
|
||||||
(a) such Covered Software must also be made available in Source Code
|
|
||||||
Form, as described in Section 3.1, and You must inform recipients of
|
|
||||||
the Executable Form how they can obtain a copy of such Source Code
|
|
||||||
Form by reasonable means in a timely manner, at a charge no more
|
|
||||||
than the cost of distribution to the recipient; and
|
|
||||||
|
|
||||||
(b) You may distribute such Executable Form under the terms of this
|
|
||||||
License, or sublicense it under different terms, provided that the
|
|
||||||
license for the Executable Form does not attempt to limit or alter
|
|
||||||
the recipients' rights in the Source Code Form under this License.
|
|
||||||
|
|
||||||
3.3. Distribution of a Larger Work
|
|
||||||
|
|
||||||
You may create and distribute a Larger Work under terms of Your choice,
|
|
||||||
provided that You also comply with the requirements of this License for
|
|
||||||
the Covered Software. If the Larger Work is a combination of Covered
|
|
||||||
Software with a work governed by one or more Secondary Licenses, and the
|
|
||||||
Covered Software is not Incompatible With Secondary Licenses, this
|
|
||||||
License permits You to additionally distribute such Covered Software
|
|
||||||
under the terms of such Secondary License(s), so that the recipient of
|
|
||||||
the Larger Work may, at their option, further distribute the Covered
|
|
||||||
Software under the terms of either this License or such Secondary
|
|
||||||
License(s).
|
|
||||||
|
|
||||||
3.4. Notices
|
|
||||||
|
|
||||||
You may not remove or alter the substance of any license notices
|
|
||||||
(including copyright notices, patent notices, disclaimers of warranty,
|
|
||||||
or limitations of liability) contained within the Source Code Form of
|
|
||||||
the Covered Software, except that You may alter any license notices to
|
|
||||||
the extent required to remedy known factual inaccuracies.
|
|
||||||
|
|
||||||
3.5. Application of Additional Terms
|
|
||||||
|
|
||||||
You may choose to offer, and to charge a fee for, warranty, support,
|
|
||||||
indemnity or liability obligations to one or more recipients of Covered
|
|
||||||
Software. However, You may do so only on Your own behalf, and not on
|
|
||||||
behalf of any Contributor. You must make it absolutely clear that any
|
|
||||||
such warranty, support, indemnity, or liability obligation is offered by
|
|
||||||
You alone, and You hereby agree to indemnify every Contributor for any
|
|
||||||
liability incurred by such Contributor as a result of warranty, support,
|
|
||||||
indemnity or liability terms You offer. You may include additional
|
|
||||||
disclaimers of warranty and limitations of liability specific to any
|
|
||||||
jurisdiction.
|
|
||||||
|
|
||||||
4. Inability to Comply Due to Statute or Regulation
|
|
||||||
---------------------------------------------------
|
|
||||||
|
|
||||||
If it is impossible for You to comply with any of the terms of this
|
|
||||||
License with respect to some or all of the Covered Software due to
|
|
||||||
statute, judicial order, or regulation then You must: (a) comply with
|
|
||||||
the terms of this License to the maximum extent possible; and (b)
|
|
||||||
describe the limitations and the code they affect. Such description must
|
|
||||||
be placed in a text file included with all distributions of the Covered
|
|
||||||
Software under this License. Except to the extent prohibited by statute
|
|
||||||
or regulation, such description must be sufficiently detailed for a
|
|
||||||
recipient of ordinary skill to be able to understand it.
|
|
||||||
|
|
||||||
5. Termination
|
|
||||||
--------------
|
|
||||||
|
|
||||||
5.1. The rights granted under this License will terminate automatically
|
|
||||||
if You fail to comply with any of its terms. However, if You become
|
|
||||||
compliant, then the rights granted under this License from a particular
|
|
||||||
Contributor are reinstated (a) provisionally, unless and until such
|
|
||||||
Contributor explicitly and finally terminates Your grants, and (b) on an
|
|
||||||
ongoing basis, if such Contributor fails to notify You of the
|
|
||||||
non-compliance by some reasonable means prior to 60 days after You have
|
|
||||||
come back into compliance. Moreover, Your grants from a particular
|
|
||||||
Contributor are reinstated on an ongoing basis if such Contributor
|
|
||||||
notifies You of the non-compliance by some reasonable means, this is the
|
|
||||||
first time You have received notice of non-compliance with this License
|
|
||||||
from such Contributor, and You become compliant prior to 30 days after
|
|
||||||
Your receipt of the notice.
|
|
||||||
|
|
||||||
5.2. If You initiate litigation against any entity by asserting a patent
|
|
||||||
infringement claim (excluding declaratory judgment actions,
|
|
||||||
counter-claims, and cross-claims) alleging that a Contributor Version
|
|
||||||
directly or indirectly infringes any patent, then the rights granted to
|
|
||||||
You by any and all Contributors for the Covered Software under Section
|
|
||||||
2.1 of this License shall terminate.
|
|
||||||
|
|
||||||
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
|
|
||||||
end user license agreements (excluding distributors and resellers) which
|
|
||||||
have been validly granted by You or Your distributors under this License
|
|
||||||
prior to termination shall survive termination.
|
|
||||||
|
|
||||||
************************************************************************
|
|
||||||
* *
|
|
||||||
* 6. Disclaimer of Warranty *
|
|
||||||
* ------------------------- *
|
|
||||||
* *
|
|
||||||
* Covered Software is provided under this License on an "as is" *
|
|
||||||
* basis, without warranty of any kind, either expressed, implied, or *
|
|
||||||
* statutory, including, without limitation, warranties that the *
|
|
||||||
* Covered Software is free of defects, merchantable, fit for a *
|
|
||||||
* particular purpose or non-infringing. The entire risk as to the *
|
|
||||||
* quality and performance of the Covered Software is with You. *
|
|
||||||
* Should any Covered Software prove defective in any respect, You *
|
|
||||||
* (not any Contributor) assume the cost of any necessary servicing, *
|
|
||||||
* repair, or correction. This disclaimer of warranty constitutes an *
|
|
||||||
* essential part of this License. No use of any Covered Software is *
|
|
||||||
* authorized under this License except under this disclaimer. *
|
|
||||||
* *
|
|
||||||
************************************************************************
|
|
||||||
|
|
||||||
************************************************************************
|
|
||||||
* *
|
|
||||||
* 7. Limitation of Liability *
|
|
||||||
* -------------------------- *
|
|
||||||
* *
|
|
||||||
* Under no circumstances and under no legal theory, whether tort *
|
|
||||||
* (including negligence), contract, or otherwise, shall any *
|
|
||||||
* Contributor, or anyone who distributes Covered Software as *
|
|
||||||
* permitted above, be liable to You for any direct, indirect, *
|
|
||||||
* special, incidental, or consequential damages of any character *
|
|
||||||
* including, without limitation, damages for lost profits, loss of *
|
|
||||||
* goodwill, work stoppage, computer failure or malfunction, or any *
|
|
||||||
* and all other commercial damages or losses, even if such party *
|
|
||||||
* shall have been informed of the possibility of such damages. This *
|
|
||||||
* limitation of liability shall not apply to liability for death or *
|
|
||||||
* personal injury resulting from such party's negligence to the *
|
|
||||||
* extent applicable law prohibits such limitation. Some *
|
|
||||||
* jurisdictions do not allow the exclusion or limitation of *
|
|
||||||
* incidental or consequential damages, so this exclusion and *
|
|
||||||
* limitation may not apply to You. *
|
|
||||||
* *
|
|
||||||
************************************************************************
|
|
||||||
|
|
||||||
8. Litigation
|
|
||||||
-------------
|
|
||||||
|
|
||||||
Any litigation relating to this License may be brought only in the
|
|
||||||
courts of a jurisdiction where the defendant maintains its principal
|
|
||||||
place of business and such litigation shall be governed by laws of that
|
|
||||||
jurisdiction, without reference to its conflict-of-law provisions.
|
|
||||||
Nothing in this Section shall prevent a party's ability to bring
|
|
||||||
cross-claims or counter-claims.
|
|
||||||
|
|
||||||
9. Miscellaneous
|
|
||||||
----------------
|
|
||||||
|
|
||||||
This License represents the complete agreement concerning the subject
|
|
||||||
matter hereof. If any provision of this License is held to be
|
|
||||||
unenforceable, such provision shall be reformed only to the extent
|
|
||||||
necessary to make it enforceable. Any law or regulation which provides
|
|
||||||
that the language of a contract shall be construed against the drafter
|
|
||||||
shall not be used to construe this License against a Contributor.
|
|
||||||
|
|
||||||
10. Versions of the License
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
10.1. New Versions
|
|
||||||
|
|
||||||
Mozilla Foundation is the license steward. Except as provided in Section
|
|
||||||
10.3, no one other than the license steward has the right to modify or
|
|
||||||
publish new versions of this License. Each version will be given a
|
|
||||||
distinguishing version number.
|
|
||||||
|
|
||||||
10.2. Effect of New Versions
|
|
||||||
|
|
||||||
You may distribute the Covered Software under the terms of the version
|
|
||||||
of the License under which You originally received the Covered Software,
|
|
||||||
or under the terms of any subsequent version published by the license
|
|
||||||
steward.
|
|
||||||
|
|
||||||
10.3. Modified Versions
|
|
||||||
|
|
||||||
If you create software not governed by this License, and you want to
|
|
||||||
create a new license for such software, you may create and use a
|
|
||||||
modified version of this License if you rename the license and remove
|
|
||||||
any references to the name of the license steward (except to note that
|
|
||||||
such modified license differs from this License).
|
|
||||||
|
|
||||||
10.4. Distributing Source Code Form that is Incompatible With Secondary
|
|
||||||
Licenses
|
|
||||||
|
|
||||||
If You choose to distribute Source Code Form that is Incompatible With
|
|
||||||
Secondary Licenses under the terms of this version of the License, the
|
|
||||||
notice described in Exhibit B of this License must be attached.
|
|
||||||
|
|
||||||
Exhibit A - Source Code Form License Notice
|
|
||||||
-------------------------------------------
|
|
||||||
|
|
||||||
This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
|
|
||||||
If it is not possible or desirable to put the notice in a particular
|
|
||||||
file, then You may include the notice in a location (such as a LICENSE
|
|
||||||
file in a relevant directory) where a recipient would be likely to look
|
|
||||||
for such a notice.
|
|
||||||
|
|
||||||
You may add additional accurate notices of copyright ownership.
|
|
||||||
|
|
||||||
Exhibit B - "Incompatible With Secondary Licenses" Notice
|
|
||||||
---------------------------------------------------------
|
|
||||||
|
|
||||||
This Source Code Form is "Incompatible With Secondary Licenses", as
|
|
||||||
defined by the Mozilla Public License, v. 2.0.
|
|
||||||
|
|
@ -1,91 +0,0 @@
|
||||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
||||||
This license is copied below, and is also available with a FAQ at:
|
|
||||||
http://scripts.sil.org/OFL
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------------------------------
|
|
||||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
||||||
-----------------------------------------------------------
|
|
||||||
|
|
||||||
PREAMBLE
|
|
||||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
||||||
development of collaborative font projects, to support the font creation
|
|
||||||
efforts of academic and linguistic communities, and to provide a free and
|
|
||||||
open framework in which fonts may be shared and improved in partnership
|
|
||||||
with others.
|
|
||||||
|
|
||||||
The OFL allows the licensed fonts to be used, studied, modified and
|
|
||||||
redistributed freely as long as they are not sold by themselves. The
|
|
||||||
fonts, including any derivative works, can be bundled, embedded,
|
|
||||||
redistributed and/or sold with any software provided that any reserved
|
|
||||||
names are not used by derivative works. The fonts and derivatives,
|
|
||||||
however, cannot be released under any other type of license. The
|
|
||||||
requirement for fonts to remain under this license does not apply
|
|
||||||
to any document created using the fonts or their derivatives.
|
|
||||||
|
|
||||||
DEFINITIONS
|
|
||||||
"Font Software" refers to the set of files released by the Copyright
|
|
||||||
Holder(s) under this license and clearly marked as such. This may
|
|
||||||
include source files, build scripts and documentation.
|
|
||||||
|
|
||||||
"Reserved Font Name" refers to any names specified as such after the
|
|
||||||
copyright statement(s).
|
|
||||||
|
|
||||||
"Original Version" refers to the collection of Font Software components as
|
|
||||||
distributed by the Copyright Holder(s).
|
|
||||||
|
|
||||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
||||||
or substituting -- in part or in whole -- any of the components of the
|
|
||||||
Original Version, by changing formats or by porting the Font Software to a
|
|
||||||
new environment.
|
|
||||||
|
|
||||||
"Author" refers to any designer, engineer, programmer, technical
|
|
||||||
writer or other person who contributed to the Font Software.
|
|
||||||
|
|
||||||
PERMISSION & CONDITIONS
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
||||||
redistribute, and sell modified and unmodified copies of the Font
|
|
||||||
Software, subject to the following conditions:
|
|
||||||
|
|
||||||
1) Neither the Font Software nor any of its individual components,
|
|
||||||
in Original or Modified Versions, may be sold by itself.
|
|
||||||
|
|
||||||
2) Original or Modified Versions of the Font Software may be bundled,
|
|
||||||
redistributed and/or sold with any software, provided that each copy
|
|
||||||
contains the above copyright notice and this license. These can be
|
|
||||||
included either as stand-alone text files, human-readable headers or
|
|
||||||
in the appropriate machine-readable metadata fields within text or
|
|
||||||
binary files as long as those fields can be easily viewed by the user.
|
|
||||||
|
|
||||||
3) No Modified Version of the Font Software may use the Reserved Font
|
|
||||||
Name(s) unless explicit written permission is granted by the corresponding
|
|
||||||
Copyright Holder. This restriction only applies to the primary font name as
|
|
||||||
presented to the users.
|
|
||||||
|
|
||||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
||||||
Software shall not be used to promote, endorse or advertise any
|
|
||||||
Modified Version, except to acknowledge the contribution(s) of the
|
|
||||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
||||||
permission.
|
|
||||||
|
|
||||||
5) The Font Software, modified or unmodified, in part or in whole,
|
|
||||||
must be distributed entirely under this license, and must not be
|
|
||||||
distributed under any other license. The requirement for fonts to
|
|
||||||
remain under this license does not apply to any document created
|
|
||||||
using the Font Software.
|
|
||||||
|
|
||||||
TERMINATION
|
|
||||||
This license becomes null and void if any of the above conditions are
|
|
||||||
not met.
|
|
||||||
|
|
||||||
DISCLAIMER
|
|
||||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
||||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
||||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
||||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
||||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
(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,27 +0,0 @@
|
||||||
Copyright (c) <year>, <copyright holder>
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express
|
|
||||||
or implied warranty. In no event will the authors be
|
|
||||||
held liable for any damages arising from the use of
|
|
||||||
this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software
|
|
||||||
for any purpose, including commercial applications,
|
|
||||||
and to alter it and redistribute it freely, subject to
|
|
||||||
the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be
|
|
||||||
misrepresented; you must not claim that you
|
|
||||||
wrote the original software. If you use this
|
|
||||||
software in a product, an acknowledgment in
|
|
||||||
the product documentation would be appreciated
|
|
||||||
but is not required.
|
|
||||||
|
|
||||||
2. Altered source versions must be plainly marked
|
|
||||||
as such, and must not be misrepresented as
|
|
||||||
being the original software.
|
|
||||||
|
|
||||||
3. This notice may not be removed or altered from
|
|
||||||
any source distribution.
|
|
||||||
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
0.6.1
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
Manual setup:
|
|
||||||
|
|
||||||
DATA="echo \'<cross-domain-policy><allow-access-from domain=\\\"*\\\" to-ports=\\\"*\\\" /></cross-domain-policy>\'"
|
|
||||||
/usr/bin/socat -T 1 TCP-L:843,reuseaddr,fork,crlf SYSTEM:"$DATA"
|
|
||||||
|
|
@ -1,76 +0,0 @@
|
||||||
New tight PNG protocol:
|
|
||||||
http://wiki.qemu.org/VNC_Tight_PNG
|
|
||||||
http://xf.iksaif.net/blog/index.php?post/2010/06/14/QEMU:-Tight-PNG-and-some-profiling
|
|
||||||
|
|
||||||
RFB protocol and extensions:
|
|
||||||
http://tigervnc.org/cgi-bin/rfbproto
|
|
||||||
|
|
||||||
Canvas Browser Compatibility:
|
|
||||||
http://philip.html5.org/tests/canvas/suite/tests/results.html
|
|
||||||
|
|
||||||
WebSockets API standard:
|
|
||||||
http://www.whatwg.org/specs/web-apps/current-work/complete.html#websocket
|
|
||||||
http://dev.w3.org/html5/websockets/
|
|
||||||
http://www.ietf.org/id/draft-ietf-hybi-thewebsocketprotocol-00.txt
|
|
||||||
|
|
||||||
Browser Keyboard Events detailed:
|
|
||||||
http://unixpapa.com/js/key.html
|
|
||||||
|
|
||||||
ActionScript (Flash) WebSocket implementation:
|
|
||||||
http://github.com/gimite/web-socket-js
|
|
||||||
|
|
||||||
ActionScript (Flash) crypto/TLS library:
|
|
||||||
http://code.google.com/p/as3crypto
|
|
||||||
http://github.com/lyokato/as3crypto_patched
|
|
||||||
|
|
||||||
TLS Protocol:
|
|
||||||
http://en.wikipedia.org/wiki/Transport_Layer_Security
|
|
||||||
|
|
||||||
Generate self-signed certificate:
|
|
||||||
http://docs.python.org/dev/library/ssl.html#certificates
|
|
||||||
|
|
||||||
Cursor appearance/style (for Cursor pseudo-encoding):
|
|
||||||
http://en.wikipedia.org/wiki/ICO_(file_format)
|
|
||||||
http://www.daubnet.com/en/file-format-cur
|
|
||||||
https://developer.mozilla.org/en/Using_URL_values_for_the_cursor_property
|
|
||||||
http://www.fileformat.info/format/bmp/egff.htm
|
|
||||||
|
|
||||||
Icon/Cursor file format:
|
|
||||||
http://msdn.microsoft.com/en-us/library/ms997538
|
|
||||||
http://msdn.microsoft.com/en-us/library/aa921550.aspx
|
|
||||||
http://msdn.microsoft.com/en-us/library/aa930622.aspx
|
|
||||||
|
|
||||||
|
|
||||||
RDP Protocol specification:
|
|
||||||
http://msdn.microsoft.com/en-us/library/cc240445(v=PROT.10).aspx
|
|
||||||
|
|
||||||
|
|
||||||
Related projects:
|
|
||||||
|
|
||||||
guacamole: http://guacamole.sourceforge.net/
|
|
||||||
|
|
||||||
- Web client, but Java servlet does pre-processing
|
|
||||||
|
|
||||||
jsvnc: http://code.google.com/p/jsvnc/
|
|
||||||
|
|
||||||
- No releases
|
|
||||||
|
|
||||||
webvnc: http://code.google.com/p/webvnc/
|
|
||||||
|
|
||||||
- Jetty web server gateway, no updates since April 2008.
|
|
||||||
|
|
||||||
RealVNC Java applet: http://www.realvnc.com/support/javavncviewer.html
|
|
||||||
|
|
||||||
- Java applet
|
|
||||||
|
|
||||||
Flashlight-VNC: http://www.wizhelp.com/flashlight-vnc/
|
|
||||||
|
|
||||||
- Adobe Flash implementation
|
|
||||||
|
|
||||||
FVNC: http://osflash.org/fvnc
|
|
||||||
|
|
||||||
- Adbove Flash implementation
|
|
||||||
|
|
||||||
CanVNC: http://canvnc.sourceforge.net/
|
|
||||||
|
|
||||||
- HTML client with REST to VNC python proxy. Mostly vapor.
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
Rebuilding inflator.js
|
|
||||||
|
|
||||||
- Download pako from npm
|
|
||||||
- Install browserify using npm
|
|
||||||
- browserify core/inflator.mod.js -o core/inflator.js -s Inflator
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
- Decide a new version number X.Y.Z (follow SemVer)
|
|
||||||
- Update version in package.json
|
|
||||||
- Update version in docs/VERSION
|
|
||||||
- Commit the change with a commit like "Release X.Y.Z"
|
|
||||||
- Add a new release on GitHub called "vX.Y.Z", and populate it with
|
|
||||||
release notes of the following form (where A.B.C is the last release):
|
|
||||||
|
|
||||||
Major Changes Since A.B.C
|
|
||||||
=========================
|
|
||||||
|
|
||||||
*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,147 +0,0 @@
|
||||||
5.1.1 ProtocolVersion: 12, 12 bytes
|
|
||||||
|
|
||||||
- Sent by server, max supported
|
|
||||||
12 ascii - "RFB 003.008\n"
|
|
||||||
- Response by client, version to use
|
|
||||||
12 ascii - "RFB 003.003\n"
|
|
||||||
|
|
||||||
5.1.2 Authentication: >=4, [16, 4] bytes
|
|
||||||
|
|
||||||
- Sent by server
|
|
||||||
CARD32 - authentication-scheme
|
|
||||||
0 - connection failed
|
|
||||||
CARD32 - length
|
|
||||||
length - reason
|
|
||||||
1 - no authentication
|
|
||||||
|
|
||||||
2 - VNC authentication
|
|
||||||
16 CARD8 - challenge (random bytes)
|
|
||||||
|
|
||||||
- Response by client (if VNC authentication)
|
|
||||||
16 CARD8 - client encrypts the challenge with DES, using user
|
|
||||||
password as key, sends resulting 16 byte response
|
|
||||||
|
|
||||||
- Response by server (if VNC authentication)
|
|
||||||
CARD32 - 0 - OK
|
|
||||||
1 - failed
|
|
||||||
2 - too-many
|
|
||||||
|
|
||||||
5.1.3 ClientInitialisation: 1 byte
|
|
||||||
- Sent by client
|
|
||||||
CARD8 - shared-flag, 0 exclusive, non-zero shared
|
|
||||||
|
|
||||||
5.1.4 ServerInitialisation: >=24 bytes
|
|
||||||
- Sent by server
|
|
||||||
CARD16 - framebuffer-width
|
|
||||||
CARD16 - framebuffer-height
|
|
||||||
16 byte PIXEL_FORMAT - server-pixel-format
|
|
||||||
CARD8 - bits-per-pixel
|
|
||||||
CARD8 - depth
|
|
||||||
CARD8 - big-endian-flag, non-zero is big endian
|
|
||||||
CARD8 - true-color-flag, non-zero then next 6 apply
|
|
||||||
CARD16 - red-max
|
|
||||||
CARD16 - green-max
|
|
||||||
CARD16 - blue-max
|
|
||||||
CARD8 - red-shift
|
|
||||||
CARD8 - green-shift
|
|
||||||
CARD8 - blue-shift
|
|
||||||
3 bytes - padding
|
|
||||||
CARD32 - name-length
|
|
||||||
|
|
||||||
CARD8[length] - name-string
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Client to Server Messages:
|
|
||||||
|
|
||||||
5.2.1 SetPixelFormat: 20 bytes
|
|
||||||
CARD8: 0 - message-type
|
|
||||||
...
|
|
||||||
|
|
||||||
5.2.2 FixColourMapEntries: >=6 bytes
|
|
||||||
CARD8: 1 - message-type
|
|
||||||
...
|
|
||||||
|
|
||||||
5.2.3 SetEncodings: >=8 bytes
|
|
||||||
CARD8: 2 - message-type
|
|
||||||
CARD8 - padding
|
|
||||||
CARD16 - numer-of-encodings
|
|
||||||
|
|
||||||
CARD32 - encoding-type in preference order
|
|
||||||
0 - raw
|
|
||||||
1 - copy-rectangle
|
|
||||||
2 - RRE
|
|
||||||
4 - CoRRE
|
|
||||||
5 - hextile
|
|
||||||
|
|
||||||
5.2.4 FramebufferUpdateRequest (10 bytes)
|
|
||||||
CARD8: 3 - message-type
|
|
||||||
CARD8 - incremental (0 for full-update, non-zero for incremental)
|
|
||||||
CARD16 - x-position
|
|
||||||
CARD16 - y-position
|
|
||||||
CARD16 - width
|
|
||||||
CARD16 - height
|
|
||||||
|
|
||||||
|
|
||||||
5.2.5 KeyEvent: 8 bytes
|
|
||||||
CARD8: 4 - message-type
|
|
||||||
CARD8 - down-flag
|
|
||||||
2 bytes - padding
|
|
||||||
CARD32 - key (X-Windows keysym values)
|
|
||||||
|
|
||||||
5.2.6 PointerEvent: 6 bytes
|
|
||||||
CARD8: 5 - message-type
|
|
||||||
CARD8 - button-mask
|
|
||||||
CARD16 - x-position
|
|
||||||
CARD16 - y-position
|
|
||||||
|
|
||||||
5.2.7 ClientCutText: >=9 bytes
|
|
||||||
CARD8: 6 - message-type
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
Server to Client Messages:
|
|
||||||
|
|
||||||
5.3.1 FramebufferUpdate
|
|
||||||
CARD8: 0 - message-type
|
|
||||||
1 byte - padding
|
|
||||||
CARD16 - number-of-rectangles
|
|
||||||
|
|
||||||
CARD16 - x-position
|
|
||||||
CARD16 - y-position
|
|
||||||
CARD16 - width
|
|
||||||
CARD16 - height
|
|
||||||
CARD16 - encoding-type:
|
|
||||||
0 - raw
|
|
||||||
1 - copy rectangle
|
|
||||||
2 - RRE
|
|
||||||
4 - CoRRE
|
|
||||||
5 - hextile
|
|
||||||
|
|
||||||
raw:
|
|
||||||
- width x height pixel values
|
|
||||||
|
|
||||||
copy rectangle:
|
|
||||||
CARD16 - src-x-position
|
|
||||||
CARD16 - src-y-position
|
|
||||||
|
|
||||||
RRE:
|
|
||||||
CARD32 - N number-of-subrectangles
|
|
||||||
Nxd bytes - background-pixel-value (d bits-per-pixel)
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
5.3.2 SetColourMapEntries (no support)
|
|
||||||
CARD8: 1 - message-type
|
|
||||||
...
|
|
||||||
|
|
||||||
5.3.3 Bell
|
|
||||||
CARD8: 2 - message-type
|
|
||||||
|
|
||||||
5.3.4 ServerCutText
|
|
||||||
CARD8: 3 - message-type
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||