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:
SSimco 2022-09-18 18:07:26 -07:00 committed by GitHub
parent 5e968eff4f
commit 9f02733a0d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 143 additions and 83 deletions

View file

@ -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;