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:
parent
36842943f5
commit
a2ee3b4931
@ -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 */
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user