1 // license:BSD-3-Clause
2 // copyright-holders:Olivier Galibert, R. Belmont, Brad Hughes
3 //============================================================
4 //
5 //  input_common.cpp - Common code for all MAME input modules
6 //
7 //  SDLMAME by Olivier Galibert and R. Belmont
8 //
9 //============================================================
10 
11 #include "input_module.h"
12 #include "modules/lib/osdobj_common.h"
13 
14 #include <memory>
15 
16 // MAME headers
17 #include "emu.h"
18 
19 // winnt.h defines this
20 #ifdef DELETE
21 #undef DELETE
22 #endif
23 
24 #include "input_common.h"
25 
26 //============================================================
27 //  Keyboard translation table
28 //============================================================
29 
30 #if defined(OSD_WINDOWS)
31 #include <windows.h>
32 #define KEY_TRANS_ENTRY0(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii, UI) { ITEM_ID_##mame, KEY_ ## disc, virtual, ascii, "ITEM_ID_"#mame, (char *) UI }
33 #define KEY_TRANS_ENTRY1(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii)     { ITEM_ID_##mame, KEY_ ## disc, virtual, ascii, "ITEM_ID_"#mame, (char*) #mame }
34 #elif defined(OSD_SDL)
35 // SDL include
36 #include <SDL2/SDL.h>
37 #define KEY_TRANS_ENTRY0(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii, UI) { ITEM_ID_##mame, SDL_SCANCODE_ ## sdlsc, ascii, "ITEM_ID_"#mame, (char *) UI }
38 #define KEY_TRANS_ENTRY1(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii)     { ITEM_ID_##mame, SDL_SCANCODE_ ## sdlsc, ascii, "ITEM_ID_"#mame, (char*) #mame }
39 #elif defined(OSD_UWP)
40 #define KEY_TRANS_ENTRY0(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii, UI) { ITEM_ID_##mame, KEY_ ## disc, Windows::System::VirtualKey:: ## uwp, ascii, "ITEM_ID_"#mame, (char *) UI }
41 #define KEY_TRANS_ENTRY1(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii)     { ITEM_ID_##mame, KEY_ ## disc, Windows::System::VirtualKey:: ## uwp, ascii, "ITEM_ID_"#mame, (char*) #mame }
42 #else
43 // osd mini
44 #endif
45 
46 // FIXME: sdl_key can be removed from the table below. It is no longer used.
47 
48 #if defined(OSD_WINDOWS) || defined(OSD_SDL) || defined(OSD_UWP)
49 key_trans_entry keyboard_trans_table::s_default_table[] =
50 {
51 	//              MAME key       sdl scancode  sdl key       di scancode     virtual key     uwp vkey       ascii     ui
52 	KEY_TRANS_ENTRY0(ESC,          ESCAPE,       ESCAPE,       ESCAPE,         VK_ESCAPE,      Escape,        27,       "ESCAPE"),
53 	KEY_TRANS_ENTRY1(1,            1,            1,            1,              '1',            Number1,       '1'),
54 	KEY_TRANS_ENTRY1(2,            2,            2,            2,              '2',            Number2,       '2'),
55 	KEY_TRANS_ENTRY1(3,            3,            3,            3,              '3',            Number3,       '3'),
56 	KEY_TRANS_ENTRY1(4,            4,            4,            4,              '4',            Number4,       '4'),
57 	KEY_TRANS_ENTRY1(5,            5,            5,            5,              '5',            Number5,       '5'),
58 	KEY_TRANS_ENTRY1(6,            6,            6,            6,              '6',            Number6,       '6'),
59 	KEY_TRANS_ENTRY1(7,            7,            7,            7,              '7',            Number7,       '7'),
60 	KEY_TRANS_ENTRY1(8,            8,            8,            8,              '8',            Number8,       '8'),
61 	KEY_TRANS_ENTRY1(9,            9,            9,            9,              '9',            Number9,       '9'),
62 	KEY_TRANS_ENTRY1(0,            0,            0,            0,              '0',            Number0,       '0'),
63 	KEY_TRANS_ENTRY1(MINUS,        MINUS,        MINUS,        MINUS,          VK_OEM_MINUS,   None,          '-'),
64 	KEY_TRANS_ENTRY1(EQUALS,       EQUALS,       EQUALS,       EQUALS,         VK_OEM_PLUS,    None,          '='),
65 	KEY_TRANS_ENTRY1(BACKSPACE,    BACKSPACE,    BACKSPACE,    BACK,           VK_BACK,        Back,          8),
66 	KEY_TRANS_ENTRY1(TAB,          TAB,          TAB,          TAB,            VK_TAB,         Tab,           9),
67 	KEY_TRANS_ENTRY1(Q,            Q,            q,            Q,              'Q',            Q,             'Q'),
68 	KEY_TRANS_ENTRY1(W,            W,            w,            W,              'W',            W,             'W'),
69 	KEY_TRANS_ENTRY1(E,            E,            e,            E,              'E',            E,             'E'),
70 	KEY_TRANS_ENTRY1(R,            R,            r,            R,              'R',            R,             'R'),
71 	KEY_TRANS_ENTRY1(T,            T,            t,            T,              'T',            T,             'T'),
72 	KEY_TRANS_ENTRY1(Y,            Y,            y,            Y,              'Y',            Y,             'Y'),
73 	KEY_TRANS_ENTRY1(U,            U,            u,            U,              'U',            U,             'U'),
74 	KEY_TRANS_ENTRY1(I,            I,            i,            I,              'I',            I,             'I'),
75 	KEY_TRANS_ENTRY1(O,            O,            o,            O,              'O',            O,             'O'),
76 	KEY_TRANS_ENTRY1(P,            P,            p,            P,              'P',            P,             'P'),
77 	KEY_TRANS_ENTRY1(OPENBRACE,    LEFTBRACKET,  LEFTBRACKET,  LBRACKET,       VK_OEM_4,       None,          '['),
78 	KEY_TRANS_ENTRY1(CLOSEBRACE,   RIGHTBRACKET, RIGHTBRACKET, RBRACKET,       VK_OEM_6,       None,          ']'),
79 	KEY_TRANS_ENTRY0(ENTER,        RETURN,       RETURN,       RETURN,         VK_RETURN,      Enter,         13,      "RETURN"),
80 	KEY_TRANS_ENTRY1(LCONTROL,     LCTRL,        LCTRL,        LCONTROL,       VK_LCONTROL,    LeftControl,   0),
81 	KEY_TRANS_ENTRY1(A,            A,            a,            A,              'A',            A,             'A'),
82 	KEY_TRANS_ENTRY1(S,            S,            s,            S,              'S',            S,             'S'),
83 	KEY_TRANS_ENTRY1(D,            D,            d,            D,              'D',            D,             'D'),
84 	KEY_TRANS_ENTRY1(F,            F,            f,            F,              'F',            F,             'F'),
85 	KEY_TRANS_ENTRY1(G,            G,            g,            G,              'G',            G,             'G'),
86 	KEY_TRANS_ENTRY1(H,            H,            h,            H,              'H',            H,             'H'),
87 	KEY_TRANS_ENTRY1(J,            J,            j,            J,              'J',            J,             'J'),
88 	KEY_TRANS_ENTRY1(K,            K,            k,            K,              'K',            K,             'K'),
89 	KEY_TRANS_ENTRY1(L,            L,            l,            L,              'L',            L,             'L'),
90 	KEY_TRANS_ENTRY1(COLON,        SEMICOLON,    SEMICOLON,    SEMICOLON,      VK_OEM_1,       None,          ';'),
91 	KEY_TRANS_ENTRY1(QUOTE,        APOSTROPHE,   QUOTE,        APOSTROPHE,     VK_OEM_7,       None,          '\''),
92 	KEY_TRANS_ENTRY1(TILDE,        GRAVE,        BACKQUOTE,    GRAVE,          VK_OEM_3,       None,          '`'),
93 	KEY_TRANS_ENTRY1(LSHIFT,       LSHIFT,       LSHIFT,       LSHIFT,         VK_LSHIFT,      LeftShift,     0),
94 	KEY_TRANS_ENTRY1(BACKSLASH,    BACKSLASH,    BACKSLASH,    BACKSLASH,      VK_OEM_5,       None,          '\\'),
95 //  KEY_TRANS_ENTRY1(BACKSLASH2,   NONUSHASH,    UNKNOWN,      OEM_102,        VK_OEM_102,     None,          '<'),
96 // This is the additional key that ISO keyboards have over ANSI ones, located between left shift and Y.
97 	KEY_TRANS_ENTRY1(BACKSLASH2,   NONUSBACKSLASH, UNKNOWN,    OEM_102,        VK_OEM_102,     None,          '<'),
98 	KEY_TRANS_ENTRY1(Z,            Z,            z,            Z,              'Z',            Z,             'Z'),
99 	KEY_TRANS_ENTRY1(X,            X,            x,            X,              'X',            X,             'X'),
100 	KEY_TRANS_ENTRY1(C,            C,            c,            C,              'C',            C,             'C'),
101 	KEY_TRANS_ENTRY1(V,            V,            v,            V,              'V',            V,             'V'),
102 	KEY_TRANS_ENTRY1(B,            B,            b,            B,              'B',            B,             'B'),
103 	KEY_TRANS_ENTRY1(N,            N,            n,            N,              'N',            N,             'N'),
104 	KEY_TRANS_ENTRY1(M,            M,            m,            M,              'M',            M,             'M'),
105 	KEY_TRANS_ENTRY1(COMMA,        COMMA,        COMMA,        COMMA,          VK_OEM_COMMA,   None,          ','),
106 	KEY_TRANS_ENTRY1(STOP,         PERIOD,       PERIOD,       PERIOD,         VK_OEM_PERIOD,  None,          '.'),
107 	KEY_TRANS_ENTRY1(SLASH,        SLASH,        SLASH,        SLASH,          VK_OEM_2,       None,          '/'),
108 	KEY_TRANS_ENTRY1(RSHIFT,       RSHIFT,       RSHIFT,       RSHIFT,         VK_RSHIFT,      RightShift,    0),
109 	KEY_TRANS_ENTRY1(ASTERISK,     KP_MULTIPLY,  KP_MULTIPLY,  MULTIPLY,       VK_MULTIPLY,    Multiply,      '*'),
110 	KEY_TRANS_ENTRY1(LALT,         LALT,         LALT,         LMENU,          VK_LMENU,       LeftMenu,      0),
111 	KEY_TRANS_ENTRY1(SPACE,        SPACE,        SPACE,        SPACE,          VK_SPACE,       Space,         ' '),
112 	KEY_TRANS_ENTRY1(CAPSLOCK,     CAPSLOCK,     CAPSLOCK,     CAPITAL,        VK_CAPITAL,     CapitalLock,   0),
113 	KEY_TRANS_ENTRY1(F1,           F1,           F1,           F1,             VK_F1,          F1,            0),
114 	KEY_TRANS_ENTRY1(F2,           F2,           F2,           F2,             VK_F2,          F2,            0),
115 	KEY_TRANS_ENTRY1(F3,           F3,           F3,           F3,             VK_F3,          F3,            0),
116 	KEY_TRANS_ENTRY1(F4,           F4,           F4,           F4,             VK_F4,          F4,            0),
117 	KEY_TRANS_ENTRY1(F5,           F5,           F5,           F5,             VK_F5,          F5,            0),
118 	KEY_TRANS_ENTRY1(F6,           F6,           F6,           F6,             VK_F6,          F6,            0),
119 	KEY_TRANS_ENTRY1(F7,           F7,           F7,           F7,             VK_F7,          F7,            0),
120 	KEY_TRANS_ENTRY1(F8,           F8,           F8,           F8,             VK_F8,          F8,            0),
121 	KEY_TRANS_ENTRY1(F9,           F9,           F9,           F9,             VK_F9,          F9,            0),
122 	KEY_TRANS_ENTRY1(F10,          F10,          F10,          F10,            VK_F10,         F10,           0),
123 	KEY_TRANS_ENTRY1(NUMLOCK,      NUMLOCKCLEAR, NUMLOCKCLEAR, NUMLOCK,        VK_NUMLOCK,     NumberKeyLock, 0),
124 	KEY_TRANS_ENTRY1(SCRLOCK,      SCROLLLOCK,   SCROLLLOCK,   SCROLL,         VK_SCROLL,      Scroll,        0),
125 	KEY_TRANS_ENTRY1(7_PAD,        KP_7,         KP_7,         NUMPAD7,        VK_NUMPAD7,     NumberPad7,    0),
126 	KEY_TRANS_ENTRY1(8_PAD,        KP_8,         KP_8,         NUMPAD8,        VK_NUMPAD8,     NumberPad8,    0),
127 	KEY_TRANS_ENTRY1(9_PAD,        KP_9,         KP_9,         NUMPAD9,        VK_NUMPAD9,     NumberPad9,    0),
128 	KEY_TRANS_ENTRY1(MINUS_PAD,    KP_MINUS,     KP_MINUS,     SUBTRACT,       VK_SUBTRACT,    Subtract,      0),
129 	KEY_TRANS_ENTRY1(4_PAD,        KP_4,         KP_4,         NUMPAD4,        VK_NUMPAD4,     NumberPad4,    0),
130 	KEY_TRANS_ENTRY1(5_PAD,        KP_5,         KP_5,         NUMPAD5,        VK_NUMPAD5,     NumberPad5,    0),
131 	KEY_TRANS_ENTRY1(6_PAD,        KP_6,         KP_6,         NUMPAD6,        VK_NUMPAD6,     NumberPad6,    0),
132 	KEY_TRANS_ENTRY1(PLUS_PAD,     KP_PLUS,      KP_PLUS,      ADD,            VK_ADD,         Add,           0),
133 	KEY_TRANS_ENTRY1(1_PAD,        KP_1,         KP_1,         NUMPAD1,        VK_NUMPAD1,     NumberPad1,    0),
134 	KEY_TRANS_ENTRY1(2_PAD,        KP_2,         KP_2,         NUMPAD2,        VK_NUMPAD2,     NumberPad2,    0),
135 	KEY_TRANS_ENTRY1(3_PAD,        KP_3,         KP_3,         NUMPAD3,        VK_NUMPAD3,     NumberPad3,    0),
136 	KEY_TRANS_ENTRY1(0_PAD,        KP_0,         KP_0,         NUMPAD0,        VK_NUMPAD0,     NumberPad0,    0),
137 	KEY_TRANS_ENTRY1(DEL_PAD,      KP_PERIOD,    KP_PERIOD,    DECIMAL,        VK_DECIMAL,     Decimal,       0),
138 	KEY_TRANS_ENTRY1(F11,          F11,          F11,          F11,            VK_F11,         F11,           0),
139 	KEY_TRANS_ENTRY1(F12,          F12,          F12,          F12,            VK_F12,         F12,           0),
140 	KEY_TRANS_ENTRY1(F13,          F13,          F13,          F13,            VK_F13,         F13,           0),
141 	KEY_TRANS_ENTRY1(F14,          F14,          F14,          F14,            VK_F14,         F14,           0),
142 	KEY_TRANS_ENTRY1(F15,          F15,          F15,          F15,            VK_F15,         F15,           0),
143 	KEY_TRANS_ENTRY1(ENTER_PAD,    KP_ENTER,     KP_ENTER,     NUMPADENTER,    VK_RETURN,      None,          0),
144 	KEY_TRANS_ENTRY1(RCONTROL,     RCTRL,        RCTRL,        RCONTROL,       VK_RCONTROL,    RightControl,  0),
145 	KEY_TRANS_ENTRY1(SLASH_PAD,    KP_DIVIDE,    KP_DIVIDE,    DIVIDE,         VK_DIVIDE,      Divide,        0),
146 	KEY_TRANS_ENTRY1(PRTSCR,       PRINTSCREEN,  PRINTSCREEN,  SYSRQ,          0,              Print,         0),
147 	KEY_TRANS_ENTRY1(RALT,         RALT,         RALT,         RMENU,          VK_RMENU,       RightMenu,     0),
148 	KEY_TRANS_ENTRY1(HOME,         HOME,         HOME,         HOME,           VK_HOME,        Home,          0),
149 	KEY_TRANS_ENTRY1(UP,           UP,           UP,           UP,             VK_UP,          Up,            0),
150 	KEY_TRANS_ENTRY1(PGUP,         PAGEUP,       PAGEUP,       PRIOR,          VK_PRIOR,       PageUp,        0),
151 	KEY_TRANS_ENTRY1(LEFT,         LEFT,         LEFT,         LEFT,           VK_LEFT,        Left,          0),
152 	KEY_TRANS_ENTRY1(RIGHT,        RIGHT,        RIGHT,        RIGHT,          VK_RIGHT,       Right,         0),
153 	KEY_TRANS_ENTRY1(END,          END,          END,          END,            VK_END,         End,           0),
154 	KEY_TRANS_ENTRY1(DOWN,         DOWN,         DOWN,         DOWN,           VK_DOWN,        Down,          0),
155 	KEY_TRANS_ENTRY1(PGDN,         PAGEDOWN,     PAGEDOWN,     NEXT,           VK_NEXT,        PageDown,      0),
156 	KEY_TRANS_ENTRY1(INSERT,       INSERT,       INSERT,       INSERT,         VK_INSERT,      Insert,        0),
157 	KEY_TRANS_ENTRY0(DEL,          DELETE,       DELETE,       DELETE,         VK_DELETE,      Delete,        0,        "DELETE"),
158 	KEY_TRANS_ENTRY1(LWIN,         LGUI,         LGUI,         LWIN,           VK_LWIN,        LeftWindows,   0),
159 	KEY_TRANS_ENTRY1(RWIN,         RGUI,         RGUI,         RWIN,           VK_RWIN,        RightWindows,  0),
160 	KEY_TRANS_ENTRY1(MENU,         MENU,         MENU,         APPS,           VK_APPS,        Menu,          0),
161 	KEY_TRANS_ENTRY1(PAUSE,        PAUSE,        PAUSE,        PAUSE,          VK_PAUSE,       Pause,         0),
162 	KEY_TRANS_ENTRY0(CANCEL,       CANCEL,       CANCEL,       UNKNOWN,        0,              Cancel,        0,        "CANCEL"),
163 	KEY_TRANS_ENTRY1(BS_PAD,       KP_BACKSPACE, KP_BACKSPACE, UNKNOWN,        0,              None,          0),
164 	KEY_TRANS_ENTRY1(TAB_PAD,      KP_TAB,       KP_TAB,       UNKNOWN,        0,              None,          0),
165 	KEY_TRANS_ENTRY1(00_PAD,       KP_00,        KP_00,        UNKNOWN,        0,              None,          0),
166 	KEY_TRANS_ENTRY1(000_PAD,      KP_000,       KP_000,       UNKNOWN,        0,              None,          0),
167 	KEY_TRANS_ENTRY1(COMMA_PAD,    KP_COMMA,     KP_COMMA,     NUMPADCOMMA,    0,              None,          0),
168 	KEY_TRANS_ENTRY1(EQUALS_PAD,   KP_EQUALS,    KP_EQUALS,    NUMPADEQUALS,   0,              None,          0),
169 
170 	// New keys introduced in Windows 2000. These have no MAME codes to
171 	// preserve compatibility with old config files that may refer to them
172 	// as e.g. FORWARD instead of e.g. KEYCODE_WEBFORWARD. They need table
173 	// entries anyway because otherwise they aren't recognized when
174 	// GetAsyncKeyState polling is used (as happens currently when MAME is
175 	// paused). Some codes are missing because the mapping to vkey codes
176 	// isn't clear, and MapVirtualKey is no help.
177 	KEY_TRANS_ENTRY1(OTHER_SWITCH, MUTE,         MUTE,           MUTE,           VK_VOLUME_MUTE,         None,          0),
178 	KEY_TRANS_ENTRY1(OTHER_SWITCH, VOLUMEDOWN,   VOLUMEDOWN,     VOLUMEDOWN,     VK_VOLUME_DOWN,         None,          0),
179 	KEY_TRANS_ENTRY1(OTHER_SWITCH, VOLUMEUP,     VOLUMEUP,       VOLUMEUP,       VK_VOLUME_UP,           None,          0),
180 	KEY_TRANS_ENTRY1(OTHER_SWITCH, AC_HOME,      AC_HOME,        WEBHOME,        VK_BROWSER_HOME,        None,          0),
181 	KEY_TRANS_ENTRY1(OTHER_SWITCH, AC_SEARCH,    AC_SEARCH,      WEBSEARCH,      VK_BROWSER_SEARCH,      None,          0),
182 	KEY_TRANS_ENTRY1(OTHER_SWITCH, AC_BOOKMARKS, AC_BOOKMARKS,   WEBFAVORITES,   VK_BROWSER_FAVORITES,   None,          0),
183 	KEY_TRANS_ENTRY1(OTHER_SWITCH, AC_REFRESH,   AC_REFRESH,     WEBREFRESH,     VK_BROWSER_REFRESH,     None,          0),
184 	KEY_TRANS_ENTRY1(OTHER_SWITCH, AC_STOP,      AC_STOP,        WEBSTOP,        VK_BROWSER_STOP,        None,          0),
185 	KEY_TRANS_ENTRY1(OTHER_SWITCH, AC_FORWARD,   AC_FORWARD,     WEBFORWARD,     VK_BROWSER_FORWARD,     None,          0),
186 	KEY_TRANS_ENTRY1(OTHER_SWITCH, AC_BACK,      AC_BACK,        WEBBACK,        VK_BROWSER_BACK,        None,          0),
187 	KEY_TRANS_ENTRY1(OTHER_SWITCH, MAIL,         MAIL,           MAIL,           VK_LAUNCH_MAIL,         None,          0),
188 	KEY_TRANS_ENTRY1(OTHER_SWITCH, MEDIASELECT,  MEDIASELECT,    MEDIASELECT,    VK_LAUNCH_MEDIA_SELECT, None,          0),
189 	KEY_TRANS_ENTRY0(INVALID,      UNKNOWN,      UNKNOWN,        ESCAPE,         0,                      None,          0,      "INVALID")
190 };
191 
192 // The private constructor to create the default instance
keyboard_trans_table()193 keyboard_trans_table::keyboard_trans_table()
194 {
195 	m_table = s_default_table;
196 	m_table_size = ARRAY_LENGTH(s_default_table);
197 }
198 #else
keyboard_trans_table()199 keyboard_trans_table::keyboard_trans_table()
200 {
201 	m_table = nullptr;
202 	m_table_size = 0;
203 }
204 
205 #endif
206 // public constructor to allow creation of non-default instances
keyboard_trans_table(std::unique_ptr<key_trans_entry[]> entries,unsigned int size)207 keyboard_trans_table::keyboard_trans_table(std::unique_ptr<key_trans_entry[]> entries, unsigned int size)
208 {
209 	m_custom_table = std::move(entries);
210 	m_table = m_custom_table.get();
211 	m_table_size = size;
212 }
213 
lookup_mame_index(const char * scode) const214 int keyboard_trans_table::lookup_mame_index(const char *scode) const
215 {
216 	for (int i = 0; i < m_table_size; i++)
217 	{
218 		if (!strcmp(scode, m_table[i].mame_key_name))
219 			return i;
220 	}
221 	return -1;
222 }
223 
lookup_mame_code(const char * scode) const224 input_item_id keyboard_trans_table::lookup_mame_code(const char *scode) const
225 {
226 	int const index = lookup_mame_index(scode);
227 	if (index >= 0)
228 		return m_table[index].mame_key;
229 	else
230 		return ITEM_ID_INVALID;
231 }
232 
233 // Windows specific lookup methods
234 #if defined(OSD_WINDOWS) || defined(OSD_UWP)
235 
map_di_scancode_to_itemid(int scancode) const236 input_item_id keyboard_trans_table::map_di_scancode_to_itemid(int scancode) const
237 {
238 	int tablenum;
239 
240 	// scan the table for a match
241 	for (tablenum = 0; tablenum < m_table_size; tablenum++)
242 		if (m_table[tablenum].scan_code == scancode)
243 			return m_table[tablenum].mame_key;
244 
245 	// default to an "other" switch
246 	return ITEM_ID_OTHER_SWITCH;
247 }
248 
249 #endif
250 
251 #if defined(OSD_WINDOWS)
252 
253 //============================================================
254 //  wininput_vkey_for_mame_code
255 //============================================================
256 
vkey_for_mame_code(input_code code) const257 int keyboard_trans_table::vkey_for_mame_code(input_code code) const
258 {
259 	// only works for keyboard switches
260 	if (code.device_class() == DEVICE_CLASS_KEYBOARD && code.item_class() == ITEM_CLASS_SWITCH)
261 	{
262 		input_item_id id = code.item_id();
263 		int tablenum;
264 
265 		// scan the table for a match
266 		for (tablenum = 0; tablenum < m_table_size; tablenum++)
267 			if (m_table[tablenum].mame_key == id)
268 				return m_table[tablenum].virtual_key;
269 	}
270 	return 0;
271 }
272 
273 #endif
274 
275 #if defined(OSD_UWP)
276 
ui_label_for_mame_key(input_item_id itemid) const277 const char* keyboard_trans_table::ui_label_for_mame_key(input_item_id itemid) const
278 {
279 	// scan the table for a match
280 	for (int tablenum = 0; tablenum < m_table_size; tablenum++)
281 		if (m_table[tablenum].mame_key == itemid)
282 			return m_table[tablenum].ui_name;
283 
284 	// We didn't find one
285 	return nullptr;
286 }
287 
288 #endif
289 
290 
init(const osd_options & options)291 int input_module_base::init(const osd_options &options)
292 {
293 	m_options = &options;
294 
295 	m_mouse_enabled = options.mouse();
296 	m_lightgun_enabled = options.lightgun();
297 
298 	int result = init_internal();
299 	if (result != 0)
300 		return result;
301 
302 	m_input_paused = false;
303 	m_input_enabled = true;
304 
305 	return 0;
306 }
307