From: Anthony Liguori <aliguori@cs.utexas.edu>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH] Support VNC PointerTypeChange psuedo-encoding
Date: Fri, 05 Jan 2007 21:30:32 -0600 [thread overview]
Message-ID: <459F17D8.2090703@cs.utexas.edu> (raw)
[-- Attachment #1: Type: text/plain, Size: 913 bytes --]
The following patch adds support to the VNC server for the
PointerTypeChange. This is a new encoding I've defined specifically for
virtualization. It allows a VNC client to support a server that has a
relative mouse (such as a PS/2 mouse in QEMU). If you're familiar with
the mouse being offset in a VNC session, this patch is the proper way to
address that.
This extension is documented at http://tocm.wikidot.com/pointertypechange
It uses a type that I've reserved in the latest RFB spec.
Currently, the only client that supports this encoding is my PoC client
available at http://hg.codemonkey.ws/vnc-gui. I've also talked to Dan
Berrange, the virt-manager maintainer, and I believe he plans on
supporting this extension in virt-manager too. Once QEMU supports the
encoding, I suspect some of the other more popular VNC clients will
considering also supporting it.
Regards,
Anthony Liguori
[-- Attachment #2: vnc-relative-mouse.diff --]
[-- Type: text/x-patch, Size: 2569 bytes --]
diff -r a137f714c033 vnc.c
--- a/vnc.c Sun Dec 17 23:58:38 2006 -0600
+++ b/vnc.c Sun Dec 17 23:58:51 2006 -0600
@@ -68,6 +68,11 @@ struct VncState
int depth; /* internal VNC frame buffer byte per pixel */
int has_resize;
int has_hextile;
+ int has_pointer_type_change;
+ int absolute;
+ int last_x;
+ int last_y;
+
Buffer output;
Buffer input;
kbd_layout_t *kbd_layout;
@@ -671,6 +676,19 @@ static void client_cut_text(VncState *vs
{
}
+static void check_pointer_type_change(VncState *vs, int absolute)
+{
+ if (vs->has_pointer_type_change && vs->absolute != absolute) {
+ vnc_write_u8(vs, 0);
+ vnc_write_u8(vs, 0);
+ vnc_write_u16(vs, 1);
+ vnc_framebuffer_update(vs, absolute, 0,
+ vs->ds->width, vs->ds->height, -257);
+ vnc_flush(vs);
+ }
+ vs->absolute = absolute;
+}
+
static void pointer_event(VncState *vs, int button_mask, int x, int y)
{
int buttons = 0;
@@ -686,21 +704,26 @@ static void pointer_event(VncState *vs,
dz = -1;
if (button_mask & 0x10)
dz = 1;
-
- if (kbd_mouse_is_absolute()) {
+
+ if (vs->absolute) {
kbd_mouse_event(x * 0x7FFF / vs->ds->width,
y * 0x7FFF / vs->ds->height,
dz, buttons);
+ } else if (vs->has_pointer_type_change) {
+ x -= 0x7FFF;
+ y -= 0x7FFF;
+
+ kbd_mouse_event(x, y, dz, buttons);
} else {
- static int last_x = -1;
- static int last_y = -1;
-
- if (last_x != -1)
- kbd_mouse_event(x - last_x, y - last_y, dz, buttons);
-
- last_x = x;
- last_y = y;
- }
+ if (vs->last_x != -1)
+ kbd_mouse_event(x - vs->last_x,
+ y - vs->last_y,
+ dz, buttons);
+ vs->last_x = x;
+ vs->last_y = y;
+ }
+
+ check_pointer_type_change(vs, kbd_mouse_is_absolute());
}
static void reset_keys(VncState *vs)
@@ -829,6 +852,8 @@ static void set_encodings(VncState *vs,
vs->has_hextile = 0;
vs->has_resize = 0;
+ vs->has_pointer_type_change = 0;
+ vs->absolute = -1;
vs->ds->dpy_copy = NULL;
for (i = n_encodings - 1; i >= 0; i--) {
@@ -845,10 +870,15 @@ static void set_encodings(VncState *vs,
case -223: /* DesktopResize */
vs->has_resize = 1;
break;
+ case -257:
+ vs->has_pointer_type_change = 1;
+ break;
default:
break;
}
}
+
+ check_pointer_type_change(vs, kbd_mouse_is_absolute());
}
static int compute_nbits(unsigned int val)
@@ -1124,6 +1154,8 @@ void vnc_display_init(DisplayState *ds,
vs->lsock = -1;
vs->csock = -1;
vs->depth = 4;
+ vs->last_x = -1;
+ vs->last_y = -1;
vs->ds = ds;
next reply other threads:[~2007-01-06 3:30 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-01-06 3:30 Anthony Liguori [this message]
2007-01-07 17:20 ` [Qemu-devel] Re: [PATCH] Support VNC PointerTypeChange psuedo-encoding Daniel P. Berrange
-- strict thread matches above, loose matches on Subject: below --
2007-01-08 20:19 [Qemu-devel] " Nolan Leake
2007-01-08 20:52 ` Ramesh Dharan
2007-03-25 16:22 ` Anthony Liguori
2007-03-30 1:25 ` Ramesh Dharan
2007-03-30 2:55 ` Anthony Liguori
2007-03-25 17:20 ` Anthony Liguori
2007-03-30 0:54 ` Ramesh Dharan
2007-03-30 2:37 ` Anthony Liguori
2007-03-30 3:14 ` Ramesh Dharan
2007-03-30 3:23 ` Anthony Liguori
2007-03-30 3:26 ` Ramesh Dharan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=459F17D8.2090703@cs.utexas.edu \
--to=aliguori@cs.utexas.edu \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).