1 | Keyboard mapping
|
---|
2 | ================
|
---|
3 | This release of rdesktop uses a new, portable keyboard mapping
|
---|
4 | implementation. It should hopefully work on all X11 systems. This new
|
---|
5 | implementation only looks at X11 keysyms: Not on (nonportable)
|
---|
6 | keycodes or modifier status. This means that rdesktop will obey your
|
---|
7 | local keyboard configuration. For example, if you have swapped
|
---|
8 | CapsLock and Control, rdesktop will use this mapping.
|
---|
9 |
|
---|
10 | XKB is currently not used. It seems like a good idea to me, but since
|
---|
11 | some X servers (like Xvnc) does not support XKB, we still need to use
|
---|
12 | the plain old interface as well, at least.
|
---|
13 |
|
---|
14 | There are still some small problems.
|
---|
15 |
|
---|
16 | * CapsLock: CapsLock changes are never sent to the RDP
|
---|
17 | server. rdesktop does not know which keys that are modified by
|
---|
18 | CapsLock and which are not. So, the CapsLock indicator in Wordpad
|
---|
19 | etc will always be off.
|
---|
20 |
|
---|
21 | Composing/Multi_key is supported. For more information, see:
|
---|
22 |
|
---|
23 | MIT: $SRC/xc/nls/X11/locale/Compose/iso8859-1
|
---|
24 | XFree86: /usr/X11R6/lib/X11/locale/*/Compose
|
---|
25 | Solaris' Openwin: /usr/openwin/include/X11/Suncompose.h
|
---|
26 | /usr/openwin/lib/locale/*/Compose
|
---|
27 | Irix6: compose(5)
|
---|
28 |
|
---|
29 |
|
---|
30 | Keymap files
|
---|
31 | ============
|
---|
32 | The names of the keymaps follows RFC1766.
|
---|
33 |
|
---|
34 | (You can find a translation from Windows keyboard layout numbers to
|
---|
35 | keymap names by looking at
|
---|
36 | HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\RFC1766 in the
|
---|
37 | registry.)
|
---|
38 |
|
---|
39 |
|
---|
40 | Contents of keymap files
|
---|
41 | ========================
|
---|
42 | The keymaps are line based. There are four different types of lines:
|
---|
43 |
|
---|
44 | 1) include lines
|
---|
45 | Syntax:
|
---|
46 | include <another-map-file>
|
---|
47 |
|
---|
48 | Example:
|
---|
49 | include common
|
---|
50 |
|
---|
51 |
|
---|
52 | 2) map lines
|
---|
53 | Syntax:
|
---|
54 | map <hex-number>
|
---|
55 |
|
---|
56 | Example:
|
---|
57 | map 0x41d
|
---|
58 |
|
---|
59 | Map-lines specifies how the remote RDP server should interpret the
|
---|
60 | sent scancodes.
|
---|
61 |
|
---|
62 |
|
---|
63 | 3) Translation lines
|
---|
64 | Syntax:
|
---|
65 | <keysym-name> <scancode> [flags..]
|
---|
66 |
|
---|
67 | Example:
|
---|
68 | onehalf 0x29 shift
|
---|
69 |
|
---|
70 | The scancode can be found in scancodes.h. Note: The scancode value for
|
---|
71 | extended keys can be calculated by OR:ing with 0x80. Example: The
|
---|
72 | Delete key have the scancode sequence 0xe0, 0x52. You can get the
|
---|
73 | scancode value to put into the map file by running:
|
---|
74 |
|
---|
75 | python -c "print hex(0x80 | 0x52)"
|
---|
76 |
|
---|
77 | If flags are "altgr", "shift", the scancode sent for this keysym will
|
---|
78 | be prefixed with AltGr, or Shift.
|
---|
79 |
|
---|
80 | If flags includes "addupper", a translation for this keysyms uppercase
|
---|
81 | name will be added as well, in addition to the non-uppercase
|
---|
82 | name. Example:
|
---|
83 |
|
---|
84 | x 2d addupper
|
---|
85 |
|
---|
86 | ...will add an translation for "X" automatically, just like if you
|
---|
87 | would specify:
|
---|
88 |
|
---|
89 | X 2d shift
|
---|
90 |
|
---|
91 | If flags include "localstate", the modifier to send will be determined
|
---|
92 | by the local modifier state.
|
---|
93 |
|
---|
94 | If flags is "inhibit", nothing will be sent to the server.
|
---|
95 |
|
---|
96 | If flags is "numlock", rdesktop will make sure that the remote NumLock
|
---|
97 | state is on before generating the key event. Otherwise, it will make
|
---|
98 | sure NumLock is off.
|
---|
99 |
|
---|
100 |
|
---|
101 | 4) enable_compose
|
---|
102 |
|
---|
103 | If any line starts with the keyword "enable_compose", rdesktop will
|
---|
104 | enable local Compose/Multi_key handling. Enabling this will often make
|
---|
105 | it impossible to compose characters with dead keys (on the remote
|
---|
106 | side). This is because when local compose support is enabled, dead
|
---|
107 | keys will not be sent to the remote side.
|
---|
108 |
|
---|
109 |
|
---|
110 | 5) sequence lines
|
---|
111 | Syntax:
|
---|
112 | sequence <event-keysym-name> <keysym-name1> <keysym-name2> ...
|
---|
113 |
|
---|
114 | Examples:
|
---|
115 | sequence eacute dead_acute e
|
---|
116 | sequence F12 f o o at e x a m p l e period c o m
|
---|
117 |
|
---|
118 | Sequence lines allows you to specify that multiple scancodes should be
|
---|
119 | sent to the RDP server, in response to one X11 keyboard event. Note:
|
---|
120 | The sequence is sent at the X11 KeyPress event. Nothing is sent at
|
---|
121 | KeyRelease.
|
---|
122 |
|
---|
123 |
|
---|
124 | 6) keyboard_type lines
|
---|
125 | Syntax:
|
---|
126 | keyboard_type <hex-number>
|
---|
127 |
|
---|
128 | keyboard_type lines specifies the keyboard type. Default value is 0x4
|
---|
129 | (en-us 101/104 keys keyboard).
|
---|
130 |
|
---|
131 |
|
---|
132 | 7) keyboard_subtype lines
|
---|
133 | Syntax:
|
---|
134 | keyboard_subtype <hex-number>
|
---|
135 |
|
---|
136 | keyboard_subtype lines specifies the keyboard subtype. Default value
|
---|
137 | is 0x0 (en-us 101/104 keys keyboard).
|
---|
138 |
|
---|
139 |
|
---|
140 | 8) keyboard_functionkeys lines
|
---|
141 | Syntax:
|
---|
142 | keyboard_functionkeys <hex-number>
|
---|
143 |
|
---|
144 | keyboard_functionkeys specifies the number of keyboard function
|
---|
145 | keys. Default value is 0xc (12, for standard 101/104 keys keyboard).
|
---|
146 |
|
---|
147 |
|
---|
148 |
|
---|
149 |
|
---|
150 | Suggested X11 keysym mapping on PCs
|
---|
151 | ===================================
|
---|
152 | Unfortunately, there is no standard for which keysyms a given key
|
---|
153 | should generate. If you have a PC-keyboard with Windows keys, I suggest this mapping:
|
---|
154 |
|
---|
155 | Keyboard keys:
|
---|
156 | CtrlLeft WinLeft AltLeft Space AltGr WinRight Menu CtrlRight
|
---|
157 |
|
---|
158 | ...should generate keysyms:
|
---|
159 | Control_L Super_L Alt_L space Mode_switch Super_R Menu Control_R
|
---|
160 |
|
---|
161 | Additionally:
|
---|
162 | Shift-Alt should produce Meta_L
|
---|
163 | Shift-AltGr should produce Multi_Key.
|
---|
164 |
|
---|
165 | Use a modifier-map like this:
|
---|
166 |
|
---|
167 | shift Shift_L (0x32), Shift_R (0x3e)
|
---|
168 | lock Caps_Lock (0x25)
|
---|
169 | control Control_L (0x42), Control_R (0x6d)
|
---|
170 | mod1 Alt_L (0x40)
|
---|
171 | mod2 Num_Lock (0x4d)
|
---|
172 | mod3 Mode_switch (0x71)
|
---|
173 | mod4 Super_L (0x73), Super_R (0x74)
|
---|
174 | mod5 Scroll_Lock (0x4e)
|
---|
175 |
|
---|
176 |
|
---|
177 | Updating / writing keymap files
|
---|
178 | ===============================
|
---|
179 | When writing new or updating keymap files, please use comments and
|
---|
180 | blanks, to increase readability. The "sv" keymap is a good template.
|
---|
181 |
|
---|
182 | When you need to add a translation to a keymap file, do:
|
---|
183 |
|
---|
184 | 1. Get the "key number" for this key, by looking at keynums.png.
|
---|
185 |
|
---|
186 | 2. Take a look at scancodes.h, and look for
|
---|
187 | SCANCODE_KEY_<my-key-number>. The scancode value is at the end of
|
---|
188 | the line. If the line contains (SCANCODE_EXTENDED | 0xsomething),
|
---|
189 | then you should OR 0x80 to this value. For example, you can do:
|
---|
190 |
|
---|
191 | python -c "print hex(0x80 | 0xsomething)"
|
---|
192 |
|
---|
193 | 3. Put the scancode (from step 2) and keysym name (found in the
|
---|
194 | error message) into the keymap file.
|
---|
195 |
|
---|
196 |
|
---|
197 | Special keys
|
---|
198 | ============
|
---|
199 |
|
---|
200 | * The combination Ctrl-Alt-Enter toggles between fullscreen and
|
---|
201 | non-fullscreen mode.
|
---|
202 |
|
---|
203 | * Meta, Hyper and Super are treated as windows keys. RDP4 does not
|
---|
204 | support the windows keys though, so if you are running RDP4, these
|
---|
205 | keys will translate to Ctrl-Esc.
|
---|
206 |
|
---|
207 |
|
---|
208 | Links
|
---|
209 | =====
|
---|
210 | http://www.win.tue.nl/~aeb/linux/kbd/scancodes.html
|
---|
211 |
|
---|
212 |
|
---|
213 | Test cases
|
---|
214 | ==========
|
---|
215 | When changing the keyboard code, make sure all these tests in Notepad
|
---|
216 | works:
|
---|
217 |
|
---|
218 | 1. Ctrl+f should bring up Find dialog, with CapsLock both on and off.
|
---|
219 |
|
---|
220 | 2. Ctrl+Shift+arrows should mark text, with CapsLock both on and off.
|
---|
221 |
|
---|
222 | 3. Test a sequence, like egrave. If you don't have this symbol in your
|
---|
223 | keyboard layout, try something like:
|
---|
224 |
|
---|
225 | xmodmap -e "keycode 49 = egrave"
|
---|
226 |
|
---|
227 | 4. Test a char generated with AltGr, such as @ on a swedish keyboard.
|
---|
228 |
|
---|
229 | 5. Test Ctrl-Alt-Delete.
|
---|
230 |
|
---|
231 | 6. Ctrl-Alt-Enter should toggle fullscreen.
|
---|
232 |
|
---|
233 | 7. Test NumLock synchronization using the -N option. Excel is able to
|
---|
234 | indicate the current NumLock state. Verify that the status is
|
---|
235 | updated correctly on reconnects.
|
---|
236 |
|
---|
237 | 8. Test the Windows keys, standalone as well as in combination with,
|
---|
238 | say, E.
|
---|
239 |
|
---|
240 | 9. Make sure the system menu (via Alt-space) cannot be accessed in
|
---|
241 | single app mode.
|
---|
242 |
|
---|
243 | 10. Make sure keymaps can be loaded from ~/.rdesktop/keymaps,
|
---|
244 | KEYMAP_PATH, $CWD/keymaps, and from an absolute path.
|
---|
245 |
|
---|
246 | 11. Press Shift, then press a key modified by shift, the release
|
---|
247 | shift, then release the other key. Do this in a speedy fasion.
|
---|
248 | Make sure the shift state is not stuck down.
|
---|
249 |
|
---|
250 | 12. Test all numpad keys, when not using the -N option.
|
---|
251 |
|
---|
252 | 13. Map a single, un-shifted key (such as F1) to XK_A:
|
---|
253 | xmodmap -e "keycode 67 = A A"
|
---|
254 |
|
---|
255 | Perform in Notepad:
|
---|
256 | * Write some text
|
---|
257 | * Press F1
|
---|
258 | * Press b
|
---|
259 | * Release b
|
---|
260 | * Release F1
|
---|
261 |
|
---|
262 | Verify that shift is not stuck down, by clicking on the text.
|
---|
263 |
|
---|
264 | 14. Use a keyboard layout where Meta_L can be generated with Shift_R +
|
---|
265 | Alt_L. Then:
|
---|
266 |
|
---|
267 | * Start Notepad
|
---|
268 | * Press Shift_R
|
---|
269 | * Press Alt_L
|
---|
270 | * Release Shift_R
|
---|
271 | * Release Alt_L
|
---|
272 | * Press "e"
|
---|
273 |
|
---|
274 | Verify that you get an "e" in Notepad, rather than start Windows
|
---|
275 | Explorer.
|
---|