Patchwork [6/7] input: make vnc use mouse mode notifiers

login
register
mail settings
Submitter Anthony Liguori
Date March 10, 2010, 4:51 p.m.
Message ID <1268239869-16058-6-git-send-email-aliguori@us.ibm.com>
Download mbox | patch
Permalink /patch/47262/
State New
Headers show

Comments

Anthony Liguori - March 10, 2010, 4:51 p.m.
When we switch to absolute mode, we send out a notification (if the client
supports it).  Today, we only send this notification when the client sends us
a mouse event and we're in the wrong mode.

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
---
 vnc.c |   13 ++++++++-----
 vnc.h |    2 ++
 2 files changed, 10 insertions(+), 5 deletions(-)
Gerd Hoffmann - March 10, 2010, 10:37 p.m.
On 03/10/10 17:51, Anthony Liguori wrote:
> When we switch to absolute mode, we send out a notification (if the client
> supports it).  Today, we only send this notification when the client sends us
> a mouse event and we're in the wrong mode.

Very nice.

ACK for the whole patch series.

cheers,
   Gerd

Patch

diff --git a/vnc.c b/vnc.c
index 7ce73dc..f4d7f12 100644
--- a/vnc.c
+++ b/vnc.c
@@ -1110,6 +1110,7 @@  static void vnc_disconnect_finish(VncState *vs)
         dcl->idle = 1;
     }
 
+    qemu_remove_mouse_mode_change_notifier(&vs->mouse_mode_notifier);
     vnc_remove_timer(vs->vd);
     qemu_remove_led_event_handler(vs->led);
     qemu_free(vs);
@@ -1427,8 +1428,11 @@  static void client_cut_text(VncState *vs, size_t len, uint8_t *text)
 {
 }
 
-static void check_pointer_type_change(VncState *vs, int absolute)
+static void check_pointer_type_change(QEMUNotifier *notifier)
 {
+    VncState *vs = container_of(notifier, VncState, mouse_mode_notifier);
+    int absolute = kbd_mouse_is_absolute();
+
     if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE) && vs->absolute != absolute) {
         vnc_write_u8(vs, 0);
         vnc_write_u8(vs, 0);
@@ -1474,8 +1478,6 @@  static void pointer_event(VncState *vs, int button_mask, int x, int y)
         vs->last_x = x;
         vs->last_y = y;
     }
-
-    check_pointer_type_change(vs, kbd_mouse_is_absolute());
 }
 
 static void reset_keys(VncState *vs)
@@ -1814,8 +1816,6 @@  static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings)
             break;
         }
     }
-
-    check_pointer_type_change(vs, kbd_mouse_is_absolute());
 }
 
 static void set_pixel_conversion(VncState *vs)
@@ -2431,6 +2431,9 @@  static void vnc_connect(VncDisplay *vd, int csock)
     reset_keys(vs);
     vs->led = qemu_add_led_event_handler(kbd_leds, vs);
 
+    vs->mouse_mode_notifier.notify = check_pointer_type_change;
+    qemu_add_mouse_mode_change_notifier(&vs->mouse_mode_notifier);
+
     vnc_init_timer(vd);
 
     /* vs might be free()ed here */
diff --git a/vnc.h b/vnc.h
index 0fc89bd..e1d764a 100644
--- a/vnc.h
+++ b/vnc.h
@@ -167,6 +167,8 @@  struct VncState
     Buffer zlib_tmp;
     z_stream zlib_stream[4];
 
+    QEMUNotifier mouse_mode_notifier;
+
     QTAILQ_ENTRY(VncState) next;
 };