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,6 +41,8 @@ static int gui_fullscreen; | ||
41 | static int gui_key_modifier_pressed; | 41 | static int gui_key_modifier_pressed; |
42 | static int gui_keysym; | 42 | static int gui_keysym; |
43 | static int gui_fullscreen_initial_grab; | 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 | static void sdl_update(DisplayState *ds, int x, int y, int w, int h) | 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,10 +277,22 @@ static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev) | ||
275 | 277 | ||
276 | #endif | 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 | static void sdl_process_key(SDL_KeyboardEvent *ev) | 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 | if (ev->keysym.sym == SDLK_PAUSE) { | 297 | if (ev->keysym.sym == SDLK_PAUSE) { |
284 | /* specific case */ | 298 | /* specific case */ |
@@ -297,13 +311,7 @@ static void sdl_process_key(SDL_KeyboardEvent *ev) | @@ -297,13 +311,7 @@ static void sdl_process_key(SDL_KeyboardEvent *ev) | ||
297 | switch(keycode) { | 311 | switch(keycode) { |
298 | case 0x00: | 312 | case 0x00: |
299 | /* sent when leaving window: reset the modifiers state */ | 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 | return; | 315 | return; |
308 | case 0x2a: /* Left Shift */ | 316 | case 0x2a: /* Left Shift */ |
309 | case 0x36: /* Right Shift */ | 317 | case 0x36: /* Right Shift */ |
@@ -341,7 +349,7 @@ static void sdl_update_caption(void) | @@ -341,7 +349,7 @@ static void sdl_update_caption(void) | ||
341 | strcat(buf, " [Stopped]"); | 349 | strcat(buf, " [Stopped]"); |
342 | } | 350 | } |
343 | if (gui_grab) { | 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 | SDL_WM_SetCaption(buf, "QEMU"); | 354 | SDL_WM_SetCaption(buf, "QEMU"); |
347 | } | 355 | } |
@@ -422,17 +430,19 @@ static void sdl_refresh(DisplayState *ds) | @@ -422,17 +430,19 @@ static void sdl_refresh(DisplayState *ds) | ||
422 | case SDL_KEYDOWN: | 430 | case SDL_KEYDOWN: |
423 | case SDL_KEYUP: | 431 | case SDL_KEYUP: |
424 | if (ev->type == SDL_KEYDOWN) { | 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 | gui_key_modifier_pressed = mod_state; | 435 | gui_key_modifier_pressed = mod_state; |
428 | if (gui_key_modifier_pressed) { | 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 | toggle_full_screen(ds); | 441 | toggle_full_screen(ds); |
432 | gui_keysym = 1; | 442 | gui_keysym = 1; |
433 | break; | 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 | if (is_active_console(vga_console)) { | 446 | if (is_active_console(vga_console)) { |
437 | /* tell the vga console to redisplay itself */ | 447 | /* tell the vga console to redisplay itself */ |
438 | vga_invalidate_display(); | 448 | vga_invalidate_display(); |
@@ -446,8 +456,7 @@ static void sdl_refresh(DisplayState *ds) | @@ -446,8 +456,7 @@ static void sdl_refresh(DisplayState *ds) | ||
446 | default: | 456 | default: |
447 | break; | 457 | break; |
448 | } | 458 | } |
449 | - } | ||
450 | - if (!is_active_console(vga_console)) { | 459 | + } else if (!is_active_console(vga_console)) { |
451 | int keysym; | 460 | int keysym; |
452 | keysym = 0; | 461 | keysym = 0; |
453 | if (ev->key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) { | 462 | if (ev->key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) { |
@@ -483,15 +492,18 @@ static void sdl_refresh(DisplayState *ds) | @@ -483,15 +492,18 @@ static void sdl_refresh(DisplayState *ds) | ||
483 | } | 492 | } |
484 | } | 493 | } |
485 | } else if (ev->type == SDL_KEYUP) { | 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 | if (!mod_state) { | 496 | if (!mod_state) { |
488 | if (gui_key_modifier_pressed) { | 497 | if (gui_key_modifier_pressed) { |
489 | if (gui_keysym == 0) { | 498 | if (gui_keysym == 0) { |
490 | - /* exit/enter grab if pressing Ctrl-Shift */ | 499 | + /* exit/enter grab if pressing Ctrl-Alt */ |
491 | if (!gui_grab) | 500 | if (!gui_grab) |
492 | sdl_grab_start(); | 501 | sdl_grab_start(); |
493 | else | 502 | else |
494 | sdl_grab_end(); | 503 | sdl_grab_end(); |
504 | + /* SDL does not send back all the | ||
505 | + modifiers key, so we must correct it */ | ||
506 | + reset_keys(); | ||
495 | break; | 507 | break; |
496 | } | 508 | } |
497 | gui_key_modifier_pressed = 0; | 509 | gui_key_modifier_pressed = 0; |