Compare commits

..

13 Commits

Author SHA1 Message Date
Romain Vimont
3ce6f8ca91 Add Bash completion script
Fixes #2930 <https://github.com/Genymobile/scrcpy/issues/2930>
Refs #3012 <https://github.com/Genymobile/scrcpy/pull/3012>
2022-02-22 19:22:12 +01:00
hltdev8642
26953784d9 Add ZSH completion script
PR #3012 <https://github.com/Genymobile/scrcpy/pull/3012>

Signed-off-by: Romain Vimont <rom@rom1v.com>
2022-02-22 19:15:27 +01:00
Romain Vimont
2716385887 Move "Device unauthorized" in FAQ
Put "Device not detected" first.
2022-02-22 19:12:02 +01:00
Romain Vimont
1f951f1a3a Update FAQ to match the latest version 2022-02-22 19:08:15 +01:00
Romain Vimont
6a9b2f2c36 Remove spurious empty line 2022-02-22 18:31:37 +01:00
Flying Press
ff8a69d8ec Mention adb wireless option for Android 11+
Add a paragraph about toggling an option to bypass having to physically
connect the device to the user's computer.

PR #1303 <https://github.com/Genymobile/scrcpy/pull/1303>

Signed-off-by: Romain Vimont <rom@rom1v.com>
2022-02-22 18:27:25 +01:00
Flying Press
1693797277 Make step more explicit in wireless section
PR #1303 <https://github.com/Genymobile/scrcpy/pull/1303>

Signed-off-by: Romain Vimont <rom@rom1v.com>
2022-02-22 18:27:25 +01:00
Flying Press
8610e9a454 Add troubleshooting in wireless section
Add a small troubleshooting section since wireless might add some
complexity, and to lessen incoming relevant issue posts.

PR #1303 <https://github.com/Genymobile/scrcpy/pull/1303>

Signed-off-by: Romain Vimont <rom@rom1v.com>
2022-02-22 18:27:25 +01:00
Flying Press
528275d501 Improve phrasing in wireless section
PR #1303 <https://github.com/Genymobile/scrcpy/pull/1303>

Signed-off-by: Romain Vimont <rom@rom1v.com>
2022-02-22 18:27:25 +01:00
Flying Press
78b18b7cee Renumber steps in wireless section
The actual numbers are ignored by markdown, but start at 1 for
consistency.

PR #1303 <https://github.com/Genymobile/scrcpy/pull/1303>

Signed-off-by: Romain Vimont <rom@rom1v.com>
2022-02-22 18:27:25 +01:00
Flying Press
90816291d4 Add an explicit first step in wireless section
Mention that the device must be plugged via USB before configuring
TCP/IP connections.

It wasn't obvious that the device should be first plugged before running
scrcpy wirelessly, especially to those who aren't very familiar with
adb.

Note from committer: add this new step with index 0 to make the diff
readable, the next commit will renumber all the steps.

PR #1303 <https://github.com/Genymobile/scrcpy/pull/1303>

Signed-off-by: Romain Vimont <rom@rom1v.com>
2022-02-22 18:27:25 +01:00
Romain Vimont
3e0df6ad05 Update HID/OTG features in README
HID/OTG features are not limited to Linux anymore.

Refs 82a99f69ec
2022-02-22 18:27:13 +01:00
Romain Vimont
79ed83ab68 Reorder --tcpip option in cli
To keep options in alphabetic order.
2022-02-22 18:10:30 +01:00
7 changed files with 204 additions and 62 deletions

68
FAQ.md
View File

