Compare commits

..
Author SHA1 Message Date
Romain Vimont dd73a71a15 Fix feature test macro
The expected feature test macro is _POSIX_C_SOURCE, not _POSIX_SOURCE.

Fixes #1726 <https://github.com/Genymobile/scrcpy/issues/1726>
2020-08-31 14:01:30 +02:00
18 changed files with 29 additions and 78 deletions
-4
View File
@@ -548,10 +548,6 @@ into the device clipboard. As a consequence, any Android application could read
its content. You should avoid to paste sensitive content (like passwords) that its content. You should avoid to paste sensitive content (like passwords) that
way. way.
Some devices do not behave as expected when setting the device clipboard
programmatically. An option `--legacy-paste` is provided to change the behavior
of <kbd>Ctrl</kbd>+<kbd>v</kbd> and <kbd>MOD</kbd>+<kbd>v</kbd> to also inject
the computer clipboard text as a sequence of key events.
#### Pinch-to-zoom #### Pinch-to-zoom
+4 -10
View File
@@ -68,12 +68,6 @@ Start in fullscreen.
.B \-h, \-\-help .B \-h, \-\-help
Print this help. Print this help.
.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 .TP
.BI "\-\-lock\-video\-orientation " value .BI "\-\-lock\-video\-orientation " value
Lock video orientation to \fIvalue\fR. Possible values are -1 (unlocked), 0, 1, 2 and 3. Natural device orientation is 0, and each increment adds a 90 degrees otation counterclockwise. Lock video orientation to \fIvalue\fR. Possible values are -1 (unlocked), 0, 1, 2 and 3. Natural device orientation is 0, and each increment adds a 90 degrees otation counterclockwise.
@@ -98,14 +92,14 @@ Disable device control (mirror the device in read\-only).
.B \-N, \-\-no\-display .B \-N, \-\-no\-display
Do not display device (only when screen recording is enabled). Do not display device (only when screen recording is enabled).
.TP
.B \-\-no\-key\-repeat
Do not forward repeated key events when a key is held down.
.TP .TP
.B \-\-no\-mipmaps .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. 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\-key\-repeat
Do not forward repeated key events when a key is held down.
.TP .TP
.BI "\-p, \-\-port " port[:port] .BI "\-p, \-\-port " port[:port]
Set the TCP port (range) used by the client to listen. Set the TCP port (range) used by the client to listen.
+4 -15
View File
@@ -63,12 +63,6 @@ scrcpy_print_usage(const char *arg0) {
" -h, --help\n" " -h, --help\n"
" Print this help.\n" " Print this help.\n"
"\n" "\n"
" --legacy-paste\n"
" Inject computer clipboard text as a sequence of key events\n"
" on Ctrl+v (like MOD+Shift+v).\n"
" This is a workaround for some devices not behaving as\n"
" expected when setting the device clipboard programmatically.\n"
"\n"
" --lock-video-orientation value\n" " --lock-video-orientation value\n"
" Lock video orientation to value.\n" " Lock video orientation to value.\n"
" Possible values are -1 (unlocked), 0, 1, 2 and 3.\n" " Possible values are -1 (unlocked), 0, 1, 2 and 3.\n"
@@ -93,14 +87,14 @@ scrcpy_print_usage(const char *arg0) {
" Do not display device (only when screen recording is\n" " Do not display device (only when screen recording is\n"
" enabled).\n" " enabled).\n"
"\n" "\n"
" --no-key-repeat\n"
" Do not forward repeated key events when a key is held down.\n"
"\n"
" --no-mipmaps\n" " --no-mipmaps\n"
" If the renderer is OpenGL 3.0+ or OpenGL ES 2.0+, then\n" " If the renderer is OpenGL 3.0+ or OpenGL ES 2.0+, then\n"
" mipmaps are automatically generated to improve downscaling\n" " mipmaps are automatically generated to improve downscaling\n"
" quality. This option disables the generation of mipmaps.\n" " quality. This option disables the generation of mipmaps.\n"
"\n" "\n"
" --no-key-repeat\n"
" Do not forward repeated key events when a key is held down.\n"
"\n"
" -p, --port port[:port]\n" " -p, --port port[:port]\n"
" Set the TCP port (range) used by the client to listen.\n" " Set the TCP port (range) used by the client to listen.\n"
" Default is %d:%d.\n" " Default is %d:%d.\n"
@@ -657,7 +651,6 @@ guess_record_format(const char *filename) {
#define OPT_DISABLE_SCREENSAVER 1020 #define OPT_DISABLE_SCREENSAVER 1020
#define OPT_SHORTCUT_MOD 1021 #define OPT_SHORTCUT_MOD 1021
#define OPT_NO_KEY_REPEAT 1022 #define OPT_NO_KEY_REPEAT 1022
#define OPT_LEGACY_PASTE 1023
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[]) {
@@ -673,15 +666,14 @@ scrcpy_parse_args(struct scrcpy_cli_args *args, int argc, char *argv[]) {
OPT_FORCE_ADB_FORWARD}, OPT_FORCE_ADB_FORWARD},
{"fullscreen", no_argument, NULL, 'f'}, {"fullscreen", no_argument, NULL, 'f'},
{"help", no_argument, NULL, 'h'}, {"help", no_argument, NULL, 'h'},
{"legacy-paste", no_argument, NULL, OPT_LEGACY_PASTE},
{"lock-video-orientation", required_argument, NULL, {"lock-video-orientation", required_argument, NULL,
OPT_LOCK_VIDEO_ORIENTATION}, OPT_LOCK_VIDEO_ORIENTATION},
{"max-fps", required_argument, NULL, OPT_MAX_FPS}, {"max-fps", required_argument, NULL, OPT_MAX_FPS},
{"max-size", required_argument, NULL, 'm'}, {"max-size", required_argument, NULL, 'm'},
{"no-control", no_argument, NULL, 'n'}, {"no-control", no_argument, NULL, 'n'},
{"no-display", no_argument, NULL, 'N'}, {"no-display", no_argument, NULL, 'N'},
{"no-key-repeat", no_argument, NULL, OPT_NO_KEY_REPEAT},
{"no-mipmaps", no_argument, NULL, OPT_NO_MIPMAPS}, {"no-mipmaps", no_argument, NULL, OPT_NO_MIPMAPS},
{"no-key-repeat", no_argument, NULL, OPT_NO_KEY_REPEAT},
{"port", required_argument, NULL, 'p'}, {"port", required_argument, NULL, 'p'},
{"prefer-text", no_argument, NULL, OPT_PREFER_TEXT}, {"prefer-text", no_argument, NULL, OPT_PREFER_TEXT},
{"push-target", required_argument, NULL, OPT_PUSH_TARGET}, {"push-target", required_argument, NULL, OPT_PUSH_TARGET},
@@ -864,9 +856,6 @@ scrcpy_parse_args(struct scrcpy_cli_args *args, int argc, char *argv[]) {
return false; return false;
} }
break; break;
case OPT_LEGACY_PASTE:
opts->legacy_paste = true;
break;
default: default:
// getopt prints the error message on stderr // getopt prints the error message on stderr
return false; return false;
+1 -7
View File
@@ -60,7 +60,6 @@ input_manager_init(struct input_manager *im,
im->control = options->control; im->control = options->control;
im->forward_key_repeat = options->forward_key_repeat; im->forward_key_repeat = options->forward_key_repeat;
im->prefer_text = options->prefer_text; im->prefer_text = options->prefer_text;
im->legacy_paste = options->legacy_paste;
const struct sc_shortcut_mods *shortcut_mods = &options->shortcut_mods; const struct sc_shortcut_mods *shortcut_mods = &options->shortcut_mods;
assert(shortcut_mods->count); assert(shortcut_mods->count);
@@ -441,7 +440,7 @@ input_manager_process_key(struct input_manager *im,
return; return;
case SDLK_v: case SDLK_v:
if (control && !repeat && down) { if (control && !repeat && down) {
if (shift || im->legacy_paste) { if (shift) {
// inject the text as input events // inject the text as input events
clipboard_paste(controller); clipboard_paste(controller);
} else { } else {
@@ -505,11 +504,6 @@ input_manager_process_key(struct input_manager *im,
} }
if (ctrl && !shift && keycode == SDLK_v && down && !repeat) { if (ctrl && !shift && keycode == SDLK_v && down && !repeat) {
if (im->legacy_paste) {
// inject the text as input events
clipboard_paste(controller);
return;
}
// Synchronize the computer clipboard to the device clipboard before // Synchronize the computer clipboard to the device clipboard before
// sending Ctrl+v, to allow seamless copy-paste. // sending Ctrl+v, to allow seamless copy-paste.
set_device_clipboard(controller, false); set_device_clipboard(controller, false);
-1
View File
@@ -25,7 +25,6 @@ struct input_manager {
bool control; bool control;
bool forward_key_repeat; bool forward_key_repeat;
bool prefer_text; bool prefer_text;
bool legacy_paste;
struct { struct {
unsigned data[SC_MAX_SHORTCUT_MODS]; unsigned data[SC_MAX_SHORTCUT_MODS];
+1 -1
View File
@@ -100,7 +100,7 @@ main(int argc, char *argv[]) {
#if defined (__WINDOWS__) && ! defined (WINDOWS_NOCONSOLE) #if defined (__WINDOWS__) && ! defined (WINDOWS_NOCONSOLE)
if (res != 0) { if (res != 0) {
fprintf(stderr, "Press Enter to continue...\n"); fprintf(stderr, "Press any key to continue...\n");
getchar(); getchar();
} }
#endif #endif
-2
View File
@@ -361,14 +361,12 @@ recorder_push(struct recorder *recorder, const AVPacket *packet) {
if (recorder->failed) { if (recorder->failed) {
// reject any new packet (this will stop the stream) // reject any new packet (this will stop the stream)
mutex_unlock(recorder->mutex);
return false; return false;
} }
struct record_packet *rec = record_packet_new(packet); struct record_packet *rec = record_packet_new(packet);
if (!rec) { if (!rec) {
LOGC("Could not allocate record packet"); LOGC("Could not allocate record packet");
mutex_unlock(recorder->mutex);
return false; return false;
} }
-2
View File
@@ -79,7 +79,6 @@ struct scrcpy_options {
bool force_adb_forward; bool force_adb_forward;
bool disable_screensaver; bool disable_screensaver;
bool forward_key_repeat; bool forward_key_repeat;
bool legacy_paste;
}; };
#define SCRCPY_OPTIONS_DEFAULT { \ #define SCRCPY_OPTIONS_DEFAULT { \
@@ -124,7 +123,6 @@ struct scrcpy_options {
.force_adb_forward = false, \ .force_adb_forward = false, \
.disable_screensaver = false, \ .disable_screensaver = false, \
.forward_key_repeat = true, \ .forward_key_repeat = true, \
.legacy_paste = false, \
} }
bool bool
+1
View File
@@ -14,6 +14,7 @@ struct video_buffer;
struct stream { struct stream {
socket_t socket; socket_t socket;
struct video_buffer *video_buffer;
SDL_Thread *thread; SDL_Thread *thread;
struct decoder *decoder; struct decoder *decoder;
struct recorder *recorder; struct recorder *recorder;
-3
View File
@@ -19,9 +19,6 @@ allprojects {
google() google()
jcenter() jcenter()
} }
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:deprecation"
}
} }
task clean(type: Delete) { task clean(type: Delete) {
+1 -1
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env bash #!/bin/bash
set -e set -e
url="$1" url="$1"
sum="$2" sum="$2"
+1 -1
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env bash #!/bin/bash
# Run scrcpy generated in the specified BUILDDIR. # Run scrcpy generated in the specified BUILDDIR.
# #
# This provides the same feature as "ninja run", except that it is possible to # This provides the same feature as "ninja run", except that it is possible to
+1 -1
View File
@@ -1,2 +1,2 @@
#!/usr/bin/env bash #!/bin/bash
SCRCPY_SERVER_PATH="$MESON_BUILD_ROOT/server/scrcpy-server" "$MESON_BUILD_ROOT/app/scrcpy" SCRCPY_SERVER_PATH="$MESON_BUILD_ROOT/server/scrcpy-server" "$MESON_BUILD_ROOT/app/scrcpy"
+2 -2
View File
@@ -1,11 +1,11 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
android { android {
compileSdkVersion 30 compileSdkVersion 29
defaultConfig { defaultConfig {
applicationId "com.genymobile.scrcpy" applicationId "com.genymobile.scrcpy"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 30 targetSdkVersion 29
versionCode 19 versionCode 19
versionName "1.16" versionName "1.16"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+3 -3
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env bash #!/bin/bash
# #
# This script generates the scrcpy binary "manually" (without gradle). # This script generates the scrcpy binary "manually" (without gradle).
# #
@@ -14,8 +14,8 @@ set -e
SCRCPY_DEBUG=false SCRCPY_DEBUG=false
SCRCPY_VERSION_NAME=1.16 SCRCPY_VERSION_NAME=1.16
PLATFORM=${ANDROID_PLATFORM:-30} PLATFORM=${ANDROID_PLATFORM:-29}
BUILD_TOOLS=${ANDROID_BUILD_TOOLS:-30.0.0} BUILD_TOOLS=${ANDROID_BUILD_TOOLS:-29.0.2}
BUILD_DIR="$(realpath ${BUILD_DIR:-build_manual})" BUILD_DIR="$(realpath ${BUILD_DIR:-build_manual})"
CLASSES_DIR="$BUILD_DIR/classes" CLASSES_DIR="$BUILD_DIR/classes"
+1 -1
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env bash #!/bin/bash
# Wrapper script to invoke gradle from meson # Wrapper script to invoke gradle from meson
set -e set -e
@@ -16,7 +16,6 @@ public final class Workarounds {
// not instantiable // not instantiable
} }
@SuppressWarnings("deprecation")
public static void prepareMainLooper() { public static void prepareMainLooper() {
// Some devices internally create a Handler when creating an input Surface, causing an exception: // Some devices internally create a Handler when creating an input Surface, causing an exception:
// "Can't create handler inside thread that has not called Looper.prepare()" // "Can't create handler inside thread that has not called Looper.prepare()"
@@ -35,7 +35,7 @@ public class ContentProvider implements Closeable {
private final IBinder token; private final IBinder token;
private Method callMethod; private Method callMethod;
private int callMethodVersion; private boolean callMethodLegacy;
ContentProvider(ActivityManager manager, Object provider, String name, IBinder token) { ContentProvider(ActivityManager manager, Object provider, String name, IBinder token) {
this.manager = manager; this.manager = manager;
@@ -46,20 +46,12 @@ public class ContentProvider implements Closeable {
private Method getCallMethod() throws NoSuchMethodException { private Method getCallMethod() throws NoSuchMethodException {
if (callMethod == null) { if (callMethod == null) {
try { try {
callMethod = provider.getClass() callMethod = provider.getClass().getMethod("call", String.class, String.class, String.class, String.class, Bundle.class);
.getMethod("call", String.class, String.class, String.class, String.class, String.class, Bundle.class);
callMethodVersion = 0;
} catch (NoSuchMethodException e) { } catch (NoSuchMethodException e) {
// old versions // old version
try { callMethod = provider.getClass().getMethod("call", String.class, String.class, String.class, Bundle.class);
callMethod = provider.getClass().getMethod("call", String.class, String.class, String.class, String.class, Bundle.class); callMethodLegacy = true;
callMethodVersion = 1;
} catch (NoSuchMethodException e2) {
callMethod = provider.getClass().getMethod("call", String.class, String.class, String.class, Bundle.class);
callMethodVersion = 2;
}
} }
} }
return callMethod; return callMethod;
@@ -69,16 +61,10 @@ public class ContentProvider implements Closeable {
try { try {
Method method = getCallMethod(); Method method = getCallMethod();
Object[] args; Object[] args;
switch (callMethodVersion) { if (!callMethodLegacy) {
case 0: args = new Object[]{ServiceManager.PACKAGE_NAME, "settings", callMethod, arg, extras};
args = new Object[]{ServiceManager.PACKAGE_NAME, null, "settings", callMethod, arg, extras}; } else {
break; args = new Object[]{ServiceManager.PACKAGE_NAME, callMethod, arg, extras};
case 1:
args = new Object[]{ServiceManager.PACKAGE_NAME, "settings", callMethod, arg, extras};
break;
default:
args = new Object[]{ServiceManager.PACKAGE_NAME, callMethod, arg, extras};
break;
} }
return (Bundle) method.invoke(provider, args); return (Bundle) method.invoke(provider, args);
} catch (InvocationTargetException | IllegalAccessException | NoSuchMethodException e) { } catch (InvocationTargetException | IllegalAccessException | NoSuchMethodException e) {