mirror of https://github.com/xemu-project/xemu.git
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
This commit is contained in:
parent
f98593103b
commit
32ff25bf68
52
sdl.c
52
sdl.c
|
@ -41,6 +41,8 @@ static int gui_fullscreen;
|
|||
static int gui_key_modifier_pressed;
|
||||
static int gui_keysym;
|
||||
static int gui_fullscreen_initial_grab;
|
||||
static int gui_grab_code = KMOD_LALT | KMOD_LCTRL;
|
||||
static uint8_t modifiers_state[256];
|
||||
|
||||
static void sdl_update(DisplayState *ds, int x, int y, int w, int h)
|
||||
{
|
||||
|
@ -275,10 +277,22 @@ static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev)
|
|||
|
||||
#endif
|
||||
|
||||
static void reset_keys(void)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < 256; i++) {
|
||||
if (modifiers_state[i]) {
|
||||
if (i & 0x80)
|
||||
kbd_put_keycode(0xe0);
|
||||
kbd_put_keycode(i | 0x80);
|
||||
modifiers_state[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sdl_process_key(SDL_KeyboardEvent *ev)
|
||||
{
|
||||
int keycode, v, i;
|
||||
static uint8_t modifiers_state[256];
|
||||
int keycode, v;
|
||||
|
||||
if (ev->keysym.sym == SDLK_PAUSE) {
|
||||
/* specific case */
|
||||
|
@ -297,13 +311,7 @@ static void sdl_process_key(SDL_KeyboardEvent *ev)
|
|||
switch(keycode) {
|
||||
case 0x00:
|
||||
/* sent when leaving window: reset the modifiers state */
|
||||
for(i = 0; i < 256; i++) {
|
||||
if (modifiers_state[i]) {
|
||||
if (i & 0x80)
|
||||
kbd_put_keycode(0xe0);
|
||||
kbd_put_keycode(i | 0x80);
|
||||
}
|
||||
}
|
||||
reset_keys();
|
||||
return;
|
||||
case 0x2a: /* Left Shift */
|
||||
case 0x36: /* Right Shift */
|
||||
|
@ -341,7 +349,7 @@ static void sdl_update_caption(void)
|
|||
strcat(buf, " [Stopped]");
|
||||
}
|
||||
if (gui_grab) {
|
||||
strcat(buf, " - Press Ctrl-Shift to exit grab");
|
||||
strcat(buf, " - Press Ctrl-Alt to exit grab");
|
||||
}
|
||||
SDL_WM_SetCaption(buf, "QEMU");
|
||||
}
|
||||
|
@ -422,17 +430,19 @@ static void sdl_refresh(DisplayState *ds)
|
|||
case SDL_KEYDOWN:
|
||||
case SDL_KEYUP:
|
||||
if (ev->type == SDL_KEYDOWN) {
|
||||
mod_state = (SDL_GetModState() & (KMOD_LSHIFT | KMOD_LCTRL)) ==
|
||||
(KMOD_LSHIFT | KMOD_LCTRL);
|
||||
mod_state = (SDL_GetModState() & gui_grab_code) ==
|
||||
gui_grab_code;
|
||||
gui_key_modifier_pressed = mod_state;
|
||||
if (gui_key_modifier_pressed) {
|
||||
switch(ev->key.keysym.sym) {
|
||||
case SDLK_f:
|
||||
int keycode;
|
||||
keycode = sdl_keyevent_to_keycode(&ev->key);
|
||||
switch(keycode) {
|
||||
case 0x21: /* 'f' key on US keyboard */
|
||||
toggle_full_screen(ds);
|
||||
gui_keysym = 1;
|
||||
break;
|
||||
case SDLK_F1 ... SDLK_F12:
|
||||
console_select(ev->key.keysym.sym - SDLK_F1);
|
||||
case 0x02 ... 0x0a: /* '1' to '9' keys */
|
||||
console_select(keycode - 0x02);
|
||||
if (is_active_console(vga_console)) {
|
||||
/* tell the vga console to redisplay itself */
|
||||
vga_invalidate_display();
|
||||
|
@ -446,8 +456,7 @@ static void sdl_refresh(DisplayState *ds)
|
|||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!is_active_console(vga_console)) {
|
||||
} else if (!is_active_console(vga_console)) {
|
||||
int keysym;
|
||||
keysym = 0;
|
||||
if (ev->key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) {
|
||||
|
@ -483,15 +492,18 @@ static void sdl_refresh(DisplayState *ds)
|
|||
}
|
||||
}
|
||||
} else if (ev->type == SDL_KEYUP) {
|
||||
mod_state = (SDL_GetModState() & (KMOD_LSHIFT | KMOD_LCTRL));
|
||||
mod_state = (SDL_GetModState() & gui_grab_code);
|
||||
if (!mod_state) {
|
||||
if (gui_key_modifier_pressed) {
|
||||
if (gui_keysym == 0) {
|
||||
/* exit/enter grab if pressing Ctrl-Shift */
|
||||
/* exit/enter grab if pressing Ctrl-Alt */
|
||||
if (!gui_grab)
|
||||
sdl_grab_start();
|
||||
else
|
||||
sdl_grab_end();
|
||||
/* SDL does not send back all the
|
||||
modifiers key, so we must correct it */
|
||||
reset_keys();
|
||||
break;
|
||||
}
|
||||
gui_key_modifier_pressed = 0;
|
||||
|
|
Loading…
Reference in New Issue