From 36ff3273d676e316ab99a33d2eb20a82cd75c65a Mon Sep 17 00:00:00 2001 From: Steve <48870638+svan71@users.noreply.github.com> Date: Wed, 22 Jul 2026 15:33:46 -0400 Subject: [PATCH] Guard Main.overview.dash._adjustIconSize against null firstIcon.icon (fixes #336 SIGABRT on GNOME 50) --- extension.js | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/extension.js b/extension.js index 15a7410..65c32b6 100644 --- a/extension.js +++ b/extension.js @@ -163,6 +163,38 @@ export default class Dash2DockLiteExt extends Extension { Main.overview.dash._showAppsIcon.child.track_hover = show; } + _guardOverviewDashRelayout() { + // GNOME 50 Dash._adjustIconSize dereferences firstIcon.icon without a + // null check; an icon mid-destruction escalates into a fatal Clutter + // paint assertion (issue #336). Skip the relayout in that state. + let dash = Main.overview.dash; + if (dash.__d2dlAdjustIconSize) return; + dash.__d2dlAdjustIconSize = dash._adjustIconSize; + dash._adjustIconSize = function (...args) { + let iconChildren = this._box + .get_children() + .filter( + (actor) => actor.child?._delegate?.icon && !actor.animatingOut + ); + iconChildren.push(this._showAppsIcon); + let firstIcon = iconChildren[0]?.child?._delegate?.icon; + if (!firstIcon?.icon) return; + try { + this.__d2dlAdjustIconSize(...args); + } catch (err) { + console.log(`dash2dock-lite: skipped dash relayout: ${err}`); + } + }; + } + + _unguardOverviewDashRelayout() { + let dash = Main.overview.dash; + if (dash.__d2dlAdjustIconSize) { + dash._adjustIconSize = dash.__d2dlAdjustIconSize; + delete dash.__d2dlAdjustIconSize; + } + } + enable() { Main.overview.d2dl = this; @@ -205,6 +237,7 @@ export default class Dash2DockLiteExt extends Extension { Main.overview.dash.__box = Main.overview.dash._box; this._showMainOverviewDash(false); + this._guardOverviewDashRelayout(); this.docks = []; this.icon_theme = St.IconTheme.new(); @@ -256,6 +289,7 @@ export default class Dash2DockLiteExt extends Extension { this._updateAutohide(true); this._unloadConfig(); + this._unguardOverviewDashRelayout(); this._showMainOverviewDash(true); this.destroyDocks();