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