Only show windows from the primary monitor in the workspace thumbnails
Also, if windows are dropped on the thumbnail, move them to the primary monitor. https://bugzilla.gnome.org/show_bug.cgi?id=609258
This commit is contained in:
parent
a1a068a377
commit
0e6458a630
@ -146,6 +146,7 @@ function WorkspaceThumbnail(metaWorkspace) {
|
|||||||
WorkspaceThumbnail.prototype = {
|
WorkspaceThumbnail.prototype = {
|
||||||
_init : function(metaWorkspace) {
|
_init : function(metaWorkspace) {
|
||||||
this.metaWorkspace = metaWorkspace;
|
this.metaWorkspace = metaWorkspace;
|
||||||
|
this.monitorIndex = global.get_primary_monitor_index();
|
||||||
|
|
||||||
this.actor = new St.Group({ reactive: true,
|
this.actor = new St.Group({ reactive: true,
|
||||||
clip_to_allocation: true,
|
clip_to_allocation: true,
|
||||||
@ -187,6 +188,10 @@ WorkspaceThumbnail.prototype = {
|
|||||||
Lang.bind(this, this._windowAdded));
|
Lang.bind(this, this._windowAdded));
|
||||||
this._windowRemovedId = this.metaWorkspace.connect('window-removed',
|
this._windowRemovedId = this.metaWorkspace.connect('window-removed',
|
||||||
Lang.bind(this, this._windowRemoved));
|
Lang.bind(this, this._windowRemoved));
|
||||||
|
this._windowEnteredMonitorId = global.screen.connect('window-entered-monitor',
|
||||||
|
Lang.bind(this, this._windowEnteredMonitor));
|
||||||
|
this._windowLeftMonitorId = global.screen.connect('window-left-monitor',
|
||||||
|
Lang.bind(this, this._windowLeftMonitor));
|
||||||
|
|
||||||
this.state = ThumbnailState.NORMAL;
|
this.state = ThumbnailState.NORMAL;
|
||||||
this._slidePosition = 0; // Fully slid in
|
this._slidePosition = 0; // Fully slid in
|
||||||
@ -194,6 +199,8 @@ WorkspaceThumbnail.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
setPorthole: function(x, y, width, height) {
|
setPorthole: function(x, y, width, height) {
|
||||||
|
this._portholeX = x;
|
||||||
|
this._portholeY = y;
|
||||||
this.actor.set_size(width, height);
|
this.actor.set_size(width, height);
|
||||||
this._contents.set_position(-x, -y);
|
this._contents.set_position(-x, -y);
|
||||||
},
|
},
|
||||||
@ -240,7 +247,7 @@ WorkspaceThumbnail.prototype = {
|
|||||||
return this._collapseFraction;
|
return this._collapseFraction;
|
||||||
},
|
},
|
||||||
|
|
||||||
_windowRemoved : function(metaWorkspace, metaWin) {
|
_doRemoveWindow : function(metaWin) {
|
||||||
let win = metaWin.get_compositor_private();
|
let win = metaWin.get_compositor_private();
|
||||||
|
|
||||||
// find the position of the window in our list
|
// find the position of the window in our list
|
||||||
@ -249,12 +256,16 @@ WorkspaceThumbnail.prototype = {
|
|||||||
if (index == -1)
|
if (index == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Check if window still should be here
|
||||||
|
if (win && this._isMyWindow(win))
|
||||||
|
return;
|
||||||
|
|
||||||
let clone = this._windows[index];
|
let clone = this._windows[index];
|
||||||
this._windows.splice(index, 1);
|
this._windows.splice(index, 1);
|
||||||
clone.destroy();
|
clone.destroy();
|
||||||
},
|
},
|
||||||
|
|
||||||
_windowAdded : function(metaWorkspace, metaWin) {
|
_doAddWindow : function(metaWin) {
|
||||||
if (this.leavingOverview)
|
if (this.leavingOverview)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -266,18 +277,43 @@ WorkspaceThumbnail.prototype = {
|
|||||||
Mainloop.idle_add(Lang.bind(this,
|
Mainloop.idle_add(Lang.bind(this,
|
||||||
function () {
|
function () {
|
||||||
if (this.actor && metaWin.get_compositor_private())
|
if (this.actor && metaWin.get_compositor_private())
|
||||||
this._windowAdded(metaWorkspace, metaWin);
|
this._doAddWindow(metaWin);
|
||||||
return false;
|
return false;
|
||||||
}));
|
}));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this._isOverviewWindow(win))
|
// We might have the window in our list already if it was on all workspaces and
|
||||||
|
// now was moved to this workspace
|
||||||
|
if (this._lookupIndex (metaWin) != -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!this._isMyWindow(win) || !this._isOverviewWindow(win))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let clone = this._addWindowClone(win);
|
let clone = this._addWindowClone(win);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_windowAdded : function(metaWorkspace, metaWin) {
|
||||||
|
this._doAddWindow(metaWin);
|
||||||
|
},
|
||||||
|
|
||||||
|
_windowRemoved : function(metaWorkspace, metaWin) {
|
||||||
|
this._doRemoveWindow(metaWin);
|
||||||
|
},
|
||||||
|
|
||||||
|
_windowEnteredMonitor : function(metaScreen, monitorIndex, metaWin) {
|
||||||
|
if (monitorIndex == this.monitorIndex) {
|
||||||
|
this._doAddWindow(metaWin);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_windowLeftMonitor : function(metaScreen, monitorIndex, metaWin) {
|
||||||
|
if (monitorIndex == this.monitorIndex) {
|
||||||
|
this._doRemoveWindow(metaWin);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
destroy : function() {
|
destroy : function() {
|
||||||
this.actor.destroy();
|
this.actor.destroy();
|
||||||
},
|
},
|
||||||
@ -285,15 +321,17 @@ WorkspaceThumbnail.prototype = {
|
|||||||
_onDestroy: function(actor) {
|
_onDestroy: function(actor) {
|
||||||
this.metaWorkspace.disconnect(this._windowAddedId);
|
this.metaWorkspace.disconnect(this._windowAddedId);
|
||||||
this.metaWorkspace.disconnect(this._windowRemovedId);
|
this.metaWorkspace.disconnect(this._windowRemovedId);
|
||||||
|
global.screen.disconnect(this._windowEnteredMonitorId);
|
||||||
|
global.screen.disconnect(this._windowLeftMonitorId);
|
||||||
|
|
||||||
this._windows = [];
|
this._windows = [];
|
||||||
this.actor = null;
|
this.actor = null;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Tests if @win belongs to this workspaces
|
// Tests if @win belongs to this workspace and monitor
|
||||||
_isMyWindow : function (win) {
|
_isMyWindow : function (win) {
|
||||||
return win.get_workspace() == this.metaWorkspace.index() ||
|
return Main.isWindowActorDisplayedOnWorkspace(win, this.metaWorkspace.index()) &&
|
||||||
(win.get_meta_window() && win.get_meta_window().is_on_all_workspaces());
|
(!win.get_meta_window() || win.get_meta_window().get_monitor() == this.monitorIndex);
|
||||||
},
|
},
|
||||||
|
|
||||||
// Tests if @win should be shown in the Overview
|
// Tests if @win should be shown in the Overview
|
||||||
@ -362,6 +400,13 @@ WorkspaceThumbnail.prototype = {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
let metaWindow = win.get_meta_window();
|
let metaWindow = win.get_meta_window();
|
||||||
|
|
||||||
|
// We need to move the window before changing the workspace, because
|
||||||
|
// the move itself could cause a workspace change if the window enters
|
||||||
|
// the primary monitor
|
||||||
|
if (metaWindow.get_monitor() != this.monitorIndex)
|
||||||
|
metaWindow.move_frame(true, this._portholeX, this._portholeY);
|
||||||
|
|
||||||
metaWindow.change_workspace_by_index(this.metaWorkspace.index(),
|
metaWindow.change_workspace_by_index(this.metaWorkspace.index(),
|
||||||
false, // don't create workspace
|
false, // don't create workspace
|
||||||
time);
|
time);
|
||||||
|
Loading…
Reference in New Issue
Block a user