1 | Index: ioemu/vnc.c |
---|
2 | =================================================================== |
---|
3 | --- ioemu.orig/vnc.c 2006-12-06 23:46:11.000000000 +0000 |
---|
4 | +++ ioemu/vnc.c 2006-12-06 23:46:11.000000000 +0000 |
---|
5 | @@ -33,6 +33,10 @@ |
---|
6 | #include "vnc_keysym.h" |
---|
7 | #include "keymaps.c" |
---|
8 | |
---|
9 | +#define XK_MISCELLANY |
---|
10 | +#define XK_LATIN1 |
---|
11 | +#include <X11/keysymdef.h> |
---|
12 | + |
---|
13 | typedef struct Buffer |
---|
14 | { |
---|
15 | size_t capacity; |
---|
16 | @@ -96,6 +100,8 @@ |
---|
17 | int visible_h; |
---|
18 | |
---|
19 | int slow_client; |
---|
20 | + |
---|
21 | + int ctl_keys; /* Ctrl+Alt starts calibration */ |
---|
22 | }; |
---|
23 | |
---|
24 | #define DIRTY_PIXEL_BITS 64 |
---|
25 | @@ -796,16 +802,80 @@ |
---|
26 | |
---|
27 | static void do_key_event(VncState *vs, int down, uint32_t sym) |
---|
28 | { |
---|
29 | - int keycode; |
---|
30 | + sym &= 0xFFFF; |
---|
31 | |
---|
32 | - keycode = keysym2scancode(vs->kbd_layout, sym & 0xFFFF); |
---|
33 | + if (is_graphic_console()) { |
---|
34 | + int keycode; |
---|
35 | |
---|
36 | - if (keycode & 0x80) |
---|
37 | - kbd_put_keycode(0xe0); |
---|
38 | - if (down) |
---|
39 | - kbd_put_keycode(keycode & 0x7f); |
---|
40 | - else |
---|
41 | - kbd_put_keycode(keycode | 0x80); |
---|
42 | + keycode = keysym2scancode(vs->kbd_layout, sym); |
---|
43 | + if (keycode & 0x80) |
---|
44 | + kbd_put_keycode(0xe0); |
---|
45 | + if (down) |
---|
46 | + kbd_put_keycode(keycode & 0x7f); |
---|
47 | + else |
---|
48 | + kbd_put_keycode(keycode | 0x80); |
---|
49 | + } else if (down) { |
---|
50 | + int qemu_keysym = 0; |
---|
51 | + |
---|
52 | + if (sym <= 128) /* normal ascii */ |
---|
53 | + qemu_keysym = sym; |
---|
54 | + else { |
---|
55 | + switch (sym) { |
---|
56 | + case XK_Up: qemu_keysym = QEMU_KEY_UP; break; |
---|
57 | + case XK_Down: qemu_keysym = QEMU_KEY_DOWN; break; |
---|
58 | + case XK_Left: qemu_keysym = QEMU_KEY_LEFT; break; |
---|
59 | + case XK_Right: qemu_keysym = QEMU_KEY_RIGHT; break; |
---|
60 | + case XK_Home: qemu_keysym = QEMU_KEY_HOME; break; |
---|
61 | + case XK_End: qemu_keysym = QEMU_KEY_END; break; |
---|
62 | + case XK_Page_Up: qemu_keysym = QEMU_KEY_PAGEUP; break; |
---|
63 | + case XK_Page_Down: qemu_keysym = QEMU_KEY_PAGEDOWN; break; |
---|
64 | + case XK_BackSpace: qemu_keysym = QEMU_KEY_BACKSPACE; break; |
---|
65 | + case XK_Delete: qemu_keysym = QEMU_KEY_DELETE; break; |
---|
66 | + case XK_Return: |
---|
67 | + case XK_Linefeed: qemu_keysym = sym; break; |
---|
68 | + default: break; |
---|
69 | + } |
---|
70 | + } |
---|
71 | + if (qemu_keysym != 0) |
---|
72 | + kbd_put_keysym(qemu_keysym); |
---|
73 | + } |
---|
74 | + |
---|
75 | + if (down) { |
---|
76 | + switch (sym) { |
---|
77 | + case XK_Control_L: |
---|
78 | + vs->ctl_keys |= 1; |
---|
79 | + break; |
---|
80 | + |
---|
81 | + case XK_Alt_L: |
---|
82 | + vs->ctl_keys |= 2; |
---|
83 | + break; |
---|
84 | + |
---|
85 | + default: |
---|
86 | + break; |
---|
87 | + } |
---|
88 | + } else { |
---|
89 | + switch (sym) { |
---|
90 | + case XK_Control_L: |
---|
91 | + vs->ctl_keys &= ~1; |
---|
92 | + break; |
---|
93 | + |
---|
94 | + case XK_Alt_L: |
---|
95 | + vs->ctl_keys &= ~2; |
---|
96 | + break; |
---|
97 | + |
---|
98 | + case XK_1 ... XK_9: |
---|
99 | + if ((vs->ctl_keys & 3) != 3) |
---|
100 | + break; |
---|
101 | + |
---|
102 | + console_select(sym - XK_1); |
---|
103 | + if (is_graphic_console()) { |
---|
104 | + /* tell the vga console to redisplay itself */ |
---|
105 | + vga_hw_invalidate(); |
---|
106 | + vnc_dpy_update(vs->ds, 0, 0, vs->ds->width, vs->ds->height); |
---|
107 | + } |
---|
108 | + break; |
---|
109 | + } |
---|
110 | + } |
---|
111 | } |
---|
112 | |
---|
113 | static void key_event(VncState *vs, int down, uint32_t sym) |
---|