[gnome-shell/mcatanzaro/#734996: 4/4] Delay login animation until after wallpaper has loaded



commit 71abad29fab6da840eecdba3b35a72691280bb39
Author: Michael Catanzaro <mcatanzaro gnome org>
Date:   Mon Jul 20 19:00:32 2020 -0500

    Delay login animation until after wallpaper has loaded
    
    Currently, the login animation can occur before the user's wallpaper has
    been loaded. When this happens, we wind up displaying a solid blue
    background for half a second or so before the proper background is
    displayed. This looks jarring and bad. It's great that we can start
    GNOME quickly, but starting up before the wallpaper is ready is *too*
    quickly.
    
    I've been meaning to fix this since 2014. Better late than never! We can
    just have BackgroundManager emit a loaded signal the first time it loads
    its first background, and have the startup animation code wait for that
    before proceeding.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=734996

 js/ui/background.js |  9 +++++++++
 js/ui/layout.js     | 27 ++++++++++++++++++++++-----
 2 files changed, 31 insertions(+), 5 deletions(-)
---
diff --git a/js/ui/background.js b/js/ui/background.js
index 20f5e89126..2811da3fb0 100644
--- a/js/ui/background.js
+++ b/js/ui/background.js
@@ -765,10 +765,19 @@ var BackgroundManager = class BackgroundManager {
             this._updateBackgroundActor();
         });
 
+        let loadedSignalId = background.connect('loaded', () => {
+            background.disconnect(loadedSignalId);
+            loadedSignalId = null;
+            this.emit('loaded');
+        });
+
         backgroundActor.connect('destroy', () => {
             if (changeSignalId)
                 background.disconnect(changeSignalId);
 
+            if (loadedSignalId)
+                background.disconnect(loadedSignalId);
+
             if (backgroundActor.loadedSignalId)
                 background.disconnect(backgroundActor.loadedSignalId);
         });
diff --git a/js/ui/layout.js b/js/ui/layout.js
index 55cefb2823..01dae9af44 100644
--- a/js/ui/layout.js
+++ b/js/ui/layout.js
@@ -457,7 +457,7 @@ var LayoutManager = GObject.registerClass({
         }
     }
 
-    _updateBackgrounds() {
+    _updateBackgrounds(backgroundReadyCallback) {
         for (let i = 0; i < this._bgManagers.length; i++)
             this._bgManagers[i].destroy();
 
@@ -466,12 +466,24 @@ var LayoutManager = GObject.registerClass({
         if (Main.sessionMode.isGreeter)
             return;
 
+        let nLoadedBackgrounds = 0;
+        const nBackgrounds = this.monitors.length;
+
         for (let i = 0; i < this.monitors.length; i++) {
             let bgManager = this._createBackgroundManager(i);
             this._bgManagers.push(bgManager);
 
-            if (i != this.primaryIndex && this._startingUp)
+            if (i !== this.primaryIndex && this._startingUp)
                 bgManager.backgroundActor.hide();
+
+            if (backgroundReadyCallback) {
+                let loadedSignalId = bgManager.connect('loaded', () => {
+                    bgManager.disconnect(loadedSignalId);
+                    nLoadedBackgrounds++;
+                    if (nLoadedBackgrounds == nBackgrounds)
+                        backgroundReadyCallback();
+                });
+            }
         }
     }
 
@@ -527,7 +539,7 @@ var LayoutManager = GObject.registerClass({
         this._updateMonitors();
         this._updateBoxes();
         this._updateHotCorners();
-        this._updateBackgrounds();
+        this._updateBackgrounds(null);
         this._updateFullscreen();
         this._updateVisibility();
         this._queueUpdateRegions();
@@ -645,10 +657,14 @@ var LayoutManager = GObject.registerClass({
             // regions immediately so that maximized windows restore to the
             // right size taking struts into account.
             this._updateRegions();
+            this._continuePrepareStartupAnimation();
         } else if (Main.sessionMode.isGreeter) {
             this.panelBox.translation_y = -this.panelBox.height;
+            this._continuePrepareStartupAnimation();
         } else {
-            this._updateBackgrounds();
+            this._updateBackgrounds(() => {
+                this._continuePrepareStartupAnimation();
+            });
 
             // We need to force an update of the regions now before we scale
             // the UI group to get the correct allocation for the struts.
@@ -666,9 +682,10 @@ var LayoutManager = GObject.registerClass({
             this.uiGroup.opacity = 0;
             global.window_group.set_clip(monitor.x, monitor.y, monitor.width, monitor.height);
         }
+    }
 
+    _continuePrepareStartupAnimation() {
         this.emit('startup-prepared');
-
         this._startupAnimation();
     }
 


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