@@ -4,23 +4,16 @@
Here are the common reported problems and their status. Here are the common reported problems and their status.
If you encounter any error, the first step is to upgrade to the latest version.
## `adb` issues ## `adb` issues
`scrcpy` execute `adb` commands to initialize the connection with the device. If `scrcpy` execute `adb` commands to initialize the connection with the device. If
`adb` fails, then scrcpy will not work. `adb` fails, then scrcpy will not work.
In that case, it will print this error:
> ERROR: "adb get-serialno" returned with value 1
This is typically not a bug in _scrcpy_, but a problem in your environment. This is typically not a bug in _scrcpy_, but a problem in your environment.
To find out the cause, execute:
```bash
adb devices
```
### `adb` not found ### `adb` not found
@@ -30,13 +23,30 @@ On Windows, the current directory is in your `PATH`, and `adb.exe` is included
in the release, so it should work out-of-the-box. in the release, so it should work out-of-the-box.
### Device not detected
> ERROR: Could not find any ADB device
Check that you correctly enabled [adb debugging][enable-adb].
Your device must be detected by `adb`:
```
adb devices
```
If your device is not detected, you may need some [drivers] (on Windows). There is a separate [USB driver for Google devices][google-usb-driver].
[enable-adb]: https://developer.android.com/studio/command-line/adb.html#Enabling
[drivers]: https://developer.android.com/studio/run/oem-usb.html
[google-usb-driver]: https://developer.android.com/studio/run/win-usb
### Device unauthorized ### Device unauthorized
> ERROR: Device is unauthorized:
> error: device unauthorized. > ERROR: --> (usb) 0123456789abcdef unauthorized
> This adb server's $ADB_VENDOR_KEYS is not set > ERROR: A popup should open on the device to request authorization.
> Try 'adb kill-server' if that seems wrong.
> Otherwise check for a confirmation dialog on your device.
When connecting, a popup should open on the device. You must authorize USB When connecting, a popup should open on the device. You must authorize USB
debugging. debugging.
@@ -46,29 +56,27 @@ If it does not open, check [stackoverflow][device-unauthorized].
[device-unauthorized]: https://stackoverflow.com/questions/23081263/adb-android-device-unauthorized [device-unauthorized]: https://stackoverflow.com/questions/23081263/adb-android-device-unauthorized
### Device not detected
> error: no devices/emulators found
Check that you correctly enabled [adb debugging][enable-adb].
If your device is not detected, you may need some [drivers] (on Windows). There is a separate [USB driver for Google devices][google-usb-driver].
[enable-adb]: https://developer.android.com/studio/command-line/adb.html#Enabling
[drivers]: https://developer.android.com/studio/run/oem-usb.html
[google-usb-driver]: https://developer.android.com/studio/run/win-usb
### Several devices connected ### Several devices connected
If several devices are connected, you will encounter this error: If several devices are connected, you will encounter this error:
> error: more than one device/emulator ERROR: Multiple (2) ADB devices:
ERROR: --> (usb) 0123456789abcdef device Nexus_5
ERROR: --> (tcpip) 192.168.1.5:5555 device GM1913
ERROR: Select a device via -s (--serial), -d (--select-usb) or -e (--select-tcpip)
the identifier of the device you want to mirror must be provided: In that case, you can either provide the identifier of the device you want to
mirror:
```bash ```bash
scrcpy -s 01234567890abcdef scrcpy -s 0123456789abcdef
```
Or request the single USB (or TCP/IP) device:
```bash
scrcpy -d # USB device
scrcpy -e # TCP/IP device
``` ```
Note that if your device is connected over TCP/IP, you might get this message: Note that if your device is connected over TCP/IP, you might get this message:

View File

