2539 Commits

Author SHA1 Message Date
Romain Vimont
17987ee48e Add UHID gamepad support
Similar to UHID keyboard and mouse, but for gamepads.

Can be enabled with --gamepad=uhid or -G.

It is not enabled by default because not all devices support UHID
(there is a permission error on old Android versions).
2024-09-08 08:32:53 +02:00
Romain Vimont
8455b959b3 Add UHID_DESTROY control message
This message will be sent on gamepad disconnection.

Contrary to keyboard and mouse, which are registered once and are
unregistered when scrcpy exists, each gamepad is mapped with its own HID
id, and they can be plugged/unplugged dynamically.
2024-09-08 08:31:02 +02:00
Romain Vimont
5989198503 Add gamepad support in OTG mode
Implement gamepad support for OTG.
2024-09-08 08:31:02 +02:00
Romain Vimont
214efa0855 Add AOA gamepad support
Similar to AOA keyboard and mouse, but for gamepads.

Can be enabled with --gamepad=aoa.
2024-09-08 08:30:49 +02:00
Romain Vimont
75a3294c2b Implement HID gamepad
Implement the HID protocol for gamepads, that will be used in further
commits by the AOA and UHID gamepad processor implementations.
2024-09-08 08:29:09 +02:00
Romain Vimont
2680a714b4 Add util functions to write in little-endian
This will be helpful for writing HID values.
2024-09-08 08:29:09 +02:00
Romain Vimont
6366438a69 Add connected gamepads on start
Trigger SDL_CONTROLLERDEVICEADDED for all gamepads already connected
when scrcpy starts. We want to handle both the gamepads initially
connected and the gamepads connected while scrcpy is running.

This is not racy, because this event may not trigged automatically until
SDL events are "pumped" (SDL_PumpEvents/SDL_WaitEvent).
2024-09-08 08:26:39 +02:00
Romain Vimont
2d929fa4e5 Handle SDL gamepad events
Introduce a gamepad processor trait, similar to the keyboard processor
and mouse processor traits.

Handle gamepad events received from SDL, convert them to scrcpy-specific
gamepad events, and forward them to the gamepad processor.

Further commits will provide AOA and UHID implementations of the gamepad
processor trait.

Co-authored-by: Luiz Henrique Laurini <luizhenriquelaurini@gmail.com>
2024-09-07 22:45:05 +02:00
Romain Vimont
623346b558 Fix HID comments
Fix typo and reference the latest version of "HID Usage Tables"
specifications.
2024-09-07 22:45:05 +02:00
Romain Vimont
5b52afd980 Make AOA keyboard/mouse open error fatal
Now that the AOA open/close are asynchronous, an open error did not make
scrcpy exit anymore.

Add a mechanism to exit if the AOA device could not be opened
asynchronously.
2024-09-07 22:45:05 +02:00
Romain Vimont
4c5d43d41d Unregister all AOA devices automatically on exit
Pushing a close event from the keyboard_aoa or mouse_aoa implementation
was racy, because the AOA thread might be stopped before these events
were processed.

Instead, keep the list of open AOA devices to close them automatically
from the AOA thread before exiting.
2024-09-07 22:45:05 +02:00
Romain Vimont
2351eed46f Make HID logs uniform 2024-09-07 22:45:05 +02:00
Romain Vimont
2595bcfa75 Add AOA open/close verbose logs 2024-09-07 22:45:05 +02:00
Romain Vimont
93dad86634 Introduce hid_open and hid_close events
This allows to handle HID open/close at the same place as HID input
events (in the HID layer).

This will be especially useful to manage HID gamepads, to avoid
implementing one part in the HID layer and another part in the gamepad
processor implementation.
2024-09-07 22:45:05 +02:00
Romain Vimont
282e6503e1 Rename hid_event to hid_input
The sc_hid_event structure represents HID input data. Rename it so that
we can add other hid event structs without confusion.
2024-09-07 22:45:05 +02:00
Romain Vimont
9c86cf74e6 Make AOA open and close asynchronous
For AOA keyboard and mouse, only input events were asynchronous.
Register/unregister were called from the main thread.

This had the benefit to fail immediately if the AOA registration failed,
but to support gamepads we want to open/close AOA devices dynamically.

Also, it is better to avoid USB I/O from the main thread.
2024-09-07 22:45:05 +02:00
Romain Vimont
2caf593960 Reorder AOA functions
This will allow sc_aoa_setup_hid() to compile even when
sc_aoa_unregister_hid() will be made static.
2024-09-07 22:45:05 +02:00
Romain Vimont
1344b76f42 Refactor AOA handling
Extract event processing to a separate function.

