[gnome-shell] window-clone: Use ClutterClickAction
- From: Florian MÃllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] window-clone: Use ClutterClickAction
- Date: Tue, 11 Oct 2011 10:57:25 +0000 (UTC)
commit 7bc2573d8581560a032e829daaf2be4d93a16256
Author: Florian MÃllner <fmuellner gnome org>
Date: Wed Sep 21 02:54:06 2011 +0200
window-clone: Use ClutterClickAction
Right-click menus in the dash can be dismissed by clicking anywhere
outside the menu. However, if a window clone is located beneath the
pointer when doing so, the window is activated and the overview
closed.
The cause of this unexpected behavior is that window previews are
activated on button-release, which is delivered to the preview after
the menu releases its grab on button-press. Use a ClutterClickAction
instead and let Clutter do the right thing, i.e. only trigger a
'clicked' signal when a button-release event is matched by a
corresponding button-press event.
https://bugzilla.gnome.org/show_bug.cgi?id=661151
js/ui/workspace.js | 30 ++++++++++++++++++++++++++----
1 files changed, 26 insertions(+), 4 deletions(-)
---
diff --git a/js/ui/workspace.js b/js/ui/workspace.js
index 55e93f3..97e784b 100644
--- a/js/ui/workspace.js
+++ b/js/ui/workspace.js
@@ -135,8 +135,11 @@ WindowClone.prototype = {
this._realWindowDestroyId = this.realWindow.connect('destroy',
Lang.bind(this, this._disconnectRealWindowSignals));
- this.actor.connect('button-release-event',
- Lang.bind(this, this._onButtonRelease));
+ let clickAction = new Clutter.ClickAction();
+ clickAction.connect('clicked', Lang.bind(this, this._onClicked));
+ clickAction.connect('long-press', Lang.bind(this, this._onLongPress));
+
+ this.actor.add_action(clickAction);
this.actor.connect('scroll-event',
Lang.bind(this, this._onScroll));
@@ -147,6 +150,7 @@ WindowClone.prototype = {
this._draggable = DND.makeDraggable(this.actor,
{ restoreOnSuccess: true,
+ manualMode: true,
dragActorMaxSize: WINDOW_DND_SIZE,
dragActorOpacity: DRAGGING_WINDOW_OPACITY });
this._draggable.connect('drag-begin', Lang.bind(this, this._onDragBegin));
@@ -345,9 +349,27 @@ WindowClone.prototype = {
this._zoomStep = undefined;
},
- _onButtonRelease : function (actor, event) {
+ _onClicked: function(action, actor) {
this._selected = true;
- this.emit('selected', event.get_time());
+ this.emit('selected', global.get_current_time());
+ },
+
+ _onLongPress: function(action, actor, state) {
+ // Take advantage of the Clutter policy to consider
+ // a long-press canceled when the pointer movement
+ // exceeds dnd-drag-threshold to manually start the drag
+ if (state == Clutter.LongPressState.CANCEL) {
+ // A click cancels a long-press before any click handler is
+ // run - make sure to not start a drag in that case
+ Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
+ function() {
+ if (this._selected)
+ return;
+ let [x, y] = action.get_coords();
+ this._draggable.startDrag(x, y, global.get_current_time());
+ }));
+ }
+ return true;
},
_onDragBegin : function (draggable, time) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]