Commit Graph

1862 Commits

Author SHA1 Message Date
Romain Vimont
fd6536b34a Fix incorrect assertion in recording
It was assumed that the video packet immediately following a config
packet was a non-config packet. This is not necessarily true: for
example, if the capture is reset (due to resizing or rotation) before
the first frame is produced.
2026-04-11 14:54:52 +02:00
Romain Vimont
f669c81b94 Replace assertion with a runtime check
The length is provided by the device, treat invalid values as a runtime
error.
2026-04-11 13:51:25 +02:00
Romain Vimont
ebb47b55c8 Fail on demuxer error
Add missing error handling.
2026-04-11 13:50:54 +02:00
Tech-Tac
65153a09c3 Add option to disable window aspect ratio lock
By default, the window aspect ratio is preserved when resizing.

Add `--no-window-aspect-ratio-lock` to disable this behavior.

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

Signed-off-by: Romain Vimont <rom@rom1v.com>
2026-04-10 19:35:43 +02:00
Tech-Tac
1b4fd67286 Enforce window aspect ratio
Preserve the aspect ratio when resizing the window, so that the window
always matches the device content.

Fixes #2317 <https://github.com/Genymobile/scrcpy/issues/2317>
Fixes #2387 <https://github.com/Genymobile/scrcpy/issues/2387>
Fixes #3460 <https://github.com/Genymobile/scrcpy/issues/3460>
PR #6761 <https://github.com/Genymobile/scrcpy/pull/6761>

Signed-off-by: Romain Vimont <rom@rom1v.com>
2026-04-10 19:34:02 +02:00
Romain Vimont
829da1477d Fix typo in error message 2026-04-10 19:33:00 +02:00
Romain Vimont
a007c038ca Add missing --no-window shell completion 2026-04-10 19:32:05 +02:00
Romain Vimont
064635e1af Remove deprecated options
The next release will be a major version.
2026-04-10 19:29:40 +02:00
Romain Vimont
7bd18fcda8 Remove references to --rotation
This option was removed a long time ago.
2026-04-10 19:29:40 +02:00
Romain Vimont
d5158dac69 Fix man page OTG documentation
The description was updated only in `cli.c`, but the old version was
left in the man page.
2026-04-10 19:29:40 +02:00
Romain Vimont
523c820bfa Avoid double-rendering on resize
On Windows and macOS, resizing the window with the mouse blocks the
event loop until the click is released. To keep rendering during
resizing, an event watcher is registered to handle resize events.

Avoid handling resize events twice by ensuring
`SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED` is processed only once.

PR #6758 <https://github.com/Genymobile/scrcpy/pull/6758>
2026-04-10 19:27:13 +02:00
Romain Vimont
8983023457 Factorize resize event handling
Reuse the same code to handle resize events from the event loop or the
event watcher.

PR #6758 <https://github.com/Genymobile/scrcpy/pull/6758>
2026-04-10 19:27:13 +02:00
Romain Vimont
07f8eb0ec6 Move Ctrl+C handler configuration
The function `sdl_configure()` now only sets the Ctrl+C handler on
Windows. Define it only on Windows, and call it earlier.

Refs #6754 <https://github.com/Genymobile/scrcpy/pull/6754>
2026-04-07 19:51:20 +02:00
Romain Vimont
c527bc76de Enable screensaver using hints
SDL disables the screensaver by default. It can be configured via a
hint instead of explicitly calling `SDL_EnableScreenSaver()`.

Refs #6754 <https://github.com/Genymobile/scrcpy/pull/6754>
2026-04-07 19:50:48 +02:00
Romain Vimont
003616bd2c Always set hints
Some hints can be useful even when window is dsabled.

Refs #6754 <https://github.com/Genymobile/scrcpy/pull/6754>
2026-04-07 19:50:35 +02:00
ayooh
758d0a1cc0 Fix screensaver disabled unexpectedly
By default, scrcpy does not prevent the screensaver from running on the
computer unless the `--disable-screensaver` option is passed.

