fix
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
## WebSockets Proxy/Bridge
|
||||
|
||||
Websockify has been forked out into its own project. `launch.sh` wil
|
||||
automatically download it here if it is not already present and not
|
||||
installed as system-wide.
|
||||
|
||||
For more detailed description and usage information please refer to
|
||||
the [websockify README](https://github.com/kanaka/websockify/blob/master/README.md).
|
||||
|
||||
The other versions of websockify (C, Node.js) and the associated test
|
||||
programs have been moved to
|
||||
[websockify](https://github.com/kanaka/websockify). Websockify was
|
||||
formerly named wsproxy.
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
#
|
||||
# Convert image to Javascript compatible base64 Data URI
|
||||
# Copyright 2011 Joel Martin
|
||||
# Licensed under MPL 2.0 (see docs/LICENSE.MPL-2.0)
|
||||
#
|
||||
|
||||
import sys, base64
|
||||
|
||||
try:
|
||||
from PIL import Image
|
||||
except:
|
||||
print "python PIL module required (python-imaging package)"
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if len(sys.argv) < 3:
|
||||
print "Usage: %s IMAGE JS_VARIABLE" % sys.argv[0]
|
||||
sys.exit(1)
|
||||
|
||||
fname = sys.argv[1]
|
||||
var = sys.argv[2]
|
||||
|
||||
ext = fname.lower().split('.')[-1]
|
||||
if ext == "png": mime = "image/png"
|
||||
elif ext in ["jpg", "jpeg"]: mime = "image/jpeg"
|
||||
elif ext == "gif": mime = "image/gif"
|
||||
else:
|
||||
print "Only PNG, JPEG and GIF images are supported"
|
||||
sys.exit(1)
|
||||
uri = "data:%s;base64," % mime
|
||||
|
||||
im = Image.open(fname)
|
||||
w, h = im.size
|
||||
|
||||
raw = open(fname).read()
|
||||
|
||||
print '%s = {"width": %s, "height": %s, "data": "%s%s"};' % (
|
||||
var, w, h, uri, base64.b64encode(raw))
|
||||
@@ -0,0 +1,206 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
'''
|
||||
Use matplotlib to generate performance charts
|
||||
Copyright 2011 Joel Martin
|
||||
Licensed under MPL-2.0 (see docs/LICENSE.MPL-2.0)
|
||||
'''
|
||||
|
||||
# a bar plot with errorbars
|
||||
import sys, json, pprint
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from matplotlib.font_manager import FontProperties
|
||||
|
||||
def usage():
|
||||
print "%s json_file level1 level2 level3 [legend_height]\n\n" % sys.argv[0]
|
||||
print "Description:\n"
|
||||
print "level1, level2, and level3 are one each of the following:\n";
|
||||
print " select=ITEM - select only ITEM at this level";
|
||||
print " bar - each item on this level becomes a graph bar";
|
||||
print " group - items on this level become groups of bars";
|
||||
print "\n";
|
||||
print "json_file is a file containing json data in the following format:\n"
|
||||
print ' {';
|
||||
print ' "conf": {';
|
||||
print ' "order_l1": [';
|
||||
print ' "level1_label1",';
|
||||
print ' "level1_label2",';
|
||||
print ' ...';
|
||||
print ' ],';
|
||||
print ' "order_l2": [';
|
||||
print ' "level2_label1",';
|
||||
print ' "level2_label2",';
|
||||
print ' ...';
|
||||
print ' ],';
|
||||
print ' "order_l3": [';
|
||||
print ' "level3_label1",';
|
||||
print ' "level3_label2",';
|
||||
print ' ...';
|
||||
print ' ]';
|
||||
print ' },';
|
||||
print ' "stats": {';
|
||||
print ' "level1_label1": {';
|
||||
print ' "level2_label1": {';
|
||||
print ' "level3_label1": [val1, val2, val3],';
|
||||
print ' "level3_label2": [val1, val2, val3],';
|
||||
print ' ...';
|
||||
print ' },';
|
||||
print ' "level2_label2": {';
|
||||
print ' ...';
|
||||
print ' },';
|
||||
print ' },';
|
||||
print ' "level1_label2": {';
|
||||
print ' ...';
|
||||
print ' },';
|
||||
print ' ...';
|
||||
print ' },';
|
||||
print ' }';
|
||||
sys.exit(2)
|
||||
|
||||
def error(msg):
|
||||
print msg
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
#colors = ['#ff0000', '#0863e9', '#00f200', '#ffa100',
|
||||
# '#800000', '#805100', '#013075', '#007900']
|
||||
colors = ['#ff0000', '#00ff00', '#0000ff',
|
||||
'#dddd00', '#dd00dd', '#00dddd',
|
||||
'#dd6622', '#dd2266', '#66dd22',
|
||||
'#8844dd', '#44dd88', '#4488dd']
|
||||
|
||||
if len(sys.argv) < 5:
|
||||
usage()
|
||||
|
||||
filename = sys.argv[1]
|
||||
L1 = sys.argv[2]
|
||||
L2 = sys.argv[3]
|
||||
L3 = sys.argv[4]
|
||||
if len(sys.argv) > 5:
|
||||
legendHeight = float(sys.argv[5])
|
||||
else:
|
||||
legendHeight = 0.75
|
||||
|
||||
# Load the JSON data from the file
|
||||
data = json.loads(file(filename).read())
|
||||
conf = data['conf']
|
||||
stats = data['stats']
|
||||
|
||||
# Sanity check data hierarchy
|
||||
if len(conf['order_l1']) != len(stats.keys()):
|
||||
error("conf.order_l1 does not match stats level 1")
|
||||
for l1 in stats.keys():
|
||||
if len(conf['order_l2']) != len(stats[l1].keys()):
|
||||
error("conf.order_l2 does not match stats level 2 for %s" % l1)
|
||||
if conf['order_l1'].count(l1) < 1:
|
||||
error("%s not found in conf.order_l1" % l1)
|
||||
for l2 in stats[l1].keys():
|
||||
if len(conf['order_l3']) != len(stats[l1][l2].keys()):
|
||||
error("conf.order_l3 does not match stats level 3")
|
||||
if conf['order_l2'].count(l2) < 1:
|
||||
error("%s not found in conf.order_l2" % l2)
|
||||
for l3 in stats[l1][l2].keys():
|
||||
if conf['order_l3'].count(l3) < 1:
|
||||
error("%s not found in conf.order_l3" % l3)
|
||||
|
||||
#
|
||||
# Generate the data based on the level specifications
|
||||
#
|
||||
bar_labels = None
|
||||
group_labels = None
|
||||
bar_vals = []
|
||||
bar_sdvs = []
|
||||
if L3.startswith("select="):
|
||||
select_label = l3 = L3.split("=")[1]
|
||||
bar_labels = conf['order_l1']
|
||||
group_labels = conf['order_l2']
|
||||
bar_vals = [[0]*len(group_labels) for i in bar_labels]
|
||||
bar_sdvs = [[0]*len(group_labels) for i in bar_labels]
|
||||
for b in range(len(bar_labels)):
|
||||
l1 = bar_labels[b]
|
||||
for g in range(len(group_labels)):
|
||||
l2 = group_labels[g]
|
||||
bar_vals[b][g] = np.mean(stats[l1][l2][l3])
|
||||
bar_sdvs[b][g] = np.std(stats[l1][l2][l3])
|
||||
elif L2.startswith("select="):
|
||||
select_label = l2 = L2.split("=")[1]
|
||||
bar_labels = conf['order_l1']
|
||||
group_labels = conf['order_l3']
|
||||
bar_vals = [[0]*len(group_labels) for i in bar_labels]
|
||||
bar_sdvs = [[0]*len(group_labels) for i in bar_labels]
|
||||
for b in range(len(bar_labels)):
|
||||
l1 = bar_labels[b]
|
||||
for g in range(len(group_labels)):
|
||||
l3 = group_labels[g]
|
||||
bar_vals[b][g] = np.mean(stats[l1][l2][l3])
|
||||
bar_sdvs[b][g] = np.std(stats[l1][l2][l3])
|
||||
elif L1.startswith("select="):
|
||||
select_label = l1 = L1.split("=")[1]
|
||||
bar_labels = conf['order_l2']
|
||||
group_labels = conf['order_l3']
|
||||
bar_vals = [[0]*len(group_labels) for i in bar_labels]
|
||||
bar_sdvs = [[0]*len(group_labels) for i in bar_labels]
|
||||
for b in range(len(bar_labels)):
|
||||
l2 = bar_labels[b]
|
||||
for g in range(len(group_labels)):
|
||||
l3 = group_labels[g]
|
||||
bar_vals[b][g] = np.mean(stats[l1][l2][l3])
|
||||
bar_sdvs[b][g] = np.std(stats[l1][l2][l3])
|
||||
else:
|
||||
usage()
|
||||
|
||||
# If group is before bar then flip (zip) the data
|
||||
if [L1, L2, L3].index("group") < [L1, L2, L3].index("bar"):
|
||||
bar_labels, group_labels = group_labels, bar_labels
|
||||
bar_vals = zip(*bar_vals)
|
||||
bar_sdvs = zip(*bar_sdvs)
|
||||
|
||||
print "bar_vals:", bar_vals
|
||||
|
||||
#
|
||||
# Now render the bar graph
|
||||
#
|
||||
ind = np.arange(len(group_labels)) # the x locations for the groups
|
||||
width = 0.8 * (1.0/len(bar_labels)) # the width of the bars
|
||||
|
||||
fig = plt.figure(figsize=(10,6), dpi=80)
|
||||
plot = fig.add_subplot(1, 1, 1)
|
||||
|
||||
rects = []
|
||||
for i in range(len(bar_vals)):
|
||||
rects.append(plot.bar(ind+width*i, bar_vals[i], width, color=colors[i],
|
||||
yerr=bar_sdvs[i], align='center'))
|
||||
|
||||
# add some
|
||||
plot.set_ylabel('Milliseconds (less is better)')
|
||||
plot.set_title("Javascript array test: %s" % select_label)
|
||||
plot.set_xticks(ind+width)
|
||||
plot.set_xticklabels( group_labels )
|
||||
|
||||
fontP = FontProperties()
|
||||
fontP.set_size('small')
|
||||
plot.legend( [r[0] for r in rects], bar_labels, prop=fontP,
|
||||
loc = 'center right', bbox_to_anchor = (1.0, legendHeight))
|
||||
|
||||
def autolabel(rects):
|
||||
# attach some text labels
|
||||
for rect in rects:
|
||||
height = rect.get_height()
|
||||
if np.isnan(height):
|
||||
height = 0.0
|
||||
plot.text(rect.get_x()+rect.get_width()/2., height+20, '%d'%int(height),
|
||||
ha='center', va='bottom', size='7')
|
||||
|
||||
for rect in rects:
|
||||
autolabel(rect)
|
||||
|
||||
# Adjust axis sizes
|
||||
axis = list(plot.axis())
|
||||
axis[0] = -width # Make sure left side has enough for bar
|
||||
#axis[1] = axis[1] * 1.20 # Add 20% to the right to make sure it fits
|
||||
axis[2] = 0 # Make y-axis start at 0
|
||||
axis[3] = axis[3] * 1.10 # Add 10% to the top
|
||||
plot.axis(axis)
|
||||
|
||||
plt.show()
|
||||
@@ -0,0 +1,55 @@
|
||||
#!/bin/sh
|
||||
|
||||
portnb="6801";
|
||||
sumnb="1";
|
||||
|
||||
usage() {
|
||||
if [ "$*" ]; then
|
||||
echo
|
||||
echo "$*"
|
||||
fi
|
||||
echo "Usage: ${NAME} [-p] [-s] ";
|
||||
echo " -p port number";
|
||||
echo " Default: 6801";
|
||||
echo " -n port sum,start for [-p]6801";
|
||||
echo " Default: 20";
|
||||
exit 2
|
||||
}
|
||||
|
||||
while [ "$*" ]; do
|
||||
param=$1; shift; OPTARG=$1
|
||||
case $param in
|
||||
-p) portnb="${OPTARG}"; shift ;;
|
||||
-n) sumnb="${OPTARG}"; shift ;;
|
||||
-h|--help) usage ;;
|
||||
-*) usage "Unknown chrooter option: ${param}" ;;
|
||||
*) break ;;
|
||||
esac
|
||||
done
|
||||
|
||||
|
||||
expr $portnb "+" 10 &> /dev/null
|
||||
if [ $? -eq 0 ];then
|
||||
echo -e "\033[34;5;5mkill port exec!\033[0m ";
|
||||
else
|
||||
echo "[-p]erro : please input a number!";
|
||||
exit 2;
|
||||
fi
|
||||
|
||||
expr $sumnb "+" 10 &> /dev/null
|
||||
if [ $? -eq 0 ];then
|
||||
echo -e "\033[34;5;5mkill port exec!\033[0m ";
|
||||
else
|
||||
echo "[-n]erro : please input a number!";
|
||||
exit 2;
|
||||
fi
|
||||
|
||||
for i in `seq 1 $sumnb`;do
|
||||
typeset -i port=$portnb-1+i
|
||||
|
||||
vwport=`netstat -tlnp | grep ":"$port`;
|
||||
if [ -n "$vwport" ];then
|
||||
echo -e "kill port : \033[32;5;5m$port\033[0m succeed! ";
|
||||
kill -9 `lsof -ti":$port"`;
|
||||
fi
|
||||
done
|
||||
@@ -0,0 +1,150 @@
|
||||
#!/bin/bash
|
||||
|
||||
usage() {
|
||||
if [ "$*" ]; then
|
||||
echo "$*"
|
||||
echo
|
||||
fi
|
||||
echo "Usage: ${NAME} [--listen PORT] [--vnc VNC_HOST:PORT] [--cert CERT]"
|
||||
echo
|
||||
echo "Starts the WebSockets proxy and a mini-webserver and "
|
||||
echo "provides a cut-and-paste URL to go to."
|
||||
echo
|
||||
echo " --listen PORT Port for proxy/webserver to listen on"
|
||||
echo " Default: 6080"
|
||||
echo " --vnc VNC_HOST:PORT VNC server host:port proxy target"
|
||||
echo " Default: localhost:5900"
|
||||
echo " --cert CERT Path to combined cert/key file"
|
||||
echo " Default: self.pem"
|
||||
echo " --web WEB Path to web files (e.g. vnc.html)"
|
||||
echo " Default: ./"
|
||||
exit 2
|
||||
}
|
||||
|
||||
NAME="$(basename $0)"
|
||||
REAL_NAME="$(readlink -f $0)"
|
||||
HERE="$(cd "$(dirname "$REAL_NAME")" && pwd)"
|
||||
PORT="6080"
|
||||
VNC_DEST="localhost:5900"
|
||||
CERT=""
|
||||
WEB=""
|
||||
proxy_pid=""
|
||||
|
||||
die() {
|
||||
echo "$*"
|
||||
exit 1
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
trap - TERM QUIT INT EXIT
|
||||
trap "true" CHLD # Ignore cleanup messages
|
||||
echo
|
||||
if [ -n "${proxy_pid}" ]; then
|
||||
echo "Terminating WebSockets proxy (${proxy_pid})"
|
||||
kill ${proxy_pid}
|
||||
fi
|
||||
}
|
||||
|
||||
# Process Arguments
|
||||
|
||||
# Arguments that only apply to chrooter itself
|
||||
while [ "$*" ]; do
|
||||
param=$1; shift; OPTARG=$1
|
||||
case $param in
|
||||
--listen) PORT="${OPTARG}"; shift ;;
|
||||
--vnc) VNC_DEST="${OPTARG}"; shift ;;
|
||||
--cert) CERT="${OPTARG}"; shift ;;
|
||||
--web) WEB="${OPTARG}"; shift ;;
|
||||
-h|--help) usage ;;
|
||||
-*) usage "Unknown chrooter option: ${param}" ;;
|
||||
*) break ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Sanity checks
|
||||
which netstat >/dev/null 2>&1 \
|
||||
|| die "Must have netstat installed"
|
||||
|
||||
netstat -ltn | grep -qs "${PORT} .*LISTEN" \
|
||||
&& die "Port ${PORT} in use. Try --listen PORT"
|
||||
|
||||
trap "cleanup" TERM QUIT INT EXIT
|
||||
|
||||
# Find vnc.html
|
||||
if [ -n "${WEB}" ]; then
|
||||
if [ ! -e "${WEB}/vnc.html" ]; then
|
||||
die "Could not find ${WEB}/vnc.html"
|
||||
fi
|
||||
elif [ -e "$(pwd)/vnc.html" ]; then
|
||||
WEB=$(pwd)
|
||||
elif [ -e "${HERE}/../vnc.html" ]; then
|
||||
WEB=${HERE}/../
|
||||
elif [ -e "${HERE}/vnc.html" ]; then
|
||||
WEB=${HERE}
|
||||
elif [ -e "${HERE}/../share/novnc/vnc.html" ]; then
|
||||
WEB=${HERE}/../share/novnc/
|
||||
else
|
||||
die "Could not find vnc.html"
|
||||
fi
|
||||
|
||||
# Find self.pem
|
||||
if [ -n "${CERT}" ]; then
|
||||
if [ ! -e "${CERT}" ]; then
|
||||
die "Could not find ${CERT}"
|
||||
fi
|
||||
elif [ -e "$(pwd)/self.pem" ]; then
|
||||
CERT="$(pwd)/self.pem"
|
||||
elif [ -e "${HERE}/../self.pem" ]; then
|
||||
CERT="${HERE}/../self.pem"
|
||||
elif [ -e "${HERE}/self.pem" ]; then
|
||||
CERT="${HERE}/self.pem"
|
||||
else
|
||||
echo "Warning: could not find self.pem"
|
||||
fi
|
||||
|
||||
# try to find websockify (prefer local, try global, then download local)
|
||||
if [[ -e ${HERE}/websockify ]]; then
|
||||
WEBSOCKIFY=${HERE}/websockify/run
|
||||
|
||||
if [[ ! -x $WEBSOCKIFY ]]; then
|
||||
echo "The path ${HERE}/websockify exists, but $WEBSOCKIFY either does not exist or is not executable."
|
||||
echo "If you inteded to use an installed websockify package, please remove ${HERE}/websockify."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Using local websockify at $WEBSOCKIFY"
|
||||
else
|
||||
WEBSOCKIFY=$(which websockify 2>/dev/null)
|
||||
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "No installed websockify, attempting to clone websockify..."
|
||||
WEBSOCKIFY=${HERE}/websockify/run
|
||||
git clone https://github.com/kanaka/websockify ${HERE}/websockify
|
||||
|
||||
if [[ ! -e $WEBSOCKIFY ]]; then
|
||||
echo "Unable to locate ${HERE}/websockify/run after downloading"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Using local websockify at $WEBSOCKIFY"
|
||||
else
|
||||
echo "Using installed websockify at $WEBSOCKIFY"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Starting webserver and WebSockets proxy on port ${PORT}"
|
||||
#${HERE}/websockify --web ${WEB} ${CERT:+--cert ${CERT}} ${PORT} ${VNC_DEST} &
|
||||
${WEBSOCKIFY} --web ${WEB} ${CERT:+--cert ${CERT}} ${PORT} ${VNC_DEST} &
|
||||
proxy_pid="$!"
|
||||
sleep 1
|
||||
if ! ps -p ${proxy_pid} >/dev/null; then
|
||||
proxy_pid=
|
||||
echo "Failed to start WebSockets proxy"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "\n\nNavigate to this URL:\n"
|
||||
echo -e " http://$(hostname):${PORT}/vnc.html?host=$(hostname)&port=${PORT}\n"
|
||||
echo -e "Press Ctrl-C to exit\n\n"
|
||||
|
||||
wait ${proxy_pid}
|
||||
@@ -0,0 +1,97 @@
|
||||
// Utility to parse keysymdef.h to produce mappings from Unicode codepoints to keysyms
|
||||
"use strict";
|
||||
|
||||
var fs = require('fs');
|
||||
|
||||
var show_help = process.argv.length === 2;
|
||||
var use_keynames = false;
|
||||
var filename;
|
||||
|
||||
for (var i = 2; i < process.argv.length; ++i) {
|
||||
switch (process.argv[i]) {
|
||||
case "--help":
|
||||
case "-h":
|
||||
show_help = true;
|
||||
break;
|
||||
case "--debug-names":
|
||||
case "-d":
|
||||
use_keynames = true;
|
||||
break;
|
||||
case "--file":
|
||||
case "-f":
|
||||
default:
|
||||
filename = process.argv[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (!filename) {
|
||||
show_help = true;
|
||||
console.log("Error: No filename specified\n");
|
||||
}
|
||||
|
||||
if (show_help) {
|
||||
console.log("Parses a *nix keysymdef.h to generate Unicode code point mappings");
|
||||
console.log("Usage: node parse.js [options] filename:");
|
||||
console.log(" -h [ --help ] Produce this help message");
|
||||
console.log(" -d [ --debug-names ] Preserve keysym names for debugging (Increases file size by ~40KB)");
|
||||
console.log(" filename The keysymdef.h file to parse");
|
||||
return;
|
||||
}
|
||||
|
||||
// Set this to false to omit key names from the generated keysymdef.js
|
||||
// This reduces the file size by around 40kb, but may hinder debugging
|
||||
|
||||
var buf = fs.readFileSync(filename);
|
||||
var str = buf.toString('utf8');
|
||||
|
||||
var re = /^\#define XK_([a-zA-Z_0-9]+)\s+0x([0-9a-fA-F]+)\s*(\/\*\s*(.*)\s*\*\/)?\s*$/m;
|
||||
|
||||
var arr = str.split('\n');
|
||||
|
||||
var keysyms = {};
|
||||
var codepoints = {};
|
||||
|
||||
for (var i = 0; i < arr.length; ++i) {
|
||||
var result = re.exec(arr[i]);
|
||||
if (result){
|
||||
var keyname = result[1];
|
||||
var keysym = parseInt(result[2], 16);
|
||||
var remainder = result[3];
|
||||
|
||||
keysyms[keysym] = keyname;
|
||||
|
||||
var unicodeRes = /U\+([0-9a-fA-F]+)/.exec(remainder);
|
||||
if (unicodeRes) {
|
||||
var unicode = parseInt(unicodeRes[1], 16);
|
||||
if (!codepoints[unicode]){
|
||||
codepoints[unicode] = keysym;
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.log("no unicode codepoint found:", arr[i]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.log("line is not a keysym:", arr[i]);
|
||||
}
|
||||
}
|
||||
|
||||
var out = "// This file describes mappings from Unicode codepoints to the keysym values\n" +
|
||||
"// (and optionally, key names) expected by the RFB protocol\n" +
|
||||
"// How this file was generated:\n" +
|
||||
"// " + process.argv.join(" ") + "\n" +
|
||||
"var keysyms = (function(){\n" +
|
||||
" \"use strict\";\n" +
|
||||
" var keynames = {keysyms};\n" +
|
||||
" var codepoints = {codepoints};\n" +
|
||||
"\n" +
|
||||
" function lookup(k) { return k ? {keysym: k, keyname: keynames ? keynames[k] : k} : undefined; }\n" +
|
||||
" return {\n" +
|
||||
" fromUnicode : function(u) { return lookup(codepoints[u]); },\n" +
|
||||
" lookup : lookup\n" +
|
||||
" };\n" +
|
||||
"})();\n";
|
||||
out = out.replace('{keysyms}', use_keynames ? JSON.stringify(keysyms) : "null");
|
||||
out = out.replace('{codepoints}', JSON.stringify(codepoints));
|
||||
|
||||
fs.writeFileSync("keysymdef.js", out);
|
||||
@@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Convert "U+..." commented entries in /usr/include/X11/keysymdef.h
|
||||
# into JavaScript for use by noVNC. Note this is likely to produce
|
||||
# a few duplicate properties with clashing values, that will need
|
||||
# resolving manually.
|
||||
#
|
||||
# Colin Dean <colin@xvpsource.org>
|
||||
#
|
||||
|
||||
regex="^#define[ \t]+XK_[A-Za-z0-9_]+[ \t]+0x([0-9a-fA-F]+)[ \t]+\/\*[ \t]+U\+([0-9a-fA-F]+)[ \t]+[^*]+.[ \t]+\*\/[ \t]*$"
|
||||
echo "unicodeTable = {"
|
||||
while read line; do
|
||||
if echo "${line}" | egrep -qs "${regex}"; then
|
||||
|
||||
x11=$(echo "${line}" | sed -r "s/${regex}/\1/")
|
||||
vnc=$(echo "${line}" | sed -r "s/${regex}/\2/")
|
||||
|
||||
if echo "${vnc}" | egrep -qs "^00[2-9A-F][0-9A-F]$"; then
|
||||
: # skip ISO Latin-1 (U+0020 to U+00FF) as 1-to-1 mapping
|
||||
else
|
||||
# note 1-to-1 is possible (e.g. for Euro symbol, U+20AC)
|
||||
echo " 0x${vnc} : 0x${x11},"
|
||||
fi
|
||||
fi
|
||||
done < /usr/include/X11/keysymdef.h | uniq
|
||||
echo "};"
|
||||
|
||||
Reference in New Issue
Block a user