diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js index 20c45014b..3f356b68a 100644 --- a/js/ui/keyboard.js +++ b/js/ui/keyboard.js @@ -114,6 +114,35 @@ const Key = new Lang.Class({ key.release(); return Clutter.EVENT_PROPAGATE; })); + button.connect('touch-event', Lang.bind(this, + function (actor, event) { + let device = event.get_device(); + let sequence = event.get_event_sequence(); + + // We only handle touch events here on wayland. On X11 + // we do get emulated pointer events, which already works + // for single-touch cases. Besides, the X11 passive touch grab + // set up by Mutter will make us see first the touch events + // and later the pointer events, so it will look like two + // unrelated series of events, we want to avoid double handling + // in these cases. + if (!Meta.is_wayland_compositor()) + return Clutter.EVENT_PROPAGATE; + + if (!this._touchPressed && + event.type() == Clutter.EventType.TOUCH_BEGIN) { + device.sequence_grab(sequence, actor); + this._touchPressed = true; + key.press(); + } else if (this._touchPressed && + event.type() == Clutter.EventType.TOUCH_END && + device.sequence_get_grabbed_actor(sequence) == actor) { + device.sequence_ungrab(sequence); + this._touchPressed = false; + key.release(); + } + return Clutter.EVENT_PROPAGATE; + })); return button; },