@@ -32,10 +32,8 @@ Its features include:
- [configurable quality](#capture-configuration) - [configurable quality](#capture-configuration)
- device screen [as a webcam (V4L2)](#v4l2loopback) (Linux-only) - device screen [as a webcam (V4L2)](#v4l2loopback) (Linux-only)
- [physical keyboard simulation (HID)](#physical-keyboard-simulation-hid) - [physical keyboard simulation (HID)](#physical-keyboard-simulation-hid)
(Linux-only)
- [physical mouse simulation (HID)](#physical-mouse-simulation-hid) - [physical mouse simulation (HID)](#physical-mouse-simulation-hid)
(Linux-only) - [OTG mode](#otg)
- [OTG mode](#otg) (Linux-only)
- and more… - and more…
## Requirements ## Requirements
@@ -406,18 +404,30 @@ connect to the device before starting.
Alternatively, it is possible to enable the TCP/IP connection manually using Alternatively, it is possible to enable the TCP/IP connection manually using
`adb`: `adb`:
1. Connect the device to the same Wi-Fi as your computer. 1. Plug the device into a USB port on your computer.
2. Get your device IP address, in Settings → About phone → Status, or by 2. Connect the device to the same Wi-Fi network as your computer.
3. Get your device IP address, in Settings → About phone → Status, or by
executing this command: executing this command:
```bash ```bash
adb shell ip route | awk '{print $9}' adb shell ip route | awk '{print $9}'
``` ```
3. Enable adb over TCP/IP on your device: `adb tcpip 5555`. 4. Enable adb over TCP/IP on your device: `adb tcpip 5555`.
4. Unplug your device. 5. Unplug your device.
5. Connect to your device: `adb connect DEVICE_IP:5555` _(replace `DEVICE_IP`)_. 6. Connect to your device: `adb connect DEVICE_IP:5555` _(replace `DEVICE_IP`
6. Run `scrcpy` as usual. with the device IP address you found)_.
7. Run `scrcpy` as usual.
Since Android 11, a [Wireless debugging option][adb-wireless] allows to bypass
having to physically connect your device directly to your computer.
[adb-wireless]: https://developer.android.com/studio/command-line/adb#connect-to-a-device-over-wi-fi-android-11+
If the connection randomly drops, run your `scrcpy` command to reconnect. If it
says there are no devices/emulators found, try running `adb connect
DEVICE_IP:5555` again, and then `scrcpy` as usual. If it still says there are
none found, try running `adb disconnect` and then run those two commands again.
It may be useful to decrease the bit-rate and the definition: It may be useful to decrease the bit-rate and the definition:
@@ -807,14 +817,17 @@ a location inverted through the center of the screen.
By default, scrcpy uses Android key or text injection: it works everywhere, but By default, scrcpy uses Android key or text injection: it works everywhere, but
is limited to ASCII. is limited to ASCII.
On Linux, scrcpy can simulate a physical USB keyboard on Android to provide a Alternatively, scrcpy can simulate a physical USB keyboard on Android to provide
better input experience (using [USB HID over AOAv2][hid-aoav2]): the virtual a better input experience (using [USB HID over AOAv2][hid-aoav2]): the virtual
keyboard is disabled and it works for all characters and IME. keyboard is disabled and it works for all characters and IME.
[hid-aoav2]: https://source.android.com/devices/accessories/aoa2#hid-support [hid-aoav2]: https://source.android.com/devices/accessories/aoa2#hid-support
However, it only works if the device is connected by USB, and is currently only However, it only works if the device is connected by USB.
supported on Linux.
Note: On Windows, it may only work in [OTG mode](#otg), not while mirroring (it
is not possible to open a USB device if it is already open by another process
like the adb daemon).
To enable this mode: To enable this mode:
@@ -847,8 +860,7 @@ a physical keyboard is connected).
#### Physical mouse simulation (HID) #### Physical mouse simulation (HID)
Similarly to the physical keyboard simulation, it is possible to simulate a Similarly to the physical keyboard simulation, it is possible to simulate a
physical mouse. Likewise, it only works if the device is connected by USB, and physical mouse. Likewise, it only works if the device is connected by USB.
is currently only supported on Linux.
By default, scrcpy uses Android mouse events injection, using absolute By default, scrcpy uses Android mouse events injection, using absolute
coordinates. By simulating a physical mouse, a mouse pointer appears on the coordinates. By simulating a physical mouse, a mouse pointer appears on the
@@ -901,7 +913,7 @@ scrcpy --otg # keyboard and mouse
``` ```
Like `--hid-keyboard` and `--hid-mouse`, it only works if the device is Like `--hid-keyboard` and `--hid-mouse`, it only works if the device is
connected by USB, and is currently only supported on Linux. connected by USB.
#### Text injection preference #### Text injection preference

View File

@@ -0,0 +1,121 @@
_scrcpy() {
local cur prev words cword
local opts="
--always-on-top
-b --bit-rate=
--codec-options=
--crop=
-d --select-usb
--disable-screensaver
--display=
--display-buffer=
-e --select-tcpip
--encoder=
--force-adb-forward
--forward-all-clicks
-f --fullscreen
-K --hid-keyboard
-h --help
--legacy-paste
--lock-video-orientation
--lock-video-orientation=
--max-fps=
-M --hid-mouse
-m --max-size=
--no-cleanup
--no-clipboard-on-error
--no-downsize-on-error
-n --no-control
-N --no-display
--no-key-repeat
--no-mipmaps
--otg
-p --port=
--power-off-on-close
--prefer-text
--print-fps
--push-target=
--raw-key-events
-r --record=
--record-format=
--render-driver=
--rotation=
-s --serial=
--shortcut-mod=
-S --turn-screen-off
-t --show-touches
--tcpip
--tcpip=
--tunnel-host=
--tunnel-port=
--v4l2-buffer=
--v4l2-sink=
-V --verbosity=
-v --version
-w --stay-awake
--window-borderless
--window-title=
--window-x=
--window-y=
--window-width=
--window-height="
_init_completion -s || return
case "$prev" in
--lock-video-orientation)
COMPREPLY=($(compgen -W 'unlocked initial 0 1 2 3' -- "$cur"))
return
;;
-r|--record)
COMPREPLY=($(compgen -f -- "$cur"))
return
;;
--record-format)
COMPREPLY=($(compgen -W 'mkv mp4' -- "$cur"))
return
;;
--render-driver)
COMPREPLY=($(compgen -W 'direct3d opengl opengles2 opengles metal software' -- "$cur"))
return
;;
--rotation)
COMPREPLY=($(compgen -W '0 1 2 3' -- "$cur"))
return
;;
--shortcut-mod)
# Only auto-complete a single key
COMPREPLY=($(compgen -W 'lctrl rctrl lalt ralt lsuper rsuper' -- "$cur"))
return
;;
-V|--verbosity)
COMPREPLY=($(compgen -W 'verbose debug info warn error' -- "$cur"))
return
;;
-b|--bitrate \
|--codec-options \
|--crop \
|--display \
|--display-buffer \
|--encoder \
|--max-fps \
|-m|--max-size \
|-p|--port \
|--push-target \
|-s|--serial \
|--tunnel-host \
|--tunnel-port \
|--v4l2-buffer \
|--v4l2-sink \
|--tcpip \
|--window-*)
# Option accepting an argument, but nothing to auto-complete
return
;;
esac
COMPREPLY=($(compgen -W "$opts" -- "$cur"))
[[ $COMPREPLY == *= ]] && compopt -o nospace
}
complete -F _scrcpy scrcpy

