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,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; |