From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1H32Gb-0005Z2-PW for qemu-devel@nongnu.org; Fri, 05 Jan 2007 22:30:45 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1H32GZ-0005XJ-VR for qemu-devel@nongnu.org; Fri, 05 Jan 2007 22:30:45 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1H32GZ-0005X2-RK for qemu-devel@nongnu.org; Fri, 05 Jan 2007 22:30:43 -0500 Received: from [128.83.139.10] (helo=mail.cs.utexas.edu) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA:32) (Exim 4.52) id 1H32GZ-00033o-F6 for qemu-devel@nongnu.org; Fri, 05 Jan 2007 22:30:43 -0500 Message-ID: <459F17D8.2090703@cs.utexas.edu> Date: Fri, 05 Jan 2007 21:30:32 -0600 From: Anthony Liguori MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------090508050200050305040805" Subject: [Qemu-devel] [PATCH] Support VNC PointerTypeChange psuedo-encoding Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org This is a multi-part message in MIME format. --------------090508050200050305040805 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit 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 --------------090508050200050305040805 Content-Type: text/x-patch; name="vnc-relative-mouse.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="vnc-relative-mouse.diff" 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; --------------090508050200050305040805--