047483513a
xen-4.6.0-testing-src.tar.bz2 mini-os.tar.bz2 blktap2-no-uninit.patch stubdom-have-iovec.patch - Renamed xsa149.patch to CVE-2015-7969-xsa149.patch - Dropped patches now contained in tarball or unnecessary xen-4.5.2-testing-src.tar.bz2 54c2553c-grant-table-use-uint16_t-consistently-for-offset-and-length.patch 54ca33bc-grant-table-refactor-grant-copy-to-reduce-duplicate-code.patch 54ca340e-grant-table-defer-releasing-pages-acquired-in-a-grant-copy.patch 54f4985f-libxl-fix-libvirtd-double-free.patch 55103616-vm-assist-prepare-for-discontiguous-used-bit-numbers.patch 551ac326-xentop-add-support-for-qdisk.patch 552d0fd2-x86-hvm-don-t-include-asm-spinlock-h.patch 552d0fe8-x86-mtrr-include-asm-atomic.h.patch 552d293b-x86-vMSI-X-honor-all-mask-requests.patch 552d2966-x86-vMSI-X-add-valid-bits-for-read-acceleration.patch 5537a4d8-libxl-use-DEBUG-log-level-instead-of-INFO.patch 5548e903-domctl-don-t-truncate-XEN_DOMCTL_max_mem-requests.patch 5548e95d-x86-allow-to-suppress-M2P-user-mode-exposure.patch 554c7aee-x86-provide-arch_fetch_and_add.patch 554c7b00-arm-provide-arch_fetch_and_add.patch 554cc211-libxl-add-qxl.patch 55534b0a-x86-provide-add_sized.patch 55534b25-arm-provide-add_sized.patch 5555a4f8-use-ticket-locks-for-spin-locks.patch 5555a5b9-x86-arm-remove-asm-spinlock-h.patch 5555a8ec-introduce-non-contiguous-allocation.patch 556d973f-unmodified-drivers-tolerate-IRQF_DISABLED-being-undefined.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=387
158 lines
4.9 KiB
Diff
158 lines
4.9 KiB
Diff
From 9ca313aa0824f2d350a7a6c9b1ef6c47e0408f1d Mon Sep 17 00:00:00 2001
|
|
From: aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>
|
|
Date: Sat, 23 Aug 2008 23:27:37 +0000
|
|
Subject: [PATCH] VNC: Support for ExtendedKeyEvent client message
|
|
|
|
This patch adds support for the ExtendedKeyEvent client message. This message
|
|
allows a client to send raw scan codes directly to the server. If the client
|
|
and server are using the same keymap, then it's unnecessary to use the '-k'
|
|
option with QEMU when this extension is supported.
|
|
|
|
This is extension is currently only implemented by gtk-vnc based clients
|
|
(gvncviewer, virt-manager, vinagre, etc.).
|
|
|
|
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
|
|
|
|
|
|
|
|
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5076 c046a42c-6fe2-441c-8c8c-71466251a162
|
|
---
|
|
vnc.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++---------
|
|
1 files changed, 50 insertions(+), 9 deletions(-)
|
|
|
|
Index: xen-4.6.0-testing/tools/qemu-xen-traditional-dir-remote/vnc.c
|
|
===================================================================
|
|
--- xen-4.6.0-testing.orig/tools/qemu-xen-traditional-dir-remote/vnc.c
|
|
+++ xen-4.6.0-testing/tools/qemu-xen-traditional-dir-remote/vnc.c
|
|
@@ -1285,35 +1285,22 @@ static void press_key_altgr_down(VncStat
|
|
}
|
|
}
|
|
|
|
-static void do_key_event(VncState *vs, int down, uint32_t sym)
|
|
+static void do_key_event(VncState *vs, int down, int keycode, int sym, int shift)
|
|
{
|
|
- int keycode;
|
|
int shift_keys = 0;
|
|
- int shift = 0;
|
|
int keypad = 0;
|
|
int altgr = 0;
|
|
int altgr_keys = 0;
|
|
|
|
if (is_graphic_console()) {
|
|
- if (sym >= 'A' && sym <= 'Z') {
|
|
- sym = sym - 'A' + 'a';
|
|
- shift = 1;
|
|
- }
|
|
- else {
|
|
+ if (!shift)
|
|
shift = keysym_is_shift(vs->kbd_layout, sym & 0xFFFF);
|
|
- }
|
|
|
|
altgr = keysym_is_altgr(vs->kbd_layout, sym & 0xFFFF);
|
|
}
|
|
shift_keys = vs->modifiers_state[0x2a] | vs->modifiers_state[0x36];
|
|
altgr_keys = vs->modifiers_state[0xb8];
|
|
|
|
- keycode = keysym2scancode(vs->kbd_layout, sym & 0xFFFF);
|
|
- if (keycode == 0) {
|
|
- fprintf(stderr, "Key lost : keysym=0x%x(%d)\n", sym, sym);
|
|
- return;
|
|
- }
|
|
-
|
|
/* QEMU console switch */
|
|
switch(keycode) {
|
|
case 0x2a: /* Left Shift */
|
|
@@ -1445,7 +1432,25 @@ static void do_key_event(VncState *vs, i
|
|
|
|
static void key_event(VncState *vs, int down, uint32_t sym)
|
|
{
|
|
- do_key_event(vs, down, sym);
|
|
+ int keycode;
|
|
+ int shift = 0;
|
|
+
|
|
+ if (sym >= 'A' && sym <= 'Z' && is_graphic_console()) {
|
|
+ sym = sym - 'A' + 'a';
|
|
+ shift = 1;
|
|
+ }
|
|
+ keycode = keysym2scancode(vs->kbd_layout, sym & 0xFFFF);
|
|
+ do_key_event(vs, down, keycode, sym, shift);
|
|
+}
|
|
+
|
|
+static void ext_key_event(VncState *vs, int down,
|
|
+ uint32_t sym, uint16_t keycode)
|
|
+{
|
|
+ /* if the user specifies a keyboard layout, always use it */
|
|
+ if (keyboard_layout)
|
|
+ key_event(vs, down, sym);
|
|
+ else
|
|
+ do_key_event(vs, down, keycode, sym, 0);
|
|
}
|
|
|
|
static void framebuffer_set_updated(VncState *vs, int x, int y, int w, int h)
|
|
@@ -1534,6 +1539,15 @@ static void framebuffer_update_request(V
|
|
qemu_mod_timer(vs->timer, qemu_get_clock(rt_clock));
|
|
}
|
|
|
|
+static void send_ext_key_event_ack(VncState *vs)
|
|
+{
|
|
+ vnc_write_u8(vs, 0);
|
|
+ vnc_write_u8(vs, 0);
|
|
+ vnc_write_u16(vs, 1);
|
|
+ vnc_framebuffer_update(vs, 0, 0, ds_get_width(vs->ds), ds_get_height(vs->ds), -258);
|
|
+ vnc_flush(vs);
|
|
+}
|
|
+
|
|
static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings)
|
|
{
|
|
int i;
|
|
@@ -1562,6 +1576,9 @@ static void set_encodings(VncState *vs,
|
|
case -257:
|
|
vs->has_pointer_type_change = 1;
|
|
break;
|
|
+ case -258:
|
|
+ send_ext_key_event_ack(vs);
|
|
+ break;
|
|
case 0x574D5669:
|
|
vs->has_WMVi = 1;
|
|
default:
|
|
@@ -1780,6 +1797,24 @@ static int protocol_client_msg(VncState
|
|
|
|
client_cut_text(vs, read_u32(data, 4), (char *)(data + 8));
|
|
break;
|
|
+ case 255:
|
|
+ if (len == 1)
|
|
+ return 2;
|
|
+
|
|
+ switch (read_u8(data, 1)) {
|
|
+ case 0:
|
|
+ if (len == 2)
|
|
+ return 12;
|
|
+
|
|
+ ext_key_event(vs, read_u16(data, 2),
|
|
+ read_u32(data, 4), read_u32(data, 8));
|
|
+ break;
|
|
+ default:
|
|
+ printf("Msg: %d\n", read_u16(data, 0));
|
|
+ vnc_client_error(vs);
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
default:
|
|
printf("Msg: %d\n", data[0]);
|
|
vnc_client_error(vs);
|
|
@@ -2451,10 +2486,11 @@ void vnc_display_init(DisplayState *ds)
|
|
|
|
vs->ds = ds;
|
|
|
|
- if (!keyboard_layout)
|
|
- keyboard_layout = "en-us";
|
|
+ if (keyboard_layout)
|
|
+ vs->kbd_layout = init_keyboard_layout(keyboard_layout);
|
|
+ else
|
|
+ vs->kbd_layout = init_keyboard_layout("en-us");
|
|
|
|
- vs->kbd_layout = init_keyboard_layout(keyboard_layout);
|
|
if (!vs->kbd_layout)
|
|
exit(1);
|
|
vs->modifiers_state[0x45] = 1; /* NumLock on - on boot */
|