Review of "Desktop Folder Widget" version 2

Details Page Preview

Desktop folder overlay widget with navigation, search, edit mode (drag/resize) and keyboard shortcuts. Completely vibe-coded with cc

Extension Homepage
https://github.com/paolocalosso/desktop_folder_widget.git

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

Shexli found 5 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:730
    St.Clipboard.get_default()

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

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:47
        this._backBtn = new St.Button({
          reactive: true,
          can_focus: true,
          track_hover: true,
          visible: false,
          style_class: 'desktop-folder-nav-btn',
          child: new St.Icon({
            icon_name: 'go-previous-symbolic',
            style_class: 'desktop-folder-nav-icon',
          }),
  • extension.js:133
        this._bottomBar = new St.BoxLayout({
          vertical: false,
          style_class: 'desktop-folder-bottombar',
        })
  • extension.js:300
        this._collapsedItem = new PopupMenu.PopupSwitchMenuItem(
          _('Auto-hide (click to expand)'),
          this._settings.get_boolean(KEY_COLLAPSED)
        )
  • extension.js:316
        this._editItem = new PopupMenu.PopupSwitchMenuItem(
          _('Edit mode (drag/resize)'),
          this._settings.get_boolean(KEY_EDIT)
        )
  • extension.js:60
        this._homeBtn = new St.Button({
          reactive: true,
          can_focus: true,
          track_hover: true,
          visible: false,
          style_class: 'desktop-folder-nav-btn',
          child: new St.Icon({
            icon_name: 'go-home-symbolic',
            style_class: 'desktop-folder-nav-icon',
          }),
       
  • extension.js:148
        this._list = new St.BoxLayout({
          vertical: true,
          x_expand: true,
          y_expand: true,
        })
  • extension.js:79
        this._openBtn = new St.Button({
          reactive: true,
          can_focus: true,
          track_hover: true,
          style_class: 'desktop-folder-open-btn',
        })
  • extension.js:85
        this._openIcon = new St.Icon({
          icon_name: 'folder-open-symbolic',
          style_class: 'desktop-folder-open-icon',
        })
  • extension.js:124
        this._resizeHandle = new St.Widget({
          reactive: true,
          can_focus: true,
          track_hover: true,
          width: 16,
          height: 16,
          style_class: 'desktop-folder-resize-handle',
        })
  • extension.js:141
        this._scrollView = new St.ScrollView({
          style_class: 'desktop-folder-scrollview',
          overlay_scrollbars: true,
          hscrollbar_policy: St.PolicyType.NEVER,
          vscrollbar_policy: St.PolicyType.AUTOMATIC,
        })
  • extension.js:101
        this._searchEntry = new St.Entry({
          hint_text: _('Search…'),
          can_focus: true,
          track_hover: true,
          style_class: 'desktop-folder-search',
        })
  • extension.js:42
        this._titleBar = new St.BoxLayout({
          vertical: false,
          style_class: 'desktop-folder-titlebar',
        })
  • extension.js:73
        this._titleLabel = new St.Label({
          text: _('Home'),
          style_class: 'desktop-folder-title',
          y_align: Clutter.ActorAlign.CENTER,
        })
  • extension.js:92
    this._titleSpacer = new St.Widget({x_expand: true})
  • extension.js:291
        this._visibleItem = new PopupMenu.PopupSwitchMenuItem(
          _('Show widget'),
          this._settings.get_boolean(KEY_VISIBLE)
        )

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

  • extension.js:778
        this._menuDismissId = global.stage.connect('button-press-event', (_stage, event) => {
          const [cx, cy] = event.get_coords();
          const [bx, by] = menuActor.get_transformed_position();
          const inside = cx >= bx && cx <= bx + menuActor.width &&
                         cy >= by && cy <= by +
  • extension.js:166
        this._openBtnClickId = this._openBtn.connect('clicked', () => {
          if (this._settings.get_boolean(KEY_COLLAPSED)) {
            if (this._expanded)
              this._collapseWidget();
            else
              this._expandWidget();
          } else if (!this._settings.get_boolean(KEY_EDIT)) {
            this
  • extension.js:58
    this._backBtn.connect('clicked', () => this._navigateBack())
  • extension.js:71
    this._homeBtn.connect('clicked', () => this._navigateHome())
  • extension.js:114
        this._searchEntry.clutter_text.connect('key-press-event', (_actor, event) => {
          if (event.get_key_symbol() === Clutter.KEY_Escape) {
            this._searchEntry.set_text('');
            global.stage.set_key_focus(null);
            return Clutter.EVENT_STOP;
          }
          return Clutter.EVENT_PROPAG
  • extension.js:108
        this._searchEntry.clutter_text.connect('text-changed', () => {
          const text = this._searchEntry.get_text();
          this._settings.set_string('search-text', text);
          this._refresh();
        })

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:397
        GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
          this._applyVisibility(this._settings.get_boolean(KEY_VISIBLE));
          return GLib.SOURCE_REMOVE;
        })

All Versions

Version Status
2 Unreviewed
1 Rejected

Previous Reviews on this Version

p_calosso posted a review