Otherwise, `SDL_EnableScreenSaver()` must be called explicitly, since
SDL disables the screensaver by default.

Refs <https://wiki.libsdl.org/SDL3/SDL_DisableScreenSaver>
PR #6754 <https://github.com/Genymobile/scrcpy/pull/6754>

Signed-off-by: Romain Vimont <rom@rom1v.com>
2026-04-07 19:49:40 +02:00
Romain Vimont
ae13c77c5e Add option to force size alignment
Add --min-size-alignment to force a minimal size alignment.

This is a power-of-2 value (1, 2, 4, 8 or 16) that the video width and
height must be multiples of.

The actual alignment will be the maximum of this value and the video
codec's alignment requirement.

PR #6746 <https://github.com/Genymobile/scrcpy/pull/6746>
2026-04-07 19:47:11 +02:00
Romain Vimont
5fedc79530 Fix device rotation shortcut
MOD+r was never handled because it was consumed by the MOD+Shift+r
handler.
2026-04-03 21:35:26 +02:00
Romain Vimont
740460d04e Rename "hole" to "uninitialized" in vector APIs
The sc_vector and sc_vecdeque utilities define insert_hole() and
push_hole() functions to insert uninitialized items (to be initialized
after the call).

However, "hole" is a poor name. Rename it to "uninitialized" for
clarity.
2026-03-17 20:46:40 +01:00
Romain Vimont
a4000a1487 Display disconnected icon before closing
Previously, when the connection to the device was lost while mirroring,
the window closed immediately, suggesting scrcpy had crashed.

To make it clear that a disconnection occurred, display a disconnected
icon for 2 seconds before closing the window.

PR #6662 <https://github.com/Genymobile/scrcpy/pull/6662>
2026-03-17 18:40:35 +01:00
Romain Vimont
6bf8b8d957 Only reject RUN_ON_MAIN_THREAD events on quit
Use SDL_PeepEvents() to consume only SC_EVENT_RUN_ON_MAIN_THREAD events.
Other events are not dropped and can still be processed later.

PR #6662 <https://github.com/Genymobile/scrcpy/pull/6662>
2026-03-17 18:40:35 +01:00
Romain Vimont
fe1fd557f7 Add utility to push an SDL event with data
PR #6662 <https://github.com/Genymobile/scrcpy/pull/6662>
2026-03-17 18:40:35 +01:00
Romain Vimont
a2055c0a47 Add function to delete current texture
PR #6662 <https://github.com/Genymobile/scrcpy/pull/6662>
2026-03-17 18:40:35 +01:00
Romain Vimont
6ca1b79228 Add filename parameter to icon loading
Replace scrcpy_icon_load(), which loaded the unique scrcpy app icon,
with sc_icon_load(filename), which can load any icon from the icons
directory.

PR #6662 <https://github.com/Genymobile/scrcpy/pull/6662>
2026-03-17 18:40:34 +01:00
Romain Vimont
d6590738be Replace SCRCPY_ICON_PATH with SCRCPY_ICON_DIR
SCRCPY_ICON_PATH defined the path of the scrcpy app icon.
SCRCPY_ICON_DIR defines the directory where scrcpy icons reside.

This change prepares for the addition of other icons.

PR #6662 <https://github.com/Genymobile/scrcpy/pull/6662>
2026-03-17 18:40:34 +01:00
Romain Vimont
c994f9df6a Extract function to build file paths
Add a utility function to create a full path from a directory and a
filename.

PR #6662 <https://github.com/Genymobile/scrcpy/pull/6662>
2026-03-17 18:40:34 +01:00
Romain Vimont
8a4955ec57 Rename icon.png to scrcpy.png
This makes the icon name consistent everywhere.

PR #6662 <https://github.com/Genymobile/scrcpy/pull/6662>
2026-03-17 18:40:34 +01:00
chengjiansu
bad2183087 Fix orientation error message
When running `scrcpy --capture-orientation=@100`, the error shown is:

