diff options
Diffstat (limited to 'src/osd/sdl/input.cpp')
-rw-r--r-- | src/osd/sdl/input.cpp | 246 |
1 files changed, 226 insertions, 20 deletions
diff --git a/src/osd/sdl/input.cpp b/src/osd/sdl/input.cpp index 9cfcdb1cf16..4dfb5bd0ad0 100644 --- a/src/osd/sdl/input.cpp +++ b/src/osd/sdl/input.cpp @@ -15,7 +15,6 @@ #include "sdlinc.h" #include <ctype.h> #include <stddef.h> -#include <mutex> #if USE_XINPUT // for xinput @@ -155,7 +154,7 @@ struct device_info //============================================================ // global states -static std::mutex input_lock; +static osd_lock * input_lock; static UINT8 input_paused; static sdl_window_info * focus_window = NULL; @@ -235,6 +234,7 @@ struct kt_table { char * ui_name; }; +#if (SDLMAME_SDL2) #define OSD_SDL_INDEX(x) (x) #define OSD_SDL_INDEX_KEYSYM(keysym) ((keysym)->scancode) @@ -364,6 +364,132 @@ static kt_table sdl_key_trans_table[] = KTT_ENTRY0( BACKSLASH2, NONUSBACKSLASH, 0xdc, '\\', "BACKSLASH2" ), { ITEM_ID_INVALID } }; +#else + +#define OSD_SDL_INDEX(x) (SDLK_INDEX(x)-SDLK_FIRST) +#define OSD_SDL_INDEX_KEYSYM(keysym) (OSD_SDL_INDEX((keysym)->sym)) +#define GET_WINDOW(ev) sdl_window_list +#define GET_FOCUS_WINDOW(ev) sdl_window_list + +#define KTT_ENTRY0(MAME, SDL, VK, AS, UI) { ITEM_ID_ ## MAME, SDLK_ ## SDL, "ITEM_ID_" #MAME, (char *) UI } +#define KTT_ENTRY1(MAME, SDL) KTT_ENTRY0(MAME, SDL, MAME, MAME, #MAME) +// only for reference ... +#define KTT_ENTRY2(MAME, SDL) KTT_ENTRY0(MAME, SDL, 0, 0, #MAME) + + +static kt_table sdl_key_trans_table[] = +{ + // MAME key SDL key vkey ascii + KTT_ENTRY0( ESC, ESCAPE, 0x1b, 0x1b, "ESC" ), + KTT_ENTRY1( 1, 1 ), + KTT_ENTRY1( 2, 2 ), + KTT_ENTRY1( 3, 3 ), + KTT_ENTRY1( 4, 4 ), + KTT_ENTRY1( 5, 5 ), + KTT_ENTRY1( 6, 6 ), + KTT_ENTRY1( 7, 7 ), + KTT_ENTRY1( 8, 8 ), + KTT_ENTRY1( 9, 9 ), + KTT_ENTRY1( 0, 0 ), + KTT_ENTRY0( MINUS, MINUS, 0xbd, '-', "MINUS" ), + KTT_ENTRY0( EQUALS, EQUALS, 0xbb, '=', "EQUALS" ), + KTT_ENTRY0( BACKSPACE, BACKSPACE, 0x08, 0x08, "BACKSPACE" ), + KTT_ENTRY0( TAB, TAB, 0x09, 0x09, "TAB" ), + KTT_ENTRY1( Q, q ), + KTT_ENTRY1( W, w ), + KTT_ENTRY1( E, e ), + KTT_ENTRY1( R, r ), + KTT_ENTRY1( T, t ), + KTT_ENTRY1( Y, y ), + KTT_ENTRY1( U, u ), + KTT_ENTRY1( I, i ), + KTT_ENTRY1( O, o ), + KTT_ENTRY1( P, p ), + KTT_ENTRY0( OPENBRACE, LEFTBRACKET, 0xdb, '[', "OPENBRACE" ), + KTT_ENTRY0( CLOSEBRACE,RIGHTBRACKET, 0xdd, ']', "CLOSEBRACE" ), + KTT_ENTRY0( ENTER, RETURN, 0x0d, 0x0d, "RETURN" ), + KTT_ENTRY2( LCONTROL, LCTRL ), + KTT_ENTRY1( A, a ), + KTT_ENTRY1( S, s ), + KTT_ENTRY1( D, d ), + KTT_ENTRY1( F, f ), + KTT_ENTRY1( G, g ), + KTT_ENTRY1( H, h ), + KTT_ENTRY1( J, j ), + KTT_ENTRY1( K, k ), + KTT_ENTRY1( L, l ), + KTT_ENTRY0( COLON, SEMICOLON, 0xba, ';', "COLON" ), + KTT_ENTRY0( QUOTE, QUOTE, 0xde, '\'', "QUOTE" ), + KTT_ENTRY2( LSHIFT, LSHIFT ), + KTT_ENTRY0( BACKSLASH, BACKSLASH, 0xdc, '\\', "BACKSLASH" ), + KTT_ENTRY1( Z, z ), + KTT_ENTRY1( X, x ), + KTT_ENTRY1( C, c ), + KTT_ENTRY1( V, v ), + KTT_ENTRY1( B, b ), + KTT_ENTRY1( N, n ), + KTT_ENTRY1( M, m ), + KTT_ENTRY0( COMMA, COMMA, 0xbc, ',', "COMMA" ), + KTT_ENTRY0( STOP, PERIOD, 0xbe, '.', "STOP" ), + KTT_ENTRY0( SLASH, SLASH, 0xbf, '/', "SLASH" ), + KTT_ENTRY2( RSHIFT, RSHIFT ), + KTT_ENTRY0( ASTERISK, KP_MULTIPLY, '*', '*', "ASTERIX" ), + KTT_ENTRY2( LALT, LALT ), + KTT_ENTRY0( SPACE, SPACE, ' ', ' ', "SPACE" ), + KTT_ENTRY2( CAPSLOCK, CAPSLOCK ), + KTT_ENTRY2( F1, F1 ), + KTT_ENTRY2( F2, F2 ), + KTT_ENTRY2( F3, F3 ), + KTT_ENTRY2( F4, F4 ), + KTT_ENTRY2( F5, F5 ), + KTT_ENTRY2( F6, F6 ), + KTT_ENTRY2( F7, F7 ), + KTT_ENTRY2( F8, F8 ), + KTT_ENTRY2( F9, F9 ), + KTT_ENTRY2( F10, F10 ), + KTT_ENTRY2( NUMLOCK, NUMLOCK ), + KTT_ENTRY2( SCRLOCK, SCROLLOCK ), + KTT_ENTRY2( 7_PAD, KP7 ), + KTT_ENTRY2( 8_PAD, KP8 ), + KTT_ENTRY2( 9_PAD, KP9 ), + KTT_ENTRY2( MINUS_PAD, KP_MINUS ), + KTT_ENTRY2( 4_PAD, KP4 ), + KTT_ENTRY2( 5_PAD, KP5 ), + KTT_ENTRY2( 6_PAD, KP6 ), + KTT_ENTRY2( PLUS_PAD, KP_PLUS ), + KTT_ENTRY2( 1_PAD, KP1 ), + KTT_ENTRY2( 2_PAD, KP2 ), + KTT_ENTRY2( 3_PAD, KP3 ), + KTT_ENTRY2( 0_PAD, KP0 ), + KTT_ENTRY2( DEL_PAD, KP_PERIOD ), + KTT_ENTRY2( F11, F11 ), + KTT_ENTRY2( F12, F12 ), + KTT_ENTRY2( F13, F13 ), + KTT_ENTRY2( F14, F14 ), + KTT_ENTRY2( F15, F15 ), + KTT_ENTRY2( ENTER_PAD, KP_ENTER ), + KTT_ENTRY2( RCONTROL, RCTRL ), + KTT_ENTRY2( SLASH_PAD, KP_DIVIDE ), + KTT_ENTRY2( PRTSCR, PRINT ), + KTT_ENTRY2( RALT, RALT ), + KTT_ENTRY2( HOME, HOME ), + KTT_ENTRY2( UP, UP ), + KTT_ENTRY2( PGUP, PAGEUP ), + KTT_ENTRY2( LEFT, LEFT ), + KTT_ENTRY2( RIGHT, RIGHT ), + KTT_ENTRY2( END, END ), + KTT_ENTRY2( DOWN, DOWN ), + KTT_ENTRY2( PGDN, PAGEDOWN ), + KTT_ENTRY2( INSERT, INSERT ), + { ITEM_ID_DEL, SDLK_DELETE, "ITEM_ID_DEL", (char *)"DELETE" }, + KTT_ENTRY2( LWIN, LSUPER ), + KTT_ENTRY2( RWIN, RSUPER ), + KTT_ENTRY2( MENU, MENU ), + KTT_ENTRY0( TILDE, BACKQUOTE, 0xc0, '`', "TILDE" ), + KTT_ENTRY0( BACKSLASH2, HASH, 0xdc, '\\', "BACKSLASH2" ), + { ITEM_ID_INVALID } +}; +#endif struct key_lookup_table { @@ -371,6 +497,7 @@ struct key_lookup_table const char *name; }; +#if (SDLMAME_SDL2) #define KE(x) { SDL_SCANCODE_ ## x, "SDL_SCANCODE_" #x }, #define KE8(A, B, C, D, E, F, G, H) KE(A) KE(B) KE(C) KE(D) KE(E) KE(F) KE(G) KE(H) #define KE7(A, B, C, D, E, F, G) KE(A) KE(B) KE(C) KE(D) KE(E) KE(F) KE(G) @@ -399,6 +526,46 @@ static key_lookup_table sdl_lookup_table[] = KE(UNDO) {-1, ""} }; +#else +#define KE(x) { SDLK_ ## x, "SDLK_" #x }, +#define KE8(A, B, C, D, E, F, G, H) KE(A) KE(B) KE(C) KE(D) KE(E) KE(F) KE(G) KE(H) + +static key_lookup_table sdl_lookup_table[] = +{ + KE8(UNKNOWN, FIRST, BACKSPACE, TAB, CLEAR, RETURN, PAUSE, ESCAPE ) + KE8(SPACE, EXCLAIM, QUOTEDBL, HASH, DOLLAR, AMPERSAND, QUOTE, LEFTPAREN ) + KE8(RIGHTPAREN, ASTERISK, PLUS, COMMA, MINUS, PERIOD, SLASH, 0 ) + KE8(1, 2, 3, 4, 5, 6, 7, 8 ) + KE8(9, COLON, SEMICOLON, LESS, EQUALS, GREATER, QUESTION, AT ) + KE8(LEFTBRACKET,BACKSLASH, RIGHTBRACKET, CARET, UNDERSCORE, BACKQUOTE, a, b ) + KE8(c, d, e, f, g, h, i, j ) + KE8(k, l, m, n, o, p, q, r ) + KE8(s, t, u, v, w, x, y, z ) + KE8(DELETE, WORLD_0, WORLD_1, WORLD_2, WORLD_3, WORLD_4, WORLD_5, WORLD_6 ) + KE8(WORLD_7, WORLD_8, WORLD_9, WORLD_10, WORLD_11, WORLD_12, WORLD_13, WORLD_14 ) + KE8(WORLD_15, WORLD_16, WORLD_17, WORLD_18, WORLD_19, WORLD_20, WORLD_21, WORLD_22 ) + KE8(WORLD_23, WORLD_24, WORLD_25, WORLD_26, WORLD_27, WORLD_28, WORLD_29, WORLD_30 ) + KE8(WORLD_31, WORLD_32, WORLD_33, WORLD_34, WORLD_35, WORLD_36, WORLD_37, WORLD_38 ) + KE8(WORLD_39, WORLD_40, WORLD_41, WORLD_42, WORLD_43, WORLD_44, WORLD_45, WORLD_46 ) + KE8(WORLD_47, WORLD_48, WORLD_49, WORLD_50, WORLD_51, WORLD_52, WORLD_53, WORLD_54 ) + KE8(WORLD_55, WORLD_56, WORLD_57, WORLD_58, WORLD_59, WORLD_60, WORLD_61, WORLD_62 ) + KE8(WORLD_63, WORLD_64, WORLD_65, WORLD_66, WORLD_67, WORLD_68, WORLD_69, WORLD_70 ) + KE8(WORLD_71, WORLD_72, WORLD_73, WORLD_74, WORLD_75, WORLD_76, WORLD_77, WORLD_78 ) + KE8(WORLD_79, WORLD_80, WORLD_81, WORLD_82, WORLD_83, WORLD_84, WORLD_85, WORLD_86 ) + KE8(WORLD_87, WORLD_88, WORLD_89, WORLD_90, WORLD_91, WORLD_92, WORLD_93, WORLD_94 ) + KE8(WORLD_95, KP0, KP1, KP2, KP3, KP4, KP5, KP6 ) + KE8(KP7, KP8, KP9, KP_PERIOD, KP_DIVIDE, KP_MULTIPLY,KP_MINUS, KP_PLUS ) + KE8(KP_ENTER, KP_EQUALS, UP, DOWN, RIGHT, LEFT, INSERT, HOME ) + KE8(END, PAGEUP, PAGEDOWN, F1, F2, F3, F4, F5 ) + KE8(F6, F7, F8, F9, F10, F11, F12, F13 ) + KE8(F14, F15, NUMLOCK, CAPSLOCK, SCROLLOCK, RSHIFT, LSHIFT, RCTRL ) + KE8(LCTRL, RALT, LALT, RMETA, LMETA, LSUPER, RSUPER, MODE ) + KE8(COMPOSE, HELP, PRINT, SYSREQ, BREAK, MENU, POWER, EURO ) + KE(UNDO) + KE(LAST) + {-1, ""} +}; +#endif //============================================================ // INLINE FUNCTIONS @@ -550,9 +717,14 @@ static void sdlinput_register_joysticks(running_machine &machine) { char *joy_name; +#if (SDLMAME_SDL2) joy = SDL_JoystickOpen(physical_stick); joy_name = remove_spaces(machine, SDL_JoystickName(joy)); SDL_JoystickClose(joy); +#else + joy_name = remove_spaces(machine, SDL_JoystickName(physical_stick)); +#endif + devmap_register(&joy_map, physical_stick, joy_name); } @@ -1068,7 +1240,7 @@ static kt_table * sdlinput_read_keymap(running_machine &machine) { sdl2section = 1; } - else if (((1) ^ sdl2section) == 0) + else if (((SDLMAME_SDL2) ^ sdl2section) == 0) { mks[0]=0; sks[0]=0; @@ -1208,6 +1380,10 @@ bool sdl_osd_interface::input_init() app_has_mouse_focus = 1; + // allocate a lock for input synchronizations + input_lock = osd_lock_alloc(); + assert_always(input_lock != NULL, "Failed to allocate input_lock"); + // register the keyboards sdlinput_register_keyboards(machine()); @@ -1265,6 +1441,9 @@ void sdl_osd_interface::input_resume() void sdl_osd_interface::input_exit() { + // free the lock + osd_lock_free(input_lock); + // deregister sdlinput_deregister_joysticks(machine()); @@ -1345,6 +1524,7 @@ INT32 normalize_absolute_axis(INT32 raw, INT32 rawmin, INT32 rawmax) // sdlinput_poll //============================================================ +#if (SDLMAME_SDL2) static inline sdl_window_info * window_from_id(Uint32 windowID) { sdl_window_info *w; @@ -1380,15 +1560,19 @@ static inline void resize_all_windows(void) } } +#endif + void sdlinput_process_events_buf() { SDL_Event event; if (SDLMAME_EVENTS_IN_WORKER_THREAD) { - std::lock_guard<std::mutex> lock(input_lock); + osd_lock_acquire(input_lock); + #if (SDLMAME_SDL2) /* Make sure we get all pending events */ SDL_PumpEvents(); + #endif while(SDL_PollEvent(&event)) { if (event_buf_count < MAX_BUF_EVENTS) @@ -1396,6 +1580,7 @@ void sdlinput_process_events_buf() else osd_printf_warning("Event Buffer Overflow!\n"); } + osd_lock_release(input_lock); } else SDL_PumpEvents(); @@ -1524,10 +1709,11 @@ void sdlinput_poll(running_machine &machine) if (SDLMAME_EVENTS_IN_WORKER_THREAD) { - std::lock_guard<std::mutex> lock(input_lock); + osd_lock_acquire(input_lock); memcpy(loc_event_buf, event_buf, sizeof(event_buf)); loc_event_buf_count = event_buf_count; event_buf_count = 0; + osd_lock_release(input_lock); bufp = 0; } @@ -1553,8 +1739,12 @@ void sdlinput_poll(running_machine &machine) devinfo = generic_device_find_index( keyboard_list, keyboard_map.logical[0]); #endif devinfo->keyboard.state[OSD_SDL_INDEX_KEYSYM(&event.key.keysym)] = 0x80; +#if (SDLMAME_SDL2) if (event.key.keysym.sym < 0x20) machine.ui_input().push_char_event(sdl_window_list->target(), event.key.keysym.sym); +#else + ui_input_push_char_event(machine, sdl_window_list->target(), (unicode_char) event.key.keysym.unicode); +#endif break; case SDL_KEYUP: #ifdef SDL2_MULTIAPI @@ -1673,19 +1863,6 @@ void sdlinput_poll(running_machine &machine) } } break; - case SDL_MOUSEWHEEL: -#ifdef SDL2_MULTIAPI - devinfo = generic_device_find_index(mouse_list, mouse_map.logical[event.wheel.which]); -#else - devinfo = generic_device_find_index(mouse_list, mouse_map.logical[0]); -#endif - if (devinfo) - { - sdl_window_info *window = GET_FOCUS_WINDOW(&event.wheel); - if (window != NULL) - machine.ui_input().push_mouse_wheel_event(window->target(), 0, 0, event.wheel.y, 3); - } - break; case SDL_MOUSEBUTTONUP: #ifdef SDL2_MULTIAPI devinfo = generic_device_find_index(mouse_list, mouse_map.logical[event.button.which]); @@ -1712,10 +1889,15 @@ void sdlinput_poll(running_machine &machine) #else devinfo = generic_device_find_index(mouse_list, mouse_map.logical[0]); #endif +#if (SDLMAME_SDL2) // FIXME: may apply to 1.2 as well ... //printf("Motion %d %d %d %s\n", event.motion.which, event.motion.x, event.motion.y, devinfo->name.c_str()); devinfo->mouse.lX += event.motion.xrel * INPUT_RELATIVE_PER_PIXEL; devinfo->mouse.lY += event.motion.yrel * INPUT_RELATIVE_PER_PIXEL; +#else + devinfo->mouse.lX = event.motion.xrel * INPUT_RELATIVE_PER_PIXEL; + devinfo->mouse.lY = event.motion.yrel * INPUT_RELATIVE_PER_PIXEL; +#endif { int cx=-1, cy=-1; sdl_window_info *window = GET_FOCUS_WINDOW(&event.motion); @@ -1730,6 +1912,22 @@ void sdlinput_poll(running_machine &machine) devinfo->joystick.balls[event.jball.ball * 2] = event.jball.xrel * INPUT_RELATIVE_PER_PIXEL; devinfo->joystick.balls[event.jball.ball * 2 + 1] = event.jball.yrel * INPUT_RELATIVE_PER_PIXEL; break; +#if (!SDLMAME_SDL2) + case SDL_APPMOUSEFOCUS: + app_has_mouse_focus = event.active.gain; + if (!event.active.gain) + { + sdl_window_info *window = GET_FOCUS_WINDOW(&event.motion); + ui_input_push_mouse_leave_event(machine, window->target()); + } + break; + case SDL_QUIT: + machine.schedule_exit(); + break; + case SDL_VIDEORESIZE: + sdl_window_list->resize(event.resize.w, event.resize.h); + break; +#else case SDL_TEXTINPUT: if (*event.text.text) { @@ -1780,8 +1978,8 @@ void sdlinput_poll(running_machine &machine) #endif { //printf("event data1,data2 %d x %d %ld\n", event.window.data1, event.window.data2, sizeof(SDL_Event)); - window->resize(event.window.data1, event.window.data2); - } + window->resize(event.window.data1, event.window.data2); + } } focus_window = window; break; @@ -1797,9 +1995,12 @@ void sdlinput_poll(running_machine &machine) } break; } +#endif } } +#if (SDLMAME_SDL2) resize_all_windows(); +#endif } @@ -1810,6 +2011,10 @@ void sdlinput_poll(running_machine &machine) void sdlinput_release_keys() { + // FIXME: SDL >= 1.3 will nuke the window event buffer when + // a window is closed. This will leave keys in a pressed + // state when a window is destroyed and recreated. +#if (SDLMAME_SDL2) device_info *devinfo; int index; @@ -1820,6 +2025,7 @@ void sdlinput_release_keys() break; memset(&devinfo->keyboard.state, 0, sizeof(devinfo->keyboard.state)); } +#endif } |