void windows_osd_interface::customize_input_type_list(simple_list<input_type_entry> &typelist) { const char* uimode; // loop over the defaults for (input_type_entry &entry : typelist) switch (entry.type()) { #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) // disable the config menu if the ALT key is down // (allows ALT-TAB to switch between windows apps) case IPT_UI_CONFIGURE: entry.defseq(SEQ_TYPE_STANDARD).set(KEYCODE_TAB, input_seq::not_code, KEYCODE_LALT, input_seq::not_code, KEYCODE_RALT); break; #else // UWP: Hotkey Select + X => UI_CONFIGURE (Menu) case IPT_UI_CONFIGURE: entry.defseq(SEQ_TYPE_STANDARD).set(KEYCODE_TAB, input_seq::or_code, JOYCODE_SELECT, JOYCODE_BUTTON3); break; // UWP: Hotkey Select + Start => CANCEL case IPT_UI_CANCEL: entry.defseq(SEQ_TYPE_STANDARD).set(KEYCODE_ESC, input_seq::or_code, JOYCODE_SELECT, JOYCODE_START); break; #endif // configurable UI mode switch case IPT_UI_TOGGLE_UI: uimode = options().ui_mode_key(); if (strcmp(uimode, "auto")) { std::string fullmode = "ITEM_ID_"; fullmode += uimode; input_item_id const mameid_code = keyboard_trans_table::instance().lookup_mame_code(fullmode.c_str()); if (ITEM_ID_INVALID != mameid_code) { input_code const ui_code = input_code(DEVICE_CLASS_KEYBOARD, 0, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, input_item_id(mameid_code)); entry.defseq(SEQ_TYPE_STANDARD).set(ui_code); } } break; // alt-enter for fullscreen case IPT_OSD_1: entry.configure_osd("TOGGLE_FULLSCREEN", "Toggle Fullscreen"); entry.defseq(SEQ_TYPE_STANDARD).set(KEYCODE_ENTER, KEYCODE_LALT, input_seq::or_code, KEYCODE_ENTER, KEYCODE_RALT); break; // lalt-F12 for fullscreen snap (HLSL) case IPT_OSD_2: entry.configure_osd("RENDER_SNAP", "Take Rendered Snapshot"); entry.defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F12, KEYCODE_LALT, input_seq::not_code, KEYCODE_LSHIFT); break; // add a NOT-lalt to our default F12 case IPT_UI_SNAPSHOT: // emu/input.c: input_seq(KEYCODE_F12, input_seq::not_code, KEYCODE_LSHIFT) entry.defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F12, input_seq::not_code, KEYCODE_LSHIFT, input_seq::not_code, KEYCODE_LALT); break; // lshift-lalt-F12 for fullscreen video (HLSL, BGFX) case IPT_OSD_3: entry.configure_osd("RENDER_AVI", "Record Rendered Video"); entry.defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F12, KEYCODE_LSHIFT, KEYCODE_LALT); break; // add a NOT-lalt to our default shift-F12 case IPT_UI_RECORD_MOVIE: // emu/input.c: input_seq(KEYCODE_F12, KEYCODE_LSHIFT) entry.defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F12, KEYCODE_LSHIFT, input_seq::not_code, KEYCODE_LALT); break; // add a NOT-lalt to write timecode file case IPT_UI_TIMECODE: // emu/input.c: input_seq(KEYCODE_F12, input_seq::not_code, KEYCODE_LSHIFT) entry.defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F12, input_seq::not_code, KEYCODE_LSHIFT, input_seq::not_code, KEYCODE_LALT); break; // lctrl-lalt-F5 to toggle post-processing case IPT_OSD_4: entry.configure_osd("POST_PROCESS", "Toggle Post-Processing"); entry.defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F5, KEYCODE_LALT, KEYCODE_LCONTROL); break; // add a NOT-lctrl-lalt to our default F5 case IPT_UI_TOGGLE_DEBUG: // emu/input.c: input_seq(KEYCODE_F5) entry.defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F5, input_seq::not_code, KEYCODE_LCONTROL, input_seq::not_code, KEYCODE_LALT); break; // leave everything else alone default: break; } }
void sdl_osd_interface::customize_input_type_list(simple_list<input_type_entry> &typelist) { input_item_id mameid_code; input_code ui_code; input_type_entry *entry; const char* uimode; char fullmode[64]; // loop over the defaults for (entry = typelist.first(); entry != NULL; entry = entry->next()) { switch (entry->type()) { // configurable UI mode switch case IPT_UI_TOGGLE_UI: uimode = options().ui_mode_key(); if (!strcmp(uimode, "auto")) { #if defined(__APPLE__) && defined(__MACH__) mameid_code = keyboard_trans_table::instance().lookup_mame_code("ITEM_ID_INSERT"); #else mameid_code = keyboard_trans_table::instance().lookup_mame_code("ITEM_ID_SCRLOCK"); #endif } else { snprintf(fullmode, 63, "ITEM_ID_%s", uimode); mameid_code = keyboard_trans_table::instance().lookup_mame_code(fullmode); } ui_code = input_code(DEVICE_CLASS_KEYBOARD, 0, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, input_item_id(mameid_code)); entry->defseq(SEQ_TYPE_STANDARD).set(ui_code); break; // alt-enter for fullscreen case IPT_OSD_1: entry->configure_osd("TOGGLE_FULLSCREEN", "Toggle Fullscreen"); entry->defseq(SEQ_TYPE_STANDARD).set(KEYCODE_ENTER, KEYCODE_LALT); break; // disable UI_SELECT when LALT is down, this stops selecting // things in the menu when toggling fullscreen with LALT+ENTER /* case IPT_UI_SELECT: entry->defseq(SEQ_TYPE_STANDARD).set(KEYCODE_ENTER, input_seq::not_code, KEYCODE_LALT); break;*/ // page down for fastforward (must be OSD_3 as per src/emu/ui.c) case IPT_UI_FAST_FORWARD: entry->defseq(SEQ_TYPE_STANDARD).set(KEYCODE_PGDN); break; // OSD hotkeys use LCTRL and start at F3, they start at // F3 because F1-F2 are hardcoded into many drivers to // various dipswitches, and pressing them together with // LCTRL will still press/toggle these dipswitches. // LCTRL-F3 to toggle fullstretch case IPT_OSD_2: entry->configure_osd("TOGGLE_FULLSTRETCH", "Toggle Uneven stretch"); entry->defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F3, KEYCODE_LCONTROL); break; // add a Not lcrtl condition to the reset key case IPT_UI_SOFT_RESET: entry->defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F3, input_seq::not_code, KEYCODE_LCONTROL, input_seq::not_code, KEYCODE_LSHIFT); break; // LCTRL-F4 to toggle keep aspect case IPT_OSD_4: entry->configure_osd("TOGGLE_KEEP_ASPECT", "Toggle Keepaspect"); entry->defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F4, KEYCODE_LCONTROL); break; // add a Not lcrtl condition to the show gfx key case IPT_UI_SHOW_GFX: entry->defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F4, input_seq::not_code, KEYCODE_LCONTROL); break; // LCTRL-F5 to toggle OpenGL filtering case IPT_OSD_5: entry->configure_osd("TOGGLE_FILTER", "Toggle Filter"); entry->defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F5, KEYCODE_LCONTROL); break; // add a Not lcrtl condition to the toggle debug key case IPT_UI_TOGGLE_DEBUG: entry->defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F5, input_seq::not_code, KEYCODE_LCONTROL); break; // LCTRL-F6 to decrease OpenGL prescaling case IPT_OSD_6: entry->configure_osd("DECREASE_PRESCALE", "Decrease Prescaling"); entry->defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F6, KEYCODE_LCONTROL); break; // add a Not lcrtl condition to the toggle cheat key case IPT_UI_TOGGLE_CHEAT: entry->defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F6, input_seq::not_code, KEYCODE_LCONTROL); break; // LCTRL-F7 to increase OpenGL prescaling case IPT_OSD_7: entry->configure_osd("INCREASE_PRESCALE", "Increase Prescaling"); entry->defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F7, KEYCODE_LCONTROL); break; // add a Not lcrtl condition to the load state key case IPT_UI_LOAD_STATE: entry->defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F7, input_seq::not_code, KEYCODE_LCONTROL, input_seq::not_code, KEYCODE_LSHIFT); break; // add a Not lcrtl condition to the throttle key case IPT_UI_THROTTLE: entry->defseq(SEQ_TYPE_STANDARD).set(KEYCODE_F10, input_seq::not_code, KEYCODE_LCONTROL); break; // disable the config menu if the ALT key is down // (allows ALT-TAB to switch between apps) case IPT_UI_CONFIGURE: entry->defseq(SEQ_TYPE_STANDARD).set(KEYCODE_TAB, input_seq::not_code, KEYCODE_LALT, input_seq::not_code, KEYCODE_RALT); break; // leave everything else alone default: break; } } }
input_code input_manager::code_from_token(const char *_token) { // copy the token and break it into pieces std::string token[6]; int numtokens; for (numtokens = 0; numtokens < ARRAY_LENGTH(token); ) { // make a token up to the next underscore char *score = (char *)strchr(_token, '_'); token[numtokens++].assign(_token, (score == nullptr) ? strlen(_token) : (score - _token)); // if we hit the end, we're done, else advance our pointer if (score == nullptr) break; _token = score + 1; } // first token should be the devclass int curtok = 0; input_device_class devclass = input_device_class((*devclass_token_table)[token[curtok++].c_str()]); if (devclass == ~input_device_class(0)) return INPUT_CODE_INVALID; // second token might be index; look for number int devindex = 0; if (numtokens > 2 && sscanf(token[curtok].c_str(), "%d", &devindex) == 1) { curtok++; devindex--; } if (curtok >= numtokens) return INPUT_CODE_INVALID; // next token is the item ID input_item_id itemid = input_item_id((*itemid_token_table)[token[curtok].c_str()]); bool standard = (itemid != ~input_item_id(0)); // if we're a standard code, default the itemclass based on it input_item_class itemclass = ITEM_CLASS_INVALID; if (standard) itemclass = m_class[devclass]->standard_item_class(itemid); // otherwise, keep parsing else { // if this is an invalid device, we have nothing to look up input_device *device = m_class[devclass]->device(devindex); if (device == nullptr) return INPUT_CODE_INVALID; // if not a standard code, look it up in the device specific codes for (itemid = ITEM_ID_FIRST_VALID; itemid <= device->maxitem(); ++itemid) { input_device_item *item = device->item(itemid); if (item != nullptr && token[curtok].compare(item->token()) == 0) { // take the itemclass from the item itemclass = item->itemclass(); break; } } // bail on fail if (itemid > device->maxitem()) return INPUT_CODE_INVALID; } curtok++; // if we have another token, it is probably a modifier input_item_modifier modifier = ITEM_MODIFIER_NONE; if (curtok < numtokens) { modifier = input_item_modifier((*modifier_token_table)[token[curtok].c_str()]); if (modifier != ~input_item_modifier(0)) curtok++; else modifier = ITEM_MODIFIER_NONE; } // if we have another token, it is the item class if (curtok < numtokens) { uint32_t temp = (*itemclass_token_table)[token[curtok].c_str()]; if (temp != ~0) { curtok++; itemclass = input_item_class(temp); } } // we should have consumed all tokens if (curtok != numtokens) return INPUT_CODE_INVALID; // assemble the final code return input_code(devclass, devindex, itemclass, modifier, itemid); }