diff --git a/README.md b/README.md index d5eb3a83..38e117ce 100644 --- a/README.md +++ b/README.md @@ -582,7 +582,7 @@ device). | Expand notification panel | `RCtrl`+`n` | Collapse notification panel | `RCtrl`+`Shift`+`n` | Paste computer clipboard to device | `RCtrl`+`v` - | Copy computer clipboard to device and paste | `RCtrl`+`Shift`+`v` + | Copy computer clipboard to device | `RCtrl`+`Shift`+`v` | Enable/disable FPS counter (on stdout) | `RCtrl`+`i` _¹Double-click on black borders to remove them._ diff --git a/app/scrcpy.1 b/app/scrcpy.1 index 1a6d2ed0..8ca5df6c 100644 --- a/app/scrcpy.1 +++ b/app/scrcpy.1 @@ -283,7 +283,7 @@ Paste computer clipboard to device .TP .B RCtrl+Shift+v -Copy computer clipboard to device (and paste if the device runs Android >= 7) +Copy computer clipboard to device .TP .B RCtrl+i diff --git a/app/src/cli.c b/app/src/cli.c index 66540d84..5948b6b4 100644 --- a/app/src/cli.c +++ b/app/src/cli.c @@ -246,8 +246,7 @@ scrcpy_print_usage(const char *arg0) { " Paste computer clipboard to device\n" "\n" " RCtrl+Shift+v\n" - " Copy computer clipboard to device (and paste if the device\n" - " runs Android >= 7)\n" + " Copy computer clipboard to device\n" "\n" " RCtrl+i\n" " Enable/disable FPS counter (print frames/second in logs)\n" diff --git a/app/src/control_msg.c b/app/src/control_msg.c index c5778c02..72504138 100644 --- a/app/src/control_msg.c +++ b/app/src/control_msg.c @@ -67,11 +67,10 @@ control_msg_serialize(const struct control_msg *msg, unsigned char *buf) { (uint32_t) msg->inject_scroll_event.vscroll); return 21; case CONTROL_MSG_TYPE_SET_CLIPBOARD: { - buf[1] = !!msg->set_clipboard.paste; size_t len = write_string(msg->set_clipboard.text, CONTROL_MSG_CLIPBOARD_TEXT_MAX_LENGTH, - &buf[2]); - return 2 + len; + &buf[1]); + return 1 + len; } case CONTROL_MSG_TYPE_SET_SCREEN_POWER_MODE: buf[1] = msg->set_screen_power_mode.mode; diff --git a/app/src/control_msg.h b/app/src/control_msg.h index 0e85c97e..e132fc6b 100644 --- a/app/src/control_msg.h +++ b/app/src/control_msg.h @@ -11,9 +11,9 @@ #include "common.h" #define CONTROL_MSG_INJECT_TEXT_MAX_LENGTH 300 -#define CONTROL_MSG_CLIPBOARD_TEXT_MAX_LENGTH 4092 +#define CONTROL_MSG_CLIPBOARD_TEXT_MAX_LENGTH 4093 #define CONTROL_MSG_SERIALIZED_MAX_SIZE \ - (4 + CONTROL_MSG_CLIPBOARD_TEXT_MAX_LENGTH) + (3 + CONTROL_MSG_CLIPBOARD_TEXT_MAX_LENGTH) #define POINTER_ID_MOUSE UINT64_C(-1); @@ -62,7 +62,6 @@ struct control_msg { } inject_scroll_event; struct { char *text; // owned, to be freed by SDL_free() - bool paste; } set_clipboard; struct { enum screen_power_mode mode; diff --git a/app/src/input_manager.c b/app/src/input_manager.c index 7057dc3e..8a5d93e6 100644 --- a/app/src/input_manager.c +++ b/app/src/input_manager.c @@ -102,7 +102,7 @@ collapse_notification_panel(struct controller *controller) { } static void -set_device_clipboard(struct controller *controller, bool paste) { +set_device_clipboard(struct controller *controller) { char *text = SDL_GetClipboardText(); if (!text) { LOGW("Could not get clipboard text: %s", SDL_GetError()); @@ -117,7 +117,6 @@ set_device_clipboard(struct controller *controller, bool paste) { struct control_msg msg; msg.type = CONTROL_MSG_TYPE_SET_CLIPBOARD; msg.set_clipboard.text = text; - msg.set_clipboard.paste = paste; if (!controller_push_msg(controller, &msg)) { SDL_free(text); @@ -334,8 +333,8 @@ input_manager_process_key(struct input_manager *im, case SDLK_v: if (control && !repeat && down) { if (shift) { - // store the text in the device clipboard and paste - set_device_clipboard(controller, true); + // store the text in the device clipboard + set_device_clipboard(controller); } else { // inject the text as input events clipboard_paste(controller); @@ -390,7 +389,7 @@ input_manager_process_key(struct input_manager *im, if (lctrl && !shift && keycode == SDLK_v && down) { // Synchronize the computer clipboard to the device clipboard before // sending Ctrl+V, to allow seamless copy-paste. - set_device_clipboard(controller, false); + set_device_clipboard(controller); } struct control_msg msg; diff --git a/app/tests/test_control_msg_serialize.c b/app/tests/test_control_msg_serialize.c index c6ff7b2e..da243d91 100644 --- a/app/tests/test_control_msg_serialize.c +++ b/app/tests/test_control_msg_serialize.c @@ -201,18 +201,16 @@ static void test_serialize_set_clipboard(void) { struct control_msg msg = { .type = CONTROL_MSG_TYPE_SET_CLIPBOARD, .set_clipboard = { - .paste = true, .text = "hello, world!", }, }; unsigned char buf[CONTROL_MSG_SERIALIZED_MAX_SIZE]; int size = control_msg_serialize(&msg, buf); - assert(size == 17); + assert(size == 16); const unsigned char expected[] = { CONTROL_MSG_TYPE_SET_CLIPBOARD, - 1, // paste 0x00, 0x0d, // text length 'h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', // text }; diff --git a/server/src/main/java/com/genymobile/scrcpy/ControlMessage.java b/server/src/main/java/com/genymobile/scrcpy/ControlMessage.java index 7d0ab7a6..195b04bf 100644 --- a/server/src/main/java/com/genymobile/scrcpy/ControlMessage.java +++ b/server/src/main/java/com/genymobile/scrcpy/ControlMessage.java @@ -17,8 +17,6 @@ public final class ControlMessage { public static final int TYPE_SET_SCREEN_POWER_MODE = 9; public static final int TYPE_ROTATE_DEVICE = 10; - public static final int FLAGS_PASTE = 1; - private int type; private String text; private int metaState; // KeyEvent.META_* @@ -30,7 +28,6 @@ public final class ControlMessage { private Position position; private int hScroll; private int vScroll; - private int flags; private ControlMessage() { } @@ -71,13 +68,10 @@ public final class ControlMessage { return msg; } - public static ControlMessage createSetClipboard(String text, boolean paste) { + public static ControlMessage createSetClipboard(String text) { ControlMessage msg = new ControlMessage(); msg.type = TYPE_SET_CLIPBOARD; msg.text = text; - if (paste) { - msg.flags = FLAGS_PASTE; - } return msg; } @@ -140,8 +134,4 @@ public final class ControlMessage { public int getVScroll() { return vScroll; } - - public int getFlags() { - return flags; - } } diff --git a/server/src/main/java/com/genymobile/scrcpy/ControlMessageReader.java b/server/src/main/java/com/genymobile/scrcpy/ControlMessageReader.java index fbf49a61..73673d4d 100644 --- a/server/src/main/java/com/genymobile/scrcpy/ControlMessageReader.java +++ b/server/src/main/java/com/genymobile/scrcpy/ControlMessageReader.java @@ -12,9 +12,8 @@ public class ControlMessageReader { static final int INJECT_TOUCH_EVENT_PAYLOAD_LENGTH = 27; static final int INJECT_SCROLL_EVENT_PAYLOAD_LENGTH = 20; static final int SET_SCREEN_POWER_MODE_PAYLOAD_LENGTH = 1; - static final int SET_CLIPBOARD_FIXED_PAYLOAD_LENGTH = 1; - public static final int CLIPBOARD_TEXT_MAX_LENGTH = 4092; // 4096 - 1 (type) - 1 (parse flag) - 2 (length) + public static final int CLIPBOARD_TEXT_MAX_LENGTH = 4093; // 4096 - 1 (type) - 2 (length) public static final int INJECT_TEXT_MAX_LENGTH = 300; private static final int RAW_BUFFER_SIZE = 4096; @@ -149,15 +148,11 @@ public class ControlMessageReader { } private ControlMessage parseSetClipboard() { - if (buffer.remaining() < SET_CLIPBOARD_FIXED_PAYLOAD_LENGTH) { - return null; - } - boolean parse = buffer.get() != 0; String text = parseString(); if (text == null) { return null; } - return ControlMessage.createSetClipboard(text, parse); + return ControlMessage.createSetClipboard(text); } private ControlMessage parseSetScreenPowerMode() { diff --git a/server/src/main/java/com/genymobile/scrcpy/Controller.java b/server/src/main/java/com/genymobile/scrcpy/Controller.java index 960c6a6e..4c16a882 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Controller.java +++ b/server/src/main/java/com/genymobile/scrcpy/Controller.java @@ -1,6 +1,5 @@ package com.genymobile.scrcpy; -import android.os.Build; import android.os.SystemClock; import android.view.InputDevice; import android.view.KeyCharacterMap; @@ -110,8 +109,7 @@ public class Controller { } break; case ControlMessage.TYPE_SET_CLIPBOARD: - boolean paste = (msg.getFlags() & ControlMessage.FLAGS_PASTE) != 0; - setClipboard(msg.getText(), paste); + setClipboard(msg.getText()); break; case ControlMessage.TYPE_SET_SCREEN_POWER_MODE: if (device.supportsInputEvents()) { @@ -229,17 +227,13 @@ public class Controller { return device.injectKeycode(keycode); } - private boolean setClipboard(String text, boolean paste) { + private boolean setClipboard(String text) { boolean ok = device.setClipboardText(text); if (ok) { Ln.i("Device clipboard set"); + return true; } - // On Android >= 7, also press the PASTE key if requested - if (paste && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && device.supportsInputEvents()) { - device.injectKeycode(KeyEvent.KEYCODE_PASTE); - } - - return ok; + return false; } } diff --git a/server/src/test/java/com/genymobile/scrcpy/ControlMessageReaderTest.java b/server/src/test/java/com/genymobile/scrcpy/ControlMessageReaderTest.java index f5fa4d09..d495b44c 100644 --- a/server/src/test/java/com/genymobile/scrcpy/ControlMessageReaderTest.java +++ b/server/src/test/java/com/genymobile/scrcpy/ControlMessageReaderTest.java @@ -216,7 +216,6 @@ public class ControlMessageReaderTest { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bos); dos.writeByte(ControlMessage.TYPE_SET_CLIPBOARD); - dos.writeByte(1); // paste byte[] text = "testé".getBytes(StandardCharsets.UTF_8); dos.writeShort(text.length); dos.write(text); @@ -228,9 +227,6 @@ public class ControlMessageReaderTest { Assert.assertEquals(ControlMessage.TYPE_SET_CLIPBOARD, event.getType()); Assert.assertEquals("testé", event.getText()); - - boolean parse = (event.getFlags() & ControlMessage.FLAGS_PASTE) != 0; - Assert.assertTrue(parse); } @Test @@ -242,7 +238,6 @@ public class ControlMessageReaderTest { dos.writeByte(ControlMessage.TYPE_SET_CLIPBOARD); byte[] rawText = new byte[ControlMessageReader.CLIPBOARD_TEXT_MAX_LENGTH]; - dos.writeByte(1); // paste Arrays.fill(rawText, (byte) 'a'); String text = new String(rawText, 0, rawText.length); @@ -256,9 +251,6 @@ public class ControlMessageReaderTest { Assert.assertEquals(ControlMessage.TYPE_SET_CLIPBOARD, event.getType()); Assert.assertEquals(text, event.getText()); - - boolean parse = (event.getFlags() & ControlMessage.FLAGS_PASTE) != 0; - Assert.assertTrue(parse); } @Test