This will make the code more readable when more event types will be
added.
2024-09-07 22:45:05 +02:00
Romain Vimont
32b1a8093a Move HID ids to common HID code
The HID ids (accessory ids or UHID ids) were defined by the keyboard and
mouse implementations.

Instead, define them in the common HID part, and make that id part of
the sc_hid_event.

This prepares the introduction of gamepad support, which will handle
several gamepads (and ids) in the common HID gamepad code.
2024-09-07 22:45:05 +02:00
Romain Vimont
4416aa29f1 Fix HID mouse header guard 2024-09-07 22:45:05 +02:00
Romain Vimont
4b95a9674a Add missing SC_ prefix for HID mouse event size 2024-09-07 22:45:05 +02:00
Romain Vimont
c7c8d71de5 Remove duplicate definition SC_HID_MAX_SIZE
This constant is defined in hid_event.h.
2024-09-07 22:45:05 +02:00
Romain Vimont
de6ee25d09 Fail on AOA keyboard/mouse initialization error
If the AOA keyboard or the AOA mouse fails to be initialized, this is a
fatal error.
2024-09-07 22:45:05 +02:00
Romain Vimont
70a9bbbc06 Introduce non-droppable control messages
Control messages are queued from the main thread and sent to the device
from a separate thread.

When the queue is full, messages are just dropped. This avoids to
accumulate too much delay between the client and the device in case of
network issue.

However, some messages should not be dropped: for example, dropping a
UHID_CREATE message would make invalid all further UHID_INPUT messages.
Therefore, mark these messages as non-droppable.

A non-droppable event is queued anyway (resizing the queue if
necessary, unless the allocation fails).
2024-09-07 22:45:05 +02:00
Romain Vimont
97e83fa3d6 Remove atomics from keyboard_uhid
The UHID output callback is now called from the same (main) thread as
the process_key() function.
2024-09-07 22:45:05 +02:00
Romain Vimont
0215693725 Process UHID outputs events from the main thread
This will guarantee that the callbacks of UHID devices implementations
will always be called from the same (main) thread.
2024-09-07 22:45:05 +02:00
Romain Vimont
220cad2e7a Set clipboard from the main thread
The clipboard changes from the device are received from a separate
thread, but it must be handled from the main thread.
2024-09-07 22:45:05 +02:00
Romain Vimont
0b6119a594 Add mechanism to execute code on the main thread
This allows to schedule a runnable to be executed on the main thread,
until the event loop is explicitly terminated.

It is guaranteed that all accepted runnables will be executed (this
avoids possible memory leaks if a runnable owns resources).
2024-09-07 22:44:51 +02:00
Romain Vimont
9cae029ef2 Expose main thread id
This will allow to assert that a function is called from the main
thread.
2024-09-07 22:05:18 +02:00
Romain Vimont
72d5bcc12a Extract sc_push_event()
Expose a convenience function to push an event without args to the main
thread.
2024-09-07 22:03:27 +02:00
Romain Vimont
d56b8a6a95 Store events numbers in an enum
This avoids to manually set an explicit value for each item.
2024-09-07 22:03:27 +02:00
Romain Vimont
580cba73c0 Fix deprecated reference in scrcpy manpage
The options --hid-keyboard and --hid-mouse do not exist anymore. They
have been replaced by --keyboard=XXX and --mouse=XXX.
2024-09-07 18:36:05 +02:00
Romain Vimont
523299743c Do not send uninitialized HID event
If the function returns false, then there is nothing to send.
2024-09-07 18:35:16 +02:00
Romain Vimont
21b412cd98 Simplify messages reader/writer
In Java, control messages were parsed using manual buffering, which was
convoluted and error-prone.

Instead, read the socket directly through a DataInputStream and a
BufferedInputStream. Symmetrically, use a DataOutputStream and a
BufferedOutputStream to write messages.
2024-09-07 14:31:54 +02:00
Romain Vimont
3b241af3f6 Allow to pass an explicit version name on release
To build with a specific version name:

    VERSION=pr1234 ./release.sh

If not set, it will use the result of "git describe" (as before).
2024-09-06 23:07:15 +02:00
Romain Vimont
0c95794463 Do not apply all workarounds for ONYX devices
Calling fillAppInfo() breaks video mirroring on ONYX devices.

