From 3d425b2919fc16818f53ae8fa14a60b7ad6bc2d3 Mon Sep 17 00:00:00 2001 From: Eskander Bejaoui Date: Sat, 13 Sep 2025 21:19:15 +0100 Subject: [PATCH 1/6] Refactor unmaximize calls and update maximized checks - Replace `Meta.Window.get_maximized()` with `Meta.Window.is_maximized()`. - Update `Meta.Window.unmaximize()` calls. https://gjs.guide/extensions/upgrading/gnome-shell-49.html#meta-window --- lib/extension/window.js | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/lib/extension/window.js b/lib/extension/window.js index b02d8d5..7b8762f 100644 --- a/lib/extension/window.js +++ b/lib/extension/window.js @@ -951,9 +951,7 @@ export class WindowManager extends GObject.Object { move(metaWindow, rect) { if (!metaWindow) return; if (metaWindow.grabbed) return; - metaWindow.unmaximize(Meta.MaximizeFlags.HORIZONTAL); - metaWindow.unmaximize(Meta.MaximizeFlags.VERTICAL); - metaWindow.unmaximize(Meta.MaximizeFlags.BOTH); + metaWindow.unmaximize(); let windowActor = metaWindow.get_compositor_private(); if (!windowActor) return; @@ -1235,7 +1233,7 @@ export class WindowManager extends GObject.Object { let tilingModeEnabled = this.ext.settings.get_boolean("tiling-mode-enabled"); let gap = this.calculateGaps(nodeWindow); let maximized = () => { - return metaWindow.get_maximized() === 3 || metaWindow.is_fullscreen() || gap === 0; + return metaWindow.is_maximized() || metaWindow.is_fullscreen() || gap === 0; }; let monitorCount = global.display.get_n_monitors(); let tiledChildren = this.tree.getTiledChildren(nodeWindow.parentNode.childNodes); @@ -1287,7 +1285,7 @@ export class WindowManager extends GObject.Object { } } - if (gap === 0 || metaWindow.get_maximized() === 1 || metaWindow.get_maximized() === 2) { + if (gap === 0 || metaWindow.is_maximized()) { inset = 0; } @@ -1506,9 +1504,7 @@ export class WindowManager extends GObject.Object { { name: "window-create-queue", callback: () => { - metaWindow.unmaximize(Meta.MaximizeFlags.HORIZONTAL); - metaWindow.unmaximize(Meta.MaximizeFlags.VERTICAL); - metaWindow.unmaximize(Meta.MaximizeFlags.BOTH); + metaWindow.unmaximize(); this.renderTree("window-create", true); }, }, @@ -1727,7 +1723,7 @@ export class WindowManager extends GObject.Object { this._handleMoving(focusNodeWindow); } } else { - if (focusMetaWindow.get_maximized() === 0) { + if (!focusMetaWindow.is_maximized()) { this.renderTree(from); } } @@ -1765,9 +1761,7 @@ export class WindowManager extends GObject.Object { let monWsNoMaxWindows = activeWsNode.getNodeByType(NODE_TYPES.MONITOR).filter((monitor) => { return ( monitor.getNodeByType(NODE_TYPES.WINDOW).filter((w) => { - return ( - w.nodeValue.get_maximized() === Meta.MaximizeFlags.BOTH || w.nodeValue.is_fullscreen() - ); + return w.nodeValue.is_maximized() || w.nodeValue.is_fullscreen(); }).length === 0 ); }); From ce1080442a17dea54ab665a40e5a29ee4853538c Mon Sep 17 00:00:00 2001 From: Eskander Bejaoui Date: Sat, 13 Sep 2025 21:20:58 +0100 Subject: [PATCH 2/6] Update shell-version to support GNOME 49 Changes are not backward compatible. --- metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metadata.json b/metadata.json index d975ab0..463a67e 100644 --- a/metadata.json +++ b/metadata.json @@ -4,7 +4,7 @@ "gettext-domain": "forge", "uuid": "forge@jmmaranan.com", "settings-schema": "org.gnome.shell.extensions.forge", - "shell-version": ["45", "46", "47", "48"], + "shell-version": ["49"], "session-modes": ["user", "unlock-dialog"], "url": "https://github.com/forge-ext/forge" } From 50143404fd8e9e97b57c158b29059ae21e38af92 Mon Sep 17 00:00:00 2001 From: Eskander Bejaoui Date: Mon, 15 Sep 2025 21:57:59 +0100 Subject: [PATCH 3/6] Restore pre-GNOME 49 compatibility --- lib/extension/window.js | 58 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/lib/extension/window.js b/lib/extension/window.js index 7b8762f..058e6f3 100644 --- a/lib/extension/window.js +++ b/lib/extension/window.js @@ -951,7 +951,15 @@ export class WindowManager extends GObject.Object { move(metaWindow, rect) { if (!metaWindow) return; if (metaWindow.grabbed) return; - metaWindow.unmaximize(); + try { + // GNOME 49+ + metaWindow.unmaximize(); + } catch (e) { + // pre-49 fallback + metaWindow.unmaximize(Meta.MaximizeFlags.HORIZONTAL); + metaWindow.unmaximize(Meta.MaximizeFlags.VERTICAL); + metaWindow.unmaximize(Meta.MaximizeFlags.BOTH); + } let windowActor = metaWindow.get_compositor_private(); if (!windowActor) return; @@ -1233,7 +1241,13 @@ export class WindowManager extends GObject.Object { let tilingModeEnabled = this.ext.settings.get_boolean("tiling-mode-enabled"); let gap = this.calculateGaps(nodeWindow); let maximized = () => { - return metaWindow.is_maximized() || metaWindow.is_fullscreen() || gap === 0; + try { + // GNOME 49+ + return metaWindow.is_maximized() || metaWindow.is_fullscreen() || gap === 0; + } catch (e) { + // pre-49 fallback + return metaWindow.get_maximized() === 3 || metaWindow.is_fullscreen() || gap === 0; + } }; let monitorCount = global.display.get_n_monitors(); let tiledChildren = this.tree.getTiledChildren(nodeWindow.parentNode.childNodes); @@ -1285,7 +1299,15 @@ export class WindowManager extends GObject.Object { } } - if (gap === 0 || metaWindow.is_maximized()) { + if (gap === 0 || (() => { + try { + // GNOME 49+ + return metaWindow.is_maximized(); + } catch (e) { + // pre-49 fallback + return metaWindow.get_maximized() === 1 || metaWindow.get_maximized() === 2; + } + })()) { inset = 0; } @@ -1504,7 +1526,15 @@ export class WindowManager extends GObject.Object { { name: "window-create-queue", callback: () => { - metaWindow.unmaximize(); + try { + // GNOME 49+ + metaWindow.unmaximize(); + } catch (e) { + // pre-49 fallback + metaWindow.unmaximize(Meta.MaximizeFlags.HORIZONTAL); + metaWindow.unmaximize(Meta.MaximizeFlags.VERTICAL); + metaWindow.unmaximize(Meta.MaximizeFlags.BOTH); + } this.renderTree("window-create", true); }, }, @@ -1723,7 +1753,15 @@ export class WindowManager extends GObject.Object { this._handleMoving(focusNodeWindow); } } else { - if (!focusMetaWindow.is_maximized()) { + if ((() => { + try { + // GNOME 49+ + return !focusMetaWindow.is_maximized(); + } catch (e) { + // pre-49 fallback + return focusMetaWindow.get_maximized() === 0; + } + })()) { this.renderTree(from); } } @@ -1761,7 +1799,15 @@ export class WindowManager extends GObject.Object { let monWsNoMaxWindows = activeWsNode.getNodeByType(NODE_TYPES.MONITOR).filter((monitor) => { return ( monitor.getNodeByType(NODE_TYPES.WINDOW).filter((w) => { - return w.nodeValue.is_maximized() || w.nodeValue.is_fullscreen(); + return (() => { + try { + // GNOME 49+ + return w.nodeValue.is_maximized() || w.nodeValue.is_fullscreen(); + } catch (e) { + // pre-49 fallback + return w.nodeValue.get_maximized() === Meta.MaximizeFlags.BOTH || w.nodeValue.is_fullscreen(); + } + })(); }).length === 0 ); }); From fbd196f70ee70f69941b9c967dc436f144a6f83a Mon Sep 17 00:00:00 2001 From: Eskander Bejaoui Date: Mon, 15 Sep 2025 22:01:26 +0100 Subject: [PATCH 4/6] Restore backwards compatibility --- metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metadata.json b/metadata.json index 463a67e..d9c4f4b 100644 --- a/metadata.json +++ b/metadata.json @@ -4,7 +4,7 @@ "gettext-domain": "forge", "uuid": "forge@jmmaranan.com", "settings-schema": "org.gnome.shell.extensions.forge", - "shell-version": ["49"], + "shell-version": ["45", "46", "47", "48", "49"], "session-modes": ["user", "unlock-dialog"], "url": "https://github.com/forge-ext/forge" } From 4c297b5022e728a5181deff93f134df61d29d046 Mon Sep 17 00:00:00 2001 From: Eskander Bejaoui Date: Mon, 15 Sep 2025 23:46:17 +0100 Subject: [PATCH 5/6] Add missed compatibility check --- lib/extension/window.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/extension/window.js b/lib/extension/window.js index 058e6f3..62cefde 100644 --- a/lib/extension/window.js +++ b/lib/extension/window.js @@ -953,6 +953,7 @@ export class WindowManager extends GObject.Object { if (metaWindow.grabbed) return; try { // GNOME 49+ + metaWindow.set_unmaximize_flags(Meta.MaximizeFlags.BOTH); metaWindow.unmaximize(); } catch (e) { // pre-49 fallback @@ -1528,6 +1529,7 @@ export class WindowManager extends GObject.Object { callback: () => { try { // GNOME 49+ + metaWindow.set_unmaximize_flags(Meta.MaximizeFlags.BOTH); metaWindow.unmaximize(); } catch (e) { // pre-49 fallback @@ -2450,7 +2452,15 @@ export class WindowManager extends GObject.Object { } this._grabCleanup(focusNodeWindow); - if (focusMetaWindow.get_maximized() === 0) { + if ((() => { + try { + // GNOME 49+ + return !focusMetaWindow.is_maximized(); + } catch (e) { + // pre-49 fallback + return focusMetaWindow.get_maximized() === 0; + } + })()) { this.renderTree("grab-op-end"); } From 47dadc767be19b951200dc5ee278dd8447bb8917 Mon Sep 17 00:00:00 2001 From: Eskander Bejaoui Date: Tue, 16 Sep 2025 21:36:52 +0100 Subject: [PATCH 6/6] Fix formatting --- lib/extension/window.js | 66 ++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/lib/extension/window.js b/lib/extension/window.js index 62cefde..24356f5 100644 --- a/lib/extension/window.js +++ b/lib/extension/window.js @@ -1300,15 +1300,18 @@ export class WindowManager extends GObject.Object { } } - if (gap === 0 || (() => { - try { - // GNOME 49+ - return metaWindow.is_maximized(); - } catch (e) { - // pre-49 fallback - return metaWindow.get_maximized() === 1 || metaWindow.get_maximized() === 2; - } - })()) { + if ( + gap === 0 || + (() => { + try { + // GNOME 49+ + return metaWindow.is_maximized(); + } catch (e) { + // pre-49 fallback + return metaWindow.get_maximized() === 1 || metaWindow.get_maximized() === 2; + } + })() + ) { inset = 0; } @@ -1755,15 +1758,17 @@ export class WindowManager extends GObject.Object { this._handleMoving(focusNodeWindow); } } else { - if ((() => { - try { - // GNOME 49+ - return !focusMetaWindow.is_maximized(); - } catch (e) { - // pre-49 fallback - return focusMetaWindow.get_maximized() === 0; - } - })()) { + if ( + (() => { + try { + // GNOME 49+ + return !focusMetaWindow.is_maximized(); + } catch (e) { + // pre-49 fallback + return focusMetaWindow.get_maximized() === 0; + } + })() + ) { this.renderTree(from); } } @@ -1807,7 +1812,10 @@ export class WindowManager extends GObject.Object { return w.nodeValue.is_maximized() || w.nodeValue.is_fullscreen(); } catch (e) { // pre-49 fallback - return w.nodeValue.get_maximized() === Meta.MaximizeFlags.BOTH || w.nodeValue.is_fullscreen(); + return ( + w.nodeValue.get_maximized() === Meta.MaximizeFlags.BOTH || + w.nodeValue.is_fullscreen() + ); } })(); }).length === 0 @@ -2452,15 +2460,17 @@ export class WindowManager extends GObject.Object { } this._grabCleanup(focusNodeWindow); - if ((() => { - try { - // GNOME 49+ - return !focusMetaWindow.is_maximized(); - } catch (e) { - // pre-49 fallback - return focusMetaWindow.get_maximized() === 0; - } - })()) { + if ( + (() => { + try { + // GNOME 49+ + return !focusMetaWindow.is_maximized(); + } catch (e) { + // pre-49 fallback + return focusMetaWindow.get_maximized() === 0; + } + })() + ) { this.renderTree("grab-op-end"); }