Review of "Superbar" version 9

Details Page Preview

Superbar is a keyboard-driven, system-wide launcher and command bar for GNOME Shell. It reads the clipboard to provide clipboard history, forwards generic queries to GNOME application search providers enabled by the user, and sends user-entered weather locations, dictionary terms, and currency conversions to open-meteo.com, dictionaryapi.dev, and frankfurter.app.

Extension Homepage
https://github.com/Furkan-rgb/superbar

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 2 manual_review 1

Shexli found 3 issues that may need reviewer attention.

EGO-A-005 manual_review

extensions should not access the clipboard directly

Direct clipboard access via `St.Clipboard.get_default()` requires reviewer scrutiny.

Review Guidelines

  • extension.js:316
    St.Clipboard.get_default()

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

  • extension.js:514
        this._actionsHint = new St.BoxLayout({
          style_class: "spotlight-actions-hint",
          vertical: false,
          y_align: Clutter.ActorAlign.CENTER,
        })
  • extension.js:377
        this._contentLayer = new St.BoxLayout({
          style_class: "spotlight-content",
          vertical: true,
          x_expand: true,
          y_expand: true,
        })
  • extension.js:399
        this._entry = new St.Entry({
          hint_text: "Search",
          style_class: "spotlight-entry",
          can_focus: true,
          x_expand: true,
          y_align: Clutter.ActorAlign.CENTER,
        })
  • extension.js:509
        this._footer = new St.BoxLayout({
          style_class: "spotlight-footer",
          vertical: false,
          x_expand: true,
        })
  • extension.js:503
        this._footerDivider = new St.Widget({
          style_class: "spotlight-divider spotlight-footer-divider",
          x_expand: true,
        })
  • extension.js:535
        this._footerHints = new St.BoxLayout({
          style_class: "spotlight-footer-hints",
          vertical: false,
          x_align: Clutter.ActorAlign.END,
          y_align: Clutter.ActorAlign.CENTER,
        })
  • extension.js:532
    this._footerSpacer = new St.Widget({ x_expand: true })
  • extension.js:437
        this._headerDivider = new St.Widget({
          style_class: "spotlight-divider",
          x_expand: true,
        })
  • extension.js:372
        this._highlightLayer = new St.Widget({
          style_class: "spotlight-highlight",
          x_expand: true,
          y_expand: true,
        })
  • extension.js:393
        this._icon = new St.Icon({
          icon_name: "system-search-symbolic",
          style_class: "spotlight-icon",
          y_align: Clutter.ActorAlign.CENTER,
        })
  • extension.js:388
        this._inputRow = new St.BoxLayout({
          style_class: "spotlight-input-row",
          vertical: false,
        })
  • extension.js:367
        this._materialLayer = new St.Widget({
          style_class: "spotlight-material",
          x_expand: true,
          y_expand: true,
        })
  • extension.js:422
        this._modeDot = new St.Widget({
          style_class: "spotlight-mode-dot",
          y_align: Clutter.ActorAlign.CENTER,
        })
  • extension.js:410
        this._modeIndicator = new St.BoxLayout({
          style_class: "spotlight-mode-indicator",
          vertical: false,
          reactive: false,
          can_focus: false,
          y_align: Clutter.ActorAlign.CENTER,
        })
  • extension.js:417
        this._modeInner = new St.BoxLayout({
          style_class: "spotlight-mode-inner",
          vertical: false,
          y_align: Clutter.ActorAlign.CENTER,
        })
  • extension.js:443
        this._resultsBox = new St.BoxLayout({
          style_class: "spotlight-results-box",
          vertical: true,
          x_expand: true,
        })
  • extension.js:483
        this._resultsClip = new St.Widget({
          style_class: "spotlight-results-clip",
          layout_manager: new Clutter.BinLayout(),
          x_expand: true,
          clip_to_allocation: true,
        })
  • extension.js:472
        this._resultsScroll = new St.ScrollView({
          style_class: "spotlight-results-scroll",
          x_expand: true,
          overlay_scrollbars: true,
        })
  • extension.js:449
        this._statusBox = new St.BoxLayout({
          style_class: "spotlight-status",
          vertical: true,
          x_expand: true,
          y_expand: true,
          visible: false,
        })

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:1510
        this._clipboardPollId = GLib.timeout_add(
          GLib.PRIORITY_DEFAULT,
          1200,
          () => {
            this._pollClipboard();
            return GLib.SOURCE_CONTINUE;
          },
        )
  • extension.js:3085
        this._resultsHeightTimeoutId = GLib.timeout_add(
          GLib.PRIORITY_DEFAULT,
          0,
          () => {
            this._resultsHeightTimeoutId = null;
            if (this._enabled) this._updateResultsHeight(false);
            return GLib.SOURCE_REMOVE;
          },
        )
  • extension.js:1340
        this._searchTimeout = GLib.timeout_add(
          GLib.PRIORITY_DEFAULT,
          delay,
          () => {
            this._searchTimeout = null;
            if (this._isCurrentQuery(text, generation)) callback();
            return GLib.SOURCE_REMOVE;
          },
        )
  • extension.js:3029
        this._selectionScrollTimeoutId = GLib.timeout_add(
          GLib.PRIORITY_DEFAULT,
          0,
          () => {
            this._selectionScrollTimeoutId = null;
            this._scrollToSelection();
            return GLib.SOURCE_REMOVE;
          },
        )

All Versions

Version Status
14 Unreviewed
13 Rejected
12 Rejected
11 Rejected
10 Rejected
9 Rejected
8 Rejected
7 Rejected
6 Rejected
5 Rejected
4 Rejected
3 Rejected
2 Rejected
1 Rejected

Previous Reviews on this Version

furkan12 posted a review
Object destroy warning: false-positive-ish; child actors are owned by _container, and _container.destroy() handles the tree. Adding duplicate child destroys would make cleanup noisier. Timeout warning: uses _removeSource() helper. I kept that helper-based cleanup rather than duplicating GLib.Source.remove() blocks everywhere.
furkan12 auto- rejected
Auto-rejected because of new version 10 was uploaded