ioemu: fix SDL mouse events processing
- GetRelativeMouseState always returns the last position, so when the
polling loop gets several mouse events in one go, we would send
useless 'no move' events.
- So as to make sure we don't miss any mouse click / double click, we
should not use GetRelativeMouseState() to get the button state, but
keep records of the button state ourselves.
Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx>
diff -r 86e64b684fb2 tools/ioemu/sdl.c
--- a/tools/ioemu/sdl.c Wed Mar 05 11:10:29 2008 +0000
+++ b/tools/ioemu/sdl.c Wed Mar 05 11:41:24 2008 +0000
@@ -360,6 +360,7 @@
{
SDL_Event ev1, *ev = &ev1;
int mod_state;
+ int state;
if (last_vm_running != vm_running) {
last_vm_running = vm_running;
@@ -368,6 +369,7 @@
vga_hw_update();
+ state = SDL_GetMouseState(NULL, NULL);
while (SDL_PollEvent(ev)) {
switch (ev->type) {
case SDL_VIDEOEXPOSE:
@@ -475,41 +477,38 @@
case SDL_MOUSEMOTION:
if (gui_grab || kbd_mouse_is_absolute() ||
absolute_enabled) {
- int dx, dy, state;
- state = SDL_GetRelativeMouseState(&dx, &dy);
- sdl_send_mouse_event(dx, dy, 0, state);
+ int dx, dy;
+ SDL_GetRelativeMouseState(&dx, &dy);
+ if (dx || dy)
+ sdl_send_mouse_event(dx, dy, 0, state);
}
break;
case SDL_MOUSEBUTTONUP:
if (gui_grab || kbd_mouse_is_absolute()) {
- int dx, dy, state;
- state = SDL_GetRelativeMouseState(&dx, &dy);
- sdl_send_mouse_event(dx, dy, 0, state);
+ state &= ~SDL_BUTTON(ev->button.button);
+ sdl_send_mouse_event(0, 0, 0, state);
}
break;
case SDL_MOUSEBUTTONDOWN:
{
SDL_MouseButtonEvent *bev = &ev->button;
if (!gui_grab && !kbd_mouse_is_absolute()) {
- if (ev->type == SDL_MOUSEBUTTONDOWN &&
- (bev->state & SDL_BUTTON_LMASK)) {
+ if (bev->button == SDL_BUTTON_LEFT) {
/* start grabbing all events */
sdl_grab_start();
}
} else {
- int dx, dy, dz, state;
+ int dz;
dz = 0;
- state = SDL_GetRelativeMouseState(&dx, &dy);
+ state |= SDL_BUTTON(bev->button);
#ifdef SDL_BUTTON_WHEELUP
if (bev->button == SDL_BUTTON_WHEELUP) {
dz = -1;
} else if (bev->button == SDL_BUTTON_WHEELDOWN) {
dz = 1;
- } else {
- state = bev->button | state;
}
#endif
- sdl_send_mouse_event(dx, dy, dz, state);
+ sdl_send_mouse_event(0, 0, dz, state);
}
}
break;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|