void OptionsScreenInput2::gotSensedInput(const Input& sensed_input) { const bool keyboard = (m_config->isKeyboard() && sensed_input.m_type == Input::IT_KEYBOARD); const bool gamepad = (sensed_input.m_type == Input::IT_STICKMOTION || sensed_input.m_type == Input::IT_STICKBUTTON) && m_config->isGamePad(); if (keyboard) { if (UserConfigParams::logMisc()) { Log::info("OptionsScreenInput2", "Binding %s: setting to keyboard key %d", KartActionStrings[binding_to_set].c_str(), sensed_input.m_button_id); } KeyboardConfig* keyboard = (KeyboardConfig*)m_config; keyboard->setBinding(binding_to_set, Input::IT_KEYBOARD, sensed_input.m_button_id, Input::AD_NEUTRAL, Input::AR_HALF, sensed_input.m_character); // refresh display updateInputButtons(); } else if (gamepad) { if (UserConfigParams::logMisc()) { Log::info("OptionsScreenInput2", "Binding %s: setting to gamepad #%d", KartActionStrings[binding_to_set].c_str(), sensed_input.m_device_id); if (sensed_input.m_type == Input::IT_STICKMOTION) { Log::info("OptionsScreenInput2", "Axis %d; direction %s", sensed_input.m_button_id, sensed_input.m_axis_direction == Input::AD_NEGATIVE ? "-" : "+"); } else if (sensed_input.m_type == Input::IT_STICKBUTTON) { Log::info("OptionsScreenInput2", "Button %d", sensed_input.m_button_id); } else { Log::info("OptionsScreenInput2", "Sensed unknown gamepad event type??"); } } GamePadDevice *gpad = input_manager->getDeviceManager() ->getGamePadFromIrrID(sensed_input.m_device_id); std::string gamepad_name = gpad ? gpad->getName() : "UNKNOWN DEVICE"; if (m_config->getName() == gamepad_name) { GamepadConfig* config = (GamepadConfig*)m_config; config->setBinding(binding_to_set, sensed_input.m_type, sensed_input.m_button_id, (Input::AxisDirection)sensed_input.m_axis_direction, (Input::AxisRange)sensed_input.m_axis_range); // refresh display updateInputButtons(); } } else if (sensed_input.m_type == Input::IT_NONE) { if (UserConfigParams::logMisc()) { Log::info("OptionsScreenInput2", "Binding %s: setting to keyboard key NONE", KartActionStrings[binding_to_set].c_str()); } KeyboardConfig* keyboard = (KeyboardConfig*)m_config; keyboard->setBinding(binding_to_set, Input::IT_NONE, sensed_input.m_button_id, Input::AD_NEUTRAL, Input::AR_HALF, sensed_input.m_character); // refresh display updateInputButtons(); } else { return; } ModalDialog::dismiss(); input_manager->setMode(InputManager::MENU); if (keyboard && (sensed_input.m_button_id == irr::KEY_SHIFT || sensed_input.m_button_id == irr::KEY_LSHIFT || sensed_input.m_button_id == irr::KEY_RSHIFT)) { new MessageDialog(_("Warning, 'Shift' is not a recommended key : when " "shift is pressed down, all keys that contain a " "character that is different in upper-case will " "stop working.")); } // re-select the previous button (TODO!) //ButtonWidget* btn = // getWidget<ButtonWidget>(binding_to_set_button.c_str()); //if(btn != NULL) btn->setFocusForPlayer(PLAYER_ID_GAME_MASTER); // save new binding to file input_manager->getDeviceManager()->save(); } // gotSensedInput
// ----------------------------------------------------------------------------- bool DeviceManager::initialize() { GamepadConfig *gamepadConfig = NULL; GamePadDevice *gamepadDevice = NULL; m_map_fire_to_select = false; bool created = false; // Shutdown in case the device manager is being re-initialized shutdown(); if(UserConfigParams::logMisc()) { Log::info("Device manager","Initializing Device Manager"); Log::info("-","---------------------------"); } load(); // Assign a configuration to the keyboard, or create one if we haven't yet if(UserConfigParams::logMisc()) Log::info("Device manager","Initializing keyboard support."); if (m_keyboard_configs.size() == 0) { if(UserConfigParams::logMisc()) Log::info("Device manager","No keyboard configuration exists, creating one."); m_keyboard_configs.push_back(new KeyboardConfig()); created = true; } const int keyboard_amount = m_keyboard_configs.size(); for (int n = 0; n < keyboard_amount; n++) { m_keyboards.push_back(new KeyboardDevice(m_keyboard_configs.get(n))); } if(UserConfigParams::logMisc()) Log::info("Device manager","Initializing gamepad support."); irr_driver->getDevice()->activateJoysticks(m_irrlicht_gamepads); int num_gamepads = m_irrlicht_gamepads.size(); if(UserConfigParams::logMisc()) { Log::info("Device manager","Irrlicht reports %d gamepads are attached to the system.", num_gamepads); } // Create GamePadDevice for each physical gamepad and find a GamepadConfig to match for (int id = 0; id < num_gamepads; id++) { core::stringc name = m_irrlicht_gamepads[id].Name; // Some systems report a disk accelerometer as a gamepad, skip that if (name.find("LIS3LV02DL") != -1) continue; if (name == "applesmc") continue; if(m_irrlicht_gamepads[id].HasGenericName) { // On Windows all gamepads are given the same name ('microsoft // pc-joystick driver'). Irrlicht now tries to get a better name // from the registry, but in case this should fail we still have // all gamepads with the same name shown in the GUI. This makes // configuration totally useless, so append an ID to the name. name = name + " " + StringUtils::toString(id).c_str(); } if (UserConfigParams::logMisc()) { Log::info("Device manager","#%d: %s detected...", id, name.c_str()); } // Returns true if new configuration was created if (getConfigForGamepad(id, name.c_str(), &gamepadConfig) == true) { if(UserConfigParams::logMisc()) Log::info("Device manager","creating new configuration."); created = true; } else { if(UserConfigParams::logMisc()) Log::info("Device manager","using existing configuration."); } gamepadConfig->setPlugged(); gamepadDevice = new GamePadDevice(id, name.c_str(), m_irrlicht_gamepads[id].Axes, m_irrlicht_gamepads[id].Buttons, gamepadConfig ); addGamepad(gamepadDevice); } // end for if (UserConfigParams::m_multitouch_enabled) { m_multitouch_device = new MultitouchDevice(); } if (created) save(); return created; } // initialize
void OptionsScreenInput2::gotSensedInput(const Input& sensed_input) { const bool keyboard = (m_config->getType() == DEVICE_CONFIG_TYPE_KEYBOARD&& sensed_input.m_type == Input::IT_KEYBOARD); const bool gamepad = (sensed_input.m_type == Input::IT_STICKMOTION || sensed_input.m_type == Input::IT_STICKBUTTON) && m_config->getType() == DEVICE_CONFIG_TYPE_GAMEPAD; if (keyboard) { if (UserConfigParams::logMisc()) { std::cout << "% Binding " << KartActionStrings[binding_to_set] << " : setting to keyboard key " << sensed_input.m_button_id << " \n\n"; } KeyboardConfig* keyboard = (KeyboardConfig*)m_config; keyboard->setBinding(binding_to_set, Input::IT_KEYBOARD, sensed_input.m_button_id, Input::AD_NEUTRAL, Input::AR_HALF, sensed_input.m_character); // refresh display updateInputButtons(); } else if (gamepad) { if (UserConfigParams::logMisc()) { std::cout << "% Binding " << KartActionStrings[binding_to_set] << " : setting to gamepad #" << sensed_input.m_device_id<< " : "; if (sensed_input.m_type == Input::IT_STICKMOTION) { std::cout << "axis " <<sensed_input.m_button_id<< " direction " << (sensed_input.m_axis_direction==Input::AD_NEGATIVE ? "-" : "+") << "\n\n"; } else if (sensed_input.m_type == Input::IT_STICKBUTTON) { std::cout << "button " << sensed_input.m_button_id<< "\n\n"; } else { std::cout << "Sensed unknown gamepad event type??\n"; } } std::string gamepad_name = input_manager->getDeviceList()->getGamePadFromIrrID(sensed_input.m_device_id)->m_name; if (m_config->getName() == gamepad_name) { GamepadConfig* config = (GamepadConfig*)m_config; config->setBinding(binding_to_set, sensed_input.m_type, sensed_input.m_button_id, (Input::AxisDirection)sensed_input.m_axis_direction, (Input::AxisRange)sensed_input.m_axis_range); // refresh display updateInputButtons(); } } else { return; } ModalDialog::dismiss(); input_manager->setMode(InputManager::MENU); if (keyboard && (sensed_input.m_button_id == irr::KEY_SHIFT || sensed_input.m_button_id == irr::KEY_LSHIFT || sensed_input.m_button_id == irr::KEY_RSHIFT)) { new MessageDialog(_("Warning, 'Shift' is not a recommended key : when " "shift is pressed down, all keys that contain a " "character that is different in upper-case will " "stop working.")); } // re-select the previous button (TODO!) //ButtonWidget* btn = // getWidget<ButtonWidget>(binding_to_set_button.c_str()); //if(btn != NULL) btn->setFocusForPlayer(PLAYER_ID_GAME_MASTER); // save new binding to file input_manager->getDeviceList()->serialize(); } // gotSensedInput