Fixes #5182 <https://github.com/Genymobile/scrcpy/issues/5182>
Refs 2b6089cbfc29c41643e0c0e8049bda3ede777b61
2024-08-10 14:29:26 +02:00
Romain Vimont
523f939532 Do not create UHID thread if not used
The HandlerThread is used only via the looper queue.
2024-08-08 20:32:35 +02:00
yangfl
dd47cefa47 Fix typos
Refs <https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1077968#27>
PR #5171 <https://github.com/Genymobile/scrcpy/pull/5171>

Signed-off-by: Romain Vimont <rom@rom1v.com>
2024-08-05 16:13:02 +02:00
Romain Vimont
44b3fd82b1 Update links to 2.6.1 v2.6.1-install-release 2024-08-02 22:58:09 +02:00
Romain Vimont
cc41115625 Bump version to 2.6.1 v2.6.1 2024-08-02 22:32:04 +02:00
Romain Vimont
773c23fda2 Inject finger input whenever possible
Even if the pointer is a mouse, inject it as a finger unless it is
required to be a mouse, that is:
 - when it is a HOVER_MOUSE event, or
 - when a secondary button is pressed.

Some apps/games only accept events from a finger/touchscreen, so using a
mouse by default does not work for them.

For simplicity, make this change on the server side just before
event injection (so that the client does not need to know about this
hacky behavior).

Refs 6808288823239b0f3a76f9be377e4de82e91b35a
Refs c7b1d0ea9af8bb9603ec8f713f1a5fbf3f628b6a
Fixes #5162 <https://github.com/Genymobile/scrcpy/issues/5162>
Fixes #5163 <https://github.com/Genymobile/scrcpy/issues/5163>
2024-08-02 22:24:31 +02:00
Romain Vimont
992b4922fe Document INJECT_EVENTS permission issue on Xiaomi
Make explicit in the prerequisites the exact error message when "USB
debugging (Security Settings)" is not set.
2024-08-02 18:44:42 +02:00
Romain Vimont
67f93350f6 Update links to 2.6 v2.6-install-release 2024-08-01 18:46:10 +02:00
Romain Vimont
52136268ef Bump version to 2.6 v2.6 2024-08-01 18:15:59 +02:00
Romain Vimont
0a6ccdc4df Merge branch 'master' into release 2024-08-01 18:15:40 +02:00
Romain Vimont
5d2441d198 Upgrade SDL (2.30.5) for Windows 2024-08-01 18:15:37 +02:00
Romain Vimont
2b6089cbfc Enable workarounds by default
Workarounds were disabled by default, and only enabled for some devices
or under specific conditions.

But it seems they are needed for more and more devices, so enable them
by default. They could be disabled for specific devices if necessary in
the future.

In the past, these workarounds caused a (harmless) exception to be
printed on some Xiaomi devices [1]. But this is not a problem anymore
since commit b8c5853aa6ac9cfbe3fb4e46bf10978b3fa212e3.

They also caused problems for audio on Vivo devices [2], but it seems
this is not the case anymore [3].

They might also impact an old Nvidia Shield [4], but hopefully this is
fixed now.

[1]: <https://github.com/Genymobile/scrcpy/issues/4015#issuecomment-1595382142>
[2]: <https://github.com/Genymobile/scrcpy/issues/3805#issuecomment-1596148031>
[3]: <https://github.com/Genymobile/scrcpy/issues/3805#issuecomment-2260205882>
[4]: <https://github.com/Genymobile/scrcpy/issues/940>

PR #5154 <https://github.com/Genymobile/scrcpy/pull/5154>
2024-08-01 12:16:35 +02:00
Al Grimes
f691ebb1b4 Add workaround for TCL Android 12 Smart TVs
Fixes #5140 <https://github.com/Genymobile/scrcpy/issues/5140>
PR #5148 <https://github.com/Genymobile/scrcpy/pull/5148>

Signed-off-by: Romain Vimont <rom@rom1v.com>
2024-07-31 14:55:00 +02:00
Romain Vimont
071d459ad7 Fix --no-audio
By default, the audio source is initialized to SC_AUDIO_SOURCE_AUTO, and
is "resolved" only if audio is enabled.

But the server arguments were built assuming that the audio source was
never SC_AUDIO_SOURCE_AUTO (even with audio disabled), causing a crash.

Regression introduced by a10f8cd798023f858796b023cb846fa2184ad2c7.
2024-07-29 20:03:44 +02:00
Romain Vimont
bbfac9ae1f Add FUNDING.yml
The donation links were already in the README.

Also add them in the format expected by GitHub in FUNDING.yml.
2024-07-19 17:56:26 +02:00