Commit 4c44bdcb704945980898a04c556d1377c267a3f1

Authored by aurel32
1 parent 80621676

SDL mouse events smoothness

(Samuel Thibault)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4049 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 20 additions and 16 deletions
@@ -276,8 +276,6 @@ static void sdl_grab_start(void) @@ -276,8 +276,6 @@ static void sdl_grab_start(void)
276 } else 276 } else
277 sdl_hide_cursor(); 277 sdl_hide_cursor();
278 SDL_WM_GrabInput(SDL_GRAB_ON); 278 SDL_WM_GrabInput(SDL_GRAB_ON);
279 - /* dummy read to avoid moving the mouse */  
280 - SDL_GetRelativeMouseState(NULL, NULL);  
281 gui_grab = 1; 279 gui_grab = 1;
282 sdl_update_caption(); 280 sdl_update_caption();
283 } 281 }
@@ -290,10 +288,9 @@ static void sdl_grab_end(void) @@ -290,10 +288,9 @@ static void sdl_grab_end(void)
290 sdl_update_caption(); 288 sdl_update_caption();
291 } 289 }
292 290
293 -static void sdl_send_mouse_event(int dz) 291 +static void sdl_send_mouse_event(int dx, int dy, int dz, int x, int y, int state)
294 { 292 {
295 - int dx, dy, state, buttons;  
296 - state = SDL_GetRelativeMouseState(&dx, &dy); 293 + int buttons;
297 buttons = 0; 294 buttons = 0;
298 if (state & SDL_BUTTON(SDL_BUTTON_LEFT)) 295 if (state & SDL_BUTTON(SDL_BUTTON_LEFT))
299 buttons |= MOUSE_EVENT_LBUTTON; 296 buttons |= MOUSE_EVENT_LBUTTON;
@@ -311,18 +308,18 @@ static void sdl_send_mouse_event(int dz) @@ -311,18 +308,18 @@ static void sdl_send_mouse_event(int dz)
311 absolute_enabled = 1; 308 absolute_enabled = 1;
312 } 309 }
313 310
314 - SDL_GetMouseState(&dx, &dy);  
315 - dx = dx * 0x7FFF / (width - 1);  
316 - dy = dy * 0x7FFF / (height - 1); 311 + dx = x * 0x7FFF / (width - 1);
  312 + dy = y * 0x7FFF / (height - 1);
317 } else if (absolute_enabled) { 313 } else if (absolute_enabled) {
318 sdl_show_cursor(); 314 sdl_show_cursor();
319 absolute_enabled = 0; 315 absolute_enabled = 0;
320 } else if (guest_cursor) { 316 } else if (guest_cursor) {
321 - SDL_GetMouseState(&dx, &dy);  
322 - dx -= guest_x;  
323 - dy -= guest_y;  
324 - guest_x += dx;  
325 - guest_y += dy; 317 + x -= guest_x;
  318 + y -= guest_y;
  319 + guest_x += x;
  320 + guest_y += y;
  321 + dx = x;
  322 + dy = y;
326 } 323 }
327 324
328 kbd_mouse_event(dx, dy, dz, buttons); 325 kbd_mouse_event(dx, dy, dz, buttons);
@@ -347,6 +344,7 @@ static void sdl_refresh(DisplayState *ds) @@ -347,6 +344,7 @@ static void sdl_refresh(DisplayState *ds)
347 { 344 {
348 SDL_Event ev1, *ev = &ev1; 345 SDL_Event ev1, *ev = &ev1;
349 int mod_state; 346 int mod_state;
  347 + int buttonstate = SDL_GetMouseState(NULL, NULL);
350 348
351 if (last_vm_running != vm_running) { 349 if (last_vm_running != vm_running) {
352 last_vm_running = vm_running; 350 last_vm_running = vm_running;
@@ -474,7 +472,8 @@ static void sdl_refresh(DisplayState *ds) @@ -474,7 +472,8 @@ static void sdl_refresh(DisplayState *ds)
474 case SDL_MOUSEMOTION: 472 case SDL_MOUSEMOTION:
475 if (gui_grab || kbd_mouse_is_absolute() || 473 if (gui_grab || kbd_mouse_is_absolute() ||
476 absolute_enabled) { 474 absolute_enabled) {
477 - sdl_send_mouse_event(0); 475 + sdl_send_mouse_event(ev->motion.xrel, ev->motion.yrel, 0,
  476 + ev->motion.x, ev->motion.y, ev->motion.state);
478 } 477 }
479 break; 478 break;
480 case SDL_MOUSEBUTTONDOWN: 479 case SDL_MOUSEBUTTONDOWN:
@@ -483,13 +482,18 @@ static void sdl_refresh(DisplayState *ds) @@ -483,13 +482,18 @@ static void sdl_refresh(DisplayState *ds)
483 SDL_MouseButtonEvent *bev = &ev->button; 482 SDL_MouseButtonEvent *bev = &ev->button;
484 if (!gui_grab && !kbd_mouse_is_absolute()) { 483 if (!gui_grab && !kbd_mouse_is_absolute()) {
485 if (ev->type == SDL_MOUSEBUTTONDOWN && 484 if (ev->type == SDL_MOUSEBUTTONDOWN &&
486 - (bev->state & SDL_BUTTON_LMASK)) { 485 + (bev->button == SDL_BUTTON_LEFT)) {
487 /* start grabbing all events */ 486 /* start grabbing all events */
488 sdl_grab_start(); 487 sdl_grab_start();
489 } 488 }
490 } else { 489 } else {
491 int dz; 490 int dz;
492 dz = 0; 491 dz = 0;
  492 + if (ev->type == SDL_MOUSEBUTTONDOWN) {
  493 + buttonstate |= SDL_BUTTON(bev->button);
  494 + } else {
  495 + buttonstate &= ~SDL_BUTTON(bev->button);
  496 + }
493 #ifdef SDL_BUTTON_WHEELUP 497 #ifdef SDL_BUTTON_WHEELUP
494 if (bev->button == SDL_BUTTON_WHEELUP && ev->type == SDL_MOUSEBUTTONDOWN) { 498 if (bev->button == SDL_BUTTON_WHEELUP && ev->type == SDL_MOUSEBUTTONDOWN) {
495 dz = -1; 499 dz = -1;
@@ -497,7 +501,7 @@ static void sdl_refresh(DisplayState *ds) @@ -497,7 +501,7 @@ static void sdl_refresh(DisplayState *ds)
497 dz = 1; 501 dz = 1;
498 } 502 }
499 #endif 503 #endif
500 - sdl_send_mouse_event(dz); 504 + sdl_send_mouse_event(0, 0, dz, bev->x, bev->y, buttonstate);
501 } 505 }
502 } 506 }
503 break; 507 break;