All of lore.kernel.org
 help / color / mirror / Atom feed
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;
 

             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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.