> Unsupported orientation: @100 (expected 0, 90, 180, 270, flip0, flip90, flip180 or flip270)

We should tell the user that the error is 100, not @100.

Moreover, the function parse_orientation() should not access the
`optarg` global variable.

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

Signed-off-by: Romain Vimont <rom@rom1v.com>
2026-03-10 20:14:23 +01:00
Romain Vimont
e17a885f32 Draw a dark square when no texture is rendered
Draw a dark 10x10 square in the top-right corner to distinguish a black
frame from the absence of a frame (useful for debugging).

PR #6694 <https://github.com/Genymobile/scrcpy/pull/6694>
2026-03-10 20:11:04 +01:00
Romain Vimont
691a63761c Open the scrcpy window earlier
Previously, the window was opened only once the first frame was
available. Instead, open it as soon as the frame dimensions are known.

This is especially useful when the encoder does not produce an initial
frame while the phone is turned off (e.g., with --no-power-on).

Fixes #6546 <https://github.com/Genymobile/scrcpy/issues/6546>
PR #6694 <https://github.com/Genymobile/scrcpy/pull/6694>
2026-03-10 20:11:04 +01:00
Romain Vimont
57af6b9209 Track window shown state
Use a flag to indicate whether the window is currently shown.

This replaces the old has_video_window flag, which was true only when
the window was shown and video was enabled.

This will simplify performing actions only when the window is currently
shown.

PR #6694 <https://github.com/Genymobile/scrcpy/pull/6694>
2026-03-10 20:11:04 +01:00
Romain Vimont
0597c5eb8d Remove unnecessary void cast
The ctx variable is used.

PR #6694 <https://github.com/Genymobile/scrcpy/pull/6694>
2026-03-10 20:11:04 +01:00
Romain Vimont
8b0206f7be Keep Windows terminal open on error
If scrcpy is launched by double-clicking scrcpy.exe in Windows Explorer,
automatically set --pause-on-exit=if-error.

Without this, the terminal would close immediately, preventing the user
from seeing the error.

Also remove scrcpy-console.bat, which is now useless.

PR #6667 <https://github.com/Genymobile/scrcpy/pull/6667>
2026-02-21 12:17:31 +01:00
Romain Vimont
f91fa56593 Fix segfault on rotation while recording
The packet sink push_session() callback is optional, but it was called
unconditionnally even when not implemented, leading to a segfault.

Bug introduced by commit 78cba1b7c2.

Fixes #6687 <https://github.com/Genymobile/scrcpy/issues/6687>
2026-02-21 10:45:12 +01:00
Romain Vimont
51cbd9a5bc Detect TCP devices provided by mDNS
Their serial is not in the form ip:port, but rather a complex string
containing "adb-tls-connect".

Fixes #6248 <https://github.com/Genymobile/scrcpy/issues/6248>
PR #6665 <https://github.com/Genymobile/scrcpy/pull/6665>
2026-02-12 20:08:46 +01:00
Romain Vimont
82e102e036 Improve adb devices parsing
`adb devices -l` prints one device per line, containing, separated by
spaces:
 - the device serial,
 - the device state,
 - a list of key:value pairs.

However, the device serial itself may contain spaces, making a simple
split ambiguous.

To avoid ambiguity, parse the string backwards:
 - first, parse all the trailing values until the device state,
   identified using a list of well-known values;
 - finally, treat the remaining leading token as the device serial.

Fixes #3537 <https://github.com/Genymobile/scrcpy/issues/3537>
Refs #6248 <https://github.com/Genymobile/scrcpy/issues/6248>
PR #6664 <https://github.com/Genymobile/scrcpy/pull/6664>
2026-02-12 20:06:11 +01:00
Romain Vimont
e39d7a06e4 Remove sc_str_quote()
It is no longer used.

