mirror of
https://github.com/novnc/noVNC.git
synced 2026-06-05 20:09:41 +00:00
This is part of addressing issue #21 - non-US keyboard layouts. There are several challenges when dealing with keyboard events: - The meaning and use of keyCode, charCode and which depends on both the browser and the event type (keyDown/Up vs keyPress). - We cannot automatically determine the keyboard layout - The keyDown and keyUp events have a keyCode value that has not been translated by modifier keys. - The keyPress event has a translated (for layout and modifiers) character code but the attribute containing it differs. keyCode contains the translated value in WebKit (Chrome/Safari), Opera 11 and IE9. charCode contains the value in WebKit and Firefox. The which attribute contains the value on WebKit, Firefox and Opera 11. - The keyDown/Up keyCode value indicates (sort of) the physical key was pressed but only for standard US layout. On a US keyboard, the '-' and '_' characters are on the same key and generate a keyCode value of 189. But on an AZERTY keyboard even though they are different physical keys they both still generate a keyCode of 189! - To prevent a key event from propagating to the browser and causing unwanted default actions (such as closing a tab, opening a menu, shifting focus, etc) we must suppress this event in both keyDown and keyPress because not all key strokes generate on a keyPress event. Also, in WebKit and IE9 suppressing the keyDown prevents a keyPress but other browsers still generated a keyPress even if keyDown is suppressed. For safe key events, we wait until the keyPress event before reporting a key down event. For unsafe key events, we report a key down event when the keyDown event fires and we suppress any further actions (including keyPress). In order to report a key up event that matches what we reported for the key down event, we keep a list of keys that are currently down. When the keyDown event happens, we add the key event to the list. If it is a safe key event, then we update the which attribute in the most recent item on the list when we received a keyPress event (keyPress should immediately follow keyDown). When we received a keyUp event we search for the event on the list with a matching keyCode and we report the character code using the value in the 'which' attribute that was stored with that key. For character codes above 255 we use a character code to keysym lookup table. This is generated using the util/u2x11 script contributed by Colin Dean (xvpsource.org).
29 lines
903 B
Bash
Executable File
29 lines
903 B
Bash
Executable File
#!/bin/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 "};"
|
|
|