Commit 32ff25bf68e687a6c15bfef2d855faccb2740472
1 parent
f9859310
ctrl-alt is the default grab key - reset modifiers when toggling grab state
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1094 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
32 additions
and
20 deletions
sdl.c
| ... | ... | @@ -41,6 +41,8 @@ static int gui_fullscreen; |
| 41 | 41 | static int gui_key_modifier_pressed; |
| 42 | 42 | static int gui_keysym; |
| 43 | 43 | static int gui_fullscreen_initial_grab; |
| 44 | +static int gui_grab_code = KMOD_LALT | KMOD_LCTRL; | |
| 45 | +static uint8_t modifiers_state[256]; | |
| 44 | 46 | |
| 45 | 47 | static void sdl_update(DisplayState *ds, int x, int y, int w, int h) |
| 46 | 48 | { |
| ... | ... | @@ -275,10 +277,22 @@ static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev) |
| 275 | 277 | |
| 276 | 278 | #endif |
| 277 | 279 | |
| 280 | +static void reset_keys(void) | |
| 281 | +{ | |
| 282 | + int i; | |
| 283 | + for(i = 0; i < 256; i++) { | |
| 284 | + if (modifiers_state[i]) { | |
| 285 | + if (i & 0x80) | |
| 286 | + kbd_put_keycode(0xe0); | |
| 287 | + kbd_put_keycode(i | 0x80); | |
| 288 | + modifiers_state[i] = 0; | |
| 289 | + } | |
| 290 | + } | |
| 291 | +} | |
| 292 | + | |
| 278 | 293 | static void sdl_process_key(SDL_KeyboardEvent *ev) |
| 279 | 294 | { |
| 280 | - int keycode, v, i; | |
| 281 | - static uint8_t modifiers_state[256]; | |
| 295 | + int keycode, v; | |
| 282 | 296 | |
| 283 | 297 | if (ev->keysym.sym == SDLK_PAUSE) { |
| 284 | 298 | /* specific case */ |
| ... | ... | @@ -297,13 +311,7 @@ static void sdl_process_key(SDL_KeyboardEvent *ev) |
| 297 | 311 | switch(keycode) { |
| 298 | 312 | case 0x00: |
| 299 | 313 | /* sent when leaving window: reset the modifiers state */ |
| 300 | - for(i = 0; i < 256; i++) { | |
| 301 | - if (modifiers_state[i]) { | |
| 302 | - if (i & 0x80) | |
| 303 | - kbd_put_keycode(0xe0); | |
| 304 | - kbd_put_keycode(i | 0x80); | |
| 305 | - } | |
| 306 | - } | |
| 314 | + reset_keys(); | |
| 307 | 315 | return; |
| 308 | 316 | case 0x2a: /* Left Shift */ |
| 309 | 317 | case 0x36: /* Right Shift */ |
| ... | ... | @@ -341,7 +349,7 @@ static void sdl_update_caption(void) |
| 341 | 349 | strcat(buf, " [Stopped]"); |
| 342 | 350 | } |
| 343 | 351 | if (gui_grab) { |
| 344 | - strcat(buf, " - Press Ctrl-Shift to exit grab"); | |
| 352 | + strcat(buf, " - Press Ctrl-Alt to exit grab"); | |
| 345 | 353 | } |
| 346 | 354 | SDL_WM_SetCaption(buf, "QEMU"); |
| 347 | 355 | } |
| ... | ... | @@ -422,17 +430,19 @@ static void sdl_refresh(DisplayState *ds) |
| 422 | 430 | case SDL_KEYDOWN: |
| 423 | 431 | case SDL_KEYUP: |
| 424 | 432 | if (ev->type == SDL_KEYDOWN) { |
| 425 | - mod_state = (SDL_GetModState() & (KMOD_LSHIFT | KMOD_LCTRL)) == | |
| 426 | - (KMOD_LSHIFT | KMOD_LCTRL); | |
| 433 | + mod_state = (SDL_GetModState() & gui_grab_code) == | |
| 434 | + gui_grab_code; | |
| 427 | 435 | gui_key_modifier_pressed = mod_state; |
| 428 | 436 | if (gui_key_modifier_pressed) { |
| 429 | - switch(ev->key.keysym.sym) { | |
| 430 | - case SDLK_f: | |
| 437 | + int keycode; | |
| 438 | + keycode = sdl_keyevent_to_keycode(&ev->key); | |
| 439 | + switch(keycode) { | |
| 440 | + case 0x21: /* 'f' key on US keyboard */ | |
| 431 | 441 | toggle_full_screen(ds); |
| 432 | 442 | gui_keysym = 1; |
| 433 | 443 | break; |
| 434 | - case SDLK_F1 ... SDLK_F12: | |
| 435 | - console_select(ev->key.keysym.sym - SDLK_F1); | |
| 444 | + case 0x02 ... 0x0a: /* '1' to '9' keys */ | |
| 445 | + console_select(keycode - 0x02); | |
| 436 | 446 | if (is_active_console(vga_console)) { |
| 437 | 447 | /* tell the vga console to redisplay itself */ |
| 438 | 448 | vga_invalidate_display(); |
| ... | ... | @@ -446,8 +456,7 @@ static void sdl_refresh(DisplayState *ds) |
| 446 | 456 | default: |
| 447 | 457 | break; |
| 448 | 458 | } |
| 449 | - } | |
| 450 | - if (!is_active_console(vga_console)) { | |
| 459 | + } else if (!is_active_console(vga_console)) { | |
| 451 | 460 | int keysym; |
| 452 | 461 | keysym = 0; |
| 453 | 462 | if (ev->key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) { |
| ... | ... | @@ -483,15 +492,18 @@ static void sdl_refresh(DisplayState *ds) |
| 483 | 492 | } |
| 484 | 493 | } |
| 485 | 494 | } else if (ev->type == SDL_KEYUP) { |
| 486 | - mod_state = (SDL_GetModState() & (KMOD_LSHIFT | KMOD_LCTRL)); | |
| 495 | + mod_state = (SDL_GetModState() & gui_grab_code); | |
| 487 | 496 | if (!mod_state) { |
| 488 | 497 | if (gui_key_modifier_pressed) { |
| 489 | 498 | if (gui_keysym == 0) { |
| 490 | - /* exit/enter grab if pressing Ctrl-Shift */ | |
| 499 | + /* exit/enter grab if pressing Ctrl-Alt */ | |
| 491 | 500 | if (!gui_grab) |
| 492 | 501 | sdl_grab_start(); |
| 493 | 502 | else |
| 494 | 503 | sdl_grab_end(); |
| 504 | + /* SDL does not send back all the | |
| 505 | + modifiers key, so we must correct it */ | |
| 506 | + reset_keys(); | |
| 495 | 507 | break; |
| 496 | 508 | } |
| 497 | 509 | gui_key_modifier_pressed = 0; | ... | ... |