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>
@ -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
@ -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);
@ -188,7 +188,13 @@ convert_input_key(const SDL_KeyboardEvent *from, struct control_msg *to,
// 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);
@ -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);
(*process_text)(struct sc_key_processor *kp,