Extend Gnome Shell with advanced tiling window management. Supports multiple monitors, Windows 11 Snap Assistant, Fancy Zones, automatic tiling, keyboard shortcuts, customised tiling layouts and more!
Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.
EGO025 warning
unnecessary build and translation artifacts should not be shipped
Compiled GSettings schemas should not be shipped for 45+ packages.
Don't include unnecessary files
schemas/gschemas.compiled
schemas/gschemas.compiled
EGO026 warning
JavaScript files should be reachable from extension.js or prefs.js
Some JavaScript files are not reachable from `extension.js` or `prefs.js` imports.
Don't include unnecessary files
components/tilepreview/blurTilePreview.js
components/tilingsystem/extendedWindow.js
indicator/currentMenu.js
EGO014 warning
objects created by extension should be destroyed in disable()
Objects assigned in `enable()` are missing matching `.destroy()` calls in `disable()` or its helper methods.
components/altTab/MultipleWindowsIcon.js:41
this._label = new St.Label({
text: _("Tiled windows")
})
components/altTab/tilePreviewWithWindow.js:12
this._gaps = new Clutter.Margin()
components/editor/editableTilePreview.js:21
this._btn = new St.Button({
styleClass: "editable-tile-preview-button",
xExpand: true,
trackHover: true
})
components/editor/editorDialog.js:42
this._layoutsBoxLayout = new St.BoxLayout({
styleClass: "layouts-box-layout",
xAlign: Clutter.ActorAlign.CENTER
})
components/snapassist/snapAssistTileButton.js:8
this._btn = new St.Button({
xExpand: true,
yExpand: true,
trackHover: true
})
components/windowsSuggestions/suggestedWindowPreview.js:40
this._previewContainer = new St.Widget({
style_class: "popup-window-preview-container",
pivot_point: new Graphene.Point({ x: 0.5, y: 0.5 }),
layoutManager: new Clutter.BinLayout(),
xAlign: Clutter.ActorAlign.CENTER
})
components/windowsSuggestions/suggestionsTilePreview.js:37
this._scrollView = new St.ScrollView({
style_class: "vfade",
vscrollbar_policy: St.PolicyType.AUTOMATIC,
hscrollbar_policy: St.PolicyType.NEVER,
overlay_scrollbars: true,
clip_to_allocation: true,
// Ensure clipping
x_expand: true,
y_expand: true
components/windowsSuggestions/suggestionsTilePreview.js:30
this.layout_manager = new Clutter.BinLayout()
indicator/defaultMenu.js:133
this._container = new St.BoxLayout({
xAlign: Clutter.ActorAlign.CENTER,
yAlign: Clutter.ActorAlign.CENTER,
xExpand: true,
yExpand: true,
styleClass: "default-menu-container",
...widgetOrientation(true)
})
EGO027 warning
owned object references should be released in disable()
Owned references that are cleaned up in `disable()` should also be released with `null` or `undefined`.
components/altTab/MultipleWindowsIcon.js:41
this._label = new St.Label({
text: _("Tiled windows")
})
components/altTab/tilePreviewWithWindow.js:12
this._gaps = new Clutter.Margin()
components/editor/editableTilePreview.js:21
this._btn = new St.Button({
styleClass: "editable-tile-preview-button",
xExpand: true,
trackHover: true
})
components/editor/editorDialog.js:42
this._layoutsBoxLayout = new St.BoxLayout({
styleClass: "layouts-box-layout",
xAlign: Clutter.ActorAlign.CENTER
})
components/snapassist/snapAssistTileButton.js:8
this._btn = new St.Button({
xExpand: true,
yExpand: true,
trackHover: true
})
components/windowBorder/windowBorderManager.js:15
this._interfaceSettings = new Gio.Settings({
schema_id: "org.gnome.desktop.interface"
})
components/windowsSuggestions/suggestedWindowPreview.js:40
this._previewContainer = new St.Widget({
style_class: "popup-window-preview-container",
pivot_point: new Graphene.Point({ x: 0.5, y: 0.5 }),
layoutManager: new Clutter.BinLayout(),
xAlign: Clutter.ActorAlign.CENTER
})
components/windowsSuggestions/suggestionsTilePreview.js:37
this._scrollView = new St.ScrollView({
style_class: "vfade",
vscrollbar_policy: St.PolicyType.AUTOMATIC,
hscrollbar_policy: St.PolicyType.NEVER,
overlay_scrollbars: true,
clip_to_allocation: true,
// Ensure clipping
x_expand: true,
y_expand: true
components/windowsSuggestions/suggestionsTilePreview.js:30
this.layout_manager = new Clutter.BinLayout()
indicator/defaultMenu.js:133
this._container = new St.BoxLayout({
xAlign: Clutter.ActorAlign.CENTER,
yAlign: Clutter.ActorAlign.CENTER,
xExpand: true,
yExpand: true,
styleClass: "default-menu-container",
...widgetOrientation(true)
})
EGO015 warning
signals connected by extension should be disconnected in disable()
Signals assigned in `enable()` are missing matching disconnect calls in `disable()` or its helper methods.
components/editor/editorDialog.js:284
btn.connect("clicked", () => {
params.onSelectLayout(btnInd, lay);
this._makeLegendDialog({
onClose: params.onClose,
path: params.path
});
})
components/editor/editorDialog.js:317
newLayoutBtn.connect("clicked", () => {
params.onNewLayout();
this._makeLegendDialog({
onClose: params.onClose,
path: params.path
});
})
components/editor/editorDialog.js:254
deleteBtn.connect("clicked", () => {
params.onDeleteLayout(btnInd, lay);
this._drawLayouts({
...params,
layouts: GlobalState.get().layouts
});
})
components/editor/editorDialog.js:234
moveLeftBtn.connect("clicked", () => {
params.onReorderLayout(btnInd, btnInd - 1);
this._drawLayouts({
...params,
layouts: GlobalState.get().layouts
});
})
components/editor/editorDialog.js:274
moveRightBtn.connect("clicked", () => {
params.onReorderLayout(btnInd, btnInd + 1);
this._drawLayouts({
...params,
layouts: GlobalState.get().layouts
});
})
components/editor/layoutEditor.js:158
editableTile.connect("clicked", (_, clicked_button) => {
if (clicked_button === St.ButtonMask.ONE)
this.splitTile(editableTile);
else if (clicked_button === 3) this.deleteTile(editableTile);
})
components/editor/layoutEditor.js:163
editableTile.connect("motion-event", (_, event) => {
const [stageX, stageY] = getEventCoords(event);
this._hoverWidget.handleMouseMove(
editableTile,
stageX - this.x,
stageY - this.y
);
return Clutter.EVENT_PROPAGATE;
})
components/editor/layoutEditor.js:172
editableTile.connect("notify::hover", () => {
const [stageX, stageY] = Shell.Global.get().get_pointer();
this._hoverWidget.handleMouseMove(
editableTile,
stageX - this.x,
stageY - this.y
);
})
components/raiseTogether/raiseTogetherManager.js:16
this._signals.connect(Settings, Settings.KEY_RAISE_TOGETHER, () => {
if (Settings.RAISE_TOGETHER) this._turnOn();
else this._turnOff();
})
components/raiseTogether/raiseTogetherManager.js:34
this._signals.connect(
global.display,
"window-created",
(_display, window) => {
this._connectRaisedSignal(window);
}
)
components/raiseTogether/raiseTogetherManager.js:54
window.connect("unmanaged", () => {
delete this._raiseId[window.get_id()];
})
components/snapassist/snapAssist.js:69
this._signals.connect(
St.ThemeContext.get_for_stage(global.get_stage()),
"changed",
() => {
this._applyStyle();
}
)
components/snapassist/snapAssist.js:77
this._signals.connect(
GlobalState.get(),
GlobalState.SIGNAL_LAYOUTS_CHANGED,
() => {
this._setLayouts(GlobalState.get().layouts);
}
)
components/snapassist/snapAssistTileButton.js:15
this._btn.connect(
"notify::hover",
() => this.set_hover(this._btn.hover)
)
components/tilingsystem/resizeManager.js:126
this._signals.connect(
window,
"size-changed",
this._onResizingWindow.bind(
this,
window,
window.get_frame_rect().copy(),
verticalSide[1],
horizontalSide[1],
windowsToResize
)
)
components/tilingsystem/resizeManager.js:15
this._signals.connect(
global.display,
"grab-op-begin",
(_display, window, grabOp) => {
const moving = grabOp === Meta.GrabOp.KEYBOARD_MOVING || grabOp === Meta.GrabOp.MOVING;
if (moving || !Settings.RESIZE_COMPLEMENTING_WINDOWS) return;
this._onWindowRe
components/tilingsystem/resizeManager.js:24
this._signals.connect(
global.display,
"grab-op-end",
(_display, window, grabOp) => {
const moving = grabOp === Meta.GrabOp.KEYBOARD_MOVING || grabOp === Meta.GrabOp.MOVING;
if (moving) return;
this._onWindowResizingEnd(window);
}
)
components/tilingsystem/tilingManager.js:138
this._signals.connect(
Settings,
Settings.KEY_SETTING_SELECTED_LAYOUTS,
() => {
const ws = global.workspaceManager.get_active_workspace();
if (!ws) return;
const layout = GlobalState.get().getSelectedLayoutOfMonitor(
this._monitor.index,
components/tilingsystem/tilingManager.js:151
this._signals.connect(
GlobalState.get(),
GlobalState.SIGNAL_LAYOUTS_CHANGED,
() => {
const ws = global.workspaceManager.get_active_workspace();
if (!ws) return;
const layout = GlobalState.get().getSelectedLayoutOfMonitor(
this._monitor.index,
components/tilingsystem/tilingManager.js:164
this._signals.connect(Settings, Settings.KEY_INNER_GAPS, () => {
const innerGaps = buildMargin(Settings.get_inner_gaps());
this._workspaceTilingLayout.forEach(
(tilingLayout) => tilingLayout.relayout({ innerGaps })
);
})
components/tilingsystem/tilingManager.js:170
this._signals.connect(Settings, Settings.KEY_OUTER_GAPS, () => {
const outerGaps = buildMargin(Settings.get_outer_gaps());
this._workspaceTilingLayout.forEach(
(tilingLayout) => tilingLayout.relayout({ outerGaps })
);
})
components/tilingsystem/tilingManager.js:176
this._signals.connect(
global.display,
"grab-op-begin",
(_display, window, grabOp) => {
const moving = (grabOp & ~1024) === 1;
if (!moving) return;
this._onWindowGrabBegin(window, grabOp);
}
)
components/tilingsystem/tilingManager.js:185
this._signals.connect(
global.display,
"grab-op-end",
(_display, window) => {
if (!this._isGrabbingWindow) return;
this._onWindowGrabEnd(window);
}
)
components/tilingsystem/tilingManager.js:193
this._signals.connect(
this._snapAssist,
"snap-assist",
this._onSnapAssist.bind(this)
)
components/tilingsystem/tilingManager.js:198
this._signals.connect(
global.workspaceManager,
"active-workspace-changed",
() => {
const ws = global.workspaceManager.get_active_workspace();
if (this._workspaceTilingLayout.has(ws)) return;
const monitorScalingFactor = this._enableScaling ? getMonitorS
components/tilingsystem/tilingManager.js:224
this._signals.connect(
global.workspaceManager,
"workspace-removed",
(_) => {
const newMap = /* @__PURE__ */ new Map();
const n_workspaces = global.workspaceManager.get_n_workspaces();
for (let i = 0; i < n_workspaces; i++) {
const ws = global.
components/tilingsystem/tilingManager.js:246
this._signals.connect(
global.display,
"window-created",
(_display, window) => {
if (Settings.ENABLE_AUTO_TILING) this._autoTile(window, true);
}
)
components/tilingsystem/tilingManager.js:253
this._signals.connect(
TilingShellWindowManager.get(),
"unmaximized",
(_, window) => {
if (Settings.ENABLE_AUTO_TILING) this._autoTile(window, false);
}
)
components/tilingsystem/tilingManager.js:260
this._signals.connect(
TilingShellWindowManager.get(),
"maximized",
(_, window) => {
delete window.assignedTile;
}
)
components/tilingsystem/tilingManager.js:395
this._signals.connect(
global.stage,
"touch-event",
(_source, event) => {
const [x, y] = event.get_coords();
TouchPointer.get().onTouchEvent(x, y);
}
)
components/tilingsystem/tilingManager.js:403
this._signals.connect(
global.stage,
"captured-event",
(_source, event) => {
const device = event.get_source_device();
if (!device) return;
const deviceType = device.get_device_type();
if (deviceType === Clutter.InputDeviceType.TABLET_DEVICE || d
components/tilingsystem/tilingManager.js:422
this._signals.connect(window, "position-changed", () => {
if (Settings.ENABLE_BLUR_SELECTED_TILEPREVIEW) {
this._selectedTilesPreview.get_effect("blur")?.queue_repaint();
}
if (Settings.ENABLE_BLUR_SNAP_ASSISTANT) {
this._snapAssist.get_first_child()
components/windowBorder/windowBorder.js:100
this._signals.connect(global.display, "restacked", () => {
this.queue_repaint();
global.windowGroup.set_child_above_sibling(this, null);
})
components/windowBorder/windowBorder.js:104
this._signals.connect(this._window, "position-changed", () => {
if (this._window.maximizedVertically || this._window.maximizedHorizontally || this._window.minimized || this._window.is_fullscreen()) {
this.remove_all_transitions();
this.close();
return;
}
components/windowBorder/windowBorder.js:125
this._signals.connect(this._window, "size-changed", () => {
if (this._window.maximizedVertically || this._window.maximizedHorizontally || this._window.minimized || this._window.is_fullscreen()) {
this.remove_all_transitions();
this.close();
return;
}
if
components/windowBorder/windowBorderManager.js:22
this._signals.connect(
Settings,
Settings.KEY_ENABLE_WINDOW_BORDER,
() => {
if (Settings.ENABLE_WINDOW_BORDER) this._turnOn();
else this._turnOff();
}
)
components/windowBorder/windowBorderManager.js:34
this._signals.connect(
global.display,
"notify::focus-window",
this._onWindowFocused.bind(this)
)
components/windowBorder/windowBorderManager.js:39
this._signals.connect(
Settings,
Settings.KEY_WINDOW_BORDER_COLOR,
() => this._border?.updateStyle()
)
components/windowBorder/windowBorderManager.js:44
this._signals.connect(
Settings,
Settings.KEY_WINDOW_USE_CUSTOM_BORDER_COLOR,
() => this._border?.updateStyle()
)
components/windowBorder/windowBorderManager.js:53
this._signals.connect(
Settings,
Settings.KEY_WINDOW_BORDER_WIDTH,
() => this._border?.updateStyle()
)
components/windowBorder/windowBorderManager.js:49
this._interfaceSettings.connect(
"changed::accent-color",
() => this._border?.updateStyle()
)
components/windowManager/tilingShellWindowManager.js:48
this._signals.connect(
global.display,
"window-created",
(_, window) => {
window.__ts_cached = new CachedWindowProperties(window, this);
}
)
components/windowManager/tilingShellWindowManager.js:55
this._signals.connect(
global.windowManager,
"minimize",
(_, actor) => {
actor.metaWindow.__ts_cached?.update(
actor.metaWindow,
this
);
}
)
components/windowManager/tilingShellWindowManager.js:65
this._signals.connect(
global.windowManager,
"unminimize",
(_, actor) => {
actor.metaWindow.__ts_cached?.update(
actor.metaWindow,
this
);
}
)
components/windowManager/tilingShellWindowManager.js:75
this._signals.connect(
global.windowManager,
"size-changed",
(_, actor) => {
actor.metaWindow.__ts_cached?.update(
actor.metaWindow,
this
);
}
)
extension.js:125
this._signals.connect(
Main.layoutManager,
"startup-complete",
() => {
this._createTilingManagers();
this._setupSignals();
}
)
extension.js:170
this._signals.connect(global.display, "workareas-changed", () => {
const allMonitors = getMonitors();
if (this._tilingManagers.length !== allMonitors.length) {
GlobalState.get().validate_selected_layouts();
this._createTilingManagers();
} else {
this._ti
extension.js:181
this._signals.connect(
new Gio.Settings({ schema: "org.gnome.mutter" }),
"changed::experimental-features",
(_mutterSettings) => {
if (!_mutterSettings) return;
const fractionalScalingEnabled = this._isFractionalScalingEnabled(_mutterSettings);
if (this._
extension.js:203
this._signals.connect(
this._keybindings,
"move-window",
(kb, dp, dir) => {
this._onKeyboardMoveWin(dp, dir, false);
}
)
extension.js:210
this._signals.connect(
this._keybindings,
"span-window",
(kb, dp, dir) => {
this._onKeyboardMoveWin(dp, dir, true);
}
)
extension.js:217
this._signals.connect(
this._keybindings,
"span-window-all-tiles",
(kb, dp) => {
const window = dp.focus_window;
const monitorIndex = window.get_monitor();
const manager = this._tilingManagers[monitorIndex];
if (manager) manager.o
extension.js:227
this._signals.connect(
this._keybindings,
"untile-window",
this._onKeyboardUntileWindow.bind(this)
)
extension.js:232
this._signals.connect(
this._keybindings,
"move-window-center",
(kb, dp) => {
this._onKeyboardMoveWin(
dp,
KeyBindingsDirection.NODIRECTION,
false
);
}
)
extension.js:243
this._signals.connect(
this._keybindings,
"focus-window",
(kb, dp, dir) => {
this._onKeyboardFocusWin(dp, dir);
}
)
extension.js:250
this._signals.connect(
this._keybindings,
"focus-window-direction",
(kb, dp, dir) => {
this._onKeyboardFocusWinDirection(dp, dir);
}
)
extension.js:257
this._signals.connect(
this._keybindings,
"highlight-current-window",
(kb, dp) => {
const focus_window = dp.get_focus_window();
getWindows(
global.workspaceManager.get_active_workspace()
).forEach((win) => {
if (win
extension.js:274
this._signals.connect(
this._keybindings,
"cycle-layouts",
(kb, dp, currentAction, mask) => {
const backwardAction = kb.cycleLayoutsBackwardAction;
const switcher = new LayoutSwitcherPopup(
kb.cycleLayoutsAction,
backwardActio
extension.js:288
this._signals.connect(
Settings,
Settings.KEY_ACTIVE_SCREEN_EDGES,
() => {
const gioSettings = new Gio.Settings({
schemaId: "org.gnome.mutter"
});
if (Settings.ACTIVE_SCREEN_EDGES) {
debug("disable native edge tiling");
Sett
extension.js:311
this._signals.connect(
Settings,
Settings.KEY_OVERRIDE_WINDOW_MENU,
() => {
if (Settings.OVERRIDE_WINDOW_MENU)
OverriddenWindowMenu.enable();
else OverriddenWindowMenu.disable();
}
)
extension.js:320
this._signals.connect(
OverriddenWindowMenu,
"tile-clicked",
(_, tile, window) => {
const monitorIndex = window.get_monitor();
const manager = this._tilingManagers[monitorIndex];
if (manager) manager.onTileFromWindowMenu(tile, window);
}
)
extension.js:329
this._signals.connect(Settings, Settings.KEY_OVERRIDE_ALT_TAB, () => {
if (Settings.OVERRIDE_ALT_TAB) OverriddenAltTab.enable();
else OverriddenAltTab.disable();
})
indicator/defaultMenu.js:63
btn.connect(
"clicked",
() => !btn.checked && this.emit("selected-layout", lay.id)
)
indicator/defaultMenu.js:157
this._signals.connect(
Settings,
Settings.KEY_SETTING_LAYOUTS_JSON,
() => {
this._drawLayouts();
}
)
indicator/defaultMenu.js:164
this._signals.connect(Settings, Settings.KEY_INNER_GAPS, () => {
this._drawLayouts();
})
indicator/defaultMenu.js:167
this._signals.connect(
Settings,
Settings.KEY_SETTING_SELECTED_LAYOUTS,
() => {
this._updateScaling();
if (this._layoutsRows.length !== getMonitors().length)
this._drawLayouts();
const selected_layouts = Settings.get_selected_layouts();
indicator/defaultMenu.js:182
this._signals.connect(
global.workspaceManager,
"active-workspace-changed",
() => {
const selected_layouts = Settings.get_selected_layouts();
const wsIndex = global.workspaceManager.get_active_workspace_index();
getMonitors().forEach((m, index) => {
indicator/defaultMenu.js:194
this._signals.connect(Main.layoutManager, "monitors-changed", () => {
if (!enableScalingFactor) return;
const monitor = Main.layoutManager.findMonitorForActor(
this._container
);
const scalingFactor = getMonitorScalingFactor(
monitor?.index || Main.layoutM
indicator/defaultMenu.js:300
editLayoutsBtn.connect(
"clicked",
() => this._indicator.openLayoutEditor()
)
indicator/defaultMenu.js:310
newLayoutBtn.connect(
"clicked",
() => this._indicator.newLayoutOnClick(true)
)
indicator/defaultMenu.js:319
prefsBtn.connect("clicked", () => {
openPrefs();
this._indicator.menu.toggle();
})
indicator/defaultMenu.js:348
row.connect(
"selected-layout",
(r, layoutId) => {
this._indicator.selectLayoutOnClick(
monitor.index,
layoutId
);
}
)
indicator/editingMenu.js:22
openMenuBtn.connect("clicked", () => this._indicator.openMenu(false))
indicator/editingMenu.js:29
infoMenuBtn.connect("clicked", () => this._indicator.openMenu(true))
indicator/editingMenu.js:36
saveBtn.connect("clicked", () => {
this._indicator.menu.toggle();
this._indicator.saveLayoutOnClick();
})
indicator/editingMenu.js:46
cancelBtn.connect("clicked", () => {
this._indicator.menu.toggle();
this._indicator.cancelLayoutOnClick();
})
keybindings.js:29
this._signals.connect(
Settings,
Settings.KEY_ENABLE_MOVE_KEYBINDINGS,
() => {
this._setupKeyBindings(extensionSettings);
}
)
utils/globalState.js:113
this._signals.connect(
global.workspaceManager,
"workspace-removed",
() => {
const newMap = /* @__PURE__ */ new Map();
const n_workspaces = global.workspaceManager.get_n_workspaces();
const to_be_saved = [];
for (let i = 0; i < n_workspaces; i++)
utils/globalState.js:135
this._signals.connect(
global.workspaceManager,
"workspaces-reordered",
() => {
this._save_selected_layouts();
debug("reordered workspaces");
}
)
utils/globalState.js:46
this._signals.connect(
Settings,
Settings.KEY_SETTING_LAYOUTS_JSON,
() => {
this._layouts = Settings.get_layouts_json();
this.emit(_GlobalState.SIGNAL_LAYOUTS_CHANGED);
}
)
utils/globalState.js:54
this._signals.connect(
Settings,
Settings.KEY_SETTING_SELECTED_LAYOUTS,
() => {
const selected_layouts = Settings.get_selected_layouts();
if (selected_layouts.length === 0) {
this.validate_selected_layouts();
return;
}
const d
utils/globalState.js:78
this._signals.connect(
global.workspaceManager,
"workspace-added",
(_, index) => {
const n_workspaces = global.workspaceManager.get_n_workspaces();
const newWs = global.workspaceManager.get_workspace_by_index(index);
if (!newWs) return;
debug(`ad
EGO016 warning
main loop sources should be removed in disable()
Main loop sources assigned in `enable()` are missing matching removals in `disable()` or its helper methods.
components/editor/hoverLine.js:15
this._hoverTimer = GLib.timeout_add(
GLib.PRIORITY_DEFAULT_IDLE,
100,
this._handleModifierChange.bind(this)
)
components/windowBorder/windowBorder.js:161
this._timeout = setTimeout(() => {
this._computeBorderRadius(winActor).then(() => this.updateStyle());
if (this._timeout) clearTimeout(this._timeout);
this._timeout = void 0;
}, SMART_BORDER_RADIUS_FIRST_FRAME_DELAY)
EGO036 warning
extensions should not use lookupByURL or lookupByUUID for current extension access
Use `this`, `this.getSettings()` or `this.path` instead of `lookupByURL()` or `lookupByUUID()` for the current extension.
polyfill.js:7
Extension.lookupByUUID(
"tilingshell@ferrarodomenico.com"
)
EGO-C49-003 error
extensions targeting GNOME 49 must not call maximize or unmaximize with Meta.MaximizeFlags
This extension explicitly targets GNOME Shell 49 but still passes `Meta.MaximizeFlags` to `maximize()` or `unmaximize()`.
utils/gnomesupport.js:29
window.maximize(Meta.MaximizeFlags.BOTH)
utils/gnomesupport.js:33
window.unmaximize(Meta.MaximizeFlags.BOTH)
| Version | Status |
|---|---|
| 17.3 (76) | Active |
| 17.3 (75) | Rejected |
| 17.3 (74) | Rejected |
| 17.3 (73) | Rejected |
| 17.3 (72) | Active |
| 17.3 (71) | Active |
| 17.3 (70) | Rejected |
| 17.3 (69) | Inactive |
| 17.3 (68) | Inactive |
| 17.2 (67) | Active |
| 17.2 (66) | Active |
| 17.2 (65) | Rejected |
| 17.2 (64) | Rejected |
| 17.2 (63) | Rejected |
| 17.1 (62) | Active |
| 17.1 (61) | Active |
| 17.1 (60) | Rejected |
| 17.0 (59) | Active |
| 17.0 (58) | Active |
| 17.0 (57) | Inactive |
| 17.0 (56) | Rejected |
| 16.4 (55) | Active |
| 16.4 (54) | Active |
| 16.4 (53) | Rejected |
| 16.3 (52) | Inactive |
| 16.3 (51) | Active |
| 16.2 (50) | Active |
| 16.2 (49) | Active |
| 16.1 (48) | Active |
| 16.1 (47) | Active |
| 16.0 (46) | Inactive |
| 16.0 (45) | Inactive |
| 16.0 (44) | Inactive |
| 15.1 (43) | Active |
| 15.1 (42) | Active |
| 15.1 (41) | Rejected |
| 15.0 (40) | Active |
| 15.0 (39) | Active |
| 15.0 (38) | Rejected |
| 14.1 (37) | Active |
| 14.1 (36) | Active |
| 14.1 (35) | Rejected |
| 14 (34) | Active |
| 14 (33) | Active |
| 14 (32) | Inactive |
| 14 (31) | Rejected |
| 13.1 (30) | Active |
| 13.1 (29) | Active |
| 13.0 (28) | Active |
| 13.0 (27) | Active |
| 12.2 (26) | Active |
| 12.2 (25) | Active |
| 12.1 (24) | Active |
| 12.1 (23) | Active |
| 12 (22) | Active |
| 12 (21) | Active |
| 12 (20) | Inactive |
| 12 (19) | Inactive |
| 11.1 (18) | Active |
| 11.1 (17) | Active |
| 11 (16) | Active |
| 11 (15) | Active |
| 11 (14) | Rejected |
| 10.0 (13) | Active |
| 10.0 (12) | Active |
| 9.1 (11) | Active |
| 9.1 (10) | Active |
| 9.0 (9) | Active |
| 9.0 (8) | Active |
| 8.0 (7) | Active |
| 8.0 (6) | Active |
| 5 | Active |
| 4 | Active |
| 3 | Rejected |
| 2 | Inactive |
| 1 | Rejected |
Please check those Shexli suggestions
Hi, thanks! The actual change that I did was a one liner: adding GNOME 50 to metadata.json. The problem is that the diff is comparing the GNOME < 45 version with the one >= 45, so it is comparing the tons of the differences between the various versions, especially the changes in the import system. If you compare this update with the latest GNOME >= 45 version (72 to be precise) you will see the one liner change. I see the Shexli suggestions are related to previous uploaded code so I'm a bit confused now. What is the recommendation for the Shexli error "extensions targeting GNOME 49 must not call maximize or unmaximize with Meta.MaximizeFlags"? My code is doing `window.get_maximized ? window.unmaximize(Meta.MaximizeFlags.BOTH) : window.unmaximize();`. `get_maximized()` is removed in GNOME 49, this is why it is used in the check. Thanks
Sorry, I meant 71 and not 72.