[gnome-shell] [workspaces] Add an idle timeout for close button
- From: Colin Walters <walters src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-shell] [workspaces] Add an idle timeout for close button
- Date: Fri, 20 Nov 2009 00:40:10 +0000 (UTC)
commit 0bc578230ff78ef2d2b036e84b7ce09970ca7cb5
Author: Colin Walters <walters verbum org>
Date: Thu Nov 19 19:39:00 2009 -0500
[workspaces] Add an idle timeout for close button
Add a grace period for the close button so if you happen to move your
mouse outside the target it doesn't vanish and force a Z motion.
js/ui/workspaces.js | 41 +++++++++++++++++++++++++++++++++++++++--
1 files changed, 39 insertions(+), 2 deletions(-)
---
diff --git a/js/ui/workspaces.js b/js/ui/workspaces.js
index b236d8d..53fe4aa 100644
--- a/js/ui/workspaces.js
+++ b/js/ui/workspaces.js
@@ -3,6 +3,7 @@
const Big = imports.gi.Big;
const Clutter = imports.gi.Clutter;
const GdkPixbuf = imports.gi.GdkPixbuf;
+const Gdk = imports.gi.Gdk;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
@@ -319,6 +320,7 @@ WindowOverlay.prototype = {
_init : function(windowClone, parentActor) {
let metaWindow = windowClone.metaWindow;
+ this._windowClone = windowClone;
this._parentActor = parentActor;
let title = new St.Label({ style_class: "window-caption",
@@ -341,8 +343,7 @@ WindowOverlay.prototype = {
windowClone.actor.connect('leave-event',
Lang.bind(this, this._onLeave));
- button.connect('enter-event', Lang.bind(this, this._onEnter));
- button.connect('leave-event', Lang.bind(this, this._onLeave));
+ this._idleToggleCloseId = 0;
button.connect('button-release-event',
Lang.bind(this, function(actor, event) {
metaWindow.delete(event.get_time());
@@ -380,6 +381,10 @@ WindowOverlay.prototype = {
},
destroy: function() {
+ if (this._idleToggleCloseId > 0) {
+ Mainloop.source_remove(this._idleToggleCloseId);
+ this._idleToggleCloseId = 0;
+ }
this.title.destroy();
this.closeButton.destroy();
},
@@ -416,9 +421,30 @@ WindowOverlay.prototype = {
_onEnter: function() {
this.closeButton.raise_top();
this.closeButton.show();
+ this.emit('show-close-button');
},
_onLeave: function() {
+ if (this._idleToggleCloseId == 0)
+ this._idleToggleCloseId = Mainloop.timeout_add(750, Lang.bind(this, this._idleToggleCloseButton));
+ },
+
+ _idleToggleCloseButton: function() {
+ this._idleToggleCloseId = 0;
+ let [child, x, y, mask] = Gdk.Screen.get_default().get_root_window().get_pointer();
+ let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE,
+ x, y);
+ if (actor != this._windowClone.actor && actor != this.closeButton) {
+ this.closeButton.hide();
+ }
+ return false;
+ },
+
+ hideCloseButton: function() {
+ if (this._idleToggleCloseId > 0) {
+ Mainloop.source_remove(this._idleToggleCloseId);
+ this._idleToggleCloseId = 0;
+ }
this.closeButton.hide();
},
@@ -1253,12 +1279,23 @@ Workspace.prototype = {
this.actor.add_actor(clone.actor);
+ overlay.connect('show-close-button', Lang.bind(this, this._onShowOverlayClose));
+
this._windows.push(clone);
this._windowOverlays.push(overlay);
return clone;
},
+ _onShowOverlayClose: function (windowOverlay) {
+ for (let i = 1; i < this._windowOverlays.length; i++) {
+ let overlay = this._windowOverlays[i];
+ if (overlay == windowOverlay)
+ continue;
+ overlay.hideCloseButton();
+ }
+ },
+
_computeWindowSlot : function(windowIndex, numberOfWindows) {
if (numberOfWindows in POSITIONS)
return POSITIONS[numberOfWindows][windowIndex];
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]