mirror of https://gitee.com/openkylin/qemu.git
sdl: Factor out event handlers from sdl_refresh
No functional changes. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
d6a65ba333
commit
1ae1caf1c5
252
ui/sdl.c
252
ui/sdl.c
|
@ -582,42 +582,24 @@ static void absolute_mouse_grab(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sdl_refresh(DisplayState *ds)
|
static void handle_keydown(DisplayState *ds, SDL_Event *ev)
|
||||||
{
|
{
|
||||||
SDL_Event ev1, *ev = &ev1;
|
|
||||||
int mod_state;
|
int mod_state;
|
||||||
int buttonstate = SDL_GetMouseState(NULL, NULL);
|
int keycode;
|
||||||
|
|
||||||
if (last_vm_running != vm_running) {
|
|
||||||
last_vm_running = vm_running;
|
|
||||||
sdl_update_caption();
|
|
||||||
}
|
|
||||||
|
|
||||||
vga_hw_update();
|
|
||||||
SDL_EnableUNICODE(!is_graphic_console());
|
|
||||||
|
|
||||||
while (SDL_PollEvent(ev)) {
|
|
||||||
switch (ev->type) {
|
|
||||||
case SDL_VIDEOEXPOSE:
|
|
||||||
sdl_update(ds, 0, 0, real_screen->w, real_screen->h);
|
|
||||||
break;
|
|
||||||
case SDL_KEYDOWN:
|
|
||||||
case SDL_KEYUP:
|
|
||||||
if (ev->type == SDL_KEYDOWN) {
|
|
||||||
if (alt_grab) {
|
if (alt_grab) {
|
||||||
mod_state = (SDL_GetModState() & (gui_grab_code | KMOD_LSHIFT)) ==
|
mod_state = (SDL_GetModState() & (gui_grab_code | KMOD_LSHIFT)) ==
|
||||||
(gui_grab_code | KMOD_LSHIFT);
|
(gui_grab_code | KMOD_LSHIFT);
|
||||||
} else if (ctrl_grab) {
|
} else if (ctrl_grab) {
|
||||||
mod_state = (SDL_GetModState() & KMOD_RCTRL) == KMOD_RCTRL;
|
mod_state = (SDL_GetModState() & KMOD_RCTRL) == KMOD_RCTRL;
|
||||||
} else {
|
} else {
|
||||||
mod_state = (SDL_GetModState() & gui_grab_code) ==
|
mod_state = (SDL_GetModState() & gui_grab_code) == gui_grab_code;
|
||||||
gui_grab_code;
|
|
||||||
}
|
}
|
||||||
gui_key_modifier_pressed = mod_state;
|
gui_key_modifier_pressed = mod_state;
|
||||||
|
|
||||||
if (gui_key_modifier_pressed) {
|
if (gui_key_modifier_pressed) {
|
||||||
int keycode;
|
|
||||||
keycode = sdl_keyevent_to_keycode(&ev->key);
|
keycode = sdl_keyevent_to_keycode(&ev->key);
|
||||||
switch(keycode) {
|
switch (keycode) {
|
||||||
case 0x21: /* 'f' key on US keyboard */
|
case 0x21: /* 'f' key on US keyboard */
|
||||||
toggle_full_screen(ds);
|
toggle_full_screen(ds);
|
||||||
gui_keysym = 1;
|
gui_keysym = 1;
|
||||||
|
@ -654,10 +636,9 @@ static void sdl_refresh(DisplayState *ds)
|
||||||
case 0x1b: /* '+' */
|
case 0x1b: /* '+' */
|
||||||
case 0x35: /* '-' */
|
case 0x35: /* '-' */
|
||||||
if (!gui_fullscreen) {
|
if (!gui_fullscreen) {
|
||||||
int width = MAX(real_screen->w +
|
int width = MAX(real_screen->w + (keycode == 0x1b ? 50 : -50),
|
||||||
(keycode == 0x1b ? 50 : -50), 160);
|
160);
|
||||||
int height = (ds_get_height(ds) * width) /
|
int height = (ds_get_height(ds) * width) / ds_get_width(ds);
|
||||||
ds_get_width(ds);
|
|
||||||
|
|
||||||
sdl_scale(ds, width, height);
|
sdl_scale(ds, width, height);
|
||||||
vga_hw_invalidate();
|
vga_hw_invalidate();
|
||||||
|
@ -668,33 +649,71 @@ static void sdl_refresh(DisplayState *ds)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (!is_graphic_console()) {
|
} else if (!is_graphic_console()) {
|
||||||
int keysym;
|
int keysym = 0;
|
||||||
keysym = 0;
|
|
||||||
if (ev->key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) {
|
if (ev->key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) {
|
||||||
switch(ev->key.keysym.sym) {
|
switch (ev->key.keysym.sym) {
|
||||||
case SDLK_UP: keysym = QEMU_KEY_CTRL_UP; break;
|
case SDLK_UP:
|
||||||
case SDLK_DOWN: keysym = QEMU_KEY_CTRL_DOWN; break;
|
keysym = QEMU_KEY_CTRL_UP;
|
||||||
case SDLK_LEFT: keysym = QEMU_KEY_CTRL_LEFT; break;
|
break;
|
||||||
case SDLK_RIGHT: keysym = QEMU_KEY_CTRL_RIGHT; break;
|
case SDLK_DOWN:
|
||||||
case SDLK_HOME: keysym = QEMU_KEY_CTRL_HOME; break;
|
keysym = QEMU_KEY_CTRL_DOWN;
|
||||||
case SDLK_END: keysym = QEMU_KEY_CTRL_END; break;
|
break;
|
||||||
case SDLK_PAGEUP: keysym = QEMU_KEY_CTRL_PAGEUP; break;
|
case SDLK_LEFT:
|
||||||
case SDLK_PAGEDOWN: keysym = QEMU_KEY_CTRL_PAGEDOWN; break;
|
keysym = QEMU_KEY_CTRL_LEFT;
|
||||||
default: break;
|
break;
|
||||||
|
case SDLK_RIGHT:
|
||||||
|
keysym = QEMU_KEY_CTRL_RIGHT;
|
||||||
|
break;
|
||||||
|
case SDLK_HOME:
|
||||||
|
keysym = QEMU_KEY_CTRL_HOME;
|
||||||
|
break;
|
||||||
|
case SDLK_END:
|
||||||
|
keysym = QEMU_KEY_CTRL_END;
|
||||||
|
break;
|
||||||
|
case SDLK_PAGEUP:
|
||||||
|
keysym = QEMU_KEY_CTRL_PAGEUP;
|
||||||
|
break;
|
||||||
|
case SDLK_PAGEDOWN:
|
||||||
|
keysym = QEMU_KEY_CTRL_PAGEDOWN;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch(ev->key.keysym.sym) {
|
switch (ev->key.keysym.sym) {
|
||||||
case SDLK_UP: keysym = QEMU_KEY_UP; break;
|
case SDLK_UP:
|
||||||
case SDLK_DOWN: keysym = QEMU_KEY_DOWN; break;
|
keysym = QEMU_KEY_UP;
|
||||||
case SDLK_LEFT: keysym = QEMU_KEY_LEFT; break;
|
break;
|
||||||
case SDLK_RIGHT: keysym = QEMU_KEY_RIGHT; break;
|
case SDLK_DOWN:
|
||||||
case SDLK_HOME: keysym = QEMU_KEY_HOME; break;
|
keysym = QEMU_KEY_DOWN;
|
||||||
case SDLK_END: keysym = QEMU_KEY_END; break;
|
break;
|
||||||
case SDLK_PAGEUP: keysym = QEMU_KEY_PAGEUP; break;
|
case SDLK_LEFT:
|
||||||
case SDLK_PAGEDOWN: keysym = QEMU_KEY_PAGEDOWN; break;
|
keysym = QEMU_KEY_LEFT;
|
||||||
case SDLK_BACKSPACE: keysym = QEMU_KEY_BACKSPACE; break;
|
break;
|
||||||
case SDLK_DELETE: keysym = QEMU_KEY_DELETE; break;
|
case SDLK_RIGHT:
|
||||||
default: break;
|
keysym = QEMU_KEY_RIGHT;
|
||||||
|
break;
|
||||||
|
case SDLK_HOME:
|
||||||
|
keysym = QEMU_KEY_HOME;
|
||||||
|
break;
|
||||||
|
case SDLK_END:
|
||||||
|
keysym = QEMU_KEY_END;
|
||||||
|
break;
|
||||||
|
case SDLK_PAGEUP:
|
||||||
|
keysym = QEMU_KEY_PAGEUP;
|
||||||
|
break;
|
||||||
|
case SDLK_PAGEDOWN:
|
||||||
|
keysym = QEMU_KEY_PAGEDOWN;
|
||||||
|
break;
|
||||||
|
case SDLK_BACKSPACE:
|
||||||
|
keysym = QEMU_KEY_BACKSPACE;
|
||||||
|
break;
|
||||||
|
case SDLK_DELETE:
|
||||||
|
keysym = QEMU_KEY_DELETE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (keysym) {
|
if (keysym) {
|
||||||
|
@ -703,25 +722,28 @@ static void sdl_refresh(DisplayState *ds)
|
||||||
kbd_put_keysym(ev->key.keysym.unicode);
|
kbd_put_keysym(ev->key.keysym.unicode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (ev->type == SDL_KEYUP) {
|
if (is_graphic_console() && !gui_keysym) {
|
||||||
|
sdl_process_key(&ev->key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_keyup(DisplayState *ds, SDL_Event *ev)
|
||||||
|
{
|
||||||
|
int mod_state;
|
||||||
|
|
||||||
if (!alt_grab) {
|
if (!alt_grab) {
|
||||||
mod_state = (ev->key.keysym.mod & gui_grab_code);
|
mod_state = (ev->key.keysym.mod & gui_grab_code);
|
||||||
} else {
|
} else {
|
||||||
mod_state = (ev->key.keysym.mod &
|
mod_state = (ev->key.keysym.mod & (gui_grab_code | KMOD_LSHIFT));
|
||||||
(gui_grab_code | KMOD_LSHIFT));
|
|
||||||
}
|
}
|
||||||
if (!mod_state) {
|
if (!mod_state && gui_key_modifier_pressed) {
|
||||||
if (gui_key_modifier_pressed) {
|
|
||||||
gui_key_modifier_pressed = 0;
|
gui_key_modifier_pressed = 0;
|
||||||
if (gui_keysym == 0) {
|
if (gui_keysym == 0) {
|
||||||
/* exit/enter grab if pressing Ctrl-Alt */
|
/* exit/enter grab if pressing Ctrl-Alt */
|
||||||
if (!gui_grab) {
|
if (!gui_grab) {
|
||||||
/* if the application is not active,
|
/* If the application is not active, do not try to enter grab
|
||||||
do not try to enter grab state. It
|
* state. It prevents 'SDL_WM_GrabInput(SDL_GRAB_ON)' from
|
||||||
prevents
|
* blocking all the application (SDL bug). */
|
||||||
'SDL_WM_GrabInput(SDL_GRAB_ON)'
|
|
||||||
from blocking all the application
|
|
||||||
(SDL bug). */
|
|
||||||
if (is_graphic_console() &&
|
if (is_graphic_console() &&
|
||||||
SDL_GetAppState() & SDL_APPACTIVE) {
|
SDL_GetAppState() & SDL_APPACTIVE) {
|
||||||
sdl_grab_start();
|
sdl_grab_start();
|
||||||
|
@ -729,32 +751,27 @@ static void sdl_refresh(DisplayState *ds)
|
||||||
} else if (!gui_fullscreen) {
|
} else if (!gui_fullscreen) {
|
||||||
sdl_grab_end();
|
sdl_grab_end();
|
||||||
}
|
}
|
||||||
/* SDL does not send back all the
|
/* SDL does not send back all the modifiers key, so we must
|
||||||
modifiers key, so we must correct it */
|
* correct it. */
|
||||||
reset_keys();
|
reset_keys();
|
||||||
break;
|
return;
|
||||||
}
|
}
|
||||||
gui_keysym = 0;
|
gui_keysym = 0;
|
||||||
}
|
}
|
||||||
}
|
if (is_graphic_console() && !gui_keysym) {
|
||||||
}
|
|
||||||
if (is_graphic_console() && !gui_keysym)
|
|
||||||
sdl_process_key(&ev->key);
|
sdl_process_key(&ev->key);
|
||||||
break;
|
|
||||||
case SDL_QUIT:
|
|
||||||
if (!no_quit) {
|
|
||||||
no_shutdown = 0;
|
|
||||||
qemu_system_shutdown_request();
|
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case SDL_MOUSEMOTION:
|
|
||||||
|
static void handle_mousemotion(DisplayState *ds, SDL_Event *ev)
|
||||||
|
{
|
||||||
|
int max_x, max_y;
|
||||||
|
|
||||||
if (is_graphic_console() &&
|
if (is_graphic_console() &&
|
||||||
(kbd_mouse_is_absolute() || absolute_enabled)) {
|
(kbd_mouse_is_absolute() || absolute_enabled)) {
|
||||||
int max_x = real_screen->w - 1;
|
max_x = real_screen->w - 1;
|
||||||
int max_y = real_screen->h - 1;
|
max_y = real_screen->h - 1;
|
||||||
|
if (gui_grab && (ev->motion.x == 0 || ev->motion.y == 0 ||
|
||||||
if (gui_grab &&
|
|
||||||
(ev->motion.x == 0 || ev->motion.y == 0 ||
|
|
||||||
ev->motion.x == max_x || ev->motion.y == max_y)) {
|
ev->motion.x == max_x || ev->motion.y == max_y)) {
|
||||||
sdl_grab_end();
|
sdl_grab_end();
|
||||||
}
|
}
|
||||||
|
@ -764,16 +781,23 @@ static void sdl_refresh(DisplayState *ds)
|
||||||
sdl_grab_start();
|
sdl_grab_start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (gui_grab || kbd_mouse_is_absolute() ||
|
if (gui_grab || kbd_mouse_is_absolute() || absolute_enabled) {
|
||||||
absolute_enabled) {
|
|
||||||
sdl_send_mouse_event(ev->motion.xrel, ev->motion.yrel, 0,
|
sdl_send_mouse_event(ev->motion.xrel, ev->motion.yrel, 0,
|
||||||
ev->motion.x, ev->motion.y, ev->motion.state);
|
ev->motion.x, ev->motion.y, ev->motion.state);
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case SDL_MOUSEBUTTONDOWN:
|
|
||||||
case SDL_MOUSEBUTTONUP:
|
static void handle_mousebutton(DisplayState *ds, SDL_Event *ev)
|
||||||
if (is_graphic_console()) {
|
{
|
||||||
SDL_MouseButtonEvent *bev = &ev->button;
|
int buttonstate = SDL_GetMouseState(NULL, NULL);
|
||||||
|
SDL_MouseButtonEvent *bev;
|
||||||
|
int dz;
|
||||||
|
|
||||||
|
if (!is_graphic_console()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bev = &ev->button;
|
||||||
if (!gui_grab && !kbd_mouse_is_absolute()) {
|
if (!gui_grab && !kbd_mouse_is_absolute()) {
|
||||||
if (ev->type == SDL_MOUSEBUTTONDOWN &&
|
if (ev->type == SDL_MOUSEBUTTONDOWN &&
|
||||||
(bev->button == SDL_BUTTON_LEFT)) {
|
(bev->button == SDL_BUTTON_LEFT)) {
|
||||||
|
@ -781,7 +805,6 @@ static void sdl_refresh(DisplayState *ds)
|
||||||
sdl_grab_start();
|
sdl_grab_start();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int dz;
|
|
||||||
dz = 0;
|
dz = 0;
|
||||||
if (ev->type == SDL_MOUSEBUTTONDOWN) {
|
if (ev->type == SDL_MOUSEBUTTONDOWN) {
|
||||||
buttonstate |= SDL_BUTTON(bev->button);
|
buttonstate |= SDL_BUTTON(bev->button);
|
||||||
|
@ -789,17 +812,20 @@ static void sdl_refresh(DisplayState *ds)
|
||||||
buttonstate &= ~SDL_BUTTON(bev->button);
|
buttonstate &= ~SDL_BUTTON(bev->button);
|
||||||
}
|
}
|
||||||
#ifdef SDL_BUTTON_WHEELUP
|
#ifdef SDL_BUTTON_WHEELUP
|
||||||
if (bev->button == SDL_BUTTON_WHEELUP && ev->type == SDL_MOUSEBUTTONDOWN) {
|
if (bev->button == SDL_BUTTON_WHEELUP &&
|
||||||
|
ev->type == SDL_MOUSEBUTTONDOWN) {
|
||||||
dz = -1;
|
dz = -1;
|
||||||
} else if (bev->button == SDL_BUTTON_WHEELDOWN && ev->type == SDL_MOUSEBUTTONDOWN) {
|
} else if (bev->button == SDL_BUTTON_WHEELDOWN &&
|
||||||
|
ev->type == SDL_MOUSEBUTTONDOWN) {
|
||||||
dz = 1;
|
dz = 1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
sdl_send_mouse_event(0, 0, dz, bev->x, bev->y, buttonstate);
|
sdl_send_mouse_event(0, 0, dz, bev->x, bev->y, buttonstate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
case SDL_ACTIVEEVENT:
|
static void handle_activation(DisplayState *ds, SDL_Event *ev)
|
||||||
|
{
|
||||||
if (gui_grab && ev->active.state == SDL_APPINPUTFOCUS &&
|
if (gui_grab && ev->active.state == SDL_APPINPUTFOCUS &&
|
||||||
!ev->active.gain && !gui_fullscreen) {
|
!ev->active.gain && !gui_fullscreen) {
|
||||||
sdl_grab_end();
|
sdl_grab_end();
|
||||||
|
@ -819,6 +845,46 @@ static void sdl_refresh(DisplayState *ds)
|
||||||
dcl->idle = 1;
|
dcl->idle = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sdl_refresh(DisplayState *ds)
|
||||||
|
{
|
||||||
|
SDL_Event ev1, *ev = &ev1;
|
||||||
|
|
||||||
|
if (last_vm_running != vm_running) {
|
||||||
|
last_vm_running = vm_running;
|
||||||
|
sdl_update_caption();
|
||||||
|
}
|
||||||
|
|
||||||
|
vga_hw_update();
|
||||||
|
SDL_EnableUNICODE(!is_graphic_console());
|
||||||
|
|
||||||
|
while (SDL_PollEvent(ev)) {
|
||||||
|
switch (ev->type) {
|
||||||
|
case SDL_VIDEOEXPOSE:
|
||||||
|
sdl_update(ds, 0, 0, real_screen->w, real_screen->h);
|
||||||
|
break;
|
||||||
|
case SDL_KEYDOWN:
|
||||||
|
handle_keydown(ds, ev);
|
||||||
|
break;
|
||||||
|
case SDL_KEYUP:
|
||||||
|
handle_keyup(ds, ev);
|
||||||
|
break;
|
||||||
|
case SDL_QUIT:
|
||||||
|
if (!no_quit) {
|
||||||
|
no_shutdown = 0;
|
||||||
|
qemu_system_shutdown_request();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SDL_MOUSEMOTION:
|
||||||
|
handle_mousemotion(ds, ev);
|
||||||
|
break;
|
||||||
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
|
case SDL_MOUSEBUTTONUP:
|
||||||
|
handle_mousebutton(ds, ev);
|
||||||
|
break;
|
||||||
|
case SDL_ACTIVEEVENT:
|
||||||
|
handle_activation(ds, ev);
|
||||||
break;
|
break;
|
||||||
case SDL_VIDEORESIZE:
|
case SDL_VIDEORESIZE:
|
||||||
sdl_scale(ds, ev->resize.w, ev->resize.h);
|
sdl_scale(ds, ev->resize.w, ev->resize.h);
|
||||||
|
|
Loading…
Reference in New Issue