Review of "Quick Lofi" version 19

Details Page Preview

Play lofi music and other sounds, locally or online, on your GNOME desktop with just a click! You need MPV for this extension to work. Fedora: sudo dnf install mpv Ubuntu: sudo apt install mpv Arch Linux: sudo pacman -S mpv

Extension Homepage
https://github.com/eucaue/gnome-shell-extension-quick-lofi

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.

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

  • modules/Indicator.js:35
            this._icon = new St.Icon({
                gicon: Gio.icon_new_for_string(this._extension.path + ICONS.INDICATOR_DEFAULT),
                iconSize: 20,
                styleClass: 'system-status-icon indicator-icon',
            })

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

  • modules/Indicator.js:35
            this._icon = new St.Icon({
                gicon: Gio.icon_new_for_string(this._extension.path + ICONS.INDICATOR_DEFAULT),
                iconSize: 20,
                styleClass: 'system-status-icon indicator-icon',
            })

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

  • preferences/InterfacePage.js:71
                row.connect('notify::selected', () => {
                    const newActionIndex = row.get_selected();
                    updateAction({ mouseBtn, actionIndex: newActionIndex });
                })
  • preferences/RadiosPage.js:337
            this._window.connect('close-request', () => {
                writeLog({ message: '[RadiosPage] Cleaning up on window close', type: 'INFO' });
                this._settings = null;
                this._radios = null;
            })
  • preferences/RadiosPage.js:147
                nameRadioRow.connect('apply', (w) => {
                    const index = this._radios.findIndex((entry) => entry.endsWith(radioID));
                    if (w.text.length < 2) {
                        writeLog({ message: '[RadiosPage] Radio name too short (min 2 characters)', type: 'WARN' });
         
  • preferences/RadiosPage.js:159
                urlRadioRow.connect('apply', (w) => {
                    const index = this._radios.findIndex((entry) => entry.endsWith(radioID));
                    if (this._isPlayable({ uri: w.text }) === false) {
                        writeLog({ message: `[RadiosPage] Invalid URL or PATH for radio update: $
  • preferences/RadiosPage.js:117
                openButton.connect('clicked', () => {
                    const uri = radioUrl;
                    writeLog({ message: `[RadiosPage] Opening radio location: ${uri}`, type: 'INFO' });
                    if (!isUri(uri)) {
                        writeLog({ message: `[RadiosPage] Opening file path with 
  • preferences/RadiosPage.js:95
                removeButton.connect('clicked', () => {
                    writeLog({ message: `[RadiosPage] Remove button clicked for radio: ${radioName}`, type: 'INFO' });
                    const dialog = new Adw.AlertDialog({
                        heading: gettext(`Are you sure you want to delete ${radioNam
  • preferences/RadiosPage.js:192
                dragSource.connect('drag-begin', (_source, drag) => {
                    const dragWidget = new Gtk4.ListBox();
                    dragWidget.set_size_request(radiosExpander.get_width(), radiosExpander.get_height());
                    dragWidget.add_css_class('boxed-list');
                    const
  • preferences/RadiosPage.js:215
            dropTarget.connect('drop', (_drop, dragedExpanderRow, _x, y) => {
                const targetRow = listBox.get_row_at_y(y);
                const targetIndex = targetRow.get_index();
                if (!dragedExpanderRow || !targetRow) {
                    return false;
                }
                const [m
  • preferences/RadiosPage.js:207
                dropController.connect('enter', () => {
                    listBox.drag_highlight_row(radiosExpander);
                })
  • preferences/RadiosPage.js:323
    nameRadioController.connect('key-pressed', controllerCallback)
  • preferences/RadiosPage.js:324
    urlRadioController.connect('key-pressed', controllerCallback)
  • preferences/RadiosPage.js:210
                dropController.connect('leave', () => {
                    listBox.drag_unhighlight_row();
                })
  • preferences/RadiosPage.js:183
                dragSource.connect('prepare', (_source, x, y) => {
                    dragX = x;
                    dragY = y;
                    const value = new GObject.Value();
                    value.init(Gtk4.ListBoxRow);
                    value.set_object(radiosExpander);
                    dragIndex = radiosExp
  • preferences/RadiosPage.js:105
                    dialog.connect('response', (dialog, response) => {
                        if (response === 'ok') {
                            writeLog({ message: `[RadiosPage] User confirmed removal of radio: ${radioName}`, type: 'INFO' });
                            this._removeRadio(i, radioID);
              
  • preferences/ShortcutButton.js:32
            this._settings.connect(`changed::${this._settingsKey}`, () => {
                const newShortcut = this._settings.get_strv(this._settingsKey)[0] ?? '';
                writeLog({ message: `[ShortcutButton] Shortcut changed for ${settingsKey}: "${newShortcut}"`, type: 'INFO' });
                this._la

All Versions

Version Status
19 Unreviewed
18 Active
17 Active
16 Active
15 Active
14 Active
13 Active
12 Active
11 Active
10 Active
9 Active
8 Rejected
7 Rejected
6 Active
5 Rejected
4 Active
3 Active
2 Rejected
1 Rejected