[gnome-shell/wip/re-search-v2: 11/26] workspaceThumbnail: Make ThumbnailsBox track workspace changes itself



commit 7e8968da52ee915d5e8c275b0a338fb207be7513
Author: Tanner Doshier <doshitan gmail com>
Date:   Tue Jul 24 10:45:07 2012 -0500

    workspaceThumbnail: Make ThumbnailsBox track workspace changes itself
    
    https://bugzilla.gnome.org/show_bug.cgi?id=682050

 js/ui/workspaceThumbnail.js |   46 +++++++++++++++++++++++++++++++++++++++++++
 js/ui/workspacesView.js     |   16 ---------------
 2 files changed, 46 insertions(+), 16 deletions(-)
---
diff --git a/js/ui/workspaceThumbnail.js b/js/ui/workspaceThumbnail.js
index c6b5bdb..d543f2b 100644
--- a/js/ui/workspaceThumbnail.js
+++ b/js/ui/workspaceThumbnail.js
@@ -1,6 +1,7 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const Clutter = imports.gi.Clutter;
+const Gio = imports.gi.Gio;
 const Lang = imports.lang;
 const Mainloop = imports.mainloop;
 const Meta = imports.gi.Meta;
@@ -27,6 +28,8 @@ const WORKSPACE_CUT_SIZE = 10;
 
 const WORKSPACE_KEEP_ALIVE_TIME = 100;
 
+const OVERRIDE_SCHEMA = 'org.gnome.shell.overrides';
+
 const WindowClone = new Lang.Class({
     Name: 'WindowClone',
 
@@ -554,6 +557,16 @@ const ThumbnailsBox = new Lang.Class({
                               Lang.bind(this, this._onDragEnd));
         Main.overview.connect('window-drag-cancelled',
                               Lang.bind(this, this._onDragCancelled));
+
+        this._settings = new Gio.Settings({ schema: OVERRIDE_SCHEMA });
+        this._settings.connect('changed::dynamic-workspaces',
+            Lang.bind(this, this._updateSwitcherVisibility));
+    },
+
+    _updateSwitcherVisibility: function() {
+        this.actor.visible =
+            this._settings.get_boolean('dynamic-workspaces') ||
+                global.screen.n_workspaces > 1;
     },
 
     _onButtonRelease: function(actor, event) {
@@ -723,6 +736,9 @@ const ThumbnailsBox = new Lang.Class({
         this._switchWorkspaceNotifyId =
             global.window_manager.connect('switch-workspace',
                                           Lang.bind(this, this._activeWorkspaceChanged));
+        this._nWorkspacesNotifyId =
+            global.screen.connect('notify::n-workspaces',
+                                  Lang.bind(this, this._workspacesChanged));
 
         this._targetScale = 0;
         this._scale = 0;
@@ -744,6 +760,8 @@ const ThumbnailsBox = new Lang.Class({
         };
 
         this.addThumbnails(0, global.screen.n_workspaces);
+
+        this._updateSwitcherVisibility();
     },
 
     hide: function() {
@@ -751,12 +769,40 @@ const ThumbnailsBox = new Lang.Class({
             global.window_manager.disconnect(this._switchWorkspaceNotifyId);
             this._switchWorkspaceNotifyId = 0;
         }
+        if (this._nWorkspacesNotifyId > 0) {
+            global.screen.disconnect(this._nWorkspacesNotifyId);
+            this._nWorkspacesNotifyId = 0;
+        }
 
         for (let w = 0; w < this._thumbnails.length; w++)
             this._thumbnails[w].destroy();
         this._thumbnails = [];
     },
 
+    _workspacesChanged: function() {
+        let oldNumWorkspaces = this._thumbnails.length;
+        let newNumWorkspaces = global.screen.n_workspaces;
+        let active = global.screen.get_active_workspace_index();
+
+        if (newNumWorkspaces > oldNumWorkspaces) {
+            this.addThumbnails(oldNumWorkspaces, newNumWorkspaces - oldNumWorkspaces);
+        } else {
+            let removedIndex;
+            let removedNum = oldNumWorkspaces - newNumWorkspaces;
+            for (let w = 0; w < oldNumWorkspaces; w++) {
+                let metaWorkspace = global.screen.get_workspace_by_index(w);
+                if (this._thumbnails[w].metaWorkspace != metaWorkspace) {
+                    removedIndex = w;
+                    break;
+                }
+            }
+
+            this.removeThumbnails(removedIndex, removedNum);
+        }
+
+        this._updateSwitcherVisibility();
+    },
+
     addThumbnails: function(start, count) {
         for (let k = start; k < start + count; k++) {
             let metaWorkspace = global.screen.get_workspace_by_index(k);
diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js
index 3132238..0dc7730 100644
--- a/js/ui/workspacesView.js
+++ b/js/ui/workspacesView.js
@@ -537,10 +537,6 @@ const WorkspacesDisplay = new Lang.Class({
         this._notifyOpacityId = 0;
         this._swipeScrollBeginId = 0;
         this._swipeScrollEndId = 0;
-
-        this._settings = new Gio.Settings({ schema: OVERRIDE_SCHEMA });
-        this._settings.connect('changed::dynamic-workspaces',
-            Lang.bind(this, this._updateSwitcherVisibility));
     },
 
     _onPan: function(action) {
@@ -550,12 +546,6 @@ const WorkspacesDisplay = new Lang.Class({
         return false;
     },
 
-    _updateSwitcherVisibility: function() {
-        this._thumbnailsBox.actor.visible =
-            this._settings.get_boolean('dynamic-workspaces') ||
-                global.screen.n_workspaces > 1;
-    },
-
     show: function() {
         if(!this._alwaysZoomOut) {
             let [mouseX, mouseY] = global.get_pointer();
@@ -576,7 +566,6 @@ const WorkspacesDisplay = new Lang.Class({
 
         this._controls.show();
         this._thumbnailsBox.show();
-        this._updateSwitcherVisibility();
 
         this._updateWorkspacesViews();
 
@@ -926,8 +915,6 @@ const WorkspacesDisplay = new Lang.Class({
                 }
                 m++;
             }
-
-            this._thumbnailsBox.addThumbnails(oldNumWorkspaces, newNumWorkspaces - oldNumWorkspaces);
         } else {
             // Assume workspaces are only removed sequentially
             // (e.g. 2,3,4 - not 2,4,7)
@@ -950,14 +937,11 @@ const WorkspacesDisplay = new Lang.Class({
                     lostWorkspaces[l].destroy();
                 }
             }
-
-            this._thumbnailsBox.removeThumbnails(removedIndex, removedNum);
         }
 
         for (let i = 0; i < this._workspacesViews.length; i++)
             this._workspacesViews[i].updateWorkspaces(oldNumWorkspaces,
                                                       newNumWorkspaces);
-        this._updateSwitcherVisibility();
     },
 
     _updateZoom : function() {



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