@ -30,6 +30,7 @@
# include "ui/sdl2.h"
# include "sysemu/runstate.h"
# include "sysemu/sysemu.h"
# include "ui/win32-kbd-hook.h"
static int sdl2_num_outputs ;
static struct sdl2_console * sdl2_console ;
@ -220,6 +221,7 @@ static void sdl_grab_start(struct sdl2_console *scon)
}
SDL_SetWindowGrab ( scon - > real_window , SDL_TRUE ) ;
gui_grab = 1 ;
win32_kbd_set_grab ( true ) ;
sdl_update_caption ( scon ) ;
}
@ -227,6 +229,7 @@ static void sdl_grab_end(struct sdl2_console *scon)
{
SDL_SetWindowGrab ( scon - > real_window , SDL_FALSE ) ;
gui_grab = 0 ;
win32_kbd_set_grab ( false ) ;
sdl_show_cursor ( scon ) ;
sdl_update_caption ( scon ) ;
}
@ -325,6 +328,19 @@ static int get_mod_state(void)
}
}
static void * sdl2_win32_get_hwnd ( struct sdl2_console * scon )
{
# ifdef CONFIG_WIN32
SDL_SysWMinfo info ;
SDL_VERSION ( & info . version ) ;
if ( SDL_GetWindowWMInfo ( scon - > real_window , & info ) ) {
return info . info . win . window ;
}
# endif
return NULL ;
}
static void handle_keydown ( SDL_Event * ev )
{
int win ;
@ -544,6 +560,11 @@ static void handle_windowevent(SDL_Event *ev)
sdl2_redraw ( scon ) ;
break ;
case SDL_WINDOWEVENT_FOCUS_GAINED :
win32_kbd_set_grab ( gui_grab ) ;
if ( qemu_console_is_graphic ( scon - > dcl . con ) ) {
win32_kbd_set_window ( sdl2_win32_get_hwnd ( scon ) ) ;
}
/* fall through */
case SDL_WINDOWEVENT_ENTER :
if ( ! gui_grab & & ( qemu_input_is_absolute ( ) | | absolute_enabled ) ) {
absolute_mouse_grab ( scon ) ;
@ -558,6 +579,9 @@ static void handle_windowevent(SDL_Event *ev)
scon - > ignore_hotkeys = get_mod_state ( ) ;
break ;
case SDL_WINDOWEVENT_FOCUS_LOST :
if ( qemu_console_is_graphic ( scon - > dcl . con ) ) {
win32_kbd_set_window ( NULL ) ;
}
if ( gui_grab & & ! gui_fullscreen ) {
sdl_grab_end ( scon ) ;
}