[gnome-shell] overview: Try to do the right thing related to XDnD



commit 36a7429aa0395c69d063bf3a0eb562d1c76059bd
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Mon Mar 4 17:02:02 2013 -0500

    overview: Try to do the right thing related to XDnD
    
    Rather than expose a dizzying array of methods related to managing
    state that require infecting every user of the overview methods, try
    to do the sensible and smart thing internally. Now, the overview
    itself tracks when XDND drags start, and simply calling show, hide or
    toggle while an XDnD drag is in effect will show the overview, and
    will only take the grab until after the XDND drag ends.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=663661

 js/ui/layout.js   |    4 +-
 js/ui/overview.js |   86 +++++++++++++++++-----------------------------------
 js/ui/panel.js    |   11 ++----
 3 files changed, 34 insertions(+), 67 deletions(-)
---
diff --git a/js/ui/layout.js b/js/ui/layout.js
index 315bc10..a697bda 100644
--- a/js/ui/layout.js
+++ b/js/ui/layout.js
@@ -1221,9 +1221,9 @@ const HotCorner = new Lang.Class({
         if (source != Main.xdndHandler)
             return DND.DragMotionResult.CONTINUE;
 
-        if (!Main.overview.visible && !Main.overview.animationInProgress) {
+        if (Main.overview.shouldToggleByCornerOrButton()) {
             this.rippleAnimation();
-            Main.overview.showTemporarily();
+            Main.overview.toggle();
         }
 
         return DND.DragMotionResult.CONTINUE;
diff --git a/js/ui/overview.js b/js/ui/overview.js
index 35eb020..7d00251 100644
--- a/js/ui/overview.js
+++ b/js/ui/overview.js
@@ -152,7 +152,6 @@ const Overview = new Lang.Class({
 
         this.visible = false;           // animating to overview, in overview, animating out
         this._shown = false;            // show() and not hide()
-        this._shownTemporarily = false; // showTemporarily() and not hideTemporarily()
         this._modal = false;            // have a modal grab
         this.animationInProgress = false;
         this.visibleTarget = false;
@@ -350,18 +349,22 @@ const Overview = new Lang.Class({
     },
 
     _onDragBegin: function() {
+        this._inXdndDrag = true;
+
         DND.addDragMonitor(this._dragMonitor);
         // Remember the workspace we started from
         this._lastActiveWorkspaceIndex = global.screen.get_active_workspace_index();
     },
 
     _onDragEnd: function(time) {
+        this._inXdndDrag = false;
+
         // In case the drag was canceled while in the overview
         // we have to go back to where we started and hide
         // the overview
-        if (this._shownTemporarily)  {
+        if (this._shown) {
             global.screen.get_workspace_by_index(this._lastActiveWorkspaceIndex).activate(time);
-            this.hideTemporarily();
+            this.hide();
         }
         this._resetWindowSwitchTimeout();
         this._lastHoveredWindow = null;
@@ -409,7 +412,7 @@ const Overview = new Lang.Class({
                                                 this._needsFakePointerEvent = true;
                                                 
Main.activateWindow(dragEvent.targetActor._delegate.metaWindow,
                                                                     this._windowSwitchTimestamp);
-                                                this.hideTemporarily();
+                                                this.hide();
                                                 this._lastHoveredWindow = null;
                                             }));
         }
@@ -505,9 +508,10 @@ const Overview = new Lang.Class({
         if (this._shown)
             return;
         this._shown = true;
-        this._syncInputMode();
-        if (!this._modal)
+
+        if (!this._syncInputMode())
             return;
+
         this._animateVisible();
     },
 
@@ -573,24 +577,6 @@ const Overview = new Lang.Class({
         this.emit('showing');
     },
 
-    // showTemporarily:
-    //
-    // Animates the overview visible without grabbing mouse and keyboard input;
-    // if show() has already been called, this has no immediate effect, but
-    // will result in the overview not being hidden until hideTemporarily() is
-    // called.
-    showTemporarily: function() {
-        if (this.isDummy)
-            return;
-
-        if (this._shownTemporarily)
-            return;
-
-        this._syncInputMode();
-        this._animateVisible();
-        this._shownTemporarily = true;
-    },
-
     // hide:
     //
     // Reverses the effect of show()
@@ -604,30 +590,12 @@ const Overview = new Lang.Class({
         if (this._controlPressed)
             return;
 
-        if (!this._shownTemporarily)
-            this._animateNotVisible();
+        this._animateNotVisible();
 
         this._shown = false;
         this._syncInputMode();
     },
 
-    // hideTemporarily:
-    //
-    // Reverses the effect of showTemporarily()
-    hideTemporarily: function() {
-        if (this.isDummy)
-            return;
-
-        if (!this._shownTemporarily)
-            return;
-
-        if (!this._shown)
-            this._animateNotVisible();
-
-        this._shownTemporarily = false;
-        this._syncInputMode();
-    },
-
     toggle: function() {
         if (this.isDummy)
             return;
@@ -659,22 +627,23 @@ const Overview = new Lang.Class({
         // overview we don't have a problem with the release of a press/release
         // going to an application.
         if (this.animationInProgress)
-            return;
+            return true;
 
         if (this._shown) {
-            if (!this._modal) {
-                if (Main.pushModal(this._overview,
-                                   { keybindingMode: Shell.KeyBindingMode.OVERVIEW }))
-                    this._modal = true;
-                else
-                    this.hide();
+            let shouldBeModal = !this._inXdndDrag;
+            if (shouldBeModal) {
+                if (!this._modal) {
+                    if (Main.pushModal(this._overview,
+                                       { keybindingMode: Shell.KeyBindingMode.OVERVIEW })) {
+                        this._modal = true;
+                    } else {
+                        this.hide();
+                        return false;
+                    }
+                }
+            } else {
+                global.stage_input_mode = Shell.StageInputMode.FULLSCREEN;
             }
-        } else if (this._shownTemporarily) {
-            if (this._modal) {
-                Main.popModal(this._overview);
-                this._modal = false;
-            }
-            global.stage_input_mode = Shell.StageInputMode.FULLSCREEN;
         } else {
             if (this._modal) {
                 Main.popModal(this._overview);
@@ -683,6 +652,7 @@ const Overview = new Lang.Class({
             else if (global.stage_input_mode == Shell.StageInputMode.FULLSCREEN)
                 global.stage_input_mode = Shell.StageInputMode.NORMAL;
         }
+        return true;
     },
 
     _animateNotVisible: function() {
@@ -716,7 +686,7 @@ const Overview = new Lang.Class({
 
         this.emit('shown');
         // Handle any calls to hide* while we were showing
-        if (!this._shown && !this._shownTemporarily)
+        if (!this._shown)
             this._animateNotVisible();
 
         this._syncInputMode();
@@ -742,7 +712,7 @@ const Overview = new Lang.Class({
 
         this.emit('hidden');
         // Handle any calls to show* while we were hiding
-        if (this._shown || this._shownTemporarily)
+        if (this._shown)
             this._animateVisible();
 
         this._syncInputMode();
diff --git a/js/ui/panel.js b/js/ui/panel.js
index 2b1ed9b..c16e318 100644
--- a/js/ui/panel.js
+++ b/js/ui/panel.js
@@ -661,7 +661,7 @@ const ActivitiesButton = new Lang.Class({
         if (this._xdndTimeOut != 0)
             Mainloop.source_remove(this._xdndTimeOut);
         this._xdndTimeOut = Mainloop.timeout_add(BUTTON_DND_ACTIVATION_TIMEOUT,
-                                                 Lang.bind(this, this._xdndShowOverview, actor));
+                                                 Lang.bind(this, this._xdndToggleOverview, actor));
 
         return DND.DragMotionResult.CONTINUE;
     },
@@ -685,15 +685,12 @@ const ActivitiesButton = new Lang.Class({
         }
     },
 
-    _xdndShowOverview: function(actor) {
+    _xdndToggleOverview: function(actor) {
         let [x, y, mask] = global.get_pointer();
         let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
 
-        if (pickedActor == this.actor) {
-            if (!Main.overview.visible && !Main.overview.animationInProgress) {
-                Main.overview.showTemporarily();
-            }
-        }
+        if (pickedActor == this.actor && Main.overview.shouldToggleByCornerOrButton())
+            Main.overview.toggle();
 
         Mainloop.source_remove(this._xdndTimeOut);
         this._xdndTimeOut = 0;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]