input: make vnc use mouse mode notifiers

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>
This commit is contained in:
Anthony Liguori 2010-03-10 09:38:29 -06:00
parent 1aaee43cf7
commit 37c34d9d5d
2 changed files with 10 additions and 5 deletions

13
vnc.c
View File

@ -1109,6 +1109,7 @@ static void vnc_disconnect_finish(VncState *vs)
dcl->idle = 1; dcl->idle = 1;
} }
qemu_remove_mouse_mode_change_notifier(&vs->mouse_mode_notifier);
vnc_remove_timer(vs->vd); vnc_remove_timer(vs->vd);
if (vs->vd->lock_key_sync) if (vs->vd->lock_key_sync)
qemu_remove_led_event_handler(vs->led); qemu_remove_led_event_handler(vs->led);
@ -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(Notifier *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) { if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE) && vs->absolute != absolute) {
vnc_write_u8(vs, 0); vnc_write_u8(vs, 0);
vnc_write_u8(vs, 0); vnc_write_u8(vs, 0);
@ -1476,8 +1480,6 @@ static void pointer_event(VncState *vs, int button_mask, int x, int y)
vs->last_x = x; vs->last_x = x;
vs->last_y = y; vs->last_y = y;
} }
check_pointer_type_change(vs, kbd_mouse_is_absolute());
} }
static void reset_keys(VncState *vs) static void reset_keys(VncState *vs)
@ -1818,8 +1820,6 @@ static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings)
break; break;
} }
} }
check_pointer_type_change(vs, kbd_mouse_is_absolute());
} }
static void set_pixel_conversion(VncState *vs) static void set_pixel_conversion(VncState *vs)
@ -2436,6 +2436,9 @@ static void vnc_connect(VncDisplay *vd, int csock)
if (vs->vd->lock_key_sync) if (vs->vd->lock_key_sync)
vs->led = qemu_add_led_event_handler(kbd_leds, 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); vnc_init_timer(vd);
/* vs might be free()ed here */ /* vs might be free()ed here */

2
vnc.h
View File

@ -168,6 +168,8 @@ struct VncState
Buffer zlib_tmp; Buffer zlib_tmp;
z_stream zlib_stream[4]; z_stream zlib_stream[4];
Notifier mouse_mode_notifier;
QTAILQ_ENTRY(VncState) next; QTAILQ_ENTRY(VncState) next;
}; };