Sunshine0.0.5917
Sunshine 0.0.5917
Self-hosted game stream host for Moonlight.
Loading...
Searching...
No Matches
virtualhid_input.h
Go to the documentation of this file.
1
5#pragma once
6
7// standard includes
8#include <memory>
9#include <optional>
10#include <set>
11#include <string>
12#include <string_view>
13#include <vector>
14
15// lib includes
16#include <libvirtualhid/libvirtualhid.hpp>
17
18// local includes
19#include "src/platform/common.h"
20
21namespace platf::virtualhid {
22
31
37 explicit input_context_t(lvh::BackendKind backend);
38
42 void refresh_keyboard();
43
47 void refresh_mouse();
48
55 void refresh_mouse(const lvh::PointerViewport &desktop, const lvh::PointerViewport &viewport);
56
62 void update_mouse_viewport(const touch_port_t &touch_port);
63
64 std::unique_ptr<lvh::Runtime> runtime;
65 std::unique_ptr<lvh::Keyboard> keyboard;
66 std::unique_ptr<lvh::Mouse> mouse;
67 lvh::PointerViewport mouse_desktop;
68 lvh::PointerViewport mouse_viewport;
69 std::vector<std::shared_ptr<struct gamepad_context_t>> gamepads {static_cast<std::size_t>(MAX_GAMEPADS)};
70 };
71
82
84 std::unique_ptr<lvh::Touchscreen> touch;
85 std::unique_ptr<lvh::PenTablet> pen;
86 std::set<std::int32_t> active_touches;
87 std::set<lvh::PenButton> pressed_pen_buttons;
88 };
89
97
105
112 std::unique_ptr<lvh::Runtime> create_runtime(lvh::BackendKind backend = lvh::BackendKind::platform_default);
113
119 std::vector<supported_gamepad_t> static_supported_gamepads();
120
130 std::vector<supported_gamepad_t> supported_gamepads(
131 lvh::Runtime *runtime,
132 bool fallback_vigem_available = false,
133 bool virtualhid_licensed = true,
134 bool require_license = false
135 );
136
146 const lvh::BackendCapabilities &capabilities,
147 std::string_view gamepad_driver,
148 bool virtualhid_licensed
149 );
150
163 std::string_view configured_gamepad,
164 bool virtualhid_selected,
165 std::string_view gamepad_driver
166 );
167
177 int alloc_gamepad(input_context_t &context, const gamepad_id_t &id, const gamepad_arrival_t &metadata, feedback_queue_t feedback_queue);
178
187 int rebind_gamepad(input_context_t &context, const gamepad_id_t &id, feedback_queue_t feedback_queue);
188
196 bool has_gamepad(const input_context_t &context, int nr);
197
198#ifdef SUNSHINE_TESTS
206 lvh::GamepadStateAdapter *gamepad_adapter_for_testing(input_context_t &context, int nr);
207#endif
208
215 void free_gamepad(input_context_t &context, int nr);
216
224 void gamepad_update(input_context_t &context, int nr, const gamepad_state_t &state);
225
232 void gamepad_touch(input_context_t &context, const gamepad_touch_t &touch);
233
240 void gamepad_motion(input_context_t &context, const gamepad_motion_t &motion);
241
248 void gamepad_battery(input_context_t &context, const gamepad_battery_t &battery);
249
257 void move_mouse(input_context_t &context, int delta_x, int delta_y);
258
267 void move_mouse(input_context_t &context, const touch_port_t &touch_port, int delta_x, int delta_y);
268
277 void abs_mouse(input_context_t &context, const touch_port_t &touch_port, float x, float y);
278
286 void button_mouse(input_context_t &context, int button, bool release);
287
294 void scroll(input_context_t &context, int high_res_distance);
295
302 void hscroll(input_context_t &context, int high_res_distance);
303
313 void keyboard_update(input_context_t &context, std::uint16_t modcode, bool release, std::uint8_t flags, bool extended = false);
314
322 void unicode(input_context_t &context, const char *utf8, int size);
323
331 void touch_update(client_context_t &context, const touch_port_t &touch_port, const touch_input_t &touch);
332
340 void pen_update(client_context_t &context, const touch_port_t &touch_port, const pen_input_t &pen);
341
348
358
359} // namespace platf::virtualhid
Declarations for common platform specific utilities.
deinit_t client_input_t
Per-client input context allocated by a platform backend.
Definition common.h:1236
input_t input()
Create the platform input backend for a stream.
Definition input.cpp:561
util::safe_ptr< input_raw_t, &freeInput > input_t
Owning pointer for a platform input backend.
Definition common.h:893
constexpr auto MAX_GAMEPADS
Maximum number of simultaneously tracked gamepads.
Definition common.h:82
safe::mail_raw_t::queue_t< gamepad_feedback_msg_t > feedback_queue_t
Queue used to deliver controller feedback commands to the platform backend.
Definition common.h:275
Capabilities reported when a controller is connected.
Definition common.h:445
Battery state reported by a virtual gamepad.
Definition common.h:480
Global and client-relative identifiers for a virtual gamepad.
Definition common.h:431
Accelerometer or gyroscope sample from a controller.
Definition common.h:466
Button and axis state received for a virtual gamepad.
Definition common.h:418
Touchpad contact data reported by a controller.
Definition common.h:454
Pen tablet event data from the client.
Definition common.h:503
Absolute touchscreen event data from the client.
Definition common.h:489
Touchscreen coordinate bounds used to scale absolute input.
Definition common.h:387
Per-client virtual touch and pen state.
Definition virtualhid_input.h:75
std::unique_ptr< lvh::Touchscreen > touch
Per-client touchscreen.
Definition virtualhid_input.h:84
std::set< std::int32_t > active_touches
Active touchscreen contacts.
Definition virtualhid_input.h:86
std::unique_ptr< lvh::PenTablet > pen
Per-client pen tablet.
Definition virtualhid_input.h:85
client_context_t(input_context_t &input)
Create per-client libvirtualhid devices.
Definition virtualhid_input.cpp:578
input_context_t * global
Shared global input context.
Definition virtualhid_input.h:83
std::set< lvh::PenButton > pressed_pen_buttons
Active pen tablet buttons.
Definition virtualhid_input.h:87
Runtime and virtual devices owned by one platform input context.
Definition virtualhid_input.h:26
lvh::PointerViewport mouse_viewport
Streamed display bounds used to create the shared mouse.
Definition virtualhid_input.h:68
std::vector< std::shared_ptr< struct gamepad_context_t > > gamepads
Virtual gamepad slots.
Definition virtualhid_input.h:69
void refresh_mouse()
Recreate the shared mouse using the runtime's current driver and license state.
Definition virtualhid_input.cpp:544
input_context_t()
Construct the libvirtualhid input context using the platform-default backend.
Definition virtualhid_input.cpp:513
lvh::PointerViewport mouse_desktop
Virtual-desktop bounds used to create the shared mouse.
Definition virtualhid_input.h:67
std::unique_ptr< lvh::Runtime > runtime
libvirtualhid runtime.
Definition virtualhid_input.h:64
std::unique_ptr< lvh::Keyboard > keyboard
Shared virtual keyboard.
Definition virtualhid_input.h:65
void update_mouse_viewport(const touch_port_t &touch_port)
Retarget the shared mouse when streamed display geometry changes.
Definition virtualhid_input.cpp:569
std::unique_ptr< lvh::Mouse > mouse
Shared virtual mouse.
Definition virtualhid_input.h:66
void refresh_keyboard()
Recreate the shared keyboard using the runtime's current driver and license state.
Definition virtualhid_input.cpp:527
void scroll(input_context_t &context, int high_res_distance)
Submit vertical scroll input.
Definition virtualhid_input.cpp:929
void pen_update(client_context_t &context, const touch_port_t &touch_port, const pen_input_t &pen)
Submit a pen event.
Definition virtualhid_input.cpp:997
void keyboard_update(input_context_t &context, std::uint16_t modcode, bool release, std::uint8_t flags, bool extended)
Submit a keyboard key transition.
Definition virtualhid_input.cpp:941
void unicode(input_context_t &context, const char *utf8, int size)
Submit UTF-8 text input.
Definition virtualhid_input.cpp:947
std::vector< supported_gamepad_t > static_supported_gamepads()
Return static gamepad choices for config validation.
Definition virtualhid_input.cpp:616
bool should_use_gamepad_runtime(const lvh::BackendCapabilities &capabilities, const std::string_view gamepad_driver, const bool virtualhid_licensed)
Decide whether a libvirtualhid runtime may create a gamepad.
Definition virtualhid_input.cpp:666
std::vector< supported_gamepad_t > supported_gamepads(lvh::Runtime *runtime, const bool fallback_vigem_available, const bool virtualhid_licensed, const bool require_license)
Return gamepad choices and runtime availability.
Definition virtualhid_input.cpp:627
bool configured_gamepad_supports_touchpad()
Return whether the configured gamepad profile can expose touchpad input.
Definition virtualhid_input.cpp:1078
void move_mouse(input_context_t &context, int delta_x, int delta_y)
Move the virtual mouse relatively.
Definition virtualhid_input.cpp:882
std::unique_ptr< lvh::Runtime > create_runtime(lvh::BackendKind backend)
Create a platform-default libvirtualhid runtime.
Definition virtualhid_input.cpp:609
void free_gamepad(input_context_t &context, int nr)
Release a libvirtualhid gamepad slot.
Definition virtualhid_input.cpp:772
int rebind_gamepad(input_context_t &context, const gamepad_id_t &id, feedback_queue_t feedback_queue)
Rebind an existing libvirtualhid gamepad to a resumed client session.
Definition virtualhid_input.cpp:740
bool should_try_vigembus_fallback(const std::string_view configured_gamepad, const bool virtualhid_selected, const std::string_view gamepad_driver)
Decide whether ViGEmBus should be tried for a gamepad allocation.
Definition virtualhid_input.cpp:675
int alloc_gamepad(input_context_t &context, const gamepad_id_t &id, const gamepad_arrival_t &metadata, feedback_queue_t feedback_queue)
Allocate a libvirtualhid gamepad.
Definition virtualhid_input.cpp:691
void gamepad_battery(input_context_t &context, const gamepad_battery_t &battery)
Submit gamepad battery metadata.
Definition virtualhid_input.cpp:865
bool configured_gamepad_supports_controller_extensions()
Return whether the configured gamepad profile needs Moonlight controller extensions.
Definition virtualhid_input.cpp:1087
void button_mouse(input_context_t &context, int button, bool release)
Submit a mouse button event.
Definition virtualhid_input.cpp:918
void touch_update(client_context_t &context, const touch_port_t &touch_port, const touch_input_t &touch)
Submit a touchscreen event.
Definition virtualhid_input.cpp:953
void gamepad_update(input_context_t &context, int nr, const gamepad_state_t &state)
Submit a full gamepad state.
Definition virtualhid_input.cpp:778
void abs_mouse(input_context_t &context, const touch_port_t &touch_port, float x, float y)
Move the virtual mouse absolutely inside a target touch port.
Definition virtualhid_input.cpp:897
bool has_gamepad(const input_context_t &context, int nr)
Check whether a libvirtualhid gamepad exists in a slot.
Definition virtualhid_input.cpp:762
void gamepad_motion(input_context_t &context, const gamepad_motion_t &motion)
Submit a gamepad motion event.
Definition virtualhid_input.cpp:847
void gamepad_touch(input_context_t &context, const gamepad_touch_t &touch)
Submit a gamepad touch event.
Definition virtualhid_input.cpp:793
void hscroll(input_context_t &context, int high_res_distance)
Submit horizontal scroll input.
Definition virtualhid_input.cpp:935
input_context_t & get_input_context(input_t &input)
Return the shared libvirtualhid context from a platform input backend.
Definition input.cpp:622
client_context_t & get_client_context(client_input_t *input)
Return the per-client libvirtualhid context from a platform input backend.
Definition input.cpp:662