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:
Dan Winship 2011-06-13 09:54:05 -04:00
parent ae35d0e43c
commit 64b2b4a7d4
20 changed files with 203 additions and 266 deletions

View File

@ -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;

View File

@ -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');

View File

@ -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),

View File

@ -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
View 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);

View File

@ -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();

View File

@ -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());

View File

@ -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,

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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;');

View File

@ -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));
} }

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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);