diff --git a/grab.js b/grab.js index aa2a3d75..6904ba7d 100644 --- a/grab.js +++ b/grab.js @@ -36,20 +36,19 @@ export function disable() { } /** - * Returns a virtual pointer (i.e. mouse) device that can be used to - * "clickout" of a drag operation when `grab_end_op` is unavailable + * Returns a virtual keyboard that can be used to + * "escape" of a drag operation when `grab_end_op` is unavailable * (i.e. as of Gnome 44 where `grab_end_op` was removed). * @returns Clutter.VirtualInputDevice */ -let virtualPointer; -export function getVirtualPointer() { - if (!virtualPointer) { - virtualPointer = Clutter.get_default_backend() +let virtualKeyboard; +export function getVirtualKeyboard() { + if (!virtualKeyboard) { + virtualKeyboard = Clutter.get_default_backend() .get_default_seat() - .create_virtual_device(Clutter.InputDeviceType.POINTER_DEVICE); + .create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE); } - - return virtualPointer; + return virtualKeyboard; } export class MoveGrab { @@ -573,16 +572,11 @@ export class MoveGrab { */ Utils.later_add(Meta.LaterType.IDLE, () => { if (!global.display.end_grab_op && this.wasTiled) { - // move to current cursor position - let [x, y] = global.get_pointer(); - getVirtualPointer().notify_absolute_motion( - Clutter.get_current_event_time(), - x, y); - - getVirtualPointer().notify_button(Clutter.get_current_event_time(), - Clutter.BUTTON_PRIMARY, Clutter.ButtonState.PRESSED); - getVirtualPointer().notify_button(Clutter.get_current_event_time(), - Clutter.BUTTON_PRIMARY, Clutter.ButtonState.RELEASED); + let time = Clutter.get_current_event_time(); + + // Fakes an 'Escape' keypress to break Mutter's Wayland grab (works for both Touch and Pointer) + getVirtualKeyboard().notify_keyval(time, Clutter.KEY_Escape, Clutter.KeyState.PRESSED); + getVirtualKeyboard().notify_keyval(time, Clutter.KEY_Escape, Clutter.KeyState.RELEASED); } }); }