From 2326721561d5b0b82a0bdbf3d7aba5bc14f9cbb7 Mon Sep 17 00:00:00 2001 From: Alessandro Bono Date: Fri, 11 Nov 2022 11:47:16 +0100 Subject: [PATCH] appDisplay: Connect to hidden signal after content initialization When the overview is hidden just after starting GNOME Shell the app grid is not populated yet. Thus, this._grid.nPages is 0. When the overview is about to be hidden, we call goToPage(0) on the AppGrid. This results in pageNumber being clamped to -1 and leads to the following exception: ``` JS ERROR: Exception in callback for signal: hidden: Error: Page -2 does not exist at IconGrid getItemsAtPage@resource:///org/gnome/shell/ui/iconGrid.js:1383:19 _translatePreviousPageIcons@resource:///org/gnome/shell/ui/appDisplay.js:323:34 _syncPageIndicators@resource:///org/gnome/shell/ui/appDisplay.js:396:14 goToPage@resource:///org/gnome/shell/ui/appDisplay.js:445:14 goToPage@resource:///org/gnome/shell/ui/appDisplay.js:1237:29 goToPage@resource:///org/gnome/shell/ui/appDisplay.js:1584:15 _init/<@resource:///org/gnome/shell/ui/appDisplay.js:1328:52 _emit@resource:///org/gnome/gjs/modules/core/_signals.js:89:42 _hideDone@resource:///org/gnome/shell/ui/overview.js:589:18 _animateNotVisible/<@resource:///org/gnome/shell/ui/overview.js:566:55 onStopped@resource:///org/gnome/shell/ui/overviewControls.js:753:21 _makeEaseCallback/<@resource:///org/gnome/shell/ui/environment.js:150:22 _easeActorProperty/<@resource:///org/gnome/shell/ui/environment.js:316:60 ``` Connect to the overview hidden signal only after initializing the AppDisplay content, so that goToPage(0) is not called when there is no page yet. Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5837 Part-of: --- js/ui/appDisplay.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index fd73bf1b7..d85526d55 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -1324,9 +1324,12 @@ class AppDisplay extends BaseAppView { this._placeholder = null; - Main.overview.connect('hidden', () => this.goToPage(0)); - - this._redisplayWorkId = Main.initializeDeferredWork(this, this._redisplay.bind(this)); + this._overviewHiddenId = 0; + this._redisplayWorkId = Main.initializeDeferredWork(this, () => { + this._redisplay(); + if (this._overviewHiddenId === 0) + this._overviewHiddenId = Main.overview.connect('hidden', () => this.goToPage(0)); + }); Shell.AppSystem.get_default().connect('installed-changed', () => { Main.queueDeferredWork(this._redisplayWorkId);