65 lines
2.3 KiB
C++
65 lines
2.3 KiB
C++
#pragma once
|
|
/**
|
|
******************************************************************************
|
|
* Xenia : Xbox 360 Emulator Research Project *
|
|
******************************************************************************
|
|
* Copyright 2013 Ben Vanik. All rights reserved. *
|
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
|
******************************************************************************
|
|
*
|
|
* @modified Tom Clay, 2026 - Adapted for ReXGlue runtime
|
|
*/
|
|
|
|
#include <memory>
|
|
#include <functional>
|
|
#include <vector>
|
|
|
|
#include <rex/input/input.h>
|
|
#include <rex/input/input_driver.h>
|
|
#include <rex/system/interfaces/input.h>
|
|
|
|
namespace rex::ui {
|
|
class Window;
|
|
}
|
|
|
|
namespace rex::input {
|
|
|
|
class InputSystem : public system::IInputSystem {
|
|
public:
|
|
explicit InputSystem(rex::ui::Window* window);
|
|
~InputSystem() override;
|
|
|
|
rex::ui::Window* window() const { return window_; }
|
|
|
|
X_STATUS Setup() override;
|
|
void Shutdown() override;
|
|
|
|
void AddDriver(std::unique_ptr<InputDriver> driver);
|
|
void AttachWindow(rex::ui::Window* window);
|
|
void SetActiveCallback(std::function<bool()> callback);
|
|
void SetMenuChordCallback(std::function<void()> callback);
|
|
|
|
X_RESULT GetCapabilities(uint32_t user_index, uint32_t flags, X_INPUT_CAPABILITIES* out_caps);
|
|
X_RESULT GetState(uint32_t user_index, X_INPUT_STATE* out_state);
|
|
// Merged raw pad state for host UI overlays: all connected pads across all
|
|
// drivers and user slots, bypassing the is_active suppression and the
|
|
// menu-chord edge tracking of the guest-facing GetState. Safe to call from
|
|
// the UI thread. Returns false when no pad is connected.
|
|
bool GetUiGamepadState(X_INPUT_GAMEPAD* out_gamepad);
|
|
X_RESULT SetState(uint32_t user_index, X_INPUT_VIBRATION* vibration);
|
|
X_RESULT GetKeystroke(uint32_t user_index, uint32_t flags, X_INPUT_KEYSTROKE* out_keystroke);
|
|
|
|
private:
|
|
rex::ui::Window* window_ = nullptr;
|
|
|
|
std::vector<std::unique_ptr<InputDriver>> drivers_;
|
|
std::function<bool()> active_callback_ = nullptr;
|
|
std::function<void()> menu_chord_callback_ = nullptr;
|
|
bool menu_chord_down_ = false;
|
|
};
|
|
|
|
/// Create a default InputSystem with SDL + NOP drivers.
|
|
/// In tool mode, only the NOP driver is added.
|
|
std::unique_ptr<InputSystem> CreateDefaultInputSystem(bool tool_mode);
|
|
|
|
} // namespace rex::input
|