Some more work on the new SDL2 gui

- added keyboard mapping support (TODO: update keymap files)
- added simple application icon
- minor mouse handling fix
This commit is contained in:
Volker Ruppert 2014-06-28 13:25:52 +00:00
parent 36842943f5
commit a2ee3b4931
2 changed files with 118 additions and 19 deletions

View File

@ -27,6 +27,7 @@
#include "bochs.h"
#include "param_names.h"
#include "keymap.h"
#include "iodev.h"
#if BX_WITH_SDL2
@ -71,6 +72,7 @@ const Uint32 status_led_red = 0x00ff4000;
static unsigned prev_cursor_x=0;
static unsigned prev_cursor_y=0;
static Bit32u convertStringToSDLKey(const char *string);
#define MAX_SDL_BITMAPS 32
struct bitmaps {
@ -365,6 +367,7 @@ void bx_sdl2_gui_c::specific_init(int argc, char **argv, unsigned headerbar_y)
{
int i, j;
Uint32 flags;
unsigned icon_id;
#ifdef WIN32
bx_bool gui_ci;
@ -372,8 +375,6 @@ void bx_sdl2_gui_c::specific_init(int argc, char **argv, unsigned headerbar_y)
#endif
put("SDL2");
UNUSED(bochs_icon_bits);
headerbar_height = headerbar_y;
for(i=0;i<256;i++)
@ -401,6 +402,11 @@ void bx_sdl2_gui_c::specific_init(int argc, char **argv, unsigned headerbar_y)
}
atexit(SDL_Quit);
// load keymap for sdl
if (SIM->get_param_bool(BXPN_KBD_USEMAPPING)->get()) {
bx_keymap.loadKeymap(convertStringToSDLKey);
}
// parse sdl specific options
if (argc > 1) {
for (i = 1; i < argc; i++) {
@ -455,6 +461,10 @@ void bx_sdl2_gui_c::specific_init(int argc, char **argv, unsigned headerbar_y)
BX_HEADERBAR_BG_GREEN,
BX_HEADERBAR_BG_BLUE);
icon_id = create_bitmap(bochs_icon_bits, bochs_icon_width, bochs_icon_height);
SDL_SetWindowIcon(window, sdl_bitmaps[icon_id]->surface);
new_gfx_api = 1;
#ifdef WIN32
if (gui_ci) {
@ -804,7 +814,7 @@ void bx_sdl2_gui_c::handle_events(void)
if (sdl_grab) {
wheel_status = sdl_event.wheel.y;
if (sdl_mouse_mode_absxy) {
DEV_mouse_motion(old_mousex, old_mousey, wheel_status, old_mousebuttons, 0);
DEV_mouse_motion(old_mousex, old_mousey, wheel_status, old_mousebuttons, 1);
} else {
DEV_mouse_motion(0, 0, wheel_status, old_mousebuttons, 0);
}
@ -830,13 +840,23 @@ void bx_sdl2_gui_c::handle_events(void)
if (sdl_nokeyrepeat && sdl_event.key.repeat) {
break;
}
key_event = sdl_sym_to_bx_key(sdl_event.key.keysym.sym);
BX_DEBUG(("keypress scancode=%d, sym=%d, bx_key = %d", sdl_event.key.keysym.scancode, sdl_event.key.keysym.sym, key_event));
if (key_event == BX_KEY_UNHANDLED) break;
DEV_kbd_gen_scancode( key_event);
if ((key_event == BX_KEY_NUM_LOCK) || (key_event == BX_KEY_CAPS_LOCK)) {
DEV_kbd_gen_scancode(key_event | BX_KEY_RELEASED);
// convert sym->bochs code
if (!SIM->get_param_bool(BXPN_KBD_USEMAPPING)->get()) {
key_event = sdl_sym_to_bx_key(sdl_event.key.keysym.sym);
BX_DEBUG(("keypress scancode=%d, sym=%d, bx_key = %d", sdl_event.key.keysym.scancode, sdl_event.key.keysym.sym, key_event));
} else {
/* use mapping */
BXKeyEntry *entry = bx_keymap.findHostKey(sdl_event.key.keysym.sym);
if (!entry) {
BX_ERROR(("host key %d (0x%x) not mapped!",
(unsigned) sdl_event.key.keysym.sym,
(unsigned)sdl_event.key.keysym.sym));
break;
}
key_event = entry->baseKey;
}
if (key_event == BX_KEY_UNHANDLED) break;
DEV_kbd_gen_scancode(key_event);
break;
case SDL_KEYUP:
@ -852,11 +872,21 @@ void bx_sdl2_gui_c::handle_events(void)
mouse_toggle_check(BX_MT_KEY_F12, 0);
}
key_event = sdl_sym_to_bx_key (sdl_event.key.keysym.sym);
if (key_event == BX_KEY_UNHANDLED) break;
if ((key_event == BX_KEY_NUM_LOCK) || (key_event == BX_KEY_CAPS_LOCK)) {
DEV_kbd_gen_scancode(key_event);
// convert sym->bochs code
if (!SIM->get_param_bool(BXPN_KBD_USEMAPPING)->get()) {
key_event = sdl_sym_to_bx_key(sdl_event.key.keysym.sym);
} else {
/* use mapping */
BXKeyEntry *entry = bx_keymap.findHostKey(sdl_event.key.keysym.sym);
if (!entry) {
BX_ERROR(("host key %d (0x%x) not mapped!",
(unsigned) sdl_event.key.keysym.sym,
(unsigned) sdl_event.key.keysym.sym));
break;
}
key_event = entry->baseKey;
}
if (key_event == BX_KEY_UNHANDLED) break;
DEV_kbd_gen_scancode(key_event | BX_KEY_RELEASED);
break;
@ -1250,4 +1280,35 @@ void bx_sdl2_gui_c::show_ips(Bit32u ips_count)
}
#endif
/// key mapping for SDL
typedef struct {
const char *name;
Bit32u value;
} keyTableEntry;
#define DEF_SDL_KEY(key) \
{ #key, key },
keyTableEntry keytable[] = {
// this include provides all the entries.
#include "sdlkeys.h"
// one final entry to mark the end
{ NULL, 0 }
};
// function to convert key names into SDLKey values.
// This first try will be horribly inefficient, but it only has
// to be done while loading a keymap. Once the simulation starts,
// this function won't be called.
static Bit32u convertStringToSDLKey (const char *string)
{
keyTableEntry *ptr;
for (ptr = &keytable[0]; ptr->name != NULL; ptr++) {
//BX_DEBUG (("comparing string '%s' to SDL key '%s'", string, ptr->name));
if (!strcmp(string, ptr->name))
return ptr->value;
}
return BX_KEYMAP_UNKNOWN;
}
#endif /* if BX_WITH_SDL2 */

View File

@ -20,7 +20,9 @@
// The list was generated using symbols from SDL 1.2.3.
DEF_SDL_KEY( SDLK_UNKNOWN )
#if !BX_WITH_SDL2
DEF_SDL_KEY( SDLK_FIRST )
#endif
DEF_SDL_KEY( SDLK_BACKSPACE )
DEF_SDL_KEY( SDLK_TAB )
DEF_SDL_KEY( SDLK_CLEAR )
@ -95,6 +97,7 @@ DEF_SDL_KEY( SDLK_x )
DEF_SDL_KEY( SDLK_y )
DEF_SDL_KEY( SDLK_z )
DEF_SDL_KEY( SDLK_DELETE )
#if !BX_WITH_SDL2
DEF_SDL_KEY( SDLK_WORLD_0 )
DEF_SDL_KEY( SDLK_WORLD_1 )
DEF_SDL_KEY( SDLK_WORLD_2 )
@ -201,6 +204,28 @@ DEF_SDL_KEY( SDLK_KP6 )
DEF_SDL_KEY( SDLK_KP7 )
DEF_SDL_KEY( SDLK_KP8 )
DEF_SDL_KEY( SDLK_KP9 )
#else
#define SDLK_WORLD_20 180
#define SDLK_WORLD_63 223
#define SDLK_WORLD_68 228
#define SDLK_WORLD_86 246
#define SDLK_WORLD_92 252
DEF_SDL_KEY( SDLK_WORLD_20 )
DEF_SDL_KEY( SDLK_WORLD_63 )
DEF_SDL_KEY( SDLK_WORLD_68 )
DEF_SDL_KEY( SDLK_WORLD_86 )
DEF_SDL_KEY( SDLK_WORLD_92 )
DEF_SDL_KEY( SDLK_KP_0 )
DEF_SDL_KEY( SDLK_KP_1 )
DEF_SDL_KEY( SDLK_KP_2 )
DEF_SDL_KEY( SDLK_KP_3 )
DEF_SDL_KEY( SDLK_KP_4 )
DEF_SDL_KEY( SDLK_KP_5 )
DEF_SDL_KEY( SDLK_KP_6 )
DEF_SDL_KEY( SDLK_KP_7 )
DEF_SDL_KEY( SDLK_KP_8 )
DEF_SDL_KEY( SDLK_KP_9 )
#endif
DEF_SDL_KEY( SDLK_KP_PERIOD )
DEF_SDL_KEY( SDLK_KP_DIVIDE )
DEF_SDL_KEY( SDLK_KP_MULTIPLY )
@ -232,26 +257,39 @@ DEF_SDL_KEY( SDLK_F12 )
DEF_SDL_KEY( SDLK_F13 )
DEF_SDL_KEY( SDLK_F14 )
DEF_SDL_KEY( SDLK_F15 )
#if !BX_WITH_SDL2
DEF_SDL_KEY( SDLK_NUMLOCK )
DEF_SDL_KEY( SDLK_CAPSLOCK )
DEF_SDL_KEY( SDLK_SCROLLOCK )
#else
DEF_SDL_KEY( SDLK_NUMLOCKCLEAR )
DEF_SDL_KEY( SDLK_SCROLLLOCK )
#endif
DEF_SDL_KEY( SDLK_CAPSLOCK )
DEF_SDL_KEY( SDLK_RSHIFT )
DEF_SDL_KEY( SDLK_LSHIFT )
DEF_SDL_KEY( SDLK_RCTRL )
DEF_SDL_KEY( SDLK_LCTRL )
DEF_SDL_KEY( SDLK_RALT )
DEF_SDL_KEY( SDLK_LALT )
#if !BX_WITH_SDL2
DEF_SDL_KEY( SDLK_RMETA )
DEF_SDL_KEY( SDLK_LMETA )
DEF_SDL_KEY( SDLK_LSUPER )
DEF_SDL_KEY( SDLK_RSUPER )
DEF_SDL_KEY( SDLK_MODE )
DEF_SDL_KEY( SDLK_COMPOSE )
DEF_SDL_KEY( SDLK_HELP )
DEF_SDL_KEY( SDLK_PRINT )
#else
DEF_SDL_KEY( SDLK_RGUI )
DEF_SDL_KEY( SDLK_LGUI )
DEF_SDL_KEY( SDLK_PRINTSCREEN )
#endif
DEF_SDL_KEY( SDLK_MODE )
DEF_SDL_KEY( SDLK_HELP )
DEF_SDL_KEY( SDLK_SYSREQ )
DEF_SDL_KEY( SDLK_BREAK )
DEF_SDL_KEY( SDLK_MENU )
DEF_SDL_KEY( SDLK_POWER )
DEF_SDL_KEY( SDLK_EURO )
DEF_SDL_KEY( SDLK_UNDO )
#if !BX_WITH_SDL2
DEF_SDL_KEY( SDLK_COMPOSE )
DEF_SDL_KEY( SDLK_BREAK )
DEF_SDL_KEY( SDLK_EURO )
#endif