[gnome-shell] overview: Try to do the right thing related to XDnD
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] overview: Try to do the right thing related to XDnD
- Date: Mon, 4 Mar 2013 22:54:40 +0000 (UTC)
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]