diff --git a/app/src/control_msg.c b/app/src/control_msg.c index 27c7903d..33c36716 100644 --- a/app/src/control_msg.c +++ b/app/src/control_msg.c @@ -78,6 +78,8 @@ control_msg_serialize(const struct control_msg *msg, unsigned char *buf) { buf[1] = msg->set_screen_power_mode.mode; return 2; case CONTROL_MSG_TYPE_BACK_OR_SCREEN_ON: + buf[1] = !!msg->back_or_screen_on.screen_on_only; + return 2; case CONTROL_MSG_TYPE_EXPAND_NOTIFICATION_PANEL: case CONTROL_MSG_TYPE_COLLAPSE_NOTIFICATION_PANEL: case CONTROL_MSG_TYPE_GET_CLIPBOARD: diff --git a/app/src/control_msg.h b/app/src/control_msg.h index 6e3f239c..cd60cd19 100644 --- a/app/src/control_msg.h +++ b/app/src/control_msg.h @@ -63,6 +63,9 @@ struct control_msg { int32_t hscroll; int32_t vscroll; } inject_scroll_event; + struct { + bool screen_on_only; + } back_or_screen_on; struct { char *text; // owned, to be freed by SDL_free() bool paste; diff --git a/app/src/scrcpy.c b/app/src/scrcpy.c index 75966995..c1bb06d8 100644 --- a/app/src/scrcpy.c +++ b/app/src/scrcpy.c @@ -194,8 +194,8 @@ handle_event(SDL_Event *event, const struct scrcpy_options *options) { case SDL_ACTIVEEVENT: if (options->auto_turn_on && event->gain == 1) { struct control_msg msg; - msg.type = CONTROL_MSG_TYPE_SET_SCREEN_POWER_MODE; - msg.set_screen_power_mode.mode = SCREEN_POWER_MODE_NORMAL; + msg.type = CONTROL_MSG_TYPE_BACK_OR_SCREEN_ON; + msg.back_or_screen_on.screen_on_only = true; if (!controller_push_msg(&controller, &msg)) { LOGW("Could not request 'set screen power mode'"); diff --git a/app/tests/test_control_msg_serialize.c b/app/tests/test_control_msg_serialize.c index b58c8e20..006f213d 100644 --- a/app/tests/test_control_msg_serialize.c +++ b/app/tests/test_control_msg_serialize.c @@ -144,14 +144,16 @@ static void test_serialize_inject_scroll_event(void) { static void test_serialize_back_or_screen_on(void) { struct control_msg msg = { .type = CONTROL_MSG_TYPE_BACK_OR_SCREEN_ON, + .back_or_screen_on.screen_on_only = true, }; unsigned char buf[CONTROL_MSG_MAX_SIZE]; int size = control_msg_serialize(&msg, buf); - assert(size == 1); + assert(size == 2); const unsigned char expected[] = { CONTROL_MSG_TYPE_BACK_OR_SCREEN_ON, + 1 }; assert(!memcmp(buf, expected, sizeof(expected))); } diff --git a/server/src/main/java/com/genymobile/scrcpy/ControlMessage.java b/server/src/main/java/com/genymobile/scrcpy/ControlMessage.java index 736acf80..05fea676 100644 --- a/server/src/main/java/com/genymobile/scrcpy/ControlMessage.java +++ b/server/src/main/java/com/genymobile/scrcpy/ControlMessage.java @@ -30,6 +30,7 @@ public final class ControlMessage { private int vScroll; private boolean paste; private int repeat; + private boolean screenOnOnly; private ControlMessage() { } @@ -71,6 +72,13 @@ public final class ControlMessage { return msg; } + public static ControlMessage createBackOrScreenOn(boolean screenOnOnly) { + ControlMessage msg = new ControlMessage(); + msg.type = TYPE_BACK_OR_SCREEN_ON; + msg.screenOnOnly = screenOnOnly; + return msg; + } + public static ControlMessage createSetClipboard(String text, boolean paste) { ControlMessage msg = new ControlMessage(); msg.type = TYPE_SET_CLIPBOARD; @@ -146,4 +154,8 @@ public final class ControlMessage { public int getRepeat() { return repeat; } + + public boolean getScreenOnOnly() { + return screenOnOnly; + } } diff --git a/server/src/main/java/com/genymobile/scrcpy/ControlMessageReader.java b/server/src/main/java/com/genymobile/scrcpy/ControlMessageReader.java index ce185103..0a016bb1 100644 --- a/server/src/main/java/com/genymobile/scrcpy/ControlMessageReader.java +++ b/server/src/main/java/com/genymobile/scrcpy/ControlMessageReader.java @@ -11,6 +11,7 @@ public class ControlMessageReader { static final int INJECT_KEYCODE_PAYLOAD_LENGTH = 13; static final int INJECT_TOUCH_EVENT_PAYLOAD_LENGTH = 27; static final int INJECT_SCROLL_EVENT_PAYLOAD_LENGTH = 20; + static final int BACK_OR_SCREEN_ON_PAYLOAD_LENGTH = 1; static final int SET_SCREEN_POWER_MODE_PAYLOAD_LENGTH = 1; static final int SET_CLIPBOARD_FIXED_PAYLOAD_LENGTH = 1; @@ -73,6 +74,8 @@ public class ControlMessageReader { msg = parseSetScreenPowerMode(); break; case ControlMessage.TYPE_BACK_OR_SCREEN_ON: + msg = parseBackOrScreenOn(); + break; case ControlMessage.TYPE_EXPAND_NOTIFICATION_PANEL: case ControlMessage.TYPE_COLLAPSE_NOTIFICATION_PANEL: case ControlMessage.TYPE_GET_CLIPBOARD: @@ -170,6 +173,14 @@ public class ControlMessageReader { return ControlMessage.createSetScreenPowerMode(mode); } + private ControlMessage parseBackOrScreenOn() { + if (buffer.remaining() != BACK_OR_SCREEN_ON_PAYLOAD_LENGTH) { + return null; + } + boolean screenOnOnly = buffer.get() != 0; + return ControlMessage.createBackOrScreenOn(screenOnOnly); + } + private static Position readPosition(ByteBuffer buffer) { int x = buffer.getInt(); int y = buffer.getInt(); diff --git a/server/src/main/java/com/genymobile/scrcpy/Controller.java b/server/src/main/java/com/genymobile/scrcpy/Controller.java index 9100a9db..78be6ac0 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Controller.java +++ b/server/src/main/java/com/genymobile/scrcpy/Controller.java @@ -101,7 +101,7 @@ public class Controller { break; case ControlMessage.TYPE_BACK_OR_SCREEN_ON: if (device.supportsInputEvents()) { - pressBackOrTurnScreenOn(); + pressBackOrTurnScreenOn(msg.getScreenOnOnly()); } break; case ControlMessage.TYPE_EXPAND_NOTIFICATION_PANEL: @@ -247,7 +247,10 @@ public class Controller { }, 200, TimeUnit.MILLISECONDS); } - private boolean pressBackOrTurnScreenOn() { + private boolean pressBackOrTurnScreenOn(boolean screenOnOnly) { + if (screenOnOnly && device.isScreenOn()) { + return true; + } int keycode = device.isScreenOn() ? KeyEvent.KEYCODE_BACK : KeyEvent.KEYCODE_POWER; if (keepPowerModeOff && keycode == KeyEvent.KEYCODE_POWER) { schedulePowerModeOff(); diff --git a/server/src/test/java/com/genymobile/scrcpy/ControlMessageReaderTest.java b/server/src/test/java/com/genymobile/scrcpy/ControlMessageReaderTest.java index 5eb52760..14950825 100644 --- a/server/src/test/java/com/genymobile/scrcpy/ControlMessageReaderTest.java +++ b/server/src/test/java/com/genymobile/scrcpy/ControlMessageReaderTest.java @@ -154,6 +154,7 @@ public class ControlMessageReaderTest { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bos); dos.writeByte(ControlMessage.TYPE_BACK_OR_SCREEN_ON); + dos.writeByte(1); byte[] packet = bos.toByteArray(); @@ -161,6 +162,7 @@ public class ControlMessageReaderTest { ControlMessage event = reader.next(); Assert.assertEquals(ControlMessage.TYPE_BACK_OR_SCREEN_ON, event.getType()); + Assert.assertEquals(true, event.getScreenOnOnly()); } @Test