Review of "Shatter Shell" version 2.4.1 (2)

Details Page Preview

Tiling window management for GNOME: a fork of Pop!_OS Shell. Shatter Shell is a keyboard-driven layer for GNOME Shell which allows for quick and sensible navigation and management of windows. The core feature of Shatter Shell is the addition of advanced tiling window management — a feature that has been highly sought within our community. For many — ourselves included — i3wm has become the leading competitor to the GNOME desktop. Tiling window management in GNOME is virtually nonexistent, which makes the desktop awkward to interact with when your needs exceed that of two windows at a given time. Luckily, GNOME Shell is an extensible desktop with the foundations that make it possible to implement a tiling window manager on top of the desktop. Therefore, we see an opportunity here to advance the usability of the GNOME desktop to better accommodate the needs of our community with Shatter Shell. Advanced tiling window management is a must for the desktop, so we've merged i3-like tiling window management with the GNOME desktop for the best of both worlds.

Extension Homepage
https://github.com/adil192/shatter-shell/

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 5

Shexli found 6 issues that may need reviewer attention.

EGO-X-004 warning

extensions should avoid synchronous file IO in shell code

Shell code should avoid synchronous file IO APIs like `GLib.file_get_contents()` and `Gio.File.load_contents()`.

File Operations

  • config.js:187
    file.value.load_contents(null)

EGO-P-007 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

  • color_dialog/main.js
  • error.js
  • floating_exceptions/main.js
  • shortcuts_dialog/adjustment_mode_page.js
  • shortcuts_dialog/main.js
  • shortcuts_dialog/manipulate_window_page.js
  • shortcuts_dialog/shortcut_label.js
  • shortcuts_dialog/welcome_page.js
  • shortcuts_dialog/workspaces_and_displays_page.js

EGO-L-001 warning

extension must not create GObject instances or modify shell before enable()

Resource creation or signal/source setup was found outside `enable()`.

Only use initialization for static resources

  • extension.js:161
                this.settings.int.connect('changed::gtk-theme', () => {
                    this.register(Events.global(GlobalEvent.GtkThemeChanged));
                })
  • extension.js:166
                this.settings.shell.connect('changed::name', () => {
                    this.register(Events.global(GlobalEvent.GtkShellChanged));
                })
  • extension.js:2001
    id = actor.connect('first-frame', () => {
                        this.auto_tiler?.auto_tile(this, win, this.init);
                        grab_focus();
                        actor.disconnect(id);
                    })
  • extension.js:2001
    actor.connect('first-frame', () => {
                        this.auto_tiler?.auto_tile(this, win, this.init);
                        grab_focus();
                        actor.disconnect(id);
                    })
  • extension.js:1738
            GLib.timeout_add(GLib.PRIORITY_DEFAULT, 20, () => {
                if (this.movements.is_empty()) {
                    func();
                    return GLib.SOURCE_REMOVE;
                }
                else {
                    return GLib.SOURCE_CONTINUE;
                }
            })
  • extension.js:483
            GLib.timeout_add(GLib.PRIORITY_LOW, 100, () => {
                this.exception_selecting = true;
                overview.show(ControlsState.WINDOW_PICKER);
                return GLib.SOURCE_REMOVE;
            })

EGO-L-004 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

  • extension.js:1374
            GLib.timeout_add(GLib.PRIORITY_LOW, 50, () => {
                if (this.auto_tiler) {
                    for (const container of this.auto_tiler.forest.stacks.values()) {
                        container.restack();
                    }
                }
                const x = attempts;
                attempts +
  • extension.js:1738
            GLib.timeout_add(GLib.PRIORITY_DEFAULT, 20, () => {
                if (this.movements.is_empty()) {
                    func();
                    return GLib.SOURCE_REMOVE;
                }
                else {
                    return GLib.SOURCE_CONTINUE;
                }
            })
  • extension.js:483
            GLib.timeout_add(GLib.PRIORITY_LOW, 100, () => {
                this.exception_selecting = true;
                overview.show(ControlsState.WINDOW_PICKER);
                return GLib.SOURCE_REMOVE;
            })

EGO-M-004 error

metadata shell-version must only include plausible stable releases and at most one development release

Field `shell-version` contains invalid values, more than one development release, or implausible future releases.

metadata.json must be well-formed

  • metadata.json
    shell-version=['48', '49', '50', '51']

EGO-C45-001 warning

45+ preferences should use fillPreferencesWindow instead of getPreferencesWidget

45+ preferences code should use `fillPreferencesWindow()` instead of `getPreferencesWidget()`.

Preferences

  • prefs.js:9
        getPreferencesWidget() {
            globalThis.shatterShellExtension = this;
            const dialog = settings_dialog_new();
            dialog.show();
            log.debug(JSON.stringify(dialog));
            return dialog;
        }

All Versions

Version Status
2.4.1 (2) Unreviewed
2.4.0 (1) Rejected