mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-12-16 13:36:59 +00: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
|
|
@ -15,8 +15,10 @@ const ControllerState& ControllerBase::update_state()
|
|||
ControllerState result = raw_state();
|
||||
|
||||
// ignore default buttons
|
||||
result.buttons &= ~m_default_state.buttons;
|
||||
|
||||
for (auto&& el : m_default_state.buttons)
|
||||
{
|
||||
result.buttons[el.first] = result.buttons[el.first] && !el.second;
|
||||
}
|
||||
// apply deadzone and range and ignore default axis values
|
||||
apply_axis_setting(result.axis, m_default_state.axis, m_settings.axis);
|
||||
apply_axis_setting(result.rotation, m_default_state.rotation, m_settings.rotation);
|
||||
|
|
@ -24,22 +26,22 @@ const ControllerState& ControllerBase::update_state()
|
|||
|
||||
#define APPLY_AXIS_BUTTON(_axis_, _flag_) \
|
||||
if (result._axis_.x < -ControllerState::kAxisThreshold) \
|
||||
result.buttons.set((_flag_) + (kAxisXN - kAxisXP)); \
|
||||
result.buttons[(_flag_) + (kAxisXN - kAxisXP)]=true; \
|
||||
else if (result._axis_.x > ControllerState::kAxisThreshold) \
|
||||
result.buttons.set((_flag_)); \
|
||||
result.buttons[(_flag_)]=true; \
|
||||
if (result._axis_.y < -ControllerState::kAxisThreshold) \
|
||||
result.buttons.set((_flag_) + 1 + (kAxisXN - kAxisXP)); \
|
||||
result.buttons[(_flag_) + 1 + (kAxisXN - kAxisXP)]=true; \
|
||||
else if (result._axis_.y > ControllerState::kAxisThreshold) \
|
||||
result.buttons.set((_flag_) + 1);
|
||||
result.buttons[(_flag_) + 1]=true;
|
||||
|
||||
if (result.axis.x < -ControllerState::kAxisThreshold)
|
||||
result.buttons.set((kAxisXP) + (kAxisXN - kAxisXP));
|
||||
result.buttons[(kAxisXP) + (kAxisXN - kAxisXP)]=true;
|
||||
else if (result.axis.x > ControllerState::kAxisThreshold)
|
||||
result.buttons.set((kAxisXP));
|
||||
result.buttons[(kAxisXP)]=true;
|
||||
if (result.axis.y < -ControllerState::kAxisThreshold)
|
||||
result.buttons.set((kAxisXP) + 1 + (kAxisXN - kAxisXP));
|
||||
result.buttons[(kAxisXP) + 1 + (kAxisXN - kAxisXP)]=true;
|
||||
else if (result.axis.y > ControllerState::kAxisThreshold)
|
||||
result.buttons.set((kAxisXP) + 1);;
|
||||
result.buttons[(kAxisXP) + 1]=true;
|
||||
APPLY_AXIS_BUTTON(rotation, kRotationXP);
|
||||
APPLY_AXIS_BUTTON(trigger, kTriggerXP);
|
||||
|
||||
|
|
@ -68,7 +70,7 @@ const ControllerState& ControllerBase::update_state()
|
|||
|
||||
#undef APPLY_AXIS_BUTTON
|
||||
|
||||
m_last_state = result;
|
||||
m_last_state = std::move(result);
|
||||
return m_last_state;
|
||||
}
|
||||
|
||||
|
|
@ -127,7 +129,8 @@ bool ControllerBase::operator==(const ControllerBase& c) const
|
|||
|
||||
float ControllerBase::get_axis_value(uint64 button) const
|
||||
{
|
||||
if (m_last_state.buttons.test(button))
|
||||
auto buttonState=m_last_state.buttons.find(button);
|
||||
if (buttonState!=m_last_state.buttons.end() && buttonState->second)
|
||||
{
|
||||
if (button <= kButtonNoneAxisMAX || !has_axis())
|
||||
return 1.0f;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue