Add --rotation command-line option
In addition to Ctrl+Left and Ctrl+Right shortcuts, add a command-line parameter to set the initial rotation.
This commit is contained in:
parent
d48b375a1d
commit
28c71c528f
7 changed files with 67 additions and 3 deletions
27
README.md
27
README.md
|
@ -340,6 +340,33 @@ scrcpy -f # short version
|
||||||
|
|
||||||
Fullscreen can then be toggled dynamically with `Ctrl`+`f`.
|
Fullscreen can then be toggled dynamically with `Ctrl`+`f`.
|
||||||
|
|
||||||
|
#### Rotation
|
||||||
|
|
||||||
|
The window may be rotated:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
scrcpy --rotation 1
|
||||||
|
```
|
||||||
|
|
||||||
|
Possibles values are:
|
||||||
|
- `0`: no rotation
|
||||||
|
- `1`: 90 degrees counterclockwise
|
||||||
|
- `2`: 180 degrees
|
||||||
|
- `3`: 90 degrees clockwise
|
||||||
|
|
||||||
|
The rotation can also be changed dynamically with `Ctrl`+`←` _(left)_ and
|
||||||
|
`Ctrl`+`→` _(right)_.
|
||||||
|
|
||||||
|
Note that _scrcpy_ manages 3 different rotations:
|
||||||
|
- `Ctrl`+`r` requests the device to switch between portrait and landscape (the
|
||||||
|
current running app may refuse, if it does support the requested
|
||||||
|
orientation).
|
||||||
|
- `--lock-video-orientation` changes the mirroring orientation (the orientation
|
||||||
|
of the video sent from the device to the computer. This affects the
|
||||||
|
recording.
|
||||||
|
- `--rotation` (or `Ctrl`+`←`/`Ctrl`+`→`) rotates only the window content. This
|
||||||
|
affects only the display, not the recording.
|
||||||
|
|
||||||
|
|
||||||
### Other mirroring options
|
### Other mirroring options
|
||||||
|
|
||||||
|
|
|
@ -110,6 +110,10 @@ Force recording format (either mp4 or mkv).
|
||||||
.B \-\-render\-expired\-frames
|
.B \-\-render\-expired\-frames
|
||||||
By default, to minimize latency, scrcpy always renders the last available decoded frame, and drops any previous ones. This flag forces to render all frames, at a cost of a possible increased latency.
|
By default, to minimize latency, scrcpy always renders the last available decoded frame, and drops any previous ones. This flag forces to render all frames, at a cost of a possible increased latency.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.BI "\-\-rotation " value
|
||||||
|
Set the initial display rotation. Possibles values are 0, 1, 2 and 3. Each increment adds a 90 degrees rotation counterclockwise.
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.BI "\-s, \-\-serial " number
|
.BI "\-s, \-\-serial " number
|
||||||
The device serial number. Mandatory only if several devices are connected to adb.
|
The device serial number. Mandatory only if several devices are connected to adb.
|
||||||
|
|
|
@ -104,6 +104,11 @@ scrcpy_print_usage(const char *arg0) {
|
||||||
" This flag forces to render all frames, at a cost of a\n"
|
" This flag forces to render all frames, at a cost of a\n"
|
||||||
" possible increased latency.\n"
|
" possible increased latency.\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
" --rotation value\n"
|
||||||
|
" Set the initial display rotation.\n"
|
||||||
|
" Possibles values are 0, 1, 2 and 3. Each increment adds a 90\n"
|
||||||
|
" degrees rotation counterclockwise.\n"
|
||||||
|
"\n"
|
||||||
" -s, --serial serial\n"
|
" -s, --serial serial\n"
|
||||||
" The device serial number. Mandatory only if several devices\n"
|
" The device serial number. Mandatory only if several devices\n"
|
||||||
" are connected to adb.\n"
|
" are connected to adb.\n"
|
||||||
|
@ -316,6 +321,18 @@ parse_lock_video_orientation(const char *s, int8_t *lock_video_orientation) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
parse_rotation(const char *s, uint8_t *rotation) {
|
||||||
|
long value;
|
||||||
|
bool ok = parse_integer_arg(s, &value, false, 0, 3, "rotation");
|
||||||
|
if (!ok) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
*rotation = (uint8_t) value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
parse_window_position(const char *s, int16_t *position) {
|
parse_window_position(const char *s, int16_t *position) {
|
||||||
// special value for "auto"
|
// special value for "auto"
|
||||||
|
@ -435,6 +452,7 @@ guess_record_format(const char *filename) {
|
||||||
#define OPT_MAX_FPS 1012
|
#define OPT_MAX_FPS 1012
|
||||||
#define OPT_LOCK_VIDEO_ORIENTATION 1013
|
#define OPT_LOCK_VIDEO_ORIENTATION 1013
|
||||||
#define OPT_DISPLAY_ID 1014
|
#define OPT_DISPLAY_ID 1014
|
||||||
|
#define OPT_ROTATION 1015
|
||||||
|
|
||||||
bool
|
bool
|
||||||
scrcpy_parse_args(struct scrcpy_cli_args *args, int argc, char *argv[]) {
|
scrcpy_parse_args(struct scrcpy_cli_args *args, int argc, char *argv[]) {
|
||||||
|
@ -455,6 +473,7 @@ scrcpy_parse_args(struct scrcpy_cli_args *args, int argc, char *argv[]) {
|
||||||
{"push-target", required_argument, NULL, OPT_PUSH_TARGET},
|
{"push-target", required_argument, NULL, OPT_PUSH_TARGET},
|
||||||
{"record", required_argument, NULL, 'r'},
|
{"record", required_argument, NULL, 'r'},
|
||||||
{"record-format", required_argument, NULL, OPT_RECORD_FORMAT},
|
{"record-format", required_argument, NULL, OPT_RECORD_FORMAT},
|
||||||
|
{"rotation", required_argument, NULL, OPT_ROTATION},
|
||||||
{"render-expired-frames", no_argument, NULL,
|
{"render-expired-frames", no_argument, NULL,
|
||||||
OPT_RENDER_EXPIRED_FRAMES},
|
OPT_RENDER_EXPIRED_FRAMES},
|
||||||
{"serial", required_argument, NULL, 's'},
|
{"serial", required_argument, NULL, 's'},
|
||||||
|
@ -592,6 +611,11 @@ scrcpy_parse_args(struct scrcpy_cli_args *args, int argc, char *argv[]) {
|
||||||
case OPT_PREFER_TEXT:
|
case OPT_PREFER_TEXT:
|
||||||
opts->prefer_text = true;
|
opts->prefer_text = true;
|
||||||
break;
|
break;
|
||||||
|
case OPT_ROTATION:
|
||||||
|
if (!parse_rotation(optarg, &opts->rotation)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// getopt prints the error message on stderr
|
// getopt prints the error message on stderr
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -396,7 +396,8 @@ scrcpy(const struct scrcpy_options *options) {
|
||||||
options->always_on_top, options->window_x,
|
options->always_on_top, options->window_x,
|
||||||
options->window_y, options->window_width,
|
options->window_y, options->window_width,
|
||||||
options->window_height,
|
options->window_height,
|
||||||
options->window_borderless)) {
|
options->window_borderless,
|
||||||
|
options->rotation)) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ struct scrcpy_options {
|
||||||
uint32_t bit_rate;
|
uint32_t bit_rate;
|
||||||
uint16_t max_fps;
|
uint16_t max_fps;
|
||||||
int8_t lock_video_orientation;
|
int8_t lock_video_orientation;
|
||||||
|
uint8_t rotation;
|
||||||
int16_t window_x; // WINDOW_POSITION_UNDEFINED for "auto"
|
int16_t window_x; // WINDOW_POSITION_UNDEFINED for "auto"
|
||||||
int16_t window_y; // WINDOW_POSITION_UNDEFINED for "auto"
|
int16_t window_y; // WINDOW_POSITION_UNDEFINED for "auto"
|
||||||
uint16_t window_width;
|
uint16_t window_width;
|
||||||
|
@ -52,6 +53,7 @@ struct scrcpy_options {
|
||||||
.bit_rate = DEFAULT_BIT_RATE, \
|
.bit_rate = DEFAULT_BIT_RATE, \
|
||||||
.max_fps = 0, \
|
.max_fps = 0, \
|
||||||
.lock_video_orientation = DEFAULT_LOCK_VIDEO_ORIENTATION, \
|
.lock_video_orientation = DEFAULT_LOCK_VIDEO_ORIENTATION, \
|
||||||
|
.rotation = 0, \
|
||||||
.window_x = WINDOW_POSITION_UNDEFINED, \
|
.window_x = WINDOW_POSITION_UNDEFINED, \
|
||||||
.window_y = WINDOW_POSITION_UNDEFINED, \
|
.window_y = WINDOW_POSITION_UNDEFINED, \
|
||||||
.window_width = 0, \
|
.window_width = 0, \
|
||||||
|
|
|
@ -178,8 +178,13 @@ bool
|
||||||
screen_init_rendering(struct screen *screen, const char *window_title,
|
screen_init_rendering(struct screen *screen, const char *window_title,
|
||||||
struct size frame_size, bool always_on_top,
|
struct size frame_size, bool always_on_top,
|
||||||
int16_t window_x, int16_t window_y, uint16_t window_width,
|
int16_t window_x, int16_t window_y, uint16_t window_width,
|
||||||
uint16_t window_height, bool window_borderless) {
|
uint16_t window_height, bool window_borderless,
|
||||||
|
uint8_t rotation) {
|
||||||
screen->frame_size = frame_size;
|
screen->frame_size = frame_size;
|
||||||
|
screen->rotation = rotation;
|
||||||
|
if (rotation) {
|
||||||
|
LOGI("Initial display rotation set to %u", rotation);
|
||||||
|
}
|
||||||
struct size content_size =
|
struct size content_size =
|
||||||
get_rotated_size(frame_size, screen->rotation);
|
get_rotated_size(frame_size, screen->rotation);
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,8 @@ bool
|
||||||
screen_init_rendering(struct screen *screen, const char *window_title,
|
screen_init_rendering(struct screen *screen, const char *window_title,
|
||||||
struct size frame_size, bool always_on_top,
|
struct size frame_size, bool always_on_top,
|
||||||
int16_t window_x, int16_t window_y, uint16_t window_width,
|
int16_t window_x, int16_t window_y, uint16_t window_width,
|
||||||
uint16_t window_height, bool window_borderless);
|
uint16_t window_height, bool window_borderless,
|
||||||
|
uint8_t rotation);
|
||||||
|
|
||||||
// show the window
|
// show the window
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in a new issue