Review of "Logo Menu" version 24.6 (41)

Details Page Preview

Logo Menu - Menu similar to Apple's macOS menu for the GNOME Desktop This extension gives a simple menu along with the ability to get the icon of your distro on top left part of the panel for a great look. The Icon can be customised through settings, it has both Linux and BSD logos. For more screenshots, visit GitHub. The 'Activities' indicator is hidden by default but can be enabled through settings. The default Terminal and Software centre can also be changed. Force Quit works on Wayland and Xorg

Extension Homepage
https://github.com/Aryan20/Logomenu

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) warning 3

Shexli found 3 issues that may need reviewer attention.

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

  • selection.js:58
            this._areaSelection = new St.Widget({
                name: 'area-selection',
                style_class: 'area-selection',
                visible: 'true',
                reactive: 'true',
                x: -10,
                y: -10,
            })

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

  • extension.js:31
    this._settings = extension.getSettings()
  • selection.js:58
            this._areaSelection = new St.Widget({
                name: 'area-selection',
                style_class: 'area-selection',
                visible: 'true',
                reactive: 'true',
                x: -10,
                y: -10,
            })

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

  • selection.js:72
                this._signalCapturedEvent = this._areaSelection.connect(
                    'captured-event',
                    this._onCaptureEvent.bind(this)
                )
  • selection.js:134
    this._capture.connect('captured-event', this._onEvent.bind(this))
  • selection.js:135
            this._capture.connect('stop', () => {
                this.emit('stop');
            })

All Versions

Version Status
24.6 (41) Active
24.6 (40) Rejected
24.4 (39) Active
24.2 (38) Active
24.0 (37) Active
23.6 (36) Active
23.4 (35) Active
23.2 (34) Active
23.2 (33) Rejected
23.0 (32) Active
22.8 (31) Active
22.6 (30) Active
22.4 (29) Active
22.2 (28) Active
22 (27) Active
21.8 (26) Active
21.6 (25) Active
20.legacy (24) Active
21.4 (23) Active
19.legacy (22) Active
21 Active
20 Active
19 Active
18 Active
17 Rejected
16 Active
15 Active
14 Inactive
13 Active
12 Rejected
11 Active
10 Active
9 Active
8 Active
7 Active
6 Active
5 Active
4 Active
3 Active
2 Active
1 Rejected

Previous Reviews on this Version

Aryan Kaushik posted a review
I'd like to address each warning against selection.js, as I believe the static analyser is flagging patterns that are already correctly handled at runtime. **EGO-L-002 / EGO-L-005 — `_areaSelection` (selection.js:58)** The `_areaSelection` widget is always destroyed via `_stop()`, which calls `this._areaSelection.destroy()` before nulling and removing it from the UI group. `_stop()` is reached through every exit path — Escape key, left click (kill + stop), and right click — and is also the place where the grab and signal are cleaned up. This widget is intentionally scoped to the lifetime of a single `Capture` instance, not to `enable()`/`disable()`. Treating it as an extension-level owned object would be incorrect. **EGO-L-003 — `_signalCapturedEvent` (selection.js:72)** This signal is explicitly disconnected at the top of `_stop()` via `this._areaSelection.disconnect(this._signalCapturedEvent)`, before the widget is destroyed. **EGO-L-003 — `_capture.connect(...)` (selection.js:134–135)** `_capture` is a `Signals.EventEmitter`, not a GObject. Its `_stop()` method calls `this.disconnectAll()` on the emitter itself, which severs all listeners, including the two connected by `SelectionWindow`. Additionally, `SelectionWindow` is a short-lived, fire-and-forget object instantiated on demand — it has no persistent presence across `enable()`/`disable()` cycles and holds no reference in the extension's own state. **EGO-L-005 — `this._settings` (extension.js:31)** This was a valid concern and has already been addressed in the latest submission: `MenuButton` now connects a `destroy` handler that sets `this._settings = null`, and `LogoMenu.disable()` sets `this.settings = null` after destroying the indicator. I'm happy to discuss further if there's a specific scenario the reviewer believes these patterns don't cover.
SriramRamkrishna active