#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 #include #include #include #include namespace rex::ui { class Window; } namespace rex::input { class InputSystem; class InputDriver { public: virtual ~InputDriver() = default; virtual X_STATUS Setup() = 0; virtual X_RESULT GetCapabilities(uint32_t user_index, uint32_t flags, X_INPUT_CAPABILITIES* out_caps) = 0; virtual X_RESULT GetState(uint32_t user_index, X_INPUT_STATE* out_state) = 0; // Raw pad state for host UI overlays (settings navigation). Unlike // GetState, this must NOT be gated on is_active() - it is exactly the path // used while guest input is suppressed by an open overlay. Drivers that // self-gate GetState override this; drivers that emulate a pad from // keyboard/mouse override it to report not-connected (the host UI already // receives keyboard/mouse directly). virtual X_RESULT GetStateUi(uint32_t user_index, X_INPUT_STATE* out_state) { return GetState(user_index, out_state); } virtual X_RESULT SetState(uint32_t user_index, X_INPUT_VIBRATION* vibration) = 0; virtual X_RESULT GetKeystroke(uint32_t user_index, uint32_t flags, X_INPUT_KEYSTROKE* out_keystroke) = 0; virtual void OnWindowAvailable(rex::ui::Window* /*window*/) {} void set_is_active_callback(std::function is_active_callback) { is_active_callback_ = is_active_callback; } protected: explicit InputDriver(rex::ui::Window* window, size_t window_z_order) : window_(window), window_z_order_(window_z_order) {} rex::ui::Window* window() const { return window_; } size_t window_z_order() const { return window_z_order_; } bool is_active() const { return !is_active_callback_ || is_active_callback_(); } private: rex::ui::Window* window_; size_t window_z_order_; std::function is_active_callback_ = nullptr; }; } // namespace rex::input