![]() |
Sunshine v2025.118.151840
Self-hosted game stream host for Moonlight.
|
Implementation of input handling, prior to migration to inputtino. More...
#include <fcntl.h>#include <linux/uinput.h>#include <poll.h>#include <libevdev/libevdev-uinput.h>#include <libevdev/libevdev.h>#include <boost/locale.hpp>#include <cmath>#include <cstring>#include <filesystem>#include <thread>#include "src/config.h"#include "src/input.h"#include "src/logging.h"#include "src/platform/common.h"#include "src/utility.h"#include "src/platform/linux/misc.h"Classes | |
| struct | platf::client_input_raw_t |
| class | platf::effect_t::data_t |
| class | platf::effect_t |
| struct | platf::input_raw_t |
| struct | platf::keycode_t |
| struct | platf::rumble_ctx_t |
Macros | |
| #define | __CONVERT(wincode, linuxcode, scancode, keysym) |
| #define | __CONVERT_UNSAFE(wincode, linuxcode, scancode, keysym) keycodes[wincode] = keycode_t { linuxcode, scancode }; |
| #define | REL_HWHEEL_HI_RES 0x0c |
| #define | REL_WHEEL_HI_RES 0x0b |
Typedefs | |
| using | platf::evdev_t = util::safe_ptr<libevdev, libevdev_free> |
| using | platf::mail_evdev_t = std::tuple<int, uinput_t::pointer, feedback_queue_t, pollfd_t> |
| using | platf::uinput_t = util::safe_ptr<libevdev_uinput, libevdev_uinput_destroy> |
Functions | |
| void | platf::abs_mouse (input_t &input, const touch_port_t &touch_port, float x, float y) |
| Absolute mouse move. | |
| int | platf::alloc_gamepad (input_t &input, const gamepad_id_t &id, const gamepad_arrival_t &metadata, feedback_queue_t feedback_queue) |
| Create a new virtual gamepad. | |
| std::unique_ptr< client_input_t > | platf::allocate_client_input_context (input_t &input) |
| Allocate a context to store per-client input data. | |
| int | platf::allocate_slot_index_for_pointer_id (client_input_raw_t *input, uint32_t pointerId) |
| Reserves a slot index for a new pointer ID. | |
| void | platf::broadcastRumble (safe::queue_t< mail_evdev_t > &ctx) |
| void | platf::button_mouse (input_t &input, int button, bool release) |
| Mouse button press/release. | |
| void | platf::free_gamepad (input_t &input, int nr) |
| void | platf::freeInput (void *) |
| void | platf::gamepad_battery (input_t &input, const gamepad_battery_t &battery) |
| Send a gamepad battery event to the OS. | |
| void | platf::gamepad_motion (input_t &input, const gamepad_motion_t &motion) |
| Send a gamepad motion event to the OS. | |
| void | platf::gamepad_touch (input_t &input, const gamepad_touch_t &touch) |
| Send a gamepad touch event to the OS. | |
| void | platf::gamepad_update (input_t &input, int nr, const gamepad_state_t &gamepad_state) |
| Updates virtual gamepad with the provided gamepad state. | |
| platform_caps::caps_t | platf::get_capabilities () |
| Get the supported platform capabilities to advertise to the client. | |
| util::point_t | platf::get_mouse_loc (input_t &input) |
| Get the current mouse position on screen. | |
| void | platf::hscroll (input_t &input, int high_res_distance) |
| Horizontal mouse scroll. | |
| input_t | platf::input () |
| Initialize the input system and return it. | |
| evdev_t | platf::keyboard () |
| Initialize a new keyboard and return it. | |
| void | platf::keyboard_ev (libevdev_uinput *keyboard, int linux_code, int event_code=1) |
| void | platf::keyboard_update (input_t &input, uint16_t modcode, bool release, uint8_t flags) |
| Keyboard emulation. | |
| platf::KITTY_USING_MOVE_T (pollfd_t, pollfd, read_pollfd, { if(el.fd >=0) { ioctl(el.fd, EVIOCGRAB,(void *) 0);close(el.fd);} }) | |
| evdev_t | platf::mouse_abs () |
Initialize a new uinput virtual absolute mouse and return it. | |
| evdev_t | platf::mouse_rel () |
Initialize a new uinput virtual relative mouse and return it. | |
| void | platf::move_mouse (input_t &input, int deltaX, int deltaY) |
| Relative mouse move. | |
| void | platf::pen_update (client_input_t *input, const touch_port_t &touch_port, const pen_input_t &pen) |
| Send a pen event to the OS. | |
| evdev_t | platf::penpad () |
Initialize a new uinput virtual pen pad and return it. | |
| void | platf::rumbleIterate (std::vector< effect_t > &effects, std::vector< pollfd_t > &polls, std::chrono::milliseconds to) |
| void | platf::scroll (input_t &input, int high_res_distance) |
| Vertical mouse scroll. | |
| int | platf::slot_index_by_pointer_id (client_input_raw_t *input, uint32_t pointerId) |
| Retrieves the slot index for a given pointer ID. | |
| int | platf::startRumble (rumble_ctx_t &ctx) |
| void | platf::stopRumble (rumble_ctx_t &ctx) |
| std::vector< supported_gamepad_t > & | platf::supported_gamepads (input_t *input) |
| Gets the supported gamepads for this platform backend. | |
| std::string | platf::to_hex (const std::basic_string< char32_t > &str) |
| void | platf::touch_update (client_input_t *input, const touch_port_t &touch_port, const touch_input_t &touch) |
| Send a touch event to the OS. | |
| evdev_t | platf::touchscreen () |
Initialize a new uinput virtual touchscreen and return it. | |
| void | platf::unicode (input_t &input, char *utf8, int size) |
| evdev_t | platf::x360 () |
Initialize a new uinput virtual X360 gamepad and return it. | |
Variables | |
| constexpr auto | platf::DISTANCE_MAX = 1024 |
| constexpr int64_t | platf::INVALID_TRACKING_ID = -1 |
| constexpr auto | platf::mail_evdev = "platf::evdev"sv |
| constexpr auto | platf::NUM_TOUCH_SLOTS = 10 |
| constexpr auto | platf::PRESSURE_MAX = 4096 |
| constexpr auto | platf::PRESSURE_MIN = 0.10f |
| constexpr pollfd | platf::read_pollfd { -1, 0, 0 } |
| constexpr touch_port_t | platf::target_touch_port |
| constexpr auto | platf::UNKNOWN = 0 |
Implementation of input handling, prior to migration to inputtino.
| #define __CONVERT | ( | wincode, | |
| linuxcode, | |||
| scancode, | |||
| keysym ) |
| void platf::abs_mouse | ( | input_t & | input, |
| const touch_port_t & | touch_port, | ||
| float | x, | ||
| float | y ) |
Absolute mouse move.
| input | The input_t instance to use. |
| touch_port | The touch_port instance to use. |
| x | Absolute x position. |
| y | Absolute y position. |
Examples
| int platf::alloc_gamepad | ( | input_t & | input, |
| const gamepad_id_t & | id, | ||
| const gamepad_arrival_t & | metadata, | ||
| feedback_queue_t | feedback_queue ) |
Create a new virtual gamepad.
| input | The global input context. |
| id | The gamepad ID. |
| metadata | Controller metadata from client (empty if none provided). |
| feedback_queue | The queue for posting messages back to the client. |
| std::unique_ptr< client_input_t > platf::allocate_client_input_context | ( | input_t & | input | ) |
Allocate a context to store per-client input data.
Allocates a context to store per-client input data.
| input | The global input context. |
| int platf::allocate_slot_index_for_pointer_id | ( | client_input_raw_t * | input, |
| uint32_t | pointerId ) |
Reserves a slot index for a new pointer ID.
| input | The client-specific input context. |
| pointerId | The pointer ID sent from the client. |
| void platf::button_mouse | ( | input_t & | input, |
| int | button, | ||
| bool | release ) |
Mouse button press/release.
| input | The input_t instance to use. |
| button | Which mouse button to emulate. |
| release | Whether the event was a press (false) or a release (true) |
Examples
| void platf::gamepad_battery | ( | input_t & | input, |
| const gamepad_battery_t & | battery ) |
Send a gamepad battery event to the OS.
Sends a gamepad battery event to the OS.
| input | The global input context. |
| battery | The battery event. |
| void platf::gamepad_motion | ( | input_t & | input, |
| const gamepad_motion_t & | motion ) |
Send a gamepad motion event to the OS.
Sends a gamepad motion event to the OS.
| input | The global input context. |
| motion | The motion event. |
| void platf::gamepad_touch | ( | input_t & | input, |
| const gamepad_touch_t & | touch ) |
Send a gamepad touch event to the OS.
Sends a gamepad touch event to the OS.
| input | The global input context. |
| touch | The touch event. |
| void platf::gamepad_update | ( | input_t & | input, |
| int | nr, | ||
| const gamepad_state_t & | gamepad_state ) |
Updates virtual gamepad with the provided gamepad state.
| input | The input context. |
| nr | The gamepad index to update. |
| gamepad_state | The gamepad button/axis state sent from the client. |
| platform_caps::caps_t platf::get_capabilities | ( | ) |
Get the supported platform capabilities to advertise to the client.
Returns the supported platform capabilities to advertise to the client.
| util::point_t platf::get_mouse_loc | ( | input_t & | input | ) |
Get the current mouse position on screen.
| input | The input_t instance to use. |
Examples
| void platf::hscroll | ( | input_t & | input, |
| int | high_res_distance ) |
Horizontal mouse scroll.
| input | The input_t instance to use. |
| high_res_distance | How far to scroll. |
Examples
| input_t platf::input | ( | ) |
Initialize the input system and return it.
Examples
| evdev_t platf::keyboard | ( | ) |
Initialize a new keyboard and return it.
Examples
| void platf::keyboard_update | ( | input_t & | input, |
| uint16_t | modcode, | ||
| bool | release, | ||
| uint8_t | flags ) |
Keyboard emulation.
| input | The input_t instance to use. |
| modcode | The moonlight key code. |
| release | Whether the event was a press (false) or a release (true). |
| flags | SS_KBE_FLAG_* values. |
Examples
| evdev_t platf::mouse_abs | ( | ) |
Initialize a new uinput virtual absolute mouse and return it.
Examples
| evdev_t platf::mouse_rel | ( | ) |
Initialize a new uinput virtual relative mouse and return it.
Examples
| void platf::move_mouse | ( | input_t & | input, |
| int | deltaX, | ||
| int | deltaY ) |
Relative mouse move.
| input | The input_t instance to use. |
| deltaX | Relative x position. |
| deltaY | Relative y position. |
Examples
| void platf::pen_update | ( | client_input_t * | input, |
| const touch_port_t & | touch_port, | ||
| const pen_input_t & | pen ) |
Send a pen event to the OS.
Sends a pen event to the OS.
| input | The client-specific input context. |
| touch_port | The current viewport for translating to screen coordinates. |
| pen | The pen event. |
| evdev_t platf::penpad | ( | ) |
Initialize a new uinput virtual pen pad and return it.
Examples
| void platf::scroll | ( | input_t & | input, |
| int | high_res_distance ) |
Vertical mouse scroll.
| input | The input_t instance to use. |
| high_res_distance | How far to scroll. |
Examples
| int platf::slot_index_by_pointer_id | ( | client_input_raw_t * | input, |
| uint32_t | pointerId ) |
Retrieves the slot index for a given pointer ID.
| input | The client-specific input context. |
| pointerId | The pointer ID sent from the client. |
| std::vector< supported_gamepad_t > & platf::supported_gamepads | ( | input_t * | input | ) |
Gets the supported gamepads for this platform backend.
This may be called prior to platf::input()!
| input | Pointer to the platform's input_t or nullptr. |
| std::string platf::to_hex | ( | const std::basic_string< char32_t > & | str | ) |
Takes an UTF-32 encoded string and returns a hex string representation of the bytes (uppercase)
ex: ['👱'] = "1F471" // see UTF encoding at https://www.compart.com/en/unicode/U+1F471
adapted from: https://stackoverflow.com/a/7639754
| void platf::touch_update | ( | client_input_t * | input, |
| const touch_port_t & | touch_port, | ||
| const touch_input_t & | touch ) |
Send a touch event to the OS.
Sends a touch event to the OS.
| input | The client-specific input context. |
| touch_port | The current viewport for translating to screen coordinates. |
| touch | The touch event. |
| evdev_t platf::touchscreen | ( | ) |
Initialize a new uinput virtual touchscreen and return it.
Examples
| void platf::unicode | ( | input_t & | input, |
| char * | utf8, | ||
| int | size ) |
Here we receive a single UTF-8 encoded char at a time, the trick is to convert it to UTF-32 then send CTRL+SHIFT+U+{HEXCODE} in order to produce any unicode character, see: https://en.wikipedia.org/wiki/Unicode_input
ex:
| evdev_t platf::x360 | ( | ) |
Initialize a new uinput virtual X360 gamepad and return it.
Examples
|
constexpr |