layout: new file handling shell layout
Remove ShellGlobal's monitor-related methods, and have Main.layoutManager provide that information instead. Move Main._relayout() to LayoutManager, and have other objects connect to the layout manager's 'monitors-changed' signal to know when the screen geometry has changed. https://bugzilla.gnome.org/show_bug.cgi?id=636963
This commit is contained in:
parent
ae35d0e43c
commit
64b2b4a7d4
@ -74,7 +74,7 @@ AltTabPopup.prototype = {
|
|||||||
|
|
||||||
_allocate: function (actor, box, flags) {
|
_allocate: function (actor, box, flags) {
|
||||||
let childBox = new Clutter.ActorBox();
|
let childBox = new Clutter.ActorBox();
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
|
|
||||||
let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT);
|
let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT);
|
||||||
let rightPadding = this.actor.get_theme_node().get_padding(St.Side.RIGHT);
|
let rightPadding = this.actor.get_theme_node().get_padding(St.Side.RIGHT);
|
||||||
@ -618,7 +618,7 @@ SwitcherList.prototype = {
|
|||||||
this._items[this._highlighted].add_style_pseudo_class('selected');
|
this._items[this._highlighted].add_style_pseudo_class('selected');
|
||||||
}
|
}
|
||||||
|
|
||||||
let monitor = global.get_primary_monitor();
|
let monitor = Main.layoutManager.primaryMonitor;
|
||||||
let itemSize = this._items[index].allocation.x2 - this._items[index].allocation.x1;
|
let itemSize = this._items[index].allocation.x2 - this._items[index].allocation.x1;
|
||||||
let [posX, posY] = this._items[index].get_transformed_position();
|
let [posX, posY] = this._items[index].get_transformed_position();
|
||||||
posX += this.actor.x;
|
posX += this.actor.x;
|
||||||
@ -646,7 +646,7 @@ SwitcherList.prototype = {
|
|||||||
|
|
||||||
_scrollToRight : function() {
|
_scrollToRight : function() {
|
||||||
this._scrollableLeft = true;
|
this._scrollableLeft = true;
|
||||||
let monitor = global.get_primary_monitor();
|
let monitor = Main.layoutManager.primaryMonitor;
|
||||||
let padding = this.actor.get_theme_node().get_horizontal_padding();
|
let padding = this.actor.get_theme_node().get_horizontal_padding();
|
||||||
let parentPadding = this.actor.get_parent().get_theme_node().get_horizontal_padding();
|
let parentPadding = this.actor.get_parent().get_theme_node().get_horizontal_padding();
|
||||||
let x = this._items[this._highlighted].allocation.x2 - monitor.width + padding + parentPadding;
|
let x = this._items[this._highlighted].allocation.x2 - monitor.width + padding + parentPadding;
|
||||||
@ -743,7 +743,7 @@ SwitcherList.prototype = {
|
|||||||
let children = this._list.get_children();
|
let children = this._list.get_children();
|
||||||
let childBox = new Clutter.ActorBox();
|
let childBox = new Clutter.ActorBox();
|
||||||
|
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
let parentRightPadding = this.actor.get_parent().get_theme_node().get_padding(St.Side.RIGHT);
|
let parentRightPadding = this.actor.get_parent().get_theme_node().get_padding(St.Side.RIGHT);
|
||||||
if (this.actor.allocation.x2 == primary.x + primary.width - parentRightPadding) {
|
if (this.actor.allocation.x2 == primary.x + primary.width - parentRightPadding) {
|
||||||
if (this._squareItems)
|
if (this._squareItems)
|
||||||
@ -873,7 +873,7 @@ AppSwitcher.prototype = {
|
|||||||
totalSpacing += this._separator.width + this._list.spacing;
|
totalSpacing += this._separator.width + this._list.spacing;
|
||||||
|
|
||||||
// We just assume the whole screen here due to weirdness happing with the passed width
|
// We just assume the whole screen here due to weirdness happing with the passed width
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
let parentPadding = this.actor.get_parent().get_theme_node().get_horizontal_padding();
|
let parentPadding = this.actor.get_parent().get_theme_node().get_horizontal_padding();
|
||||||
let availWidth = primary.width - parentPadding - this.actor.get_theme_node().get_horizontal_padding();
|
let availWidth = primary.width - parentPadding - this.actor.get_theme_node().get_horizontal_padding();
|
||||||
let height = 0;
|
let height = 0;
|
||||||
|
@ -6,6 +6,7 @@ const Meta = imports.gi.Meta;
|
|||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
|
|
||||||
|
const Main = imports.ui.main;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
const POPUP_ANIMATION_TIME = 0.15;
|
const POPUP_ANIMATION_TIME = 0.15;
|
||||||
@ -329,7 +330,7 @@ BoxPointer.prototype = {
|
|||||||
// We also want to keep it onscreen, and separated from the
|
// We also want to keep it onscreen, and separated from the
|
||||||
// edge by the same distance as the main part of the box is
|
// edge by the same distance as the main part of the box is
|
||||||
// separated from its sourceActor
|
// separated from its sourceActor
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
let themeNode = this.actor.get_theme_node();
|
let themeNode = this.actor.get_theme_node();
|
||||||
let borderWidth = themeNode.get_length('-arrow-border-width');
|
let borderWidth = themeNode.get_length('-arrow-border-width');
|
||||||
let arrowBase = themeNode.get_length('-arrow-base');
|
let arrowBase = themeNode.get_length('-arrow-base');
|
||||||
|
@ -35,8 +35,8 @@ Chrome.prototype = {
|
|||||||
|
|
||||||
this._trackedActors = [];
|
this._trackedActors = [];
|
||||||
|
|
||||||
global.screen.connect('monitors-changed',
|
Main.layoutManager.connect('monitors-changed',
|
||||||
Lang.bind(this, this._monitorsChanged));
|
Lang.bind(this, this._relayout));
|
||||||
global.screen.connect('restacked',
|
global.screen.connect('restacked',
|
||||||
Lang.bind(this, this._windowsRestacked));
|
Lang.bind(this, this._windowsRestacked));
|
||||||
|
|
||||||
@ -49,9 +49,7 @@ Chrome.prototype = {
|
|||||||
Main.overview.connect('hidden',
|
Main.overview.connect('hidden',
|
||||||
Lang.bind(this, this._overviewHidden));
|
Lang.bind(this, this._overviewHidden));
|
||||||
|
|
||||||
this._updateMonitors();
|
this._relayout();
|
||||||
this._updateFullscreen();
|
|
||||||
this._queueUpdateRegions();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_allocated: function(actor, box, flags) {
|
_allocated: function(actor, box, flags) {
|
||||||
@ -205,18 +203,13 @@ Chrome.prototype = {
|
|||||||
this._queueUpdateRegions();
|
this._queueUpdateRegions();
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateMonitors: function() {
|
_relayout: function() {
|
||||||
let monitors = global.get_monitors();
|
this._monitors = Main.layoutManager.monitors;
|
||||||
let primary = global.get_primary_monitor();
|
this._primaryMonitor = Main.layoutManager.primaryMonitor;
|
||||||
this._monitors = monitors;
|
|
||||||
for (let i = 0; i < monitors.length; i++) {
|
this._updateFullscreen();
|
||||||
let monitor = monitors[i];
|
this._updateVisibility();
|
||||||
if (monitor.x == primary.x &&
|
this._queueUpdateRegions();
|
||||||
monitor.y == primary.y &&
|
|
||||||
monitor.width == primary.width &&
|
|
||||||
monitor.height == primary.height)
|
|
||||||
this._primaryMonitor = monitor;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_findMonitorForRect: function(x, y, w, h) {
|
_findMonitorForRect: function(x, y, w, h) {
|
||||||
@ -255,15 +248,6 @@ Chrome.prototype = {
|
|||||||
return this._primaryMonitor; // Not on any monitor, pretend its on the primary
|
return this._primaryMonitor; // Not on any monitor, pretend its on the primary
|
||||||
},
|
},
|
||||||
|
|
||||||
_monitorsChanged: function() {
|
|
||||||
this._updateMonitors();
|
|
||||||
|
|
||||||
// Update everything that depends on monitor positions
|
|
||||||
this._updateFullscreen();
|
|
||||||
this._updateVisibility();
|
|
||||||
this._queueUpdateRegions();
|
|
||||||
},
|
|
||||||
|
|
||||||
_queueUpdateRegions: function() {
|
_queueUpdateRegions: function() {
|
||||||
if (!this._updateRegionIdle)
|
if (!this._updateRegionIdle)
|
||||||
this._updateRegionIdle = Mainloop.idle_add(Lang.bind(this, this._updateRegions),
|
this._updateRegionIdle = Mainloop.idle_add(Lang.bind(this, this._updateRegions),
|
||||||
|
@ -153,14 +153,14 @@ CtrlAltTabPopup.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_getPreferredWidth: function (actor, forHeight, alloc) {
|
_getPreferredWidth: function (actor, forHeight, alloc) {
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
|
|
||||||
alloc.min_size = primary.width;
|
alloc.min_size = primary.width;
|
||||||
alloc.natural_size = primary.width;
|
alloc.natural_size = primary.width;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getPreferredHeight: function (actor, forWidth, alloc) {
|
_getPreferredHeight: function (actor, forWidth, alloc) {
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
|
|
||||||
alloc.min_size = primary.height;
|
alloc.min_size = primary.height;
|
||||||
alloc.natural_size = primary.height;
|
alloc.natural_size = primary.height;
|
||||||
@ -168,7 +168,7 @@ CtrlAltTabPopup.prototype = {
|
|||||||
|
|
||||||
_allocate: function (actor, box, flags) {
|
_allocate: function (actor, box, flags) {
|
||||||
let childBox = new Clutter.ActorBox();
|
let childBox = new Clutter.ActorBox();
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
|
|
||||||
let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT);
|
let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT);
|
||||||
let vPadding = this.actor.get_theme_node().get_vertical_padding();
|
let vPadding = this.actor.get_theme_node().get_vertical_padding();
|
||||||
|
130
js/ui/layout.js
Normal file
130
js/ui/layout.js
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||||
|
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const Signals = imports.signals;
|
||||||
|
const St = imports.gi.St;
|
||||||
|
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
const Panel = imports.ui.panel;
|
||||||
|
|
||||||
|
function LayoutManager() {
|
||||||
|
this._init.apply(this, arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
LayoutManager.prototype = {
|
||||||
|
_init: function () {
|
||||||
|
this._rtl = (St.Widget.get_default_direction() == St.TextDirection.RTL);
|
||||||
|
this.monitors = [];
|
||||||
|
this.primaryMonitor = null;
|
||||||
|
this.primaryIndex = -1;
|
||||||
|
this._hotCorners = [];
|
||||||
|
|
||||||
|
this._updateMonitors();
|
||||||
|
},
|
||||||
|
|
||||||
|
// This is called by Main after everything else is constructed;
|
||||||
|
// _updateHotCorners needs access to Main.panel, which didn't exist
|
||||||
|
// yet when the LayoutManager was constructed.
|
||||||
|
init: function() {
|
||||||
|
global.screen.connect('monitors-changed', Lang.bind(this, this._monitorsChanged));
|
||||||
|
this._updateHotCorners();
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateMonitors: function() {
|
||||||
|
let screen = global.screen;
|
||||||
|
|
||||||
|
this.monitors = [];
|
||||||
|
let nMonitors = screen.get_n_monitors();
|
||||||
|
for (let i = 0; i < nMonitors; i++)
|
||||||
|
this.monitors.push(screen.get_monitor_geometry(i));
|
||||||
|
|
||||||
|
this.primaryIndex = screen.get_primary_monitor();
|
||||||
|
this.primaryMonitor = this.monitors[this.primaryIndex];
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateHotCorners: function() {
|
||||||
|
// destroy old hot corners
|
||||||
|
for (let i = 0; i < this._hotCorners.length; i++)
|
||||||
|
this._hotCorners[i].destroy();
|
||||||
|
this._hotCorners = [];
|
||||||
|
|
||||||
|
// build new hot corners
|
||||||
|
for (let i = 0; i < this.monitors.length; i++) {
|
||||||
|
let monitor = this.monitors[i];
|
||||||
|
let cornerX = this._rtl ? monitor.x + monitor.width : monitor.x;
|
||||||
|
let cornerY = monitor.y;
|
||||||
|
|
||||||
|
let haveTopLeftCorner = true;
|
||||||
|
|
||||||
|
if (i != this.primaryIndex) {
|
||||||
|
// Check if we have a top left (right for RTL) corner.
|
||||||
|
// I.e. if there is no monitor directly above or to the left(right)
|
||||||
|
let besideX = this._rtl ? monitor.x + 1 : cornerX - 1;
|
||||||
|
let besideY = cornerY;
|
||||||
|
let aboveX = cornerX;
|
||||||
|
let aboveY = cornerY - 1;
|
||||||
|
|
||||||
|
for (let j = 0; j < this.monitors.length; j++) {
|
||||||
|
if (i == j)
|
||||||
|
continue;
|
||||||
|
let otherMonitor = this.monitors[j];
|
||||||
|
if (besideX >= otherMonitor.x &&
|
||||||
|
besideX < otherMonitor.x + otherMonitor.width &&
|
||||||
|
besideY >= otherMonitor.y &&
|
||||||
|
besideY < otherMonitor.y + otherMonitor.height) {
|
||||||
|
haveTopLeftCorner = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (aboveX >= otherMonitor.x &&
|
||||||
|
aboveX < otherMonitor.x + otherMonitor.width &&
|
||||||
|
aboveY >= otherMonitor.y &&
|
||||||
|
aboveY < otherMonitor.y + otherMonitor.height) {
|
||||||
|
haveTopLeftCorner = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!haveTopLeftCorner)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
let corner = new Panel.HotCorner(i == this.primaryIndex ? Main.panel.button : null);
|
||||||
|
this._hotCorners.push(corner);
|
||||||
|
corner.actor.set_position(cornerX, cornerY);
|
||||||
|
if (i == this.primaryIndex)
|
||||||
|
Main.panel.setHotCorner(corner);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_monitorsChanged: function() {
|
||||||
|
this._updateMonitors();
|
||||||
|
this._updateHotCorners();
|
||||||
|
|
||||||
|
this.emit('monitors-changed');
|
||||||
|
},
|
||||||
|
|
||||||
|
get focusIndex() {
|
||||||
|
let screen = global.screen;
|
||||||
|
let display = screen.get_display();
|
||||||
|
let focusWindow = display.focus_window;
|
||||||
|
|
||||||
|
if (focusWindow) {
|
||||||
|
let wrect = focusWindow.get_outer_rect();
|
||||||
|
for (let i = 0; i < this.monitors.length; i++) {
|
||||||
|
let monitor = this.monitors[i];
|
||||||
|
|
||||||
|
if (monitor.x <= wrect.x && monitor.y <= wrect.y &&
|
||||||
|
monitor.x + monitor.width > wrect.x &&
|
||||||
|
monitor.y + monitor.height > wrect.y)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.primaryIndex;
|
||||||
|
},
|
||||||
|
|
||||||
|
get focusMonitor() {
|
||||||
|
return this.monitors[this.focusIndex];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Signals.addSignalMethods(LayoutManager.prototype);
|
@ -436,7 +436,7 @@ Inspector.prototype = {
|
|||||||
if (!this._eventHandler)
|
if (!this._eventHandler)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
|
|
||||||
let [minWidth, minHeight, natWidth, natHeight] =
|
let [minWidth, minHeight, natWidth, natHeight] =
|
||||||
this._eventHandler.get_preferred_size();
|
this._eventHandler.get_preferred_size();
|
||||||
@ -907,7 +907,7 @@ LookingGlass.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_resizeTo: function(actor) {
|
_resizeTo: function(actor) {
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
let myWidth = primary.width * 0.7;
|
let myWidth = primary.width * 0.7;
|
||||||
let myHeight = primary.height * 0.7;
|
let myHeight = primary.height * 0.7;
|
||||||
let [srcX, srcY] = actor.get_transformed_position();
|
let [srcX, srcY] = actor.get_transformed_position();
|
||||||
|
@ -23,6 +23,7 @@ const Overview = imports.ui.overview;
|
|||||||
const Panel = imports.ui.panel;
|
const Panel = imports.ui.panel;
|
||||||
const PlaceDisplay = imports.ui.placeDisplay;
|
const PlaceDisplay = imports.ui.placeDisplay;
|
||||||
const RunDialog = imports.ui.runDialog;
|
const RunDialog = imports.ui.runDialog;
|
||||||
|
const Layout = imports.ui.layout;
|
||||||
const LookingGlass = imports.ui.lookingGlass;
|
const LookingGlass = imports.ui.lookingGlass;
|
||||||
const NotificationDaemon = imports.ui.notificationDaemon;
|
const NotificationDaemon = imports.ui.notificationDaemon;
|
||||||
const WindowAttentionHandler = imports.ui.windowAttentionHandler;
|
const WindowAttentionHandler = imports.ui.windowAttentionHandler;
|
||||||
@ -59,6 +60,7 @@ let uiGroup = null;
|
|||||||
let magnifier = null;
|
let magnifier = null;
|
||||||
let xdndHandler = null;
|
let xdndHandler = null;
|
||||||
let statusIconDispatcher = null;
|
let statusIconDispatcher = null;
|
||||||
|
let layoutManager = null;
|
||||||
let _errorLogStack = [];
|
let _errorLogStack = [];
|
||||||
let _startDate;
|
let _startDate;
|
||||||
let _defaultCssStylesheet = null;
|
let _defaultCssStylesheet = null;
|
||||||
@ -126,6 +128,7 @@ function start() {
|
|||||||
global.overlay_group.reparent(uiGroup);
|
global.overlay_group.reparent(uiGroup);
|
||||||
global.stage.add_actor(uiGroup);
|
global.stage.add_actor(uiGroup);
|
||||||
|
|
||||||
|
layoutManager = new Layout.LayoutManager();
|
||||||
placesManager = new PlaceDisplay.PlacesManager();
|
placesManager = new PlaceDisplay.PlacesManager();
|
||||||
xdndHandler = new XdndHandler.XdndHandler();
|
xdndHandler = new XdndHandler.XdndHandler();
|
||||||
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
|
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
|
||||||
@ -140,6 +143,7 @@ function start() {
|
|||||||
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
|
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
|
||||||
telepathyClient = new TelepathyClient.Client();
|
telepathyClient = new TelepathyClient.Client();
|
||||||
|
|
||||||
|
layoutManager.init();
|
||||||
overview.init();
|
overview.init();
|
||||||
statusIconDispatcher.start(messageTray.actor);
|
statusIconDispatcher.start(messageTray.actor);
|
||||||
|
|
||||||
@ -178,14 +182,9 @@ function start() {
|
|||||||
// Attempt to become a PolicyKit authentication agent
|
// Attempt to become a PolicyKit authentication agent
|
||||||
PolkitAuthenticationAgent.init()
|
PolkitAuthenticationAgent.init()
|
||||||
|
|
||||||
global.screen.connect('monitors-changed', _relayout);
|
|
||||||
|
|
||||||
ExtensionSystem.init();
|
ExtensionSystem.init();
|
||||||
ExtensionSystem.loadExtensions();
|
ExtensionSystem.loadExtensions();
|
||||||
|
|
||||||
// Perform initial relayout here
|
|
||||||
_relayout();
|
|
||||||
|
|
||||||
panel.startStatusArea();
|
panel.startStatusArea();
|
||||||
panel.startupAnimation();
|
panel.startupAnimation();
|
||||||
|
|
||||||
@ -300,14 +299,14 @@ function _windowRemoved(workspace, window) {
|
|||||||
function _windowLeftMonitor(metaScreen, monitorIndex, metaWin) {
|
function _windowLeftMonitor(metaScreen, monitorIndex, metaWin) {
|
||||||
// If the window left the primary monitor, that
|
// If the window left the primary monitor, that
|
||||||
// might make that workspace empty
|
// might make that workspace empty
|
||||||
if (monitorIndex == global.get_primary_monitor_index())
|
if (monitorIndex == layoutManager.primaryIndex)
|
||||||
_queueCheckWorkspaces();
|
_queueCheckWorkspaces();
|
||||||
}
|
}
|
||||||
|
|
||||||
function _windowEnteredMonitor(metaScreen, monitorIndex, metaWin) {
|
function _windowEnteredMonitor(metaScreen, monitorIndex, metaWin) {
|
||||||
// If the window entered the primary monitor, that
|
// If the window entered the primary monitor, that
|
||||||
// might make that workspace non-empty
|
// might make that workspace non-empty
|
||||||
if (monitorIndex == global.get_primary_monitor_index())
|
if (monitorIndex == layoutManager.primaryIndex)
|
||||||
_queueCheckWorkspaces();
|
_queueCheckWorkspaces();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -481,82 +480,6 @@ function _getAndClearErrorStack() {
|
|||||||
return errors;
|
return errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
function _relayout() {
|
|
||||||
let monitors = global.get_monitors();
|
|
||||||
// destroy old corners
|
|
||||||
for (let i = 0; i < hotCorners.length; i++)
|
|
||||||
hotCorners[i].destroy();
|
|
||||||
hotCorners = [];
|
|
||||||
|
|
||||||
|
|
||||||
let primary = global.get_primary_monitor();
|
|
||||||
for (let i = 0; i < monitors.length; i++) {
|
|
||||||
let monitor = monitors[i];
|
|
||||||
let isPrimary = (monitor.x == primary.x &&
|
|
||||||
monitor.y == primary.y &&
|
|
||||||
monitor.width == primary.width &&
|
|
||||||
monitor.height == primary.height);
|
|
||||||
|
|
||||||
let cornerX = monitor.x;
|
|
||||||
let cornerY = monitor.y;
|
|
||||||
if (St.Widget.get_default_direction() == St.TextDirection.RTL)
|
|
||||||
cornerX += monitor.width;
|
|
||||||
|
|
||||||
|
|
||||||
let haveTopLeftCorner = true;
|
|
||||||
|
|
||||||
/* Check if we have a top left (right for RTL) corner.
|
|
||||||
* I.e. if there is no monitor directly above or to the left(right) */
|
|
||||||
let besideX;
|
|
||||||
if (St.Widget.get_default_direction() == St.TextDirection.RTL)
|
|
||||||
besideX = monitor.x + 1;
|
|
||||||
else
|
|
||||||
besideX = cornerX - 1;
|
|
||||||
let besideY = cornerY;
|
|
||||||
let aboveX = cornerX;
|
|
||||||
let aboveY = cornerY - 1;
|
|
||||||
|
|
||||||
for (let j = 0; j < monitors.length; j++) {
|
|
||||||
if (i == j)
|
|
||||||
continue;
|
|
||||||
let otherMonitor = monitors[j];
|
|
||||||
if (besideX >= otherMonitor.x &&
|
|
||||||
besideX < otherMonitor.x + otherMonitor.width &&
|
|
||||||
besideY >= otherMonitor.y &&
|
|
||||||
besideY < otherMonitor.y + otherMonitor.height) {
|
|
||||||
haveTopLeftCorner = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (aboveX >= otherMonitor.x &&
|
|
||||||
aboveX < otherMonitor.x + otherMonitor.width &&
|
|
||||||
aboveY >= otherMonitor.y &&
|
|
||||||
aboveY < otherMonitor.y + otherMonitor.height) {
|
|
||||||
haveTopLeftCorner = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We only want hot corners where there is a natural top-left
|
|
||||||
* corner, and on the primary monitor */
|
|
||||||
if (!isPrimary && !haveTopLeftCorner)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
let corner = new Panel.HotCorner(isPrimary ? panel.button : null);
|
|
||||||
hotCorners.push(corner);
|
|
||||||
corner.actor.set_position(cornerX, cornerY);
|
|
||||||
if (isPrimary)
|
|
||||||
panel.setHotCorner(corner);
|
|
||||||
}
|
|
||||||
|
|
||||||
panel.relayout();
|
|
||||||
overview.relayout();
|
|
||||||
|
|
||||||
// To avoid updating the position and size of the workspaces
|
|
||||||
// in the overview, we just hide the overview. The positions
|
|
||||||
// will be updated when it is next shown.
|
|
||||||
overview.hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
function isWindowActorDisplayedOnWorkspace(win, workspaceIndex) {
|
function isWindowActorDisplayedOnWorkspace(win, workspaceIndex) {
|
||||||
return win.get_workspace() == workspaceIndex ||
|
return win.get_workspace() == workspaceIndex ||
|
||||||
(win.get_meta_window() && win.get_meta_window().is_on_all_workspaces());
|
(win.get_meta_window() && win.get_meta_window().is_on_all_workspaces());
|
||||||
|
@ -1257,7 +1257,7 @@ MessageTray.prototype = {
|
|||||||
Main.chrome.trackActor(this._notificationBin);
|
Main.chrome.trackActor(this._notificationBin);
|
||||||
Main.chrome.trackActor(this._summaryBoxPointer.actor);
|
Main.chrome.trackActor(this._summaryBoxPointer.actor);
|
||||||
|
|
||||||
global.screen.connect('monitors-changed', Lang.bind(this, this._setSizePosition));
|
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._setSizePosition));
|
||||||
|
|
||||||
this._setSizePosition();
|
this._setSizePosition();
|
||||||
|
|
||||||
@ -1293,7 +1293,7 @@ MessageTray.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_setSizePosition: function() {
|
_setSizePosition: function() {
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
this.actor.x = primary.x;
|
this.actor.x = primary.x;
|
||||||
this.actor.y = primary.y + primary.height - 1;
|
this.actor.y = primary.y + primary.height - 1;
|
||||||
this.actor.width = primary.width;
|
this.actor.width = primary.width;
|
||||||
@ -1867,7 +1867,7 @@ MessageTray.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_showTray: function() {
|
_showTray: function() {
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
this._tween(this.actor, '_trayState', State.SHOWN,
|
this._tween(this.actor, '_trayState', State.SHOWN,
|
||||||
{ y: primary.y + primary.height - this.actor.height,
|
{ y: primary.y + primary.height - this.actor.height,
|
||||||
time: ANIMATION_TIME,
|
time: ANIMATION_TIME,
|
||||||
@ -1876,7 +1876,7 @@ MessageTray.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_hideTray: function() {
|
_hideTray: function() {
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
this._tween(this.actor, '_trayState', State.HIDDEN,
|
this._tween(this.actor, '_trayState', State.HIDDEN,
|
||||||
{ y: primary.y + primary.height - 1,
|
{ y: primary.y + primary.height - 1,
|
||||||
time: ANIMATION_TIME,
|
time: ANIMATION_TIME,
|
||||||
@ -2047,7 +2047,6 @@ MessageTray.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_showSummary: function(timeout) {
|
_showSummary: function(timeout) {
|
||||||
let primary = global.get_primary_monitor();
|
|
||||||
this._summaryBin.opacity = 0;
|
this._summaryBin.opacity = 0;
|
||||||
this._summaryBin.y = this.actor.height;
|
this._summaryBin.y = this.actor.height;
|
||||||
this._tween(this._summaryBin, '_summaryState', State.SHOWN,
|
this._tween(this._summaryBin, '_summaryState', State.SHOWN,
|
||||||
|
@ -149,7 +149,7 @@ ModalDialog.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_fadeOpen: function() {
|
_fadeOpen: function() {
|
||||||
let monitor = global.get_focus_monitor();
|
let monitor = Main.layoutManager.focusMonitor;
|
||||||
|
|
||||||
this._backgroundBin.set_position(monitor.x, monitor.y);
|
this._backgroundBin.set_position(monitor.x, monitor.y);
|
||||||
this._backgroundBin.set_size(monitor.width, monitor.height);
|
this._backgroundBin.set_size(monitor.width, monitor.height);
|
||||||
|
@ -121,7 +121,7 @@ Overview.prototype = {
|
|||||||
let spacing = node.get_length('spacing');
|
let spacing = node.get_length('spacing');
|
||||||
if (spacing != this._spacing) {
|
if (spacing != this._spacing) {
|
||||||
this._spacing = spacing;
|
this._spacing = spacing;
|
||||||
this.relayout();
|
this._relayout();
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@ -202,6 +202,8 @@ Overview.prototype = {
|
|||||||
// the left of the overview
|
// the left of the overview
|
||||||
Main.ctrlAltTabManager.addGroup(this.dash.actor, _("Dash"), 'user-bookmarks');
|
Main.ctrlAltTabManager.addGroup(this.dash.actor, _("Dash"), 'user-bookmarks');
|
||||||
|
|
||||||
|
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._relayout));
|
||||||
|
this._relayout();
|
||||||
},
|
},
|
||||||
|
|
||||||
_onDragBegin: function() {
|
_onDragBegin: function() {
|
||||||
@ -391,7 +393,7 @@ Overview.prototype = {
|
|||||||
[stageX, stageY] = event.get_coords();
|
[stageX, stageY] = event.get_coords();
|
||||||
let dx = this._dragX - stageX;
|
let dx = this._dragX - stageX;
|
||||||
let dy = this._dragY - stageY;
|
let dy = this._dragY - stageY;
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
|
|
||||||
this._dragX = stageX;
|
this._dragX = stageX;
|
||||||
this._dragY = stageY;
|
this._dragY = stageY;
|
||||||
@ -438,8 +440,13 @@ Overview.prototype = {
|
|||||||
return clone;
|
return clone;
|
||||||
},
|
},
|
||||||
|
|
||||||
relayout: function () {
|
_relayout: function () {
|
||||||
let primary = global.get_primary_monitor();
|
// To avoid updating the position and size of the workspaces
|
||||||
|
// we just hide the overview. The positions will be updated
|
||||||
|
// when it is next shown.
|
||||||
|
this.hide();
|
||||||
|
|
||||||
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
let rtl = (St.Widget.get_default_direction () == St.TextDirection.RTL);
|
let rtl = (St.Widget.get_default_direction () == St.TextDirection.RTL);
|
||||||
|
|
||||||
let contentY = Main.panel.actor.height;
|
let contentY = Main.panel.actor.height;
|
||||||
|
@ -1013,6 +1013,9 @@ Panel.prototype = {
|
|||||||
|
|
||||||
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'start-here',
|
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'start-here',
|
||||||
{ sortGroup: CtrlAltTab.SortGroup.TOP });
|
{ sortGroup: CtrlAltTab.SortGroup.TOP });
|
||||||
|
|
||||||
|
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._relayout));
|
||||||
|
this._relayout();
|
||||||
},
|
},
|
||||||
|
|
||||||
_xdndShowOverview: function (actor) {
|
_xdndShowOverview: function (actor) {
|
||||||
@ -1086,8 +1089,8 @@ Panel.prototype = {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
relayout: function() {
|
_relayout: function() {
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
|
|
||||||
this.actor.set_position(primary.x, primary.y);
|
this.actor.set_position(primary.x, primary.y);
|
||||||
this.actor.set_size(primary.width, -1);
|
this.actor.set_size(primary.width, -1);
|
||||||
|
@ -35,7 +35,7 @@ Button.prototype = {
|
|||||||
// Setting the max-height won't do any good if the minimum height of the
|
// Setting the max-height won't do any good if the minimum height of the
|
||||||
// menu is higher then the screen; it's useful if part of the menu is
|
// menu is higher then the screen; it's useful if part of the menu is
|
||||||
// scrollable so the minimum height is smaller than the natural height
|
// scrollable so the minimum height is smaller than the natural height
|
||||||
let monitor = global.get_primary_monitor();
|
let monitor = Main.layoutManager.primaryMonitor;
|
||||||
this.menu.actor.style = ('max-height: ' +
|
this.menu.actor.style = ('max-height: ' +
|
||||||
Math.round(monitor.height - Main.panel.actor.height) +
|
Math.round(monitor.height - Main.panel.actor.height) +
|
||||||
'px;');
|
'px;');
|
||||||
|
@ -3,10 +3,11 @@
|
|||||||
const DBus = imports.dbus;
|
const DBus = imports.dbus;
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
|
|
||||||
const Meta = imports.gi.Meta;
|
const Meta = imports.gi.Meta;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
|
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
// This module provides functionality for driving the shell user interface
|
// This module provides functionality for driving the shell user interface
|
||||||
// in an automated fashion. The primary current use case for this is
|
// in an automated fashion. The primary current use case for this is
|
||||||
// automated performance testing (see runPerfScript()), but it could
|
// automated performance testing (see runPerfScript()), but it could
|
||||||
@ -246,18 +247,14 @@ function _collect(scriptModule, outputFile) {
|
|||||||
Shell.write_string_to_stream(out, '"events":\n');
|
Shell.write_string_to_stream(out, '"events":\n');
|
||||||
Shell.PerfLog.get_default().dump_events(out);
|
Shell.PerfLog.get_default().dump_events(out);
|
||||||
|
|
||||||
let monitors = global.get_monitors();
|
let monitors = Main.layoutManager.monitors;
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryIndex;
|
||||||
Shell.write_string_to_stream(out, ',\n"monitors":\n[');
|
Shell.write_string_to_stream(out, ',\n"monitors":\n[');
|
||||||
for (let i = 0; i < monitors.length; i++) {
|
for (let i = 0; i < monitors.length; i++) {
|
||||||
let monitor = monitors[i];
|
let monitor = monitors[i];
|
||||||
let is_primary = (monitor.x == primary.x &&
|
|
||||||
monitor.y == primary.y &&
|
|
||||||
monitor.width == primary.width &&
|
|
||||||
monitor.height == primary.height);
|
|
||||||
if (i != 0)
|
if (i != 0)
|
||||||
Shell.write_string_to_stream(out, ', ');
|
Shell.write_string_to_stream(out, ', ');
|
||||||
Shell.write_string_to_stream(out, '"%s%dx%d+%d+%d"'.format(is_primary ? "*" : "",
|
Shell.write_string_to_stream(out, '"%s%dx%d+%d+%d"'.format(i == primary ? "*" : "",
|
||||||
monitor.width, monitor.height,
|
monitor.width, monitor.height,
|
||||||
monitor.x, monitor.y));
|
monitor.x, monitor.y));
|
||||||
}
|
}
|
||||||
|
@ -180,7 +180,7 @@ WindowManager.prototype = {
|
|||||||
*/
|
*/
|
||||||
this._minimizing.push(actor);
|
this._minimizing.push(actor);
|
||||||
|
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
let xDest = primary.x;
|
let xDest = primary.x;
|
||||||
if (St.Widget.get_default_direction() == St.TextDirection.RTL)
|
if (St.Widget.get_default_direction() == St.TextDirection.RTL)
|
||||||
xDest += primary.width;
|
xDest += primary.width;
|
||||||
|
@ -225,8 +225,8 @@ WindowClone.prototype = {
|
|||||||
let [width, height] = this.actor.get_transformed_size();
|
let [width, height] = this.actor.get_transformed_size();
|
||||||
|
|
||||||
let monitorIndex = this.metaWindow.get_monitor();
|
let monitorIndex = this.metaWindow.get_monitor();
|
||||||
let availArea = global.get_monitors()[monitorIndex];
|
let availArea = Main.layoutManager.monitors[monitorIndex];
|
||||||
if (monitorIndex == global.get_primary_monitor_index()) {
|
if (monitorIndex == Main.layoutManager.primaryIndex) {
|
||||||
availArea.y += Main.panel.actor.height;
|
availArea.y += Main.panel.actor.height;
|
||||||
availArea.height -= Main.panel.actor.height;
|
availArea.height -= Main.panel.actor.height;
|
||||||
}
|
}
|
||||||
@ -593,7 +593,7 @@ Workspace.prototype = {
|
|||||||
this._height = 0;
|
this._height = 0;
|
||||||
|
|
||||||
this.monitorIndex = monitorIndex;
|
this.monitorIndex = monitorIndex;
|
||||||
this._monitor = global.get_monitors()[this.monitorIndex];
|
this._monitor = Main.layoutManager.monitors[this.monitorIndex];
|
||||||
this._windowOverlaysGroup = new Clutter.Group();
|
this._windowOverlaysGroup = new Clutter.Group();
|
||||||
// Without this the drop area will be overlapped.
|
// Without this the drop area will be overlapped.
|
||||||
this._windowOverlaysGroup.set_size(0, 0);
|
this._windowOverlaysGroup.set_size(0, 0);
|
||||||
|
@ -56,7 +56,7 @@ WorkspaceSwitcherPopup.prototype = {
|
|||||||
|
|
||||||
_getPreferredHeight : function (actor, forWidth, alloc) {
|
_getPreferredHeight : function (actor, forWidth, alloc) {
|
||||||
let children = this._list.get_children();
|
let children = this._list.get_children();
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
|
|
||||||
let availHeight = primary.height;
|
let availHeight = primary.height;
|
||||||
availHeight -= Main.panel.actor.height;
|
availHeight -= Main.panel.actor.height;
|
||||||
@ -82,7 +82,7 @@ WorkspaceSwitcherPopup.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_getPreferredWidth : function (actor, forHeight, alloc) {
|
_getPreferredWidth : function (actor, forHeight, alloc) {
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
this._childWidth = Math.round(this._childHeight * primary.width / primary.height);
|
this._childWidth = Math.round(this._childHeight * primary.width / primary.height);
|
||||||
|
|
||||||
alloc.min_size = this._childWidth;
|
alloc.min_size = this._childWidth;
|
||||||
@ -125,7 +125,7 @@ WorkspaceSwitcherPopup.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_position: function() {
|
_position: function() {
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
this._container.x = primary.x + Math.floor((primary.width - this._container.width) / 2);
|
this._container.x = primary.x + Math.floor((primary.width - this._container.width) / 2);
|
||||||
this._container.y = primary.y + Main.panel.actor.height +
|
this._container.y = primary.y + Main.panel.actor.height +
|
||||||
Math.floor(((primary.height - Main.panel.actor.height) - this._container.height) / 2);
|
Math.floor(((primary.height - Main.panel.actor.height) - this._container.height) / 2);
|
||||||
|
@ -146,7 +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.monitorIndex = Main.layoutManager.primaryIndex;
|
||||||
|
|
||||||
this.actor = new St.Group({ reactive: true,
|
this.actor = new St.Group({ reactive: true,
|
||||||
clip_to_allocation: true,
|
clip_to_allocation: true,
|
||||||
@ -170,7 +170,7 @@ WorkspaceThumbnail.prototype = {
|
|||||||
this._background = new Clutter.Clone({ source: global.background_actor });
|
this._background = new Clutter.Clone({ source: global.background_actor });
|
||||||
this._contents.add_actor(this._background);
|
this._contents.add_actor(this._background);
|
||||||
|
|
||||||
let monitor = global.get_primary_monitor();
|
let monitor = Main.layoutManager.primaryMonitor;
|
||||||
this.setPorthole(monitor.x, monitor.y, monitor.width, monitor.height);
|
this.setPorthole(monitor.x, monitor.y, monitor.width, monitor.height);
|
||||||
|
|
||||||
let windows = global.get_window_actors().filter(this._isMyWindow, this);
|
let windows = global.get_window_actors().filter(this._isMyWindow, this);
|
||||||
@ -528,7 +528,7 @@ ThumbnailsBox.prototype = {
|
|||||||
|
|
||||||
// The "porthole" is the portion of the screen that we show in the workspaces
|
// The "porthole" is the portion of the screen that we show in the workspaces
|
||||||
let panelHeight = Main.panel.actor.height;
|
let panelHeight = Main.panel.actor.height;
|
||||||
let monitor = global.get_primary_monitor();
|
let monitor = Main.layoutManager.primaryMonitor;
|
||||||
this._porthole = {
|
this._porthole = {
|
||||||
x: monitor.x,
|
x: monitor.x,
|
||||||
y: monitor.y + panelHeight,
|
y: monitor.y + panelHeight,
|
||||||
|
@ -70,10 +70,10 @@ WorkspacesView.prototype = {
|
|||||||
this._workspaces[activeWorkspaceIndex].actor.raise_top();
|
this._workspaces[activeWorkspaceIndex].actor.raise_top();
|
||||||
|
|
||||||
this._extraWorkspaces = [];
|
this._extraWorkspaces = [];
|
||||||
let monitors = global.get_monitors();
|
let monitors = Main.layoutManager.monitors;
|
||||||
let m = 0;
|
let m = 0;
|
||||||
for (let i = 0; i < monitors.length; i++) {
|
for (let i = 0; i < monitors.length; i++) {
|
||||||
if (i == global.get_primary_monitor_index())
|
if (i == Main.layoutManager.primaryIndex)
|
||||||
continue;
|
continue;
|
||||||
let ws = new Workspace.Workspace(null, i);
|
let ws = new Workspace.Workspace(null, i);
|
||||||
this._extraWorkspaces[m++] = ws;
|
this._extraWorkspaces[m++] = ws;
|
||||||
@ -383,7 +383,7 @@ WorkspacesView.prototype = {
|
|||||||
this._extraWorkspaces[i].setReservedSlot(dragEvent.dragActor._delegate);
|
this._extraWorkspaces[i].setReservedSlot(dragEvent.dragActor._delegate);
|
||||||
}
|
}
|
||||||
|
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
|
|
||||||
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
|
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
|
||||||
let topWorkspace, bottomWorkspace;
|
let topWorkspace, bottomWorkspace;
|
||||||
@ -550,8 +550,8 @@ WorkspacesDisplay.prototype = {
|
|||||||
controls.connect('scroll-event',
|
controls.connect('scroll-event',
|
||||||
Lang.bind(this, this._onScrollEvent));
|
Lang.bind(this, this._onScrollEvent));
|
||||||
|
|
||||||
this._monitorIndex = global.get_primary_monitor_index();
|
this._monitorIndex = Main.layoutManager.primaryIndex;
|
||||||
this._monitor = global.get_monitors()[this._monitorIndex];
|
this._monitor = Main.layoutManager.monitors[this._monitorIndex];
|
||||||
|
|
||||||
this._thumbnailsBox = new WorkspaceThumbnail.ThumbnailsBox();
|
this._thumbnailsBox = new WorkspaceThumbnail.ThumbnailsBox();
|
||||||
controls.add_actor(this._thumbnailsBox.actor);
|
controls.add_actor(this._thumbnailsBox.actor);
|
||||||
@ -567,7 +567,7 @@ WorkspacesDisplay.prototype = {
|
|||||||
|
|
||||||
this._updateAlwaysZoom();
|
this._updateAlwaysZoom();
|
||||||
|
|
||||||
global.screen.connect('monitors-changed', Lang.bind(this, this._updateAlwaysZoom));
|
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._updateAlwaysZoom));
|
||||||
global.screen.connect('notify::n-workspaces',
|
global.screen.connect('notify::n-workspaces',
|
||||||
Lang.bind(this, this._workspacesChanged));
|
Lang.bind(this, this._workspacesChanged));
|
||||||
|
|
||||||
@ -694,8 +694,8 @@ WorkspacesDisplay.prototype = {
|
|||||||
if (this._alwaysZoomOut)
|
if (this._alwaysZoomOut)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let monitors = global.get_monitors();
|
let monitors = Main.layoutManager.monitors;
|
||||||
let primary = global.get_primary_monitor();
|
let primary = Main.layoutManager.primaryMonitor;
|
||||||
|
|
||||||
/* Look for any monitor to the right of the primary, if there is
|
/* Look for any monitor to the right of the primary, if there is
|
||||||
* one, we always keep zoom out, otherwise its hard to reach
|
* one, we always keep zoom out, otherwise its hard to reach
|
||||||
|
@ -1193,109 +1193,6 @@ void shell_global_init_xdnd (ShellGlobal *global)
|
|||||||
32, PropModeReplace, (const unsigned char *)&stage_win, 1);
|
32, PropModeReplace, (const unsigned char *)&stage_win, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_global_get_monitors:
|
|
||||||
* @global: the #ShellGlobal
|
|
||||||
*
|
|
||||||
* Gets a list of the bounding boxes of the active screen's monitors.
|
|
||||||
*
|
|
||||||
* Return value: (transfer full) (element-type Meta.Rectangle): a list
|
|
||||||
* of monitor bounding boxes.
|
|
||||||
*/
|
|
||||||
GSList *
|
|
||||||
shell_global_get_monitors (ShellGlobal *global)
|
|
||||||
{
|
|
||||||
MetaScreen *screen = shell_global_get_screen (global);
|
|
||||||
GSList *monitors = NULL;
|
|
||||||
MetaRectangle rect;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = meta_screen_get_n_monitors (screen) - 1; i >= 0; i--)
|
|
||||||
{
|
|
||||||
meta_screen_get_monitor_geometry (screen, i, &rect);
|
|
||||||
monitors = g_slist_prepend (monitors,
|
|
||||||
meta_rectangle_copy (&rect));
|
|
||||||
}
|
|
||||||
return monitors;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_global_get_primary_monitor:
|
|
||||||
* @global: the #ShellGlobal
|
|
||||||
*
|
|
||||||
* Gets the bounding box of the primary monitor (the one that the
|
|
||||||
* panel is on).
|
|
||||||
*
|
|
||||||
* Return value: the bounding box of the primary monitor
|
|
||||||
*/
|
|
||||||
MetaRectangle *
|
|
||||||
shell_global_get_primary_monitor (ShellGlobal *global)
|
|
||||||
{
|
|
||||||
MetaScreen *screen = shell_global_get_screen (global);
|
|
||||||
MetaRectangle rect;
|
|
||||||
gint primary = 0;
|
|
||||||
|
|
||||||
primary = meta_screen_get_primary_monitor (screen);
|
|
||||||
meta_screen_get_monitor_geometry (screen, primary, &rect);
|
|
||||||
|
|
||||||
return meta_rectangle_copy (&rect);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_global_get_primary_monitor_index:
|
|
||||||
* @global: the #ShellGlobal
|
|
||||||
*
|
|
||||||
* Gets the index of the primary monitor (the one that the
|
|
||||||
* panel is on).
|
|
||||||
*
|
|
||||||
* Return value: the index of the primary monitor
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
shell_global_get_primary_monitor_index (ShellGlobal *global)
|
|
||||||
{
|
|
||||||
MetaScreen *screen = shell_global_get_screen (global);
|
|
||||||
|
|
||||||
return meta_screen_get_primary_monitor (screen);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_global_get_focus_monitor:
|
|
||||||
* @global: the #ShellGlobal
|
|
||||||
*
|
|
||||||
* Gets the bounding box of the monitor containing the window that
|
|
||||||
* currently contains the keyboard focus.
|
|
||||||
*
|
|
||||||
* Return value: the bounding box of the focus monitor
|
|
||||||
*/
|
|
||||||
MetaRectangle *
|
|
||||||
shell_global_get_focus_monitor (ShellGlobal *global)
|
|
||||||
{
|
|
||||||
MetaScreen *screen = shell_global_get_screen (global);
|
|
||||||
MetaDisplay *display = meta_screen_get_display (screen);
|
|
||||||
MetaWindow *focus = meta_display_get_focus_window (display);
|
|
||||||
MetaRectangle rect, wrect;
|
|
||||||
int nmonitors, i;
|
|
||||||
|
|
||||||
if (focus)
|
|
||||||
{
|
|
||||||
meta_window_get_outer_rect (focus, &wrect);
|
|
||||||
nmonitors = meta_screen_get_n_monitors (screen);
|
|
||||||
|
|
||||||
/* Find the monitor that the top-left corner of @focus is on. */
|
|
||||||
for (i = 0; i < nmonitors; i++)
|
|
||||||
{
|
|
||||||
meta_screen_get_monitor_geometry (screen, i, &rect);
|
|
||||||
|
|
||||||
if (rect.x <= wrect.x && rect.y <= wrect.y &&
|
|
||||||
rect.x + rect.width > wrect.x &&
|
|
||||||
rect.y + rect.height > wrect.y)
|
|
||||||
return meta_rectangle_copy (&rect);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return shell_global_get_primary_monitor (global);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* shell_global_get_pointer:
|
* shell_global_get_pointer:
|
||||||
* @global: the #ShellGlobal
|
* @global: the #ShellGlobal
|
||||||
|
@ -32,10 +32,6 @@ ShellGlobal *shell_global_get (void);
|
|||||||
MetaScreen *shell_global_get_screen (ShellGlobal *global);
|
MetaScreen *shell_global_get_screen (ShellGlobal *global);
|
||||||
GdkScreen *shell_global_get_gdk_screen (ShellGlobal *global);
|
GdkScreen *shell_global_get_gdk_screen (ShellGlobal *global);
|
||||||
GList *shell_global_get_window_actors (ShellGlobal *global);
|
GList *shell_global_get_window_actors (ShellGlobal *global);
|
||||||
GSList *shell_global_get_monitors (ShellGlobal *global);
|
|
||||||
MetaRectangle *shell_global_get_primary_monitor (ShellGlobal *global);
|
|
||||||
int shell_global_get_primary_monitor_index (ShellGlobal *global);
|
|
||||||
MetaRectangle *shell_global_get_focus_monitor (ShellGlobal *global);
|
|
||||||
GSettings *shell_global_get_settings (ShellGlobal *global);
|
GSettings *shell_global_get_settings (ShellGlobal *global);
|
||||||
guint32 shell_global_get_current_time (ShellGlobal *global);
|
guint32 shell_global_get_current_time (ShellGlobal *global);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user