Commit 4c44bdcb704945980898a04c556d1377c267a3f1
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
sdl.c
| ... | ... | @@ -276,8 +276,6 @@ static void sdl_grab_start(void) |
| 276 | 276 | } else |
| 277 | 277 | sdl_hide_cursor(); |
| 278 | 278 | SDL_WM_GrabInput(SDL_GRAB_ON); |
| 279 | - /* dummy read to avoid moving the mouse */ | |
| 280 | - SDL_GetRelativeMouseState(NULL, NULL); | |
| 281 | 279 | gui_grab = 1; |
| 282 | 280 | sdl_update_caption(); |
| 283 | 281 | } |
| ... | ... | @@ -290,10 +288,9 @@ static void sdl_grab_end(void) |
| 290 | 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 | 294 | buttons = 0; |
| 298 | 295 | if (state & SDL_BUTTON(SDL_BUTTON_LEFT)) |
| 299 | 296 | buttons |= MOUSE_EVENT_LBUTTON; |
| ... | ... | @@ -311,18 +308,18 @@ static void sdl_send_mouse_event(int dz) |
| 311 | 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 | 313 | } else if (absolute_enabled) { |
| 318 | 314 | sdl_show_cursor(); |
| 319 | 315 | absolute_enabled = 0; |
| 320 | 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 | 325 | kbd_mouse_event(dx, dy, dz, buttons); |
| ... | ... | @@ -347,6 +344,7 @@ static void sdl_refresh(DisplayState *ds) |
| 347 | 344 | { |
| 348 | 345 | SDL_Event ev1, *ev = &ev1; |
| 349 | 346 | int mod_state; |
| 347 | + int buttonstate = SDL_GetMouseState(NULL, NULL); | |
| 350 | 348 | |
| 351 | 349 | if (last_vm_running != vm_running) { |
| 352 | 350 | last_vm_running = vm_running; |
| ... | ... | @@ -474,7 +472,8 @@ static void sdl_refresh(DisplayState *ds) |
| 474 | 472 | case SDL_MOUSEMOTION: |
| 475 | 473 | if (gui_grab || kbd_mouse_is_absolute() || |
| 476 | 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 | 478 | break; |
| 480 | 479 | case SDL_MOUSEBUTTONDOWN: |
| ... | ... | @@ -483,13 +482,18 @@ static void sdl_refresh(DisplayState *ds) |
| 483 | 482 | SDL_MouseButtonEvent *bev = &ev->button; |
| 484 | 483 | if (!gui_grab && !kbd_mouse_is_absolute()) { |
| 485 | 484 | if (ev->type == SDL_MOUSEBUTTONDOWN && |
| 486 | - (bev->state & SDL_BUTTON_LMASK)) { | |
| 485 | + (bev->button == SDL_BUTTON_LEFT)) { | |
| 487 | 486 | /* start grabbing all events */ |
| 488 | 487 | sdl_grab_start(); |
| 489 | 488 | } |
| 490 | 489 | } else { |
| 491 | 490 | int dz; |
| 492 | 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 | 497 | #ifdef SDL_BUTTON_WHEELUP |
| 494 | 498 | if (bev->button == SDL_BUTTON_WHEELUP && ev->type == SDL_MOUSEBUTTONDOWN) { |
| 495 | 499 | dz = -1; |
| ... | ... | @@ -497,7 +501,7 @@ static void sdl_refresh(DisplayState *ds) |
| 497 | 501 | dz = 1; |
| 498 | 502 | } |
| 499 | 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 | 507 | break; | ... | ... |