mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-22 23:02:47 +01:00
input_common: Allow keyboard to be backwards compatible
This commit is contained in:
parent
b673857d7d
commit
bca299e8e0
10 changed files with 115 additions and 48 deletions
|
@ -572,8 +572,6 @@ struct Values {
|
||||||
|
|
||||||
BasicSetting<bool> emulate_analog_keyboard{false, "emulate_analog_keyboard"};
|
BasicSetting<bool> emulate_analog_keyboard{false, "emulate_analog_keyboard"};
|
||||||
BasicSetting<bool> keyboard_enabled{false, "keyboard_enabled"};
|
BasicSetting<bool> keyboard_enabled{false, "keyboard_enabled"};
|
||||||
KeyboardKeysRaw keyboard_keys;
|
|
||||||
KeyboardModsRaw keyboard_mods;
|
|
||||||
|
|
||||||
BasicSetting<bool> debug_pad_enabled{false, "debug_pad_enabled"};
|
BasicSetting<bool> debug_pad_enabled{false, "debug_pad_enabled"};
|
||||||
ButtonsRaw debug_pad_buttons;
|
ButtonsRaw debug_pad_buttons;
|
||||||
|
|
|
@ -29,13 +29,29 @@ void EmulatedDevices::ReloadInput() {
|
||||||
mouse_button_devices.begin(),
|
mouse_button_devices.begin(),
|
||||||
Common::Input::CreateDevice<Common::Input::InputDevice>);
|
Common::Input::CreateDevice<Common::Input::InputDevice>);
|
||||||
|
|
||||||
std::transform(Settings::values.keyboard_keys.begin(), Settings::values.keyboard_keys.end(),
|
std::size_t key_index = 0;
|
||||||
keyboard_devices.begin(),
|
for (auto& keyboard_device : keyboard_devices) {
|
||||||
Common::Input::CreateDeviceFromString<Common::Input::InputDevice>);
|
// Keyboard keys are only mapped on port 1, pad 0
|
||||||
|
Common::ParamPackage keyboard_params;
|
||||||
|
keyboard_params.Set("engine", "keyboard");
|
||||||
|
keyboard_params.Set("button", static_cast<int>(key_index));
|
||||||
|
keyboard_params.Set("port", 1);
|
||||||
|
keyboard_params.Set("pad", 0);
|
||||||
|
keyboard_device = Common::Input::CreateDevice<Common::Input::InputDevice>(keyboard_params);
|
||||||
|
key_index++;
|
||||||
|
}
|
||||||
|
|
||||||
std::transform(Settings::values.keyboard_mods.begin(), Settings::values.keyboard_mods.end(),
|
key_index = 0;
|
||||||
keyboard_modifier_devices.begin(),
|
for (auto& keyboard_device : keyboard_modifier_devices) {
|
||||||
Common::Input::CreateDeviceFromString<Common::Input::InputDevice>);
|
// Keyboard moddifiers are only mapped on port 1, pad 1
|
||||||
|
Common::ParamPackage keyboard_params;
|
||||||
|
keyboard_params.Set("engine", "keyboard");
|
||||||
|
keyboard_params.Set("button", static_cast<int>(key_index));
|
||||||
|
keyboard_params.Set("port", 1);
|
||||||
|
keyboard_params.Set("pad", 1);
|
||||||
|
keyboard_device = Common::Input::CreateDevice<Common::Input::InputDevice>(keyboard_params);
|
||||||
|
key_index++;
|
||||||
|
}
|
||||||
|
|
||||||
for (std::size_t index = 0; index < mouse_button_devices.size(); ++index) {
|
for (std::size_t index = 0; index < mouse_button_devices.size(); ++index) {
|
||||||
if (!mouse_button_devices[index]) {
|
if (!mouse_button_devices[index]) {
|
||||||
|
|
|
@ -13,15 +13,26 @@ constexpr PadIdentifier key_identifier = {
|
||||||
.port = 0,
|
.port = 0,
|
||||||
.pad = 0,
|
.pad = 0,
|
||||||
};
|
};
|
||||||
constexpr PadIdentifier modifier_identifier = {
|
constexpr PadIdentifier keyboard_key_identifier = {
|
||||||
.guid = Common::UUID{Common::INVALID_UUID},
|
.guid = Common::UUID{Common::INVALID_UUID},
|
||||||
.port = 0,
|
.port = 1,
|
||||||
|
.pad = 0,
|
||||||
|
};
|
||||||
|
constexpr PadIdentifier keyboard_modifier_identifier = {
|
||||||
|
.guid = Common::UUID{Common::INVALID_UUID},
|
||||||
|
.port = 1,
|
||||||
.pad = 1,
|
.pad = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
Keyboard::Keyboard(const std::string& input_engine_) : InputEngine(input_engine_) {
|
Keyboard::Keyboard(const std::string& input_engine_) : InputEngine(input_engine_) {
|
||||||
|
// Keyboard is broken into 3 diferent sets:
|
||||||
|
// key: Unfiltered intended for controllers.
|
||||||
|
// keyboard_key: Allows only Settings::NativeKeyboard::Keys intended for keyboard emulation.
|
||||||
|
// keyboard_modifier: Allows only Settings::NativeKeyboard::Modifiers intended for keyboard
|
||||||
|
// emulation.
|
||||||
PreSetController(key_identifier);
|
PreSetController(key_identifier);
|
||||||
PreSetController(modifier_identifier);
|
PreSetController(keyboard_key_identifier);
|
||||||
|
PreSetController(keyboard_modifier_identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Keyboard::PressKey(int key_code) {
|
void Keyboard::PressKey(int key_code) {
|
||||||
|
@ -32,35 +43,50 @@ void Keyboard::ReleaseKey(int key_code) {
|
||||||
SetButton(key_identifier, key_code, false);
|
SetButton(key_identifier, key_code, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Keyboard::SetModifiers(int key_modifiers) {
|
void Keyboard::PressKeyboardKey(int key_index) {
|
||||||
|
if (key_index == Settings::NativeKeyboard::None) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SetButton(keyboard_key_identifier, key_index, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Keyboard::ReleaseKeyboardKey(int key_index) {
|
||||||
|
if (key_index == Settings::NativeKeyboard::None) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SetButton(keyboard_key_identifier, key_index, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Keyboard::SetKeyboardModifiers(int key_modifiers) {
|
||||||
for (int i = 0; i < 32; ++i) {
|
for (int i = 0; i < 32; ++i) {
|
||||||
bool key_value = ((key_modifiers >> i) & 0x1) != 0;
|
bool key_value = ((key_modifiers >> i) & 0x1) != 0;
|
||||||
SetButton(modifier_identifier, i, key_value);
|
SetButton(keyboard_modifier_identifier, i, key_value);
|
||||||
// Use the modifier to press the key button equivalent
|
// Use the modifier to press the key button equivalent
|
||||||
switch (i) {
|
switch (i) {
|
||||||
case Settings::NativeKeyboard::LeftControl:
|
case Settings::NativeKeyboard::LeftControl:
|
||||||
SetButton(key_identifier, Settings::NativeKeyboard::LeftControlKey, key_value);
|
SetButton(keyboard_key_identifier, Settings::NativeKeyboard::LeftControlKey, key_value);
|
||||||
break;
|
break;
|
||||||
case Settings::NativeKeyboard::LeftShift:
|
case Settings::NativeKeyboard::LeftShift:
|
||||||
SetButton(key_identifier, Settings::NativeKeyboard::LeftShiftKey, key_value);
|
SetButton(keyboard_key_identifier, Settings::NativeKeyboard::LeftShiftKey, key_value);
|
||||||
break;
|
break;
|
||||||
case Settings::NativeKeyboard::LeftAlt:
|
case Settings::NativeKeyboard::LeftAlt:
|
||||||
SetButton(key_identifier, Settings::NativeKeyboard::LeftAltKey, key_value);
|
SetButton(keyboard_key_identifier, Settings::NativeKeyboard::LeftAltKey, key_value);
|
||||||
break;
|
break;
|
||||||
case Settings::NativeKeyboard::LeftMeta:
|
case Settings::NativeKeyboard::LeftMeta:
|
||||||
SetButton(key_identifier, Settings::NativeKeyboard::LeftMetaKey, key_value);
|
SetButton(keyboard_key_identifier, Settings::NativeKeyboard::LeftMetaKey, key_value);
|
||||||
break;
|
break;
|
||||||
case Settings::NativeKeyboard::RightControl:
|
case Settings::NativeKeyboard::RightControl:
|
||||||
SetButton(key_identifier, Settings::NativeKeyboard::RightControlKey, key_value);
|
SetButton(keyboard_key_identifier, Settings::NativeKeyboard::RightControlKey,
|
||||||
|
key_value);
|
||||||
break;
|
break;
|
||||||
case Settings::NativeKeyboard::RightShift:
|
case Settings::NativeKeyboard::RightShift:
|
||||||
SetButton(key_identifier, Settings::NativeKeyboard::RightShiftKey, key_value);
|
SetButton(keyboard_key_identifier, Settings::NativeKeyboard::RightShiftKey, key_value);
|
||||||
break;
|
break;
|
||||||
case Settings::NativeKeyboard::RightAlt:
|
case Settings::NativeKeyboard::RightAlt:
|
||||||
SetButton(key_identifier, Settings::NativeKeyboard::RightAltKey, key_value);
|
SetButton(keyboard_key_identifier, Settings::NativeKeyboard::RightAltKey, key_value);
|
||||||
break;
|
break;
|
||||||
case Settings::NativeKeyboard::RightMeta:
|
case Settings::NativeKeyboard::RightMeta:
|
||||||
SetButton(key_identifier, Settings::NativeKeyboard::RightMetaKey, key_value);
|
SetButton(keyboard_key_identifier, Settings::NativeKeyboard::RightMetaKey, key_value);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// Other modifier keys should be pressed with PressKey since they stay enabled until
|
// Other modifier keys should be pressed with PressKey since they stay enabled until
|
||||||
|
|
|
@ -28,11 +28,23 @@ public:
|
||||||
*/
|
*/
|
||||||
void ReleaseKey(int key_code);
|
void ReleaseKey(int key_code);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the status of the keyboard key to pressed
|
||||||
|
* @param key_index index of the key to press
|
||||||
|
*/
|
||||||
|
void PressKeyboardKey(int key_index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the status of the keyboard key to released
|
||||||
|
* @param key_index index of the key to release
|
||||||
|
*/
|
||||||
|
void ReleaseKeyboardKey(int key_index);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the status of all keyboard modifier keys
|
* Sets the status of all keyboard modifier keys
|
||||||
* @param key_modifiers the code of the key to release
|
* @param key_modifiers the code of the key to release
|
||||||
*/
|
*/
|
||||||
void SetModifiers(int key_modifiers);
|
void SetKeyboardModifiers(int key_modifiers);
|
||||||
|
|
||||||
/// Sets all keys to the non pressed state
|
/// Sets all keys to the non pressed state
|
||||||
void ReleaseAllKeys();
|
void ReleaseAllKeys();
|
||||||
|
|
|
@ -28,6 +28,10 @@ void MappingFactory::RegisterInput(const MappingData& data) {
|
||||||
if (!is_enabled) {
|
if (!is_enabled) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!IsDriverValid(data)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch (input_type) {
|
switch (input_type) {
|
||||||
case Polling::InputType::Button:
|
case Polling::InputType::Button:
|
||||||
RegisterButton(data);
|
RegisterButton(data);
|
||||||
|
@ -168,4 +172,25 @@ void MappingFactory::RegisterMotion(const MappingData& data) {
|
||||||
input_queue.Push(new_input);
|
input_queue.Push(new_input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MappingFactory::IsDriverValid(const MappingData& data) const {
|
||||||
|
// Only port 0 can be mapped on the keyboard
|
||||||
|
if (data.engine == "keyboard" && data.pad.port != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// The following drivers don't need to be mapped
|
||||||
|
if (data.engine == "tas") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (data.engine == "touch") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (data.engine == "touch_from_button") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (data.engine == "analog_from_button") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace InputCommon
|
} // namespace InputCommon
|
||||||
|
|
|
@ -66,6 +66,13 @@ private:
|
||||||
*/
|
*/
|
||||||
void RegisterMotion(const MappingData& data);
|
void RegisterMotion(const MappingData& data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if driver can be mapped
|
||||||
|
* @param "data": An struct containing all the information needed to create a proper
|
||||||
|
* ParamPackage
|
||||||
|
*/
|
||||||
|
bool IsDriverValid(const MappingData& data) const;
|
||||||
|
|
||||||
Common::SPSCQueue<Common::ParamPackage> input_queue;
|
Common::SPSCQueue<Common::ParamPackage> input_queue;
|
||||||
Polling::InputType input_type{Polling::InputType::None};
|
Polling::InputType input_type{Polling::InputType::None};
|
||||||
bool is_enabled{};
|
bool is_enabled{};
|
||||||
|
|
|
@ -402,15 +402,6 @@ std::string GenerateKeyboardParam(int key_code) {
|
||||||
return param.Serialize();
|
return param.Serialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string GenerateModdifierKeyboardParam(int key_code) {
|
|
||||||
Common::ParamPackage param;
|
|
||||||
param.Set("engine", "keyboard");
|
|
||||||
param.Set("code", key_code);
|
|
||||||
param.Set("toggle", false);
|
|
||||||
param.Set("pad", 1);
|
|
||||||
return param.Serialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string GenerateAnalogParamFromKeys(int key_up, int key_down, int key_left, int key_right,
|
std::string GenerateAnalogParamFromKeys(int key_up, int key_down, int key_left, int key_right,
|
||||||
int key_modifier, float modifier_scale) {
|
int key_modifier, float modifier_scale) {
|
||||||
Common::ParamPackage circle_pad_param{
|
Common::ParamPackage circle_pad_param{
|
||||||
|
|
|
@ -134,9 +134,6 @@ private:
|
||||||
/// Generates a serialized param package for creating a keyboard button device.
|
/// Generates a serialized param package for creating a keyboard button device.
|
||||||
std::string GenerateKeyboardParam(int key_code);
|
std::string GenerateKeyboardParam(int key_code);
|
||||||
|
|
||||||
/// Generates a serialized param package for creating a moddifier keyboard button device.
|
|
||||||
std::string GenerateModdifierKeyboardParam(int key_code);
|
|
||||||
|
|
||||||
/// Generates a serialized param package for creating an analog device taking input from keyboard.
|
/// Generates a serialized param package for creating an analog device taking input from keyboard.
|
||||||
std::string GenerateAnalogParamFromKeys(int key_up, int key_down, int key_left, int key_right,
|
std::string GenerateAnalogParamFromKeys(int key_up, int key_down, int key_left, int key_right,
|
||||||
int key_modifier, float modifier_scale);
|
int key_modifier, float modifier_scale);
|
||||||
|
|
|
@ -609,7 +609,7 @@ int GRenderWindow::QtKeyToSwitchKey(Qt::Key qt_key) {
|
||||||
return Settings::NativeKeyboard::ZenkakuHankaku;
|
return Settings::NativeKeyboard::ZenkakuHankaku;
|
||||||
// Modifier keys are handled by the modifier property
|
// Modifier keys are handled by the modifier property
|
||||||
default:
|
default:
|
||||||
return 0;
|
return Settings::NativeKeyboard::None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -662,8 +662,10 @@ void GRenderWindow::keyPressEvent(QKeyEvent* event) {
|
||||||
// Replace event->key() with event->nativeVirtualKey() since the second one provides raw key
|
// Replace event->key() with event->nativeVirtualKey() since the second one provides raw key
|
||||||
// buttons
|
// buttons
|
||||||
const auto key = QtKeyToSwitchKey(Qt::Key(event->key()));
|
const auto key = QtKeyToSwitchKey(Qt::Key(event->key()));
|
||||||
input_subsystem->GetKeyboard()->SetModifiers(moddifier);
|
input_subsystem->GetKeyboard()->SetKeyboardModifiers(moddifier);
|
||||||
input_subsystem->GetKeyboard()->PressKey(key);
|
input_subsystem->GetKeyboard()->PressKeyboardKey(key);
|
||||||
|
// This is used for gamepads
|
||||||
|
input_subsystem->GetKeyboard()->PressKey(event->key());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -671,8 +673,10 @@ void GRenderWindow::keyReleaseEvent(QKeyEvent* event) {
|
||||||
if (!event->isAutoRepeat()) {
|
if (!event->isAutoRepeat()) {
|
||||||
const auto moddifier = QtModifierToSwitchModdifier(event->nativeModifiers());
|
const auto moddifier = QtModifierToSwitchModdifier(event->nativeModifiers());
|
||||||
const auto key = QtKeyToSwitchKey(Qt::Key(event->key()));
|
const auto key = QtKeyToSwitchKey(Qt::Key(event->key()));
|
||||||
input_subsystem->GetKeyboard()->SetModifiers(moddifier);
|
input_subsystem->GetKeyboard()->SetKeyboardModifiers(moddifier);
|
||||||
input_subsystem->GetKeyboard()->ReleaseKey(key);
|
input_subsystem->GetKeyboard()->ReleaseKeyboardKey(key);
|
||||||
|
// This is used for gamepads
|
||||||
|
input_subsystem->GetKeyboard()->ReleaseKey(event->key());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -344,15 +344,6 @@ void Config::ReadDebugValues() {
|
||||||
|
|
||||||
void Config::ReadKeyboardValues() {
|
void Config::ReadKeyboardValues() {
|
||||||
ReadBasicSetting(Settings::values.keyboard_enabled);
|
ReadBasicSetting(Settings::values.keyboard_enabled);
|
||||||
|
|
||||||
for (std::size_t i = 0; i < Settings::values.keyboard_keys.size(); ++i) {
|
|
||||||
Settings::values.keyboard_keys[i] = InputCommon::GenerateKeyboardParam(static_cast<int>(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (std::size_t i = 0; i < Settings::values.keyboard_mods.size(); ++i) {
|
|
||||||
Settings::values.keyboard_mods[i] =
|
|
||||||
InputCommon::GenerateModdifierKeyboardParam(static_cast<int>(i));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Config::ReadMouseValues() {
|
void Config::ReadMouseValues() {
|
||||||
|
|
Loading…
Reference in a new issue