Review of "Cello — Desktop Batteries" version 1

Details Page Preview

See Bluetooth device batteries at a glance, right on your desktop. Adaptive charge rings, light and dark appearance, and four corner positions. Cello uses battery information already available in BlueZ, without scanning or connecting to devices. Battery availability depends on what each device and BlueZ report. Optional integration with an existing Keychron battery bridge. GNOME Shell 46. English and Italian included. Screenshots show the actual interface with simulated device readings.

Extension Homepage
https://github.com/ATAC-Helicopter/Cello

No comments.

FAQ

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 4

Shexli found 5 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

  • extension.js:22
    GLib.file_get_contents(path)

EGO-P-003 error

GSettings schema XML must be present in package

Extension appears to use GSettings but no `.gschema.xml` file is included in the package.

GSettings Schemas

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:453
    this._menuManager = new PopupMenu.PopupMenuManager(this._card)

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:215
            this._card.connect('button-press-event', (_actor, event) => {
                if (event.get_button() !== 3)
                    return Clutter.EVENT_PROPAGATE;
                this._menu.toggle();
                return Clutter.EVENT_STOP;
            })
  • extension.js:221
            this._card.connect('key-press-event', (_actor, event) => {
                if (event.get_key_symbol() === Clutter.KEY_Menu ||
                    (event.get_key_symbol() === Clutter.KEY_F10 &&
                     event.get_state() & Clutter.ModifierType.SHIFT_MASK)) {
                    this._menu.toggle(
  • extension.js:477
            this._menu.connect('open-state-changed', (_menu, open) => {
                if (open) {
                    for (const {item, key, value} of this._options)
                        item.setOrnament(this._config[key] === value
                            ? PopupMenu.Ornament.CHECK : PopupMenu.Ornament.NONE);
    

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:327
            this._renderSource = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 120, () => {
                this._renderSource = 0;
                this._render();
                return GLib.SOURCE_REMOVE;
            })
  • extension.js:424
            this._staleSource = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, Math.ceil(remaining), () => {
                this._staleSource = 0;
                this._queueRender();
                return GLib.SOURCE_REMOVE;
            })
  • extension.js:387
            this._stateReadSource = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 150, () => {
                this._stateReadSource = 0;
                this._readState();
                return GLib.SOURCE_REMOVE;
            })

All Versions

Version Status
1 Unreviewed