diff --git a/electron/configs/scrcpy/index.js b/electron/configs/scrcpy/index.js index 70861906..0906a4e1 100644 --- a/electron/configs/scrcpy/index.js +++ b/electron/configs/scrcpy/index.js @@ -5,10 +5,10 @@ export const getScrcpyPath = () => { switch (process.platform) { case 'win32': return extraResolve('win/scrcpy/scrcpy.exe') - // case 'darwin': - // return extraResolve(`mac-${process.arch}/scrcpy/scrcpy`) - // case 'linux': - // return extraResolve('linux/scrcpy/scrcpy') + case 'darwin': + return extraResolve(`mac/scrcpy/scrcpy`) + case 'linux': + return extraResolve('linux/scrcpy/scrcpy') default: return which.sync('scrcpy', { nothrow: true }) } diff --git a/electron/helpers/edger/index.js b/electron/helpers/edger/index.js index 87c2db9c..6581eff1 100644 --- a/electron/helpers/edger/index.js +++ b/electron/helpers/edger/index.js @@ -38,6 +38,9 @@ export class Edger { this.handleWindowBlur = this.handleWindowBlur.bind(this) this.handleWindowFocus = this.handleWindowFocus.bind(this) + // Add mouse tracking timer reference + this.mouseTrackingTimer = null + this.initialize() } @@ -104,8 +107,9 @@ export class Edger { } showWindow() { - if (!this.isHidden || this.isAnimating) + if (!this.window || this.window.isDestroyed() || !this.isHidden || this.isAnimating) return + clearTimeout(this.hideDebounceTimer) if (this.showDebounceTimer) @@ -119,8 +123,9 @@ export class Edger { } hideWindow() { - if (this.isHidden || this.isAnimating) + if (!this.window || this.window.isDestroyed() || this.isHidden || this.isAnimating) return + clearTimeout(this.showDebounceTimer) if (this.hideDebounceTimer) @@ -166,6 +171,11 @@ export class Edger { if (this.window.isAlwaysOnTop()) { this.wasAlwaysOnTop = true } + + // Add window close event listener + this.window.on('closed', () => { + this.destroy() + }) } handleWindowBlur() { @@ -182,7 +192,9 @@ export class Edger { setAlwaysOnTop(value) { try { - // 某些系统上可能需要特定的参数 + if (!this.window || this.window.isDestroyed()) + return + if (process.platform === 'darwin') { this.window.setAlwaysOnTop(value, 'floating') } @@ -263,32 +275,45 @@ export class Edger { } destroy() { + // Clear all timers this.cleanupAnimation() if (this.showDebounceTimer) { clearTimeout(this.showDebounceTimer) + this.showDebounceTimer = null } if (this.hideDebounceTimer) { clearTimeout(this.hideDebounceTimer) + this.hideDebounceTimer = null + } + if (this.mouseTrackingTimer) { + clearInterval(this.mouseTrackingTimer) + this.mouseTrackingTimer = null } - // 清理事件监听 - if (this.window) { + // Clean up event listeners + if (this.window && !this.window.isDestroyed()) { this.window.removeListener('blur', this.handleWindowBlur) this.window.removeListener('focus', this.handleWindowFocus) this.window.removeAllListeners() - // 恢复原始置顶状态 + // Restore original always on top state if (this.window.isAlwaysOnTop() !== this.wasAlwaysOnTop) { this.setAlwaysOnTop(this.wasAlwaysOnTop) } } this.mouseMovementBuffer = [] + this.window = null + this.dockEdge = null + this.originalBounds = null + this.isHidden = false + this.isDragging = false + this.isAnimating = false } startMouseTracking() { const trackMouse = () => { - if (!this.dockEdge) + if (!this.dockEdge || !this.window || this.window.isDestroyed()) return const currentTime = Date.now() @@ -297,24 +322,30 @@ export class Edger { // Update mouse movement buffer this.updateMouseBuffer(mousePos, currentTime) - const windowBounds = this.window.getBounds() - const display = screen.getDisplayNearestPoint(mousePos) - const screenBounds = display.workArea - - // Check that the mouse is stable - if (this.isMouseStable()) { - if (this.isMouseNearEdge(mousePos, windowBounds, screenBounds)) { - this.showWindow() - } - else if (this.isMouseOutsideWindow(mousePos, windowBounds)) { - this.hideWindow() + try { + const windowBounds = this.window.getBounds() + const display = screen.getDisplayNearestPoint(mousePos) + const screenBounds = display.workArea + + // Check that the mouse is stable + if (this.isMouseStable()) { + if (this.isMouseNearEdge(mousePos, windowBounds, screenBounds)) { + this.showWindow() + } + else if (this.isMouseOutsideWindow(mousePos, windowBounds)) { + this.hideWindow() + } } - } - this.lastMousePosition = mousePos + this.lastMousePosition = mousePos + } + catch (err) { + // Window was destroyed, clean up + this.destroy() + } } - setInterval(trackMouse, 16) + this.mouseTrackingTimer = setInterval(trackMouse, 16) } updateMouseBuffer(mousePos, currentTime) { diff --git a/electron/resources/extra/mac-arm64/scrcpy/icon.png b/electron/resources/extra/linux/scrcpy/icon.png similarity index 100% rename from electron/resources/extra/mac-arm64/scrcpy/icon.png rename to electron/resources/extra/linux/scrcpy/icon.png diff --git a/electron/resources/extra/linux/scrcpy/scrcpy b/electron/resources/extra/linux/scrcpy/scrcpy new file mode 100755 index 00000000..ac1e7a95 --- /dev/null +++ b/electron/resources/extra/linux/scrcpy/scrcpy @@ -0,0 +1,6 @@ +#!/bin/bash +cd "$(dirname ${BASH_SOURCE[0]})" +export ADB="${ADB:-./adb}" +export SCRCPY_SERVER_PATH="${SCRCPY_SERVER_PATH:-./scrcpy-server}" +export SCRCPY_ICON_PATH="${SCRCPY_ICON_PATH:-./icon.png}" +./scrcpy_bin "$@" diff --git a/electron/resources/extra/linux/scrcpy/scrcpy-server b/electron/resources/extra/linux/scrcpy/scrcpy-server new file mode 100755 index 00000000..972532b8 Binary files /dev/null and b/electron/resources/extra/linux/scrcpy/scrcpy-server differ diff --git a/electron/resources/extra/linux/scrcpy/scrcpy.1 b/electron/resources/extra/linux/scrcpy/scrcpy.1 new file mode 100755 index 00000000..c513dc9a --- /dev/null +++ b/electron/resources/extra/linux/scrcpy/scrcpy.1 @@ -0,0 +1,829 @@ +.TH "scrcpy" "1" +.SH NAME +scrcpy \- Display and control your Android device + + +.SH SYNOPSIS +.B scrcpy +.RI [ options ] + + +.SH DESCRIPTION +.B scrcpy +provides display and control of Android devices connected on USB (or over TCP/IP). It does not require any root access. + + +.SH OPTIONS + +.TP +.B \-\-always\-on\-top +Make scrcpy window always on top (above other windows). + +.TP +.BI "\-\-angle " degrees +Rotate the video content by a custom angle, in degrees (clockwise). + +.TP +.BI "\-\-audio\-bit\-rate " value +Encode the audio at the given bit rate, expressed in bits/s. Unit suffixes are supported: '\fBK\fR' (x1000) and '\fBM\fR' (x1000000). + +Default is 128K (128000). + +.TP +.BI "\-\-audio\-buffer " ms +Configure the audio buffering delay (in milliseconds). + +Lower values decrease the latency, but increase the likelihood of buffer underrun (causing audio glitches). + +Default is 50. + +.TP +.BI "\-\-audio\-codec " name +Select an audio codec (opus, aac, flac or raw). + +Default is opus. + +.TP +.BI "\-\-audio\-codec\-options " key\fR[:\fItype\fR]=\fIvalue\fR[,...] +Set a list of comma-separated key:type=value options for the device audio encoder. + +The possible values for 'type' are 'int' (default), 'long', 'float' and 'string'. + +The list of possible codec options is available in the Android documentation: + + + +.TP +.B \-\-audio\-dup +Duplicate audio (capture and keep playing on the device). + +This feature is only available with --audio-source=playback. + +.TP +.BI "\-\-audio\-encoder " name +Use a specific MediaCodec audio encoder (depending on the codec provided by \fB\-\-audio\-codec\fR). + +The available encoders can be listed by \fB\-\-list\-encoders\fR. + +.TP +.BI "\-\-audio\-source " source +Select the audio source (output, mic or playback). + +The "output" source forwards the whole audio output, and disables playback on the device. + +The "playback" source captures the audio playback (Android apps can opt-out, so the whole output is not necessarily captured). + +The "mic" source captures the microphone. + +Default is output. + +.TP +.BI "\-\-audio\-output\-buffer " ms +Configure the size of the SDL audio output buffer (in milliseconds). + +If you get "robotic" audio playback, you should test with a higher value (10). Do not change this setting otherwise. + +Default is 5. + +.TP +.BI "\-b, \-\-video\-bit\-rate " value +Encode the video at the given bit rate, expressed in bits/s. Unit suffixes are supported: '\fBK\fR' (x1000) and '\fBM\fR' (x1000000). + +Default is 8M (8000000). + +.TP +.BI "\-\-camera\-ar " ar +Select the camera size by its aspect ratio (+/- 10%). + +Possible values are "sensor" (use the camera sensor aspect ratio), "\fInum\fR:\fIden\fR" (e.g. "4:3") and "\fIvalue\fR" (e.g. "1.6"). + +.TP +.BI "\-\-camera\-facing " facing +Select the device camera by its facing direction. + +Possible values are "front", "back" and "external". + +.TP +.BI "\-\-camera\-fps " fps +Specify the camera capture frame rate. + +If not specified, Android's default frame rate (30 fps) is used. + +.TP +.B \-\-camera\-high\-speed +Enable high-speed camera capture mode. + +This mode is restricted to specific resolutions and frame rates, listed by \fB\-\-list\-camera\-sizes\fR. + +.TP +.BI "\-\-camera\-id " id +Specify the device camera id to mirror. + +The available camera ids can be listed by \fB\-\-list\-cameras\fR. + +.TP +.BI "\-\-camera\-size " width\fRx\fIheight +Specify an explicit camera capture size. + +.TP +.BI "\-\-capture\-orientation " value +Possible values are 0, 90, 180, 270, flip0, flip90, flip180 and flip270, possibly prefixed by '@'. + +The number represents the clockwise rotation in degrees; the "flip" keyword applies a horizontal flip before the rotation. + +If a leading '@' is passed (@90) for display capture, then the rotation is locked, and is relative to the natural device orientation. + +If '@' is passed alone, then the rotation is locked to the initial device orientation. + +Default is 0. + +.TP +.BI "\-\-crop " width\fR:\fIheight\fR:\fIx\fR:\fIy +Crop the device screen on the server. + +The values are expressed in the device natural orientation (typically, portrait for a phone, landscape for a tablet). + +.TP +.B \-d, \-\-select\-usb +Use USB device (if there is exactly one, like adb -d). + +Also see \fB\-e\fR (\fB\-\-select\-tcpip\fR). + +.TP +.BI "\-\-disable\-screensaver" +Disable screensaver while scrcpy is running. + +.TP +.BI "\-\-display\-id " id +Specify the device display id to mirror. + +The available display ids can be listed by \fB\-\-list\-displays\fR. + +Default is 0. + +.TP +.BI "\-\-display\-orientation " value +Set the initial display orientation. + +Possible values are 0, 90, 180, 270, flip0, flip90, flip180 and flip270. The number represents the clockwise rotation in degrees; the "flip" keyword applies a horizontal flip before the rotation. + +Default is 0. + +.TP +.B \-e, \-\-select\-tcpip +Use TCP/IP device (if there is exactly one, like adb -e). + +Also see \fB\-d\fR (\fB\-\-select\-usb\fR). + +.TP +.B \-f, \-\-fullscreen +Start in fullscreen. + +.TP +.B \-\-force\-adb\-forward +Do not attempt to use "adb reverse" to connect to the device. + +.TP +.B \-G +Same as \fB\-\-gamepad=uhid\fR, or \fB\-\-keyboard=aoa\fR if \fB\-\-otg\fR is set. + +.TP +.BI "\-\-gamepad " mode +Select how to send gamepad inputs to the device. + +Possible values are "disabled", "uhid" and "aoa": + + - "disabled" does not send gamepad inputs to the device. + - "uhid" simulates physical HID gamepads using the Linux HID kernel module on the device. + - "aoa" simulates physical HID gamepads using the AOAv2 protocol. It may only work over USB. + +Also see \fB\-\-keyboard\f and R\fB\-\-mouse\fR. +.TP +.B \-h, \-\-help +Print this help. + +.TP +.B \-K +Same as \fB\-\-keyboard=uhid\fR, or \fB\-\-keyboard=aoa\fR if \fB\-\-otg\fR is set. + +.TP +.BI "\-\-keyboard " mode +Select how to send keyboard inputs to the device. + +Possible values are "disabled", "sdk", "uhid" and "aoa": + + - "disabled" does not send keyboard inputs to the device. + - "sdk" uses the Android system API to deliver keyboard events to applications. + - "uhid" simulates a physical HID keyboard using the Linux HID kernel module on the device. + - "aoa" simulates a physical HID keyboard using the AOAv2 protocol. It may only work over USB. + +For "uhid" and "aoa", the keyboard layout must be configured (once and for all) on the device, via Settings -> System -> Languages and input -> Physical keyboard. This settings page can be started directly using the shortcut MOD+k (except in OTG mode), or by executing: + + adb shell am start -a android.settings.HARD_KEYBOARD_SETTINGS + +This option is only available when the HID keyboard is enabled (or a physical keyboard is connected). + +Also see \fB\-\-mouse\fR and \fB\-\-gamepad\fR. + +.TP +.B \-\-kill\-adb\-on\-close +Kill adb when scrcpy terminates. + +.TP +.B \-\-legacy\-paste +Inject computer clipboard text as a sequence of key events on Ctrl+v (like MOD+Shift+v). + +This is a workaround for some devices not behaving as expected when setting the device clipboard programmatically. + +.TP +.B \-\-list\-apps +List Android apps installed on the device. + +.TP +.B \-\-list\-camera\-sizes +List the valid camera capture sizes. + +.TP +.B \-\-list\-cameras +List cameras available on the device. + +.TP +.B \-\-list\-encoders +List video and audio encoders available on the device. + +.TP +.B \-\-list\-displays +List displays available on the device. + +.TP +.BI "\-m, \-\-max\-size " value +Limit both the width and height of the video to \fIvalue\fR. The other dimension is computed so that the device aspect\-ratio is preserved. + +Default is 0 (unlimited). + +.TP +.B \-M +Same as \fB\-\-mouse=uhid\fR, or \fB\-\-mouse=aoa\fR if \fB\-\-otg\fR is set. + +.TP +.BI "\-\-max\-fps " value +Limit the framerate of screen capture (officially supported since Android 10, but may work on earlier versions). + +.TP +.BI "\-\-mouse " mode +Select how to send mouse inputs to the device. + +Possible values are "disabled", "sdk", "uhid" and "aoa": + + - "disabled" does not send mouse inputs to the device. + - "sdk" uses the Android system API to deliver mouse events to applications. + - "uhid" simulates a physical HID mouse using the Linux HID kernel module on the device. + - "aoa" simulates a physical mouse using the AOAv2 protocol. It may only work over USB. + +In "uhid" and "aoa" modes, the computer mouse is captured to control the device directly (relative mouse mode). + +LAlt, LSuper or RSuper toggle the capture mode, to give control of the mouse back to the computer. + +Also see \fB\-\-keyboard\fR and \fB\-\-gamepad\fR. + +.TP +.BI "\-\-mouse\-bind " xxxx[:xxxx] +Configure bindings of secondary clicks. + +The argument must be one or two sequences (separated by ':') of exactly 4 characters, one for each secondary click (in order: right click, middle click, 4th click, 5th click). + +The first sequence defines the primary bindings, used when a mouse button is pressed alone. The second sequence defines the secondary bindings, used when a mouse button is pressed while the Shift key is held. + +If the second sequence of bindings is omitted, then it is the same as the first one. + +Each character must be one of the following: + + - '+': forward the click to the device + - '-': ignore the click + - 'b': trigger shortcut BACK (or turn screen on if off) + - 'h': trigger shortcut HOME + - 's': trigger shortcut APP_SWITCH + - 'n': trigger shortcut "expand notification panel" + +Default is 'bhsn:++++' for SDK mouse, and '++++:bhsn' for AOA and UHID. + + +.TP +.B \-n, \-\-no\-control +Disable device control (mirror the device in read\-only). + +.TP +.B \-N, \-\-no\-playback +Disable video and audio playback on the computer (equivalent to \fB\-\-no\-video\-playback \-\-no\-audio\-playback\fR). + +.TP +\fB\-\-new\-display\fR[=[\fIwidth\fRx\fIheight\fR][/\fIdpi\fR]] +Create a new display with the specified resolution and density. If not provided, they default to the main display dimensions and DPI. + +Examples: + + \-\-new\-display=1920x1080 + \-\-new\-display=1920x1080/420 + \-\-new\-display # main display size and density + \-\-new\-display=/240 # main display size and 240 dpi + +.TP +.B \-\-no\-audio +Disable audio forwarding. + +.TP +.B \-\-no\-audio\-playback +Disable audio playback on the computer. + +.TP +.B \-\-no\-cleanup +By default, scrcpy removes the server binary from the device and restores the device state (show touches, stay awake and power mode) on exit. + +This option disables this cleanup. + +.TP +.B \-\-no\-clipboard\-autosync +By default, scrcpy automatically synchronizes the computer clipboard to the device clipboard before injecting Ctrl+v, and the device clipboard to the computer clipboard whenever it changes. + +This option disables this automatic synchronization. + +.TP +.B \-\-no\-downsize\-on\-error +By default, on MediaCodec error, scrcpy automatically tries again with a lower definition. + +This option disables this behavior. + +.TP +.B \-\-no\-key\-repeat +Do not forward repeated key events when a key is held down. + +.TP +.B \-\-no\-mipmaps +If the renderer is OpenGL 3.0+ or OpenGL ES 2.0+, then mipmaps are automatically generated to improve downscaling quality. This option disables the generation of mipmaps. + +.TP +.B \-\-no\-mouse\-hover +Do not forward mouse hover (mouse motion without any clicks) events. + +.TP +.B \-\-no\-power\-on +Do not power on the device on start. + +.TP +.B \-\-no\-vd\-system\-decorations +Disable virtual display system decorations flag. + +.TP +.B \-\-no\-video +Disable video forwarding. + +.TP +.B \-\-no\-video\-playback +Disable video playback on the computer. + +.TP +.B \-\-no\-window +Disable scrcpy window. Implies --no-video-playback and --no-control. + +.TP +.BI "\-\-orientation " value +Same as --display-orientation=value --record-orientation=value. + +.TP +.B \-\-otg +Run in OTG mode: simulate physical keyboard and mouse, as if the computer keyboard and mouse were plugged directly to the device via an OTG cable. + +In this mode, adb (USB debugging) is not necessary, and mirroring is disabled. + +LAlt, LSuper or RSuper toggle the mouse capture mode, to give control of the mouse back to the computer. + +If any of \fB\-\-hid\-keyboard\fR or \fB\-\-hid\-mouse\fR is set, only enable keyboard or mouse respectively, otherwise enable both. + +It may only work over USB. + +See \fB\-\-keyboard\fR, \fB\-\-mouse\fR and \fB\-\-gamepad\fR. + +.TP +.BI "\-p, \-\-port " port\fR[:\fIport\fR] +Set the TCP port (range) used by the client to listen. + +Default is 27183:27199. + +.TP +\fB\-\-pause\-on\-exit\fR[=\fImode\fR] +Configure pause on exit. Possible values are "true" (always pause on exit), "false" (never pause on exit) and "if-error" (pause only if an error occurred). + +This is useful to prevent the terminal window from automatically closing, so that error messages can be read. + +Default is "false". + +Passing the option without argument is equivalent to passing "true". + +.TP +.B \-\-power\-off\-on\-close +Turn the device screen off when closing scrcpy. + +.TP +.B \-\-prefer\-text +Inject alpha characters and space as text events instead of key events. + +This avoids issues when combining multiple keys to enter special characters, +but breaks the expected behavior of alpha keys in games (typically WASD). + +.TP +.B "\-\-print\-fps +Start FPS counter, to print framerate logs to the console. It can be started or stopped at any time with MOD+i. + +.TP +.BI "\-\-push\-target " path +Set the target directory for pushing files to the device by drag & drop. It is passed as\-is to "adb push". + +Default is "/sdcard/Download/". + +.TP +.BI "\-r, \-\-record " file +Record screen to +.IR file . + +The format is determined by the +.B \-\-record\-format +option if set, or by the file extension. + +.TP +.B \-\-raw\-key\-events +Inject key events for all input keys, and ignore text events. + +.TP +.BI "\-\-record\-format " format +Force recording format (mp4, mkv, m4a, mka, opus, aac, flac or wav). + +.TP +.BI "\-\-record\-orientation " value +Set the record orientation. + +Possible values are 0, 90, 180 and 270. The number represents the clockwise rotation in degrees. + +Default is 0. + +.TP +.BI "\-\-render\-driver " name +Request SDL to use the given render driver (this is just a hint). + +Supported names are currently "direct3d", "opengl", "opengles2", "opengles", "metal" and "software". + + + +.TP +.B \-\-require\-audio +By default, scrcpy mirrors only the video if audio capture fails on the device. This option makes scrcpy fail if audio is enabled but does not work. + +.TP +.BI "\-s, \-\-serial " number +The device serial number. Mandatory only if several devices are connected to adb. + +.TP +.B \-S, \-\-turn\-screen\-off +Turn the device screen off immediately. + +.TP +.BI "\-\-shortcut\-mod " key\fR[+...]][,...] +Specify the modifiers to use for scrcpy shortcuts. Possible keys are "lctrl", "rctrl", "lalt", "ralt", "lsuper" and "rsuper". + +Several shortcut modifiers can be specified, separated by ','. + +For example, to use either LCtrl or LSuper for scrcpy shortcuts, pass "lctrl,lsuper". + +Default is "lalt,lsuper" (left-Alt or left-Super). + +.TP +.BI "\-\-start\-app " name +Start an Android app, by its exact package name. + +Add a '?' prefix to select an app whose name starts with the given name, case-insensitive (retrieving app names on the device may take some time): + + scrcpy --start-app=?firefox + +Add a '+' prefix to force-stop before starting the app: + + scrcpy --new-display --start-app=+org.mozilla.firefox + +Both prefixes can be used, in that order: + + scrcpy --start-app=+?firefox + +.TP +.B \-t, \-\-show\-touches +Enable "show touches" on start, restore the initial value on exit. + +It only shows physical touches (not clicks from scrcpy). + +.TP +.BI "\-\-tcpip\fR[=\fIip\fR[:\fIport\fR]] +Configure and reconnect the device over TCP/IP. + +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). + +If no destination address is provided, then scrcpy attempts to find the IP address and adb port of the current device (typically connected over USB), enables TCP/IP mode if necessary, then connects to this address before starting. + +.TP +.BI "\-\-time\-limit " seconds +Set the maximum mirroring time, in seconds. + +.TP +.BI "\-\-tunnel\-host " ip +Set the IP address of the adb tunnel to reach the scrcpy server. This option automatically enables \fB\-\-force\-adb\-forward\fR. + +Default is localhost. + +.TP +.BI "\-\-tunnel\-port " port +Set the TCP port of the adb tunnel to reach the scrcpy server. This option automatically enables \fB\-\-force\-adb\-forward\fR. + +Default is 0 (not forced): the local port used for establishing the tunnel will be used. + +.TP +.B \-v, \-\-version +Print the version of scrcpy. + +.TP +.BI "\-V, \-\-verbosity " value +Set the log level ("verbose", "debug", "info", "warn" or "error"). + +Default is "info" for release builds, "debug" for debug builds. + +.TP +.BI "\-\-v4l2-sink " /dev/videoN +Output to v4l2loopback device. + +.TP +.BI "\-\-v4l2-buffer " ms +Add a buffering delay (in milliseconds) before pushing frames. This increases latency to compensate for jitter. + +This option is similar to \fB\-\-video\-buffer\fR, but specific to V4L2 sink. + +Default is 0 (no buffering). + +.TP +.BI "\-\-video\-buffer " ms +Add a buffering delay (in milliseconds) before displaying video frames. + +This increases latency to compensate for jitter. + +Default is 0 (no buffering). + +.TP +.BI "\-\-video\-codec " name +Select a video codec (h264, h265 or av1). + +Default is h264. + +.TP +.BI "\-\-video\-codec\-options " key\fR[:\fItype\fR]=\fIvalue\fR[,...] +Set a list of comma-separated key:type=value options for the device video encoder. + +The possible values for 'type' are 'int' (default), 'long', 'float' and 'string'. + +The list of possible codec options is available in the Android documentation: + + + +.TP +.BI "\-\-video\-encoder " name +Use a specific MediaCodec video encoder (depending on the codec provided by \fB\-\-video\-codec\fR). + +The available encoders can be listed by \fB\-\-list\-encoders\fR. + +.TP +.BI "\-\-video\-source " source +Select the video source (display or camera). + +Camera mirroring requires Android 12+. + +Default is display. + +.TP +.B \-w, \-\-stay-awake +Keep the device on while scrcpy is running, when the device is plugged in. + +.TP +.B \-\-window\-borderless +Disable window decorations (display borderless window). + +.TP +.BI "\-\-window\-title " text +Set a custom window title. + +.TP +.BI "\-\-window\-x " value +Set the initial window horizontal position. + +Default is "auto". + +.TP +.BI "\-\-window\-y " value +Set the initial window vertical position. + +Default is "auto". + +.TP +.BI "\-\-window\-width " value +Set the initial window width. + +Default is 0 (automatic). + +.TP +.BI "\-\-window\-height " value +Set the initial window height. + +Default is 0 (automatic). + +.SH EXIT STATUS +.B scrcpy +will exit with code 0 on normal program termination. If an initial +connection cannot be established, the exit code 1 will be returned. If the +device disconnects while a session is active, exit code 2 will be returned. + +.SH SHORTCUTS + +In the following list, MOD is the shortcut modifier. By default, it's (left) +Alt or (left) Super, but it can be configured by \fB\-\-shortcut\-mod\fR (see above). + +.TP +.B MOD+f +Switch fullscreen mode + +.TP +.B MOD+Left +Rotate display left + +.TP +.B MOD+Right +Rotate display right + +.TP +.B MOD+Shift+Left, MOD+Shift+Right +Flip display horizontally + +.TP +.B MOD+Shift+Up, MOD+Shift+Down +Flip display vertically + +.TP +.B MOD+z +Pause or re-pause display + +.TP +.B MOD+Shift+z +Unpause display + +.TP +.B MOD+Shift+r +Reset video capture/encoding + +.TP +.B MOD+g +Resize window to 1:1 (pixel\-perfect) + +.TP +.B MOD+w, Double\-click on black borders +Resize window to remove black borders + +.TP +.B MOD+h, Home, Middle\-click +Click on HOME + +.TP +.B MOD+b, MOD+Backspace, Right\-click (when screen is on) +Click on BACK + +.TP +.B MOD+s +Click on APP_SWITCH + +.TP +.B MOD+m +Click on MENU + +.TP +.B MOD+Up +Click on VOLUME_UP + +.TP +.B MOD+Down +Click on VOLUME_DOWN + +.TP +.B MOD+p +Click on POWER (turn screen on/off) + +.TP +.B Right\-click (when screen is off) +Turn screen on + +.TP +.B MOD+o +Turn device screen off (keep mirroring) + +.TP +.B MOD+Shift+o +Turn device screen on + +.TP +.B MOD+r +Rotate device screen + +.TP +.B MOD+n +Expand notification panel + +.TP +.B MOD+Shift+n +Collapse notification panel + +.TP +.B Mod+c +Copy to clipboard (inject COPY keycode, Android >= 7 only) + +.TP +.B Mod+x +Cut to clipboard (inject CUT keycode, Android >= 7 only) + +.TP +.B MOD+v +Copy computer clipboard to device, then paste (inject PASTE keycode, Android >= 7 only) + +.TP +.B MOD+Shift+v +Inject computer clipboard text as a sequence of key events + +.TP +.B MOD+k +Open keyboard settings on the device (for HID keyboard only) + +.TP +.B MOD+i +Enable/disable FPS counter (print frames/second in logs) + +.TP +.B Ctrl+click-and-move +Pinch-to-zoom and rotate from the center of the screen + +.TP +.B Shift+click-and-move +Tilt vertically (slide with 2 fingers) + +.TP +.B Ctrl+Shift+click-and-move +Tilt horizontally (slide with 2 fingers) + +.TP +.B Drag & drop APK file +Install APK from computer + +.TP +.B Drag & drop non-APK file +Push file to device (see \fB\-\-push\-target\fR) + + +.SH Environment variables + +.TP +.B ADB +Path to adb. + +.TP +.B ANDROID_SERIAL +Device serial to use if no selector (\fB-s\fR, \fB-d\fR, \fB-e\fR or \fB\-\-tcpip=\fIaddr\fR) is specified. + +.TP +.B SCRCPY_ICON_PATH +Path to the program icon. + +.TP +.B SCRCPY_SERVER_PATH +Path to the server binary. + + +.SH AUTHORS +.B scrcpy +is written by Romain Vimont. + +This manual page was written by +.MT mmyangfl@gmail.com +Yangfl +.ME +for the Debian Project (and may be used by others). + + +.SH "REPORTING BUGS" +Report bugs to . + +.SH COPYRIGHT +Copyright \(co 2018 Genymobile + +Copyright \(co 2018\-2024 Romain Vimont + +Licensed under the Apache License, Version 2.0. + +.SH WWW + diff --git a/electron/resources/extra/linux/scrcpy/scrcpy_bin b/electron/resources/extra/linux/scrcpy/scrcpy_bin new file mode 100755 index 00000000..49c884c7 Binary files /dev/null and b/electron/resources/extra/linux/scrcpy/scrcpy_bin differ diff --git a/electron/resources/extra/mac-arm64/scrcpy/adb b/electron/resources/extra/mac-arm64/scrcpy/adb deleted file mode 100755 index 6abdd141..00000000 Binary files a/electron/resources/extra/mac-arm64/scrcpy/adb and /dev/null differ diff --git a/electron/resources/extra/mac-arm64/scrcpy/libs/libSDL2-2.0.0.dylib b/electron/resources/extra/mac-arm64/scrcpy/libs/libSDL2-2.0.0.dylib deleted file mode 100755 index 7ed42087..00000000 Binary files a/electron/resources/extra/mac-arm64/scrcpy/libs/libSDL2-2.0.0.dylib and /dev/null differ diff --git a/electron/resources/extra/mac-arm64/scrcpy/libs/libavcodec.61.3.100.dylib b/electron/resources/extra/mac-arm64/scrcpy/libs/libavcodec.61.3.100.dylib deleted file mode 100755 index a089688c..00000000 Binary files a/electron/resources/extra/mac-arm64/scrcpy/libs/libavcodec.61.3.100.dylib and /dev/null differ diff --git a/electron/resources/extra/mac-arm64/scrcpy/libs/libavformat.61.1.100.dylib b/electron/resources/extra/mac-arm64/scrcpy/libs/libavformat.61.1.100.dylib deleted file mode 100755 index dfa3b03c..00000000 Binary files a/electron/resources/extra/mac-arm64/scrcpy/libs/libavformat.61.1.100.dylib and /dev/null differ diff --git a/electron/resources/extra/mac-arm64/scrcpy/libs/libavutil.59.8.100.dylib b/electron/resources/extra/mac-arm64/scrcpy/libs/libavutil.59.8.100.dylib deleted file mode 100755 index 77eb96a2..00000000 Binary files a/electron/resources/extra/mac-arm64/scrcpy/libs/libavutil.59.8.100.dylib and /dev/null differ diff --git a/electron/resources/extra/mac-arm64/scrcpy/libs/libswresample.5.1.100.dylib b/electron/resources/extra/mac-arm64/scrcpy/libs/libswresample.5.1.100.dylib deleted file mode 100755 index 14035a5e..00000000 Binary files a/electron/resources/extra/mac-arm64/scrcpy/libs/libswresample.5.1.100.dylib and /dev/null differ diff --git a/electron/resources/extra/mac-arm64/scrcpy/libs/libusb-1.0.0.dylib b/electron/resources/extra/mac-arm64/scrcpy/libs/libusb-1.0.0.dylib deleted file mode 100755 index 5a9b0275..00000000 Binary files a/electron/resources/extra/mac-arm64/scrcpy/libs/libusb-1.0.0.dylib and /dev/null differ diff --git a/electron/resources/extra/mac-arm64/scrcpy/scrcpy b/electron/resources/extra/mac-arm64/scrcpy/scrcpy deleted file mode 100755 index f2ce649c..00000000 Binary files a/electron/resources/extra/mac-arm64/scrcpy/scrcpy and /dev/null differ diff --git a/electron/resources/extra/mac-arm64/scrcpy/scrcpy-server b/electron/resources/extra/mac-arm64/scrcpy/scrcpy-server deleted file mode 100755 index fe6713c8..00000000 Binary files a/electron/resources/extra/mac-arm64/scrcpy/scrcpy-server and /dev/null differ diff --git a/electron/resources/extra/mac-x64/scrcpy/adb b/electron/resources/extra/mac-x64/scrcpy/adb deleted file mode 100755 index f912d620..00000000 Binary files a/electron/resources/extra/mac-x64/scrcpy/adb and /dev/null differ diff --git a/electron/resources/extra/mac-x64/scrcpy/libs/libSDL2-2.0.0.dylib b/electron/resources/extra/mac-x64/scrcpy/libs/libSDL2-2.0.0.dylib deleted file mode 100755 index c6d0fd06..00000000 Binary files a/electron/resources/extra/mac-x64/scrcpy/libs/libSDL2-2.0.0.dylib and /dev/null differ diff --git a/electron/resources/extra/mac-x64/scrcpy/libs/libavcodec.61.3.100.dylib b/electron/resources/extra/mac-x64/scrcpy/libs/libavcodec.61.3.100.dylib deleted file mode 100755 index 4b1aeb27..00000000 Binary files a/electron/resources/extra/mac-x64/scrcpy/libs/libavcodec.61.3.100.dylib and /dev/null differ diff --git a/electron/resources/extra/mac-x64/scrcpy/libs/libavformat.61.1.100.dylib b/electron/resources/extra/mac-x64/scrcpy/libs/libavformat.61.1.100.dylib deleted file mode 100755 index 1327b8de..00000000 Binary files a/electron/resources/extra/mac-x64/scrcpy/libs/libavformat.61.1.100.dylib and /dev/null differ diff --git a/electron/resources/extra/mac-x64/scrcpy/libs/libavutil.59.8.100.dylib b/electron/resources/extra/mac-x64/scrcpy/libs/libavutil.59.8.100.dylib deleted file mode 100755 index 011da3fd..00000000 Binary files a/electron/resources/extra/mac-x64/scrcpy/libs/libavutil.59.8.100.dylib and /dev/null differ diff --git a/electron/resources/extra/mac-x64/scrcpy/libs/libswresample.5.1.100.dylib b/electron/resources/extra/mac-x64/scrcpy/libs/libswresample.5.1.100.dylib deleted file mode 100755 index 30f2927a..00000000 Binary files a/electron/resources/extra/mac-x64/scrcpy/libs/libswresample.5.1.100.dylib and /dev/null differ diff --git a/electron/resources/extra/mac-x64/scrcpy/libs/libusb-1.0.0.dylib b/electron/resources/extra/mac-x64/scrcpy/libs/libusb-1.0.0.dylib deleted file mode 100755 index e78f09b3..00000000 Binary files a/electron/resources/extra/mac-x64/scrcpy/libs/libusb-1.0.0.dylib and /dev/null differ diff --git a/electron/resources/extra/mac-x64/scrcpy/scrcpy b/electron/resources/extra/mac-x64/scrcpy/scrcpy deleted file mode 100755 index 4fdab6a4..00000000 Binary files a/electron/resources/extra/mac-x64/scrcpy/scrcpy and /dev/null differ diff --git a/electron/resources/extra/mac-x64/scrcpy/scrcpy-server b/electron/resources/extra/mac-x64/scrcpy/scrcpy-server deleted file mode 100755 index fe6713c8..00000000 Binary files a/electron/resources/extra/mac-x64/scrcpy/scrcpy-server and /dev/null differ diff --git a/electron/resources/extra/mac-x64/scrcpy/icon.png b/electron/resources/extra/mac/scrcpy/icon.png similarity index 100% rename from electron/resources/extra/mac-x64/scrcpy/icon.png rename to electron/resources/extra/mac/scrcpy/icon.png diff --git a/electron/resources/extra/mac/scrcpy/scrcpy b/electron/resources/extra/mac/scrcpy/scrcpy new file mode 100755 index 00000000..ac1e7a95 --- /dev/null +++ b/electron/resources/extra/mac/scrcpy/scrcpy @@ -0,0 +1,6 @@ +#!/bin/bash +cd "$(dirname ${BASH_SOURCE[0]})" +export ADB="${ADB:-./adb}" +export SCRCPY_SERVER_PATH="${SCRCPY_SERVER_PATH:-./scrcpy-server}" +export SCRCPY_ICON_PATH="${SCRCPY_ICON_PATH:-./icon.png}" +./scrcpy_bin "$@" diff --git a/electron/resources/extra/mac/scrcpy/scrcpy-server b/electron/resources/extra/mac/scrcpy/scrcpy-server new file mode 100755 index 00000000..972532b8 Binary files /dev/null and b/electron/resources/extra/mac/scrcpy/scrcpy-server differ diff --git a/electron/resources/extra/mac/scrcpy/scrcpy.1 b/electron/resources/extra/mac/scrcpy/scrcpy.1 new file mode 100755 index 00000000..c513dc9a --- /dev/null +++ b/electron/resources/extra/mac/scrcpy/scrcpy.1 @@ -0,0 +1,829 @@ +.TH "scrcpy" "1" +.SH NAME +scrcpy \- Display and control your Android device + + +.SH SYNOPSIS +.B scrcpy +.RI [ options ] + + +.SH DESCRIPTION +.B scrcpy +provides display and control of Android devices connected on USB (or over TCP/IP). It does not require any root access. + + +.SH OPTIONS + +.TP +.B \-\-always\-on\-top +Make scrcpy window always on top (above other windows). + +.TP +.BI "\-\-angle " degrees +Rotate the video content by a custom angle, in degrees (clockwise). + +.TP +.BI "\-\-audio\-bit\-rate " value +Encode the audio at the given bit rate, expressed in bits/s. Unit suffixes are supported: '\fBK\fR' (x1000) and '\fBM\fR' (x1000000). + +Default is 128K (128000). + +.TP +.BI "\-\-audio\-buffer " ms +Configure the audio buffering delay (in milliseconds). + +Lower values decrease the latency, but increase the likelihood of buffer underrun (causing audio glitches). + +Default is 50. + +.TP +.BI "\-\-audio\-codec " name +Select an audio codec (opus, aac, flac or raw). + +Default is opus. + +.TP +.BI "\-\-audio\-codec\-options " key\fR[:\fItype\fR]=\fIvalue\fR[,...] +Set a list of comma-separated key:type=value options for the device audio encoder. + +The possible values for 'type' are 'int' (default), 'long', 'float' and 'string'. + +The list of possible codec options is available in the Android documentation: + + + +.TP +.B \-\-audio\-dup +Duplicate audio (capture and keep playing on the device). + +This feature is only available with --audio-source=playback. + +.TP +.BI "\-\-audio\-encoder " name +Use a specific MediaCodec audio encoder (depending on the codec provided by \fB\-\-audio\-codec\fR). + +The available encoders can be listed by \fB\-\-list\-encoders\fR. + +.TP +.BI "\-\-audio\-source " source +Select the audio source (output, mic or playback). + +The "output" source forwards the whole audio output, and disables playback on the device. + +The "playback" source captures the audio playback (Android apps can opt-out, so the whole output is not necessarily captured). + +The "mic" source captures the microphone. + +Default is output. + +.TP +.BI "\-\-audio\-output\-buffer " ms +Configure the size of the SDL audio output buffer (in milliseconds). + +If you get "robotic" audio playback, you should test with a higher value (10). Do not change this setting otherwise. + +Default is 5. + +.TP +.BI "\-b, \-\-video\-bit\-rate " value +Encode the video at the given bit rate, expressed in bits/s. Unit suffixes are supported: '\fBK\fR' (x1000) and '\fBM\fR' (x1000000). + +Default is 8M (8000000). + +.TP +.BI "\-\-camera\-ar " ar +Select the camera size by its aspect ratio (+/- 10%). + +Possible values are "sensor" (use the camera sensor aspect ratio), "\fInum\fR:\fIden\fR" (e.g. "4:3") and "\fIvalue\fR" (e.g. "1.6"). + +.TP +.BI "\-\-camera\-facing " facing +Select the device camera by its facing direction. + +Possible values are "front", "back" and "external". + +.TP +.BI "\-\-camera\-fps " fps +Specify the camera capture frame rate. + +If not specified, Android's default frame rate (30 fps) is used. + +.TP +.B \-\-camera\-high\-speed +Enable high-speed camera capture mode. + +This mode is restricted to specific resolutions and frame rates, listed by \fB\-\-list\-camera\-sizes\fR. + +.TP +.BI "\-\-camera\-id " id +Specify the device camera id to mirror. + +The available camera ids can be listed by \fB\-\-list\-cameras\fR. + +.TP +.BI "\-\-camera\-size " width\fRx\fIheight +Specify an explicit camera capture size. + +.TP +.BI "\-\-capture\-orientation " value +Possible values are 0, 90, 180, 270, flip0, flip90, flip180 and flip270, possibly prefixed by '@'. + +The number represents the clockwise rotation in degrees; the "flip" keyword applies a horizontal flip before the rotation. + +If a leading '@' is passed (@90) for display capture, then the rotation is locked, and is relative to the natural device orientation. + +If '@' is passed alone, then the rotation is locked to the initial device orientation. + +Default is 0. + +.TP +.BI "\-\-crop " width\fR:\fIheight\fR:\fIx\fR:\fIy +Crop the device screen on the server. + +The values are expressed in the device natural orientation (typically, portrait for a phone, landscape for a tablet). + +.TP +.B \-d, \-\-select\-usb +Use USB device (if there is exactly one, like adb -d). + +Also see \fB\-e\fR (\fB\-\-select\-tcpip\fR). + +.TP +.BI "\-\-disable\-screensaver" +Disable screensaver while scrcpy is running. + +.TP +.BI "\-\-display\-id " id +Specify the device display id to mirror. + +The available display ids can be listed by \fB\-\-list\-displays\fR. + +Default is 0. + +.TP +.BI "\-\-display\-orientation " value +Set the initial display orientation. + +Possible values are 0, 90, 180, 270, flip0, flip90, flip180 and flip270. The number represents the clockwise rotation in degrees; the "flip" keyword applies a horizontal flip before the rotation. + +Default is 0. + +.TP +.B \-e, \-\-select\-tcpip +Use TCP/IP device (if there is exactly one, like adb -e). + +Also see \fB\-d\fR (\fB\-\-select\-usb\fR). + +.TP +.B \-f, \-\-fullscreen +Start in fullscreen. + +.TP +.B \-\-force\-adb\-forward +Do not attempt to use "adb reverse" to connect to the device. + +.TP +.B \-G +Same as \fB\-\-gamepad=uhid\fR, or \fB\-\-keyboard=aoa\fR if \fB\-\-otg\fR is set. + +.TP +.BI "\-\-gamepad " mode +Select how to send gamepad inputs to the device. + +Possible values are "disabled", "uhid" and "aoa": + + - "disabled" does not send gamepad inputs to the device. + - "uhid" simulates physical HID gamepads using the Linux HID kernel module on the device. + - "aoa" simulates physical HID gamepads using the AOAv2 protocol. It may only work over USB. + +Also see \fB\-\-keyboard\f and R\fB\-\-mouse\fR. +.TP +.B \-h, \-\-help +Print this help. + +.TP +.B \-K +Same as \fB\-\-keyboard=uhid\fR, or \fB\-\-keyboard=aoa\fR if \fB\-\-otg\fR is set. + +.TP +.BI "\-\-keyboard " mode +Select how to send keyboard inputs to the device. + +Possible values are "disabled", "sdk", "uhid" and "aoa": + + - "disabled" does not send keyboard inputs to the device. + - "sdk" uses the Android system API to deliver keyboard events to applications. + - "uhid" simulates a physical HID keyboard using the Linux HID kernel module on the device. + - "aoa" simulates a physical HID keyboard using the AOAv2 protocol. It may only work over USB. + +For "uhid" and "aoa", the keyboard layout must be configured (once and for all) on the device, via Settings -> System -> Languages and input -> Physical keyboard. This settings page can be started directly using the shortcut MOD+k (except in OTG mode), or by executing: + + adb shell am start -a android.settings.HARD_KEYBOARD_SETTINGS + +This option is only available when the HID keyboard is enabled (or a physical keyboard is connected). + +Also see \fB\-\-mouse\fR and \fB\-\-gamepad\fR. + +.TP +.B \-\-kill\-adb\-on\-close +Kill adb when scrcpy terminates. + +.TP +.B \-\-legacy\-paste +Inject computer clipboard text as a sequence of key events on Ctrl+v (like MOD+Shift+v). + +This is a workaround for some devices not behaving as expected when setting the device clipboard programmatically. + +.TP +.B \-\-list\-apps +List Android apps installed on the device. + +.TP +.B \-\-list\-camera\-sizes +List the valid camera capture sizes. + +.TP +.B \-\-list\-cameras +List cameras available on the device. + +.TP +.B \-\-list\-encoders +List video and audio encoders available on the device. + +.TP +.B \-\-list\-displays +List displays available on the device. + +.TP +.BI "\-m, \-\-max\-size " value +Limit both the width and height of the video to \fIvalue\fR. The other dimension is computed so that the device aspect\-ratio is preserved. + +Default is 0 (unlimited). + +.TP +.B \-M +Same as \fB\-\-mouse=uhid\fR, or \fB\-\-mouse=aoa\fR if \fB\-\-otg\fR is set. + +.TP +.BI "\-\-max\-fps " value +Limit the framerate of screen capture (officially supported since Android 10, but may work on earlier versions). + +.TP +.BI "\-\-mouse " mode +Select how to send mouse inputs to the device. + +Possible values are "disabled", "sdk", "uhid" and "aoa": + + - "disabled" does not send mouse inputs to the device. + - "sdk" uses the Android system API to deliver mouse events to applications. + - "uhid" simulates a physical HID mouse using the Linux HID kernel module on the device. + - "aoa" simulates a physical mouse using the AOAv2 protocol. It may only work over USB. + +In "uhid" and "aoa" modes, the computer mouse is captured to control the device directly (relative mouse mode). + +LAlt, LSuper or RSuper toggle the capture mode, to give control of the mouse back to the computer. + +Also see \fB\-\-keyboard\fR and \fB\-\-gamepad\fR. + +.TP +.BI "\-\-mouse\-bind " xxxx[:xxxx] +Configure bindings of secondary clicks. + +The argument must be one or two sequences (separated by ':') of exactly 4 characters, one for each secondary click (in order: right click, middle click, 4th click, 5th click). + +The first sequence defines the primary bindings, used when a mouse button is pressed alone. The second sequence defines the secondary bindings, used when a mouse button is pressed while the Shift key is held. + +If the second sequence of bindings is omitted, then it is the same as the first one. + +Each character must be one of the following: + + - '+': forward the click to the device + - '-': ignore the click + - 'b': trigger shortcut BACK (or turn screen on if off) + - 'h': trigger shortcut HOME + - 's': trigger shortcut APP_SWITCH + - 'n': trigger shortcut "expand notification panel" + +Default is 'bhsn:++++' for SDK mouse, and '++++:bhsn' for AOA and UHID. + + +.TP +.B \-n, \-\-no\-control +Disable device control (mirror the device in read\-only). + +.TP +.B \-N, \-\-no\-playback +Disable video and audio playback on the computer (equivalent to \fB\-\-no\-video\-playback \-\-no\-audio\-playback\fR). + +.TP +\fB\-\-new\-display\fR[=[\fIwidth\fRx\fIheight\fR][/\fIdpi\fR]] +Create a new display with the specified resolution and density. If not provided, they default to the main display dimensions and DPI. + +Examples: + + \-\-new\-display=1920x1080 + \-\-new\-display=1920x1080/420 + \-\-new\-display # main display size and density + \-\-new\-display=/240 # main display size and 240 dpi + +.TP +.B \-\-no\-audio +Disable audio forwarding. + +.TP +.B \-\-no\-audio\-playback +Disable audio playback on the computer. + +.TP +.B \-\-no\-cleanup +By default, scrcpy removes the server binary from the device and restores the device state (show touches, stay awake and power mode) on exit. + +This option disables this cleanup. + +.TP +.B \-\-no\-clipboard\-autosync +By default, scrcpy automatically synchronizes the computer clipboard to the device clipboard before injecting Ctrl+v, and the device clipboard to the computer clipboard whenever it changes. + +This option disables this automatic synchronization. + +.TP +.B \-\-no\-downsize\-on\-error +By default, on MediaCodec error, scrcpy automatically tries again with a lower definition. + +This option disables this behavior. + +.TP +.B \-\-no\-key\-repeat +Do not forward repeated key events when a key is held down. + +.TP +.B \-\-no\-mipmaps +If the renderer is OpenGL 3.0+ or OpenGL ES 2.0+, then mipmaps are automatically generated to improve downscaling quality. This option disables the generation of mipmaps. + +.TP +.B \-\-no\-mouse\-hover +Do not forward mouse hover (mouse motion without any clicks) events. + +.TP +.B \-\-no\-power\-on +Do not power on the device on start. + +.TP +.B \-\-no\-vd\-system\-decorations +Disable virtual display system decorations flag. + +.TP +.B \-\-no\-video +Disable video forwarding. + +.TP +.B \-\-no\-video\-playback +Disable video playback on the computer. + +.TP +.B \-\-no\-window +Disable scrcpy window. Implies --no-video-playback and --no-control. + +.TP +.BI "\-\-orientation " value +Same as --display-orientation=value --record-orientation=value. + +.TP +.B \-\-otg +Run in OTG mode: simulate physical keyboard and mouse, as if the computer keyboard and mouse were plugged directly to the device via an OTG cable. + +In this mode, adb (USB debugging) is not necessary, and mirroring is disabled. + +LAlt, LSuper or RSuper toggle the mouse capture mode, to give control of the mouse back to the computer. + +If any of \fB\-\-hid\-keyboard\fR or \fB\-\-hid\-mouse\fR is set, only enable keyboard or mouse respectively, otherwise enable both. + +It may only work over USB. + +See \fB\-\-keyboard\fR, \fB\-\-mouse\fR and \fB\-\-gamepad\fR. + +.TP +.BI "\-p, \-\-port " port\fR[:\fIport\fR] +Set the TCP port (range) used by the client to listen. + +Default is 27183:27199. + +.TP +\fB\-\-pause\-on\-exit\fR[=\fImode\fR] +Configure pause on exit. Possible values are "true" (always pause on exit), "false" (never pause on exit) and "if-error" (pause only if an error occurred). + +This is useful to prevent the terminal window from automatically closing, so that error messages can be read. + +Default is "false". + +Passing the option without argument is equivalent to passing "true". + +.TP +.B \-\-power\-off\-on\-close +Turn the device screen off when closing scrcpy. + +.TP +.B \-\-prefer\-text +Inject alpha characters and space as text events instead of key events. + +This avoids issues when combining multiple keys to enter special characters, +but breaks the expected behavior of alpha keys in games (typically WASD). + +.TP +.B "\-\-print\-fps +Start FPS counter, to print framerate logs to the console. It can be started or stopped at any time with MOD+i. + +.TP +.BI "\-\-push\-target " path +Set the target directory for pushing files to the device by drag & drop. It is passed as\-is to "adb push". + +Default is "/sdcard/Download/". + +.TP +.BI "\-r, \-\-record " file +Record screen to +.IR file . + +The format is determined by the +.B \-\-record\-format +option if set, or by the file extension. + +.TP +.B \-\-raw\-key\-events +Inject key events for all input keys, and ignore text events. + +.TP +.BI "\-\-record\-format " format +Force recording format (mp4, mkv, m4a, mka, opus, aac, flac or wav). + +.TP +.BI "\-\-record\-orientation " value +Set the record orientation. + +Possible values are 0, 90, 180 and 270. The number represents the clockwise rotation in degrees. + +Default is 0. + +.TP +.BI "\-\-render\-driver " name +Request SDL to use the given render driver (this is just a hint). + +Supported names are currently "direct3d", "opengl", "opengles2", "opengles", "metal" and "software". + + + +.TP +.B \-\-require\-audio +By default, scrcpy mirrors only the video if audio capture fails on the device. This option makes scrcpy fail if audio is enabled but does not work. + +.TP +.BI "\-s, \-\-serial " number +The device serial number. Mandatory only if several devices are connected to adb. + +.TP +.B \-S, \-\-turn\-screen\-off +Turn the device screen off immediately. + +.TP +.BI "\-\-shortcut\-mod " key\fR[+...]][,...] +Specify the modifiers to use for scrcpy shortcuts. Possible keys are "lctrl", "rctrl", "lalt", "ralt", "lsuper" and "rsuper". + +Several shortcut modifiers can be specified, separated by ','. + +For example, to use either LCtrl or LSuper for scrcpy shortcuts, pass "lctrl,lsuper". + +Default is "lalt,lsuper" (left-Alt or left-Super). + +.TP +.BI "\-\-start\-app " name +Start an Android app, by its exact package name. + +Add a '?' prefix to select an app whose name starts with the given name, case-insensitive (retrieving app names on the device may take some time): + + scrcpy --start-app=?firefox + +Add a '+' prefix to force-stop before starting the app: + + scrcpy --new-display --start-app=+org.mozilla.firefox + +Both prefixes can be used, in that order: + + scrcpy --start-app=+?firefox + +.TP +.B \-t, \-\-show\-touches +Enable "show touches" on start, restore the initial value on exit. + +It only shows physical touches (not clicks from scrcpy). + +.TP +.BI "\-\-tcpip\fR[=\fIip\fR[:\fIport\fR]] +Configure and reconnect the device over TCP/IP. + +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). + +If no destination address is provided, then scrcpy attempts to find the IP address and adb port of the current device (typically connected over USB), enables TCP/IP mode if necessary, then connects to this address before starting. + +.TP +.BI "\-\-time\-limit " seconds +Set the maximum mirroring time, in seconds. + +.TP +.BI "\-\-tunnel\-host " ip +Set the IP address of the adb tunnel to reach the scrcpy server. This option automatically enables \fB\-\-force\-adb\-forward\fR. + +Default is localhost. + +.TP +.BI "\-\-tunnel\-port " port +Set the TCP port of the adb tunnel to reach the scrcpy server. This option automatically enables \fB\-\-force\-adb\-forward\fR. + +Default is 0 (not forced): the local port used for establishing the tunnel will be used. + +.TP +.B \-v, \-\-version +Print the version of scrcpy. + +.TP +.BI "\-V, \-\-verbosity " value +Set the log level ("verbose", "debug", "info", "warn" or "error"). + +Default is "info" for release builds, "debug" for debug builds. + +.TP +.BI "\-\-v4l2-sink " /dev/videoN +Output to v4l2loopback device. + +.TP +.BI "\-\-v4l2-buffer " ms +Add a buffering delay (in milliseconds) before pushing frames. This increases latency to compensate for jitter. + +This option is similar to \fB\-\-video\-buffer\fR, but specific to V4L2 sink. + +Default is 0 (no buffering). + +.TP +.BI "\-\-video\-buffer " ms +Add a buffering delay (in milliseconds) before displaying video frames. + +This increases latency to compensate for jitter. + +Default is 0 (no buffering). + +.TP +.BI "\-\-video\-codec " name +Select a video codec (h264, h265 or av1). + +Default is h264. + +.TP +.BI "\-\-video\-codec\-options " key\fR[:\fItype\fR]=\fIvalue\fR[,...] +Set a list of comma-separated key:type=value options for the device video encoder. + +The possible values for 'type' are 'int' (default), 'long', 'float' and 'string'. + +The list of possible codec options is available in the Android documentation: + + + +.TP +.BI "\-\-video\-encoder " name +Use a specific MediaCodec video encoder (depending on the codec provided by \fB\-\-video\-codec\fR). + +The available encoders can be listed by \fB\-\-list\-encoders\fR. + +.TP +.BI "\-\-video\-source " source +Select the video source (display or camera). + +Camera mirroring requires Android 12+. + +Default is display. + +.TP +.B \-w, \-\-stay-awake +Keep the device on while scrcpy is running, when the device is plugged in. + +.TP +.B \-\-window\-borderless +Disable window decorations (display borderless window). + +.TP +.BI "\-\-window\-title " text +Set a custom window title. + +.TP +.BI "\-\-window\-x " value +Set the initial window horizontal position. + +Default is "auto". + +.TP +.BI "\-\-window\-y " value +Set the initial window vertical position. + +Default is "auto". + +.TP +.BI "\-\-window\-width " value +Set the initial window width. + +Default is 0 (automatic). + +.TP +.BI "\-\-window\-height " value +Set the initial window height. + +Default is 0 (automatic). + +.SH EXIT STATUS +.B scrcpy +will exit with code 0 on normal program termination. If an initial +connection cannot be established, the exit code 1 will be returned. If the +device disconnects while a session is active, exit code 2 will be returned. + +.SH SHORTCUTS + +In the following list, MOD is the shortcut modifier. By default, it's (left) +Alt or (left) Super, but it can be configured by \fB\-\-shortcut\-mod\fR (see above). + +.TP +.B MOD+f +Switch fullscreen mode + +.TP +.B MOD+Left +Rotate display left + +.TP +.B MOD+Right +Rotate display right + +.TP +.B MOD+Shift+Left, MOD+Shift+Right +Flip display horizontally + +.TP +.B MOD+Shift+Up, MOD+Shift+Down +Flip display vertically + +.TP +.B MOD+z +Pause or re-pause display + +.TP +.B MOD+Shift+z +Unpause display + +.TP +.B MOD+Shift+r +Reset video capture/encoding + +.TP +.B MOD+g +Resize window to 1:1 (pixel\-perfect) + +.TP +.B MOD+w, Double\-click on black borders +Resize window to remove black borders + +.TP +.B MOD+h, Home, Middle\-click +Click on HOME + +.TP +.B MOD+b, MOD+Backspace, Right\-click (when screen is on) +Click on BACK + +.TP +.B MOD+s +Click on APP_SWITCH + +.TP +.B MOD+m +Click on MENU + +.TP +.B MOD+Up +Click on VOLUME_UP + +.TP +.B MOD+Down +Click on VOLUME_DOWN + +.TP +.B MOD+p +Click on POWER (turn screen on/off) + +.TP +.B Right\-click (when screen is off) +Turn screen on + +.TP +.B MOD+o +Turn device screen off (keep mirroring) + +.TP +.B MOD+Shift+o +Turn device screen on + +.TP +.B MOD+r +Rotate device screen + +.TP +.B MOD+n +Expand notification panel + +.TP +.B MOD+Shift+n +Collapse notification panel + +.TP +.B Mod+c +Copy to clipboard (inject COPY keycode, Android >= 7 only) + +.TP +.B Mod+x +Cut to clipboard (inject CUT keycode, Android >= 7 only) + +.TP +.B MOD+v +Copy computer clipboard to device, then paste (inject PASTE keycode, Android >= 7 only) + +.TP +.B MOD+Shift+v +Inject computer clipboard text as a sequence of key events + +.TP +.B MOD+k +Open keyboard settings on the device (for HID keyboard only) + +.TP +.B MOD+i +Enable/disable FPS counter (print frames/second in logs) + +.TP +.B Ctrl+click-and-move +Pinch-to-zoom and rotate from the center of the screen + +.TP +.B Shift+click-and-move +Tilt vertically (slide with 2 fingers) + +.TP +.B Ctrl+Shift+click-and-move +Tilt horizontally (slide with 2 fingers) + +.TP +.B Drag & drop APK file +Install APK from computer + +.TP +.B Drag & drop non-APK file +Push file to device (see \fB\-\-push\-target\fR) + + +.SH Environment variables + +.TP +.B ADB +Path to adb. + +.TP +.B ANDROID_SERIAL +Device serial to use if no selector (\fB-s\fR, \fB-d\fR, \fB-e\fR or \fB\-\-tcpip=\fIaddr\fR) is specified. + +.TP +.B SCRCPY_ICON_PATH +Path to the program icon. + +.TP +.B SCRCPY_SERVER_PATH +Path to the server binary. + + +.SH AUTHORS +.B scrcpy +is written by Romain Vimont. + +This manual page was written by +.MT mmyangfl@gmail.com +Yangfl +.ME +for the Debian Project (and may be used by others). + + +.SH "REPORTING BUGS" +Report bugs to . + +.SH COPYRIGHT +Copyright \(co 2018 Genymobile + +Copyright \(co 2018\-2024 Romain Vimont + +Licensed under the Apache License, Version 2.0. + +.SH WWW + diff --git a/electron/resources/extra/mac/scrcpy/scrcpy_bin b/electron/resources/extra/mac/scrcpy/scrcpy_bin new file mode 100755 index 00000000..5a19ffe0 Binary files /dev/null and b/electron/resources/extra/mac/scrcpy/scrcpy_bin differ diff --git a/electron/resources/extra/win/scrcpy/SDL2.dll b/electron/resources/extra/win/scrcpy/SDL2.dll index c053b397..0df5007c 100755 Binary files a/electron/resources/extra/win/scrcpy/SDL2.dll and b/electron/resources/extra/win/scrcpy/SDL2.dll differ diff --git a/electron/resources/extra/win/scrcpy/avcodec-61.dll b/electron/resources/extra/win/scrcpy/avcodec-61.dll index 76cd3364..0a5a7563 100755 Binary files a/electron/resources/extra/win/scrcpy/avcodec-61.dll and b/electron/resources/extra/win/scrcpy/avcodec-61.dll differ diff --git a/electron/resources/extra/win/scrcpy/avformat-61.dll b/electron/resources/extra/win/scrcpy/avformat-61.dll index 7025100c..17910b14 100755 Binary files a/electron/resources/extra/win/scrcpy/avformat-61.dll and b/electron/resources/extra/win/scrcpy/avformat-61.dll differ diff --git a/electron/resources/extra/win/scrcpy/avutil-59.dll b/electron/resources/extra/win/scrcpy/avutil-59.dll index 1153e486..cb2ee70b 100755 Binary files a/electron/resources/extra/win/scrcpy/avutil-59.dll and b/electron/resources/extra/win/scrcpy/avutil-59.dll differ diff --git a/electron/resources/extra/win/scrcpy/libusb-1.0.dll b/electron/resources/extra/win/scrcpy/libusb-1.0.dll index 557ce281..dfe945da 100755 Binary files a/electron/resources/extra/win/scrcpy/libusb-1.0.dll and b/electron/resources/extra/win/scrcpy/libusb-1.0.dll differ diff --git a/electron/resources/extra/win/scrcpy/scrcpy-server b/electron/resources/extra/win/scrcpy/scrcpy-server index a8709d07..972532b8 100755 Binary files a/electron/resources/extra/win/scrcpy/scrcpy-server and b/electron/resources/extra/win/scrcpy/scrcpy-server differ diff --git a/electron/resources/extra/win/scrcpy/scrcpy.exe b/electron/resources/extra/win/scrcpy/scrcpy.exe index 1348c0e9..69f11be9 100755 Binary files a/electron/resources/extra/win/scrcpy/scrcpy.exe and b/electron/resources/extra/win/scrcpy/scrcpy.exe differ diff --git a/electron/resources/extra/win/scrcpy/swresample-5.dll b/electron/resources/extra/win/scrcpy/swresample-5.dll index ec1ba39d..2a1696de 100755 Binary files a/electron/resources/extra/win/scrcpy/swresample-5.dll and b/electron/resources/extra/win/scrcpy/swresample-5.dll differ