mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-07-15 19:28:29 +12:00
Use unordered_map for keydown to allow codes above 255 (#248)
- Adds internal support for 32bit key codes, required for proper keyboard input on Linux - Use gdk_keyval_name to get key name on Linux
This commit is contained in:
parent
5e968eff4f
commit
9f02733a0d
14 changed files with 143 additions and 83 deletions
|
@ -41,7 +41,7 @@ void InputPanel::on_timer(const EmulatedControllerPtr& emulated_controller, cons
|
|||
}
|
||||
|
||||
static bool s_was_idle = true;
|
||||
if (state.buttons.none()) {
|
||||
if (!std::any_of(state.buttons.begin(), state.buttons.end(), [](auto el){ return el.second; })) {
|
||||
s_was_idle = true;
|
||||
return;
|
||||
}
|
||||
|
@ -49,58 +49,65 @@ void InputPanel::on_timer(const EmulatedControllerPtr& emulated_controller, cons
|
|||
if (!s_was_idle) {
|
||||
return;
|
||||
}
|
||||
|
||||
s_was_idle = false;
|
||||
for (size_t i = 0; i < state.buttons.size(); ++i)
|
||||
auto get_button_state = [&](uint32 key_id)
|
||||
{
|
||||
if (state.buttons[i])
|
||||
auto result = state.buttons.find(key_id);
|
||||
if (result == state.buttons.end())
|
||||
return false;
|
||||
return result->second;
|
||||
};
|
||||
s_was_idle = false;
|
||||
for(auto && button : state.buttons)
|
||||
{
|
||||
if (button.second)
|
||||
{
|
||||
auto id=button.first;
|
||||
if (controller->has_axis()) {
|
||||
// test if one axis direction is pressed more than the other
|
||||
if ((i == kAxisXP || i == kAxisXN) && (state.buttons[kAxisYP] || state.buttons[kAxisYN]))
|
||||
if ((id == kAxisXP || id == kAxisXN) && (get_button_state(kAxisYP) || get_button_state(kAxisYN)))
|
||||
{
|
||||
if (std::abs(state.axis.y) > std::abs(state.axis.x))
|
||||
continue;
|
||||
}
|
||||
else if ((i == kAxisYP || i == kAxisYN) && (state.buttons[kAxisXP] || state.buttons[kAxisXN]))
|
||||
else if ((id == kAxisYP || id == kAxisYN) && (get_button_state(kAxisXP) || get_button_state(kAxisXN)))
|
||||
{
|
||||
if (std::abs(state.axis.x) > std::abs(state.axis.y))
|
||||
continue;
|
||||
}
|
||||
else if ((i == kRotationXP || i == kRotationXN) && (state.buttons[kRotationYP] || state.buttons[kRotationYN]))
|
||||
else if ((id == kRotationXP || id == kRotationXN) && (get_button_state(kRotationYP) || get_button_state(kRotationYN)))
|
||||
{
|
||||
if (std::abs(state.rotation.y) > std::abs(state.rotation.x))
|
||||
continue;
|
||||
}
|
||||
else if ((i == kRotationYP || i == kRotationYN) && (state.buttons[kRotationXP] || state.buttons[kRotationXN]))
|
||||
else if ((id == kRotationYP || id == kRotationYN) && (get_button_state(kRotationXP) || get_button_state(kRotationXN)))
|
||||
{
|
||||
if (std::abs(state.rotation.x) > std::abs(state.rotation.y))
|
||||
continue;
|
||||
}
|
||||
else if ((i == kTriggerXP || i == kTriggerXN) && (state.buttons[kTriggerYP] || state.buttons[kTriggerYN]))
|
||||
else if ((id == kTriggerXP || id == kTriggerXN) && (get_button_state(kTriggerYP) || get_button_state(kTriggerYN)))
|
||||
{
|
||||
if (std::abs(state.trigger.y) > std::abs(state.trigger.x))
|
||||
continue;
|
||||
}
|
||||
else if ((i == kTriggerYP || i == kTriggerYN) && (state.buttons[kTriggerXP] || state.buttons[kTriggerXN]))
|
||||
else if ((id == kTriggerYP || id == kTriggerYN) && (get_button_state(kTriggerXP) || get_button_state(kTriggerXN)))
|
||||
{
|
||||
if (std::abs(state.trigger.x) > std::abs(state.trigger.y))
|
||||
continue;
|
||||
}
|
||||
|
||||
// ignore too low button values on configuration
|
||||
if (i >= kButtonAxisStart)
|
||||
if (id >= kButtonAxisStart)
|
||||
{
|
||||
if (controller->get_axis_value(i) < 0.33f) {
|
||||
forceLogDebug_printf("skipping since value too low %f", controller->get_axis_value(i));
|
||||
if (controller->get_axis_value(id) < 0.33f) {
|
||||
forceLogDebug_printf("skipping since value too low %f", controller->get_axis_value(id));
|
||||
s_was_idle = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
emulated_controller->set_mapping(mapping, controller, i);
|
||||
element->SetValue(controller->get_button_name(i));
|
||||
emulated_controller->set_mapping(mapping, controller, id);
|
||||
element->SetValue(controller->get_button_name(id));
|
||||
element->SetBackgroundColour(kKeyColourNormalMode);
|
||||
m_color_backup[element->GetId()] = kKeyColourNormalMode;
|
||||
break;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue