diff --git a/src/util/imgui_manager.cpp b/src/util/imgui_manager.cpp index 07e073cfd..65ce06fb8 100644 --- a/src/util/imgui_manager.cpp +++ b/src/util/imgui_manager.cpp @@ -1705,6 +1705,10 @@ void ImGuiManager::SetImKeyState(ImGuiIO& io, ImGuiKey imkey, bool pressed) bool ImGuiManager::ProcessGenericInputEvent(GenericInputBinding key, float value) { + // Racey read, but that's okay, worst case we push a couple of keys during shutdown. + if (!s_state.imgui_context) + return false; + static constexpr std::array key_map = { ImGuiKey_None, // Unknown, ImGuiKey_GamepadDpadUp, // DPadUp @@ -1735,51 +1739,47 @@ bool ImGuiManager::ProcessGenericInputEvent(GenericInputBinding key, float value }; const ImGuiKey imkey = (static_cast(key) < key_map.size()) ? key_map[static_cast(key)] : ImGuiKey_None; - if (imkey == ImGuiKey_None) - return false; - - // Racey read, but that's okay, worst case we push a couple of keys during shutdown. - if (!s_state.imgui_context) - return false; - - VideoThread::RunOnThread([imkey, value]() { - if (!s_state.imgui_context) - return; + if (imkey != ImGuiKey_None) + { + VideoThread::RunOnThread([imkey, value]() { + if (!s_state.imgui_context) + return; - if (imkey >= ImGuiKey_GamepadLStickLeft && imkey <= ImGuiKey_GamepadLStickDown) - { - // NOTE: This assumes the source is sending a whole axis value, not half axis. - const u32 axis = BoolToUInt32(imkey >= ImGuiKey_GamepadLStickUp); - const s8 old_state = s_state.left_stick_axis_state[axis]; - const s8 new_state = (value <= -0.5f) ? -1 : ((value >= 0.5f) ? 1 : 0); - if (old_state != new_state) + if (imkey >= ImGuiKey_GamepadLStickLeft && imkey <= ImGuiKey_GamepadLStickDown) { - static constexpr auto map_to_key = [](u32 axis, s8 state) { - // 0:-1/1 => ImGuiKey_GamepadDpadLeft/Right, 1:-1/1 => ImGuiKey_GamepadDpadUp/ImGuiKey_GamepadDpadDown - return static_cast(static_cast(ImGuiKey_GamepadDpadLeft) + (axis << 1) + - BoolToUInt32(state > 0)); - }; - - s_state.left_stick_axis_state[axis] = new_state; - if (old_state != 0) - s_state.imgui_context->IO.AddKeyAnalogEvent(map_to_key(axis, old_state), false, 0.0f); - if (new_state != 0) - s_state.imgui_context->IO.AddKeyAnalogEvent(map_to_key(axis, new_state), true, 1.0f); + // NOTE: This assumes the source is sending a whole axis value, not half axis. + const u32 axis = BoolToUInt32(imkey >= ImGuiKey_GamepadLStickUp); + const s8 old_state = s_state.left_stick_axis_state[axis]; + const s8 new_state = (value <= -0.5f) ? -1 : ((value >= 0.5f) ? 1 : 0); + if (old_state != new_state) + { + static constexpr auto map_to_key = [](u32 axis, s8 state) { + // 0:-1/1 => ImGuiKey_GamepadDpadLeft/Right, 1:-1/1 => ImGuiKey_GamepadDpadUp/ImGuiKey_GamepadDpadDown + return static_cast(static_cast(ImGuiKey_GamepadDpadLeft) + (axis << 1) + + BoolToUInt32(state > 0)); + }; + + s_state.left_stick_axis_state[axis] = new_state; + if (old_state != 0) + s_state.imgui_context->IO.AddKeyAnalogEvent(map_to_key(axis, old_state), false, 0.0f); + if (new_state != 0) + s_state.imgui_context->IO.AddKeyAnalogEvent(map_to_key(axis, new_state), true, 1.0f); + } } - } - else - { - ImGuiKey mapkey = imkey; - if (s_state.swap_gamepad_face_buttons) + else { - mapkey = (mapkey == ImGuiKey_GamepadFaceRight) ? - ImGuiKey_GamepadFaceDown : - ((mapkey == ImGuiKey_GamepadFaceDown) ? ImGuiKey_GamepadFaceRight : mapkey); - } + ImGuiKey mapkey = imkey; + if (s_state.swap_gamepad_face_buttons) + { + mapkey = (mapkey == ImGuiKey_GamepadFaceRight) ? + ImGuiKey_GamepadFaceDown : + ((mapkey == ImGuiKey_GamepadFaceDown) ? ImGuiKey_GamepadFaceRight : mapkey); + } - s_state.imgui_context->IO.AddKeyAnalogEvent(mapkey, (value > 0.0f), value); - } - }); + s_state.imgui_context->IO.AddKeyAnalogEvent(mapkey, (value > 0.0f), value); + } + }); + } return s_state.imgui_wants_keyboard.load(std::memory_order_acquire); }