Review of "Tiling Shell" version 17.3 (75)

Details Page Preview

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!

Extension Homepage
https://github.com/domferr/tilingshell

No comments.

Diff Against

Files

Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.

Shexli (experimental) error 1 warning 7

Shexli found 8 issues that may need reviewer attention.

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.

Destroy all objects

  • 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`.

Destroy all objects

  • 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.

Disconnect all signals

  • 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.

Remove main loop sources

  • 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.

`extensionUtils`

  • 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()`.

Meta.Window

  • utils/gnomesupport.js:29
    window.maximize(Meta.MaximizeFlags.BOTH)
  • utils/gnomesupport.js:33
    window.unmaximize(Meta.MaximizeFlags.BOTH)

All Versions

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

Previous Reviews on this Version

dlandau waiting for author
Please check those Shexli suggestions
domferr posted a review
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
domferr posted a review
Sorry, I meant 71 and not 72.
domferr auto- rejected
Auto-rejected because of new version 17.3 (76) was uploaded