View File

@@ -48,9 +48,9 @@ arguments=(
'--rotation=[Set the initial display rotation]:rotation values:(0 1 2 3)' '--rotation=[Set the initial display rotation]:rotation values:(0 1 2 3)'
{-s,--serial=}'[The device serial number \(mandatory for multiple devices only\)]' {-s,--serial=}'[The device serial number \(mandatory for multiple devices only\)]'
'--shortcut-mod=[\[key1,key2+key3,...\] Specify the modifiers to use for scrcpy shortcuts]:shortcut mod:(lctrl rctrl lalt ralt lsuper rsuper)' '--shortcut-mod=[\[key1,key2+key3,...\] Specify the modifiers to use for scrcpy shortcuts]:shortcut mod:(lctrl rctrl lalt ralt lsuper rsuper)'
'--tcpip[\(optional \[ip\:port\]\) Configure and connect the device over TCP/IP]'
{-S,--turn-screen-off}'[Turn the device screen off immediately]' {-S,--turn-screen-off}'[Turn the device screen off immediately]'
{-t,--show-touches}'[Show physical touches]' {-t,--show-touches}'[Show physical touches]'
'--tcpip[\(optional \[ip\:port\]\) Configure and connect the device over TCP/IP]'
'--tunnel-host=[Set the IP address of the adb tunnel to reach the scrcpy server]' '--tunnel-host=[Set the IP address of the adb tunnel to reach the scrcpy server]'
'--tunnel-port=[Set the TCP port of the adb tunnel to reach the scrcpy server]' '--tunnel-port=[Set the TCP port of the adb tunnel to reach the scrcpy server]'
'--v4l2-buffer=[Add a buffering delay \(in milliseconds\) before pushing frames]' '--v4l2-buffer=[Add a buffering delay \(in milliseconds\) before pushing frames]'

View File

@@ -229,6 +229,8 @@ install_data('data/icon.png',
install_dir: 'share/icons/hicolor/256x256/apps') install_dir: 'share/icons/hicolor/256x256/apps')
install_data('data/zsh-completion/_scrcpy', install_data('data/zsh-completion/_scrcpy',
install_dir: 'share/zsh/site-functions') install_dir: 'share/zsh/site-functions')
install_data('data/bash-completion/scrcpy',
install_dir: 'share/bash-completion/completions')
### TESTS ### TESTS

View File

@@ -422,6 +422,20 @@ static const struct sc_option options[] = {
"on exit.\n" "on exit.\n"
"It only shows physical touches (not clicks from scrcpy).", "It only shows physical touches (not clicks from scrcpy).",
}, },
{
.longopt_id = OPT_TCPIP,
.longopt = "tcpip",
.argdesc = "ip[:port]",
.optional_arg = true,
.text = "Configure and reconnect the device over TCP/IP.\n"
"If a destination address is provided, then scrcpy connects to "
"this address before starting. The device must listen on the "
"given TCP port (default is 5555).\n"
"If no destination address is provided, then scrcpy attempts "
"to find the IP address of the current device (typically "
"connected over USB), enables TCP/IP mode, then connects to "
"this address before starting.",
},
{ {
.longopt_id = OPT_TUNNEL_HOST, .longopt_id = OPT_TUNNEL_HOST,
.longopt = "tunnel-host", .longopt = "tunnel-host",
@@ -483,20 +497,6 @@ static const struct sc_option options[] = {
.text = "Keep the device on while scrcpy is running, when the device " .text = "Keep the device on while scrcpy is running, when the device "
"is plugged in.", "is plugged in.",
}, },
{
.longopt_id = OPT_TCPIP,
.longopt = "tcpip",
.argdesc = "ip[:port]",
.optional_arg = true,
.text = "Configure and reconnect the device over TCP/IP.\n"
"If a destination address is provided, then scrcpy connects to "
"this address before starting. The device must listen on the "
"given TCP port (default is 5555).\n"
"If no destination address is provided, then scrcpy attempts "
"to find the IP address of the current device (typically "
"connected over USB), enables TCP/IP mode, then connects to "
"this address before starting.",
},
{ {
.longopt_id = OPT_WINDOW_BORDERLESS, .longopt_id = OPT_WINDOW_BORDERLESS,
.longopt = "window-borderless", .longopt = "window-borderless",

View File

@@ -11,7 +11,6 @@ import java.util.Locale;
public final class Server { public final class Server {
private Server() { private Server() {
// not instantiable // not instantiable
} }