layout: Properly order startup initialization

In order to make sure that the struts and regions are initialized,
we need to make sure that we do with the conditions that nothing
is transformed, like the uiGroup, and that everything is visible.

These invariants broke during a fix to hide the UI until the
system background texture could be loaded. Now, reorder things so
that the system background is loaded, and then the UI is properly
loaded, and so on.

https://bugzilla.gnome.org/show_bug.cgi?id=696159
This commit is contained in:
Jasper St. Pierre 2013-05-18 19:34:35 -04:00
parent aefe0d3ddd
commit 4b7e230531

View File

@ -248,7 +248,7 @@ const LayoutManager = new Lang.Class({
init: function() { init: function() {
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated)); Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
this._prepareStartupAnimation(); this._loadBackground();
}, },
showOverview: function() { showOverview: function() {
@ -557,6 +557,25 @@ const LayoutManager = new Lang.Class({
return this._keyboardIndex; return this._keyboardIndex;
}, },
_loadBackground: function() {
this._systemBackground = new Background.SystemBackground();
this._systemBackground.actor.hide();
global.stage.insert_child_below(this._systemBackground.actor, null);
let constraint = new Clutter.BindConstraint({ source: global.stage,
coordinate: Clutter.BindCoordinate.ALL });
this._systemBackground.actor.add_constraint(constraint);
let signalId = this._systemBackground.connect('loaded', Lang.bind(this, function() {
this._systemBackground.disconnect(signalId);
this._systemBackground.actor.show();
global.stage.show();
this._prepareStartupAnimation();
}));
},
// Startup Animations // Startup Animations
// //
// We have two different animations, depending on whether we're a greeter // We have two different animations, depending on whether we're a greeter
@ -602,32 +621,17 @@ const LayoutManager = new Lang.Class({
global.window_group.set_clip(monitor.x, monitor.y, monitor.width, monitor.height); global.window_group.set_clip(monitor.x, monitor.y, monitor.width, monitor.height);
} }
this._systemBackground = new Background.SystemBackground(); this.emit('startup-prepared');
this._systemBackground.actor.hide();
global.stage.insert_child_below(this._systemBackground.actor, null); // We're mostly prepared for the startup animation
// now, but since a lot is going on asynchronously
let constraint = new Clutter.BindConstraint({ source: global.stage, // during startup, let's defer the startup animation
coordinate: Clutter.BindCoordinate.ALL }); // until the event loop is uncontended and idle.
this._systemBackground.actor.add_constraint(constraint); // This helps to prevent us from running the animation
// when the system is bogged down
let signalId = this._systemBackground.connect('loaded', Lang.bind(this, function() { GLib.idle_add(GLib.PRIORITY_LOW, Lang.bind(this, function() {
this._systemBackground.disconnect(signalId); this._startupAnimation();
this._systemBackground.actor.show(); return false;
global.stage.show();
this.emit('startup-prepared');
// We're mostly prepared for the startup animation
// now, but since a lot is going on asynchronously
// during startup, let's defer the startup animation
// until the event loop is uncontended and idle.
// This helps to prevent us from running the animation
// when the system is bogged down
GLib.idle_add(GLib.PRIORITY_LOW, Lang.bind(this, function() {
this._startupAnimation();
return false;
}));
})); }));
}, },