Files
AC6_recomp/thirdparty/rexglue-sdk/include/rex/input/input_driver.h
T
Dipshet 33c2cf60cc Fix overlay input leaking into the game: explicit input ownership
Interacting with the overlays also drove the game (clicks fired
weapons, scroll cycled them, keys leaked), and hovering one silenced a real
pad. Input now follows window-manager rules, mouse to the window under the
cursor, keyboard to the focused window, real pads never suppressed, via
ImGui capture flags conjoined with overlay visibility, published as atomics.
2026-08-06 00:43:34 +02:00

70 lines
2.4 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 <cstddef>
#include <functional>
#include <rex/input/input.h>
#include <rex/kernel.h>
#include <rex/ui/window.h>
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;
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*/) {}
// Whether this driver synthesizes its state from the host keyboard/mouse
// and must therefore pause while the host UI (overlay dialogs) captures
// them. Real controller drivers keep the default false: a physical pad has
// nothing to do with UI capture - the overlays are not pad-navigable - and
// must keep working while a dialog has the cursor or keyboard focus.
virtual bool SuppressedByUICapture() const { return false; }
void set_is_active_callback(std::function<bool()> 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<bool()> is_active_callback_ = nullptr;
};
} // namespace rex::input