bool ShortcutsSpec::ProcessColumnTextString(int whichColumn, const char* string) { switch(whichColumn) { case STRING_COLUMN_INDEX: SetCommand(string); return true; break; case KEY_COLUMN_INDEX: { fKey = FindKeyCode(string); return true; break; } default: return ProcessColumnKeyStroke(whichColumn, string, 0); } }
// Look up each key binding in the config file and set the mappings for // all key combinations that trigger it. static void LoadConfigBindings() { std::map<CStr, CConfigValueSet> bindings = g_ConfigDB.GetValuesWithPrefix( CFG_COMMAND, "hotkey." ); CParser multikeyParser; multikeyParser.InputTaskType( "multikey", "<[~$arg(_negate)]$value_+_>_[~$arg(_negate)]$value" ); for( std::map<CStr, CConfigValueSet>::iterator bindingsIt = bindings.begin(); bindingsIt != bindings.end(); ++bindingsIt ) { std::string hotkeyName = bindingsIt->first.substr(7); // strip the "hotkey." prefix for( CConfigValueSet::iterator it = bindingsIt->second.begin(); it != bindingsIt->second.end(); ++it ) { std::string hotkey; if( it->GetString( hotkey ) ) { std::vector<SKey> keyCombination; CParserLine multikeyIdentifier; multikeyIdentifier.ParseString( multikeyParser, hotkey ); // Iterate through multiple-key bindings (e.g. Ctrl+I) bool negateNext = false; for( size_t t = 0; t < multikeyIdentifier.GetArgCount(); t++ ) { if( multikeyIdentifier.GetArgString( (int)t, hotkey ) ) { if( hotkey == "_negate" ) { negateNext = true; continue; } // Attempt decode as key name int mapping = FindKeyCode( hotkey ); // Attempt to decode as a negation of a keyname // Yes, it's going a bit far, perhaps. // Too powerful for most uses, probably. // However, it got some hardcoding out of the engine. // Thus it makes me happy. if( !mapping ) { LOGWARNING(L"Hotkey mapping used invalid key '%hs'", hotkey.c_str() ); continue; } SKey key = { (SDLKEY)mapping, negateNext }; keyCombination.push_back(key); negateNext = false; } } std::vector<SKey>::iterator itKey, itKey2; for( itKey = keyCombination.begin(); itKey != keyCombination.end(); ++itKey ) { SHotkeyMapping bindCode; bindCode.name = hotkeyName; bindCode.negated = itKey->negated; for( itKey2 = keyCombination.begin(); itKey2 != keyCombination.end(); ++itKey2 ) { // Push any auxiliary keys. if( itKey != itKey2 ) bindCode.requires.push_back( *itKey2 ); } g_HotkeyMap[itKey->code].push_back( bindCode ); } } } } }
bool xinput_pad_handler::bindPadToDevice(std::shared_ptr<Pad> pad, const std::string& device) { //Convert device string to u32 representing xinput device number int device_number = GetDeviceNumber(device); if (device_number < 0) return false; std::shared_ptr<XInputDevice> x_device = std::make_shared<XInputDevice>(); x_device->deviceNumber = static_cast<u32>(device_number); int index = static_cast<int>(bindings.size()); m_pad_configs[index].load(); x_device->config = &m_pad_configs[index]; pad_config* p_profile = x_device->config; if (p_profile == nullptr) return false; pad->Init ( CELL_PAD_STATUS_DISCONNECTED, CELL_PAD_CAPABILITY_PS3_CONFORMITY | CELL_PAD_CAPABILITY_PRESS_MODE | CELL_PAD_CAPABILITY_HP_ANALOG_STICK | CELL_PAD_CAPABILITY_ACTUATOR | CELL_PAD_CAPABILITY_SENSOR_MODE, CELL_PAD_DEV_TYPE_STANDARD, p_profile->device_class_type ); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL1, FindKeyCode(button_list, p_profile->up), CELL_PAD_CTRL_UP); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL1, FindKeyCode(button_list, p_profile->down), CELL_PAD_CTRL_DOWN); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL1, FindKeyCode(button_list, p_profile->left), CELL_PAD_CTRL_LEFT); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL1, FindKeyCode(button_list, p_profile->right), CELL_PAD_CTRL_RIGHT); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL1, FindKeyCode(button_list, p_profile->start), CELL_PAD_CTRL_START); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL1, FindKeyCode(button_list, p_profile->select), CELL_PAD_CTRL_SELECT); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL1, FindKeyCode(button_list, p_profile->l3), CELL_PAD_CTRL_L3); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL1, FindKeyCode(button_list, p_profile->r3), CELL_PAD_CTRL_R3); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL2, FindKeyCode(button_list, p_profile->l1), CELL_PAD_CTRL_L1); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL2, FindKeyCode(button_list, p_profile->r1), CELL_PAD_CTRL_R1); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL2, FindKeyCode(button_list, p_profile->ps), 0x100/*CELL_PAD_CTRL_PS*/);// TODO: PS button support pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL2, FindKeyCode(button_list, p_profile->cross), CELL_PAD_CTRL_CROSS); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL2, FindKeyCode(button_list, p_profile->circle), CELL_PAD_CTRL_CIRCLE); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL2, FindKeyCode(button_list, p_profile->square), CELL_PAD_CTRL_SQUARE); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL2, FindKeyCode(button_list, p_profile->triangle), CELL_PAD_CTRL_TRIANGLE); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL2, FindKeyCode(button_list, p_profile->l2), CELL_PAD_CTRL_L2); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL2, FindKeyCode(button_list, p_profile->r2), CELL_PAD_CTRL_R2); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL2, 0, 0x0); // Reserved pad->m_sticks.emplace_back(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X, FindKeyCode(button_list, p_profile->ls_left), FindKeyCode(button_list, p_profile->ls_right)); pad->m_sticks.emplace_back(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y, FindKeyCode(button_list, p_profile->ls_down), FindKeyCode(button_list, p_profile->ls_up)); pad->m_sticks.emplace_back(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X, FindKeyCode(button_list, p_profile->rs_left), FindKeyCode(button_list, p_profile->rs_right)); pad->m_sticks.emplace_back(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y, FindKeyCode(button_list, p_profile->rs_down), FindKeyCode(button_list, p_profile->rs_up)); pad->m_sensors.emplace_back(CELL_PAD_BTN_OFFSET_SENSOR_X, 512); pad->m_sensors.emplace_back(CELL_PAD_BTN_OFFSET_SENSOR_Y, 399); pad->m_sensors.emplace_back(CELL_PAD_BTN_OFFSET_SENSOR_Z, 512); pad->m_sensors.emplace_back(CELL_PAD_BTN_OFFSET_SENSOR_G, 512); pad->m_vibrateMotors.emplace_back(true, 0); pad->m_vibrateMotors.emplace_back(false, 0); bindings.emplace_back(x_device, pad); return true; }
KeyStrokeSequenceCommandActuator::KeyStrokeSequenceCommandActuator(int32 argc, char** argv) : CommandActuator(argc, argv) { for (int s = 1; s < argc; s++) { fSequence.Append(argv[s]); if (s < argc - 1) fSequence.Append(" "); } // Find any insert-unicode-here sequences and replace them with spaces... int32 nextStart; while ((nextStart = fSequence.FindFirst("$$")) >= 0) { int32 nextEnd = fSequence.FindFirst("$$", nextStart + 2); if (nextEnd >= 0) { uint32 customKey= 0; int32 unicodeVal= 0; uint32 customMods = 0; BString sub; fSequence.CopyInto(sub, nextStart + 2, nextEnd-(nextStart + 2)); sub.ToLower(); if ((sub.FindFirst('-') >= 0) || ((sub.Length() > 0) && ((sub.String()[0] < '0') || (sub.String()[0] > '9')))) { const char* s = sub.String(); while (*s == '-') s++;// go past any initial dashes bool lastWasDash = true; while (*s) { if (lastWasDash) { if (strncmp(s, "shift",5) == 0) customMods |=B_LEFT_SHIFT_KEY| B_SHIFT_KEY; else if (strncmp(s, "leftsh", 6) == 0) customMods |=B_LEFT_SHIFT_KEY| B_SHIFT_KEY; else if (strncmp(s, "rightsh",7) == 0) customMods |=B_RIGHT_SHIFT_KEY | B_SHIFT_KEY; else if (strncmp(s, "alt",3) == 0) customMods |=B_LEFT_COMMAND_KEY| B_COMMAND_KEY; else if (strncmp(s, "leftalt",7) == 0) customMods |=B_LEFT_COMMAND_KEY| B_COMMAND_KEY; else if (strncmp(s, "rightalt", 8) == 0) customMods |=B_RIGHT_COMMAND_KEY | B_COMMAND_KEY; else if (strncmp(s, "com",3) == 0) customMods |=B_LEFT_COMMAND_KEY| B_COMMAND_KEY; else if (strncmp(s, "leftcom",7) == 0) customMods |=B_LEFT_COMMAND_KEY| B_COMMAND_KEY; else if (strncmp(s, "rightcom", 8) == 0) customMods |=B_RIGHT_COMMAND_KEY | B_COMMAND_KEY; else if (strncmp(s, "con",3) == 0) customMods |=B_LEFT_CONTROL_KEY| B_CONTROL_KEY; else if (strncmp(s, "leftcon",7) == 0) customMods |=B_LEFT_CONTROL_KEY| B_CONTROL_KEY; else if (strncmp(s, "rightcon", 8) == 0) customMods |=B_RIGHT_CONTROL_KEY | B_CONTROL_KEY; else if (strncmp(s, "win",3) == 0) customMods |=B_LEFT_OPTION_KEY | B_OPTION_KEY; else if (strncmp(s, "leftwin",7) == 0) customMods |=B_LEFT_OPTION_KEY | B_OPTION_KEY; else if (strncmp(s, "rightwin", 8) == 0) customMods |=B_RIGHT_OPTION_KEY| B_OPTION_KEY; else if (strncmp(s, "opt",3) == 0) customMods |=B_LEFT_OPTION_KEY | B_OPTION_KEY; else if (strncmp(s, "leftopt",7) == 0) customMods |=B_LEFT_OPTION_KEY | B_OPTION_KEY; else if (strncmp(s, "rightopt", 8) == 0) customMods |=B_RIGHT_OPTION_KEY| B_OPTION_KEY; else if (strncmp(s, "menu", 4) == 0) customMods |=B_MENU_KEY; else if (strncmp(s, "caps", 4) == 0) customMods |=B_CAPS_LOCK; else if (strncmp(s, "scroll", 6) == 0) customMods |=B_SCROLL_LOCK; else if (strncmp(s, "num",3) == 0) customMods |=B_NUM_LOCK; else if (customKey == 0) { BString arg = s; int32 dashIdx = arg.FindFirst('-'); if (dashIdx >= 0) arg.Truncate(dashIdx); uint32 key = (uint32)FindKeyCode(arg.String()); if (key > 0) { customKey = key; const char* u = GetKeyUTF8(key); //Parse the UTF8 back into an int32 switch(strlen(u)) { case 1: unicodeVal = ((uint32)(u[0]&0x7F)); break; case 2: unicodeVal = ((uint32)(u[1]&0x3F)) | (((uint32)(u[0]&0x1F)) << 6); break; case 3: unicodeVal = ((uint32)(u[2]&0x3F)) | (((uint32)(u[1]&0x3F)) << 6) | (((uint32)(u[0]&0x0F)) << 12); break; default: unicodeVal = 0; break; } } } lastWasDash = false; } else lastWasDash = (*s == '-'); s++; } // If we have a letter, try to make it the correct case if ((unicodeVal >= 'A') && (unicodeVal <= 'Z')) { if ((customMods & B_SHIFT_KEY) == 0) unicodeVal += 'a'-'A'; } else if ((unicodeVal >= 'a') && (unicodeVal <= 'z')) { if ((customMods & B_SHIFT_KEY) != 0) unicodeVal -= 'a'-'A'; } } else { unicodeVal = strtol(&(fSequence.String())[nextStart + 2], NULL, 0); customMods = (uint32) -1; } if (unicodeVal == 0) unicodeVal = ' '; BString newString = fSequence; newString.Truncate(nextStart); fOverrides.AddItem((void*)(addr_t)unicodeVal); fOverrideOffsets.AddItem((void*)(addr_t)newString.Length()); fOverrideModifiers.AddItem((void*)(addr_t)customMods); fOverrideKeyCodes.AddItem((void*)(addr_t)customKey); newString.Append((unicodeVal > 0 && unicodeVal < 127) ? (char)unicodeVal : ' ', 1); newString.Append(&fSequence.String()[nextEnd + 2]); fSequence = newString; } else break; } _GenerateKeyCodes(); }