PR #6663 <https://github.com/Genymobile/scrcpy/pull/6663>
2026-02-12 20:00:59 +01:00
Romain Vimont
be34f37a57 Use proper argument serialization for Windows
Replace the hacky implementation for executing simple commands on
Windows with the proper serialization mechanism.

PR #6663 <https://github.com/Genymobile/scrcpy/pull/6663>
2026-02-12 20:00:59 +01:00
Romain Vimont
f7e74dd04d Add utility to serialize windows arguments
Add a function to convert an argv array into a single escaped string to
be passed to CreateProcess() on Windows.

Refs <https://learn.microsoft.com/en-us/cpp/c-language/parsing-c-command-line-arguments>
Refs <https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessw>
PR #6663 <https://github.com/Genymobile/scrcpy/pull/6663>
2026-02-12 20:00:39 +01:00
Romain Vimont
bb6d1c6348 Set Windows console code page to UTF-8
Refs #6663 comment <https://github.com/Genymobile/scrcpy/pull/6663#issuecomment-3875602219>

Suggested-by: Simon Chan <1330321+yume-chan@users.noreply.github.com>
2026-02-10 08:27:22 +01:00
Romain Vimont
2301f64158 Make icon loading failure non-fatal
Do not close scrcpy if the content icon cannot be loaded, even when
video playback is disabled.
2026-02-09 18:36:54 +01:00
Romain Vimont
d7f0e22067 Make screen event handler return void
The function always returned true.
2026-02-09 18:36:54 +01:00
Romain Vimont
77998f543f Rename sc_display to sc_texture
The sc_display component now only handles a texture. Rendering has been
moved to sc_screen.

PR #6651 <https://github.com/Genymobile/scrcpy/pull/6651>
2026-02-09 18:33:57 +01:00
Romain Vimont
c43cc2ddc3 Set display texture from a frame
Add a function to set a texture from an AVFrame on a sc_display.

PR #6651 <https://github.com/Genymobile/scrcpy/pull/6651>
2026-02-09 18:33:52 +01:00
Romain Vimont
1617979549 Set display texture from a surface
Add a function to set a texture from a surface on a sc_display.

PR #6651 <https://github.com/Genymobile/scrcpy/pull/6651>
2026-02-09 18:33:48 +01:00
Romain Vimont
58818dc860 Use floating-point for content location
In SDL3, texture rendering uses SDL_FRect, unlike SDL2 which used
SDL_Rect.

Compute content location using floating-point coordinates from the
start.

PR #6651 <https://github.com/Genymobile/scrcpy/pull/6651>
2026-02-09 18:33:44 +01:00
Romain Vimont
3ef51e691e Factorize icon rendering
Replace SDL "logical rendering" with explicit computation of icon
location, and unify rendering of video frames and icons using the same
common code.

PR #6651 <https://github.com/Genymobile/scrcpy/pull/6651>
2026-02-09 18:33:41 +01:00
Romain Vimont
fb77f8556a Extract function to compute content location
PR #6651 <https://github.com/Genymobile/scrcpy/pull/6651>
2026-02-09 18:33:38 +01:00
Romain Vimont
e3f0c21f2a Use render output size to compute content location
The coordinates of the content to render depend on the render output
size, not the window size in pixels. In theory, the two could differ.

PR #6651 <https://github.com/Genymobile/scrcpy/pull/6651>
2026-02-09 18:33:35 +01:00
Romain Vimont
930169af4e Move rendering from sc_display to sc_screen
Three components are involved in displaying device content on screen:
 - a window
 - a renderer
 - a texture

Originally, all three were handled by sc_screen.

Commit 051b74c883 later extracted the
renderer and texture into a separate component, sc_display.

However, the split was a bit awkward because the window size and
rendering location were managed by separate components.

Move rendering back to sc_screen, keeping only texture management
separated.

PR #6651 <https://github.com/Genymobile/scrcpy/pull/6651>
2026-02-09 18:33:31 +01:00