Handle down/up actions for BACK or POWER ON
Pressing right-click generates either BACK or POWER ON, depending on the current screen state. Forward DOWN and UP events separately to the device, to generate key events accordingly. Ref #1062 <https://github.com/Genymobile/scrcpy/issues/1062>
This commit is contained in:
@@ -75,6 +75,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.action;
|
||||
return 2;
|
||||
case CONTROL_MSG_TYPE_EXPAND_NOTIFICATION_PANEL:
|
||||
case CONTROL_MSG_TYPE_COLLAPSE_NOTIFICATION_PANEL:
|
||||
case CONTROL_MSG_TYPE_GET_CLIPBOARD:
|
||||
|
||||
@@ -66,6 +66,9 @@ struct control_msg {
|
||||
struct {
|
||||
enum screen_power_mode mode;
|
||||
} set_screen_power_mode;
|
||||
struct {
|
||||
enum android_keyevent_action action;
|
||||
} back_or_screen_on;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -99,9 +99,14 @@ action_menu(struct controller *controller, int actions) {
|
||||
|
||||
// turn the screen on if it was off, press BACK otherwise
|
||||
static void
|
||||
press_back_or_turn_screen_on(struct controller *controller) {
|
||||
press_back_or_turn_screen_on(struct controller *controller, int action) {
|
||||
assert(action == ACTION_DOWN || action == ACTION_UP);
|
||||
|
||||
struct control_msg msg;
|
||||
msg.type = CONTROL_MSG_TYPE_BACK_OR_SCREEN_ON;
|
||||
msg.back_or_screen_on.action = action == ACTION_DOWN
|
||||
? AKEY_EVENT_ACTION_DOWN
|
||||
: AKEY_EVENT_ACTION_UP;
|
||||
|
||||
if (!controller_push_msg(controller, &msg)) {
|
||||
LOGW("Could not request 'press back or turn screen on'");
|
||||
@@ -545,9 +550,9 @@ input_manager_process_mouse_button(struct input_manager *im,
|
||||
}
|
||||
|
||||
if (event->button == SDL_BUTTON_RIGHT) {
|
||||
if (event->type == SDL_MOUSEBUTTONDOWN) {
|
||||
press_back_or_turn_screen_on(im->controller);
|
||||
}
|
||||
int action = event->type == SDL_MOUSEBUTTONDOWN ? ACTION_DOWN
|
||||
: ACTION_UP;
|
||||
press_back_or_turn_screen_on(im->controller, action);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -140,14 +140,18 @@ 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 = {
|
||||
.action = AKEY_EVENT_ACTION_UP,
|
||||
},
|
||||
};
|
||||
|
||||
unsigned char buf[CONTROL_MSG_SERIALIZED_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,
|
||||
AKEY_EVENT_ACTION_UP,
|
||||
};
|
||||
assert(!memcmp(buf, expected, sizeof(expected)));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user