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
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) {
// In USB HID protocol, key repeat is handled by the host (Android), so
// 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;
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) {
if (device_clipboard_set) {
// Ctrl+v is pressed, so clipboard synchronization has been
// requested. Wait a bit so that the clipboard is set before
// 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;
}
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) {
// inject the text as input events
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

View file

@ -188,7 +188,13 @@ convert_input_key(const SDL_KeyboardEvent *from, struct control_msg *to,
static void
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);
if (event->repeat) {

View file

@ -18,8 +18,17 @@ struct sc_key_processor {
};
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
(*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
(*process_text)(struct sc_key_processor *kp,