Explicitly indicate when device clipboard is set

Pass the information that device clipboard has been set to the key
processor. This avoids the keyprocessor to "guess", and paves the way to
implement a proper acknowledgement mechanism.

PR #2814 <https://github.com/Genymobile/scrcpy/pull/2814>
This commit is contained in:
Romain Vimont 2021-11-21 17:24:34 +01:00
parent 854de9659a
commit 5b3856c3b6
4 changed files with 23 additions and 10 deletions

View file

@ -278,7 +278,8 @@ push_mod_lock_state(struct sc_hid_keyboard *kb, uint16_t sdl_mod) {
static void static void
sc_key_processor_process_key(struct sc_key_processor *kp, sc_key_processor_process_key(struct sc_key_processor *kp,
const SDL_KeyboardEvent *event) { const SDL_KeyboardEvent *event,
bool device_clipboard_set) {
if (event->repeat) { if (event->repeat) {
// In USB HID protocol, key repeat is handled by the host (Android), so // In USB HID protocol, key repeat is handled by the host (Android), so
// just ignore key repeat here. // just ignore key repeat here.
@ -298,11 +299,7 @@ sc_key_processor_process_key(struct sc_key_processor *kp,
} }
} }
SDL_Keycode keycode = event->keysym.sym; if (device_clipboard_set) {
bool down = event->type == SDL_KEYDOWN;
bool ctrl = event->keysym.mod & KMOD_CTRL;
bool shift = event->keysym.mod & KMOD_SHIFT;
if (ctrl && !shift && keycode == SDLK_v && down) {
// Ctrl+v is pressed, so clipboard synchronization has been // Ctrl+v is pressed, so clipboard synchronization has been
// requested. Wait a bit so that the clipboard is set before // requested. Wait a bit so that the clipboard is set before
// injecting Ctrl+v via HID, otherwise it would paste the old // injecting Ctrl+v via HID, otherwise it would paste the old

View file

@ -510,7 +510,8 @@ input_manager_process_key(struct input_manager *im,
return; return;
} }
if (ctrl && !shift && keycode == SDLK_v && down && !repeat) { bool is_ctrl_v = ctrl && !shift && keycode == SDLK_v && down && !repeat;
if (is_ctrl_v) {
if (im->legacy_paste) { if (im->legacy_paste) {
// inject the text as input events // inject the text as input events
clipboard_paste(controller); clipboard_paste(controller);
@ -525,7 +526,7 @@ input_manager_process_key(struct input_manager *im,
} }
} }
im->kp->ops->process_key(im->kp, event); im->kp->ops->process_key(im->kp, event, is_ctrl_v);
} }
static void static void

View file

@ -188,7 +188,13 @@ convert_input_key(const SDL_KeyboardEvent *from, struct control_msg *to,
static void static void
sc_key_processor_process_key(struct sc_key_processor *kp, sc_key_processor_process_key(struct sc_key_processor *kp,
const SDL_KeyboardEvent *event) { const SDL_KeyboardEvent *event,
bool device_clipboard_set) {
// The device clipboard synchronization and the key event messages are
// serialized, there is nothing special to do to ensure that the clipboard
// is set before injecting Ctrl+v.
(void) device_clipboard_set;
struct sc_keyboard_inject *ki = DOWNCAST(kp); struct sc_keyboard_inject *ki = DOWNCAST(kp);
if (event->repeat) { if (event->repeat) {

View file

@ -18,8 +18,17 @@ struct sc_key_processor {
}; };
struct sc_key_processor_ops { struct sc_key_processor_ops {
/**
* Process the keyboard event
*
* The flag `device_clipboard_set` indicates that the input manager sent a
* control message to synchronize the device clipboard as a result of this
* key event.
*/
void void
(*process_key)(struct sc_key_processor *kp, const SDL_KeyboardEvent *event); (*process_key)(struct sc_key_processor *kp, const SDL_KeyboardEvent *event,
bool device_clipboard_set);
void void
(*process_text)(struct sc_key_processor *kp, (*process_text)(struct sc_key_processor *kp,