Review of "AngieBar" version 1

Details Page Preview

Custom GNOME bar with island design, CPU, RAM, network monitors, and todo list

Extension Homepage
https://github.com/garrati-0/AngieBar

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

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:905
    GLib.file_get_contents('/proc/cpuinfo')
  • extension.js:930
    GLib.file_get_contents('/proc/stat')
  • extension.js:952
    GLib.file_get_contents('/proc/meminfo')
  • extension.js:977
    GLib.file_get_contents('/proc/net/dev')
  • extension.js:1280
    GLib.file_get_contents(targetPath)

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:281
    this._avgBox = new St.BoxLayout({ style_class: 'net-box', visible: false })
  • extension.js:282
    this._avgIcon = new St.Icon({ icon_name: 'network-transmit-receive-symbolic', style_class: 'net-icon' })
  • extension.js:283
    this._avgLabel = new St.Label({ text: '0.0 KB/s', style_class: 'net-label', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:116
            this._batteryBtn = new St.Button({
                style_class: 'right-island-btn',
                reactive: true, track_hover: true, can_focus: true,
                y_align: Clutter.ActorAlign.CENTER
            })
  • extension.js:125
            this._batteryIcon = new St.Icon({
                icon_name: 'battery-level-100-symbolic',
                style_class: 'battery-icon'
            })
  • extension.js:123
    this._batteryLabel = new St.Label({ text: '...', style_class: 'battery-label', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:75
    this._btIcon = new St.Icon({ icon_name: 'bluetooth-active-symbolic', style_class: 'system-icon' })
  • extension.js:368
    this._camBox = new St.BoxLayout({ style_class: 'privacy-box cam-box', visible: false, y_align: Clutter.ActorAlign.CENTER })
  • extension.js:33
    this._centerBoxLayout = new St.BoxLayout({ style_class: 'center-island-box' })
  • extension.js:27
            this._centerIsland = new St.Button({
                style_class: 'custom-island',
                y_align: Clutter.ActorAlign.CENTER,
                reactive: true, track_hover: true, can_focus: true
            })
  • extension.js:124
    this._chargingIcon = new St.Icon({ icon_name: 'battery-flash-symbolic', style_class: 'charging-icon', visible: false })
  • extension.js:226
    this._cpuIcon = new St.Icon({ gicon: Gio.Icon.new_for_string(`${this.path}/cpu-custom-symbolic.svg`), style_class: 'stats-icon cpu-icon' })
  • extension.js:225
    this._cpuIsland = new St.BoxLayout({ style_class: 'custom-island cpu-island', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:227
    this._cpuLabel = new St.Label({ text: '0.0%', style_class: 'stats-label cpu-label', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:269
    this._downBox = new St.BoxLayout({ style_class: 'net-box' })
  • extension.js:271
    this._downLabel = new St.Label({ text: '0.0 KB/s', style_class: 'net-label', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:193
            this._logoIcon = new St.Icon({
                style_class: 'logo-icon'
            })
  • extension.js:186
            this._logoIsland = new St.Bin({
                style_class: 'logo-island',
                y_align: Clutter.ActorAlign.CENTER,
                reactive: true, track_hover: true, can_focus: true
            })
  • extension.js:199
    this._logoMenuManager = new PopupMenu.PopupMenuManager(this)
  • extension.js:36
    this._mediaArt = new St.Icon({ style_class: 'media-art', visible: false })
  • extension.js:43
    this._mediaWave = new St.BoxLayout({ style_class: 'media-wave', visible: false, y_align: Clutter.ActorAlign.CENTER })
  • extension.js:364
    this._micBox = new St.BoxLayout({ style_class: 'privacy-box mic-box', visible: false, y_align: Clutter.ActorAlign.CENTER })
  • extension.js:266
    this._netBoxLayout = new St.BoxLayout({ style_class: 'net-island-layout' })
  • extension.js:260
            this._netIsland = new St.Button({
                style_class: 'custom-island net-island',
                y_align: Clutter.ActorAlign.CENTER,
                reactive: true, track_hover: true, can_focus: true
            })
  • extension.js:161
            this._powerIsland = new St.Button({
                style_class: 'custom-island power-island',
                y_align: Clutter.ActorAlign.CENTER,
                reactive: true, track_hover: true, can_focus: true
            })
  • extension.js:357
            this._privacyIsland = new St.BoxLayout({
                style_class: 'custom-island privacy-island',
                y_align: Clutter.ActorAlign.CENTER,
                reactive: true, track_hover: true, can_focus: true,
                visible: false
            })
  • extension.js:67
            this._quickSettingsBtn = new St.Button({
                style_class: 'right-island-btn',
                reactive: true, track_hover: true, can_focus: true,
                y_align: Clutter.ActorAlign.CENTER
            })
  • extension.js:245
    this._ramIcon = new St.Icon({ gicon: Gio.Icon.new_for_string(`${this.path}/ram-custom-symbolic.svg`), style_class: 'stats-icon ram-icon' })
  • extension.js:244
    this._ramIsland = new St.BoxLayout({ style_class: 'custom-island ram-island', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:246
    this._ramLabel = new St.Label({ text: '0.0%', style_class: 'stats-label ram-label', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:62
            this._rightIsland = new St.BoxLayout({
                style_class: 'custom-island right-island',
                y_align: Clutter.ActorAlign.CENTER
            })
  • extension.js:113
    this._separator = new St.Label({ text: '|', style_class: 'island-separator', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:37
            this._timeLabel = new St.Label({
                text: this._getFormattedTime(),
                y_align: Clutter.ActorAlign.CENTER,
                style_class: 'time-label'
            })
  • extension.js:307
    this._todoBoxLayout = new St.BoxLayout({ y_align: Clutter.ActorAlign.CENTER })
  • extension.js:1330
    this._todoEntry = new St.Entry({ hint_text: 'Add a task...', style_class: 'todo-entry', x_expand: true })
  • extension.js:301
            this._todoIsland = new St.Button({
                style_class: 'custom-island todo-island',
                y_align: Clutter.ActorAlign.CENTER,
                reactive: true, track_hover: true, can_focus: true
            })
  • extension.js:315
            this._todoLabel = new St.Label({
                text: '0/0',
                style_class: 'todo-label',
                y_align: Clutter.ActorAlign.CENTER
            })
  • extension.js:1356
    this._todoListContainer = new St.BoxLayout({ vertical: true, style_class: 'todo-list-container' })
  • extension.js:324
    this._todoMenuManager = new PopupMenu.PopupMenuManager(this)
  • extension.js:343
    this._tooltipLabel = new St.Label({ style_class: 'tooltip-text' })
  • extension.js:275
    this._upBox = new St.BoxLayout({ style_class: 'net-box' })
  • extension.js:277
    this._upLabel = new St.Label({ text: '0.0 KB/s', style_class: 'net-label', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:1443
    this._uptimeItem = new PopupMenu.PopupMenuItem('Uptime: ...')
  • extension.js:76
    this._volIcon = new St.Icon({ icon_name: 'audio-volume-high-symbolic', style_class: 'system-icon', reactive: true })
  • extension.js:74
    this._wifiIcon = new St.Icon({ icon_name: 'network-wireless-signal-excellent-symbolic', style_class: 'system-icon', reactive: true })
  • extension.js:350
    this._workspacesIsland = new St.BoxLayout({ style_class: 'custom-island workspaces-island', y_align: Clutter.ActorAlign.CENTER })

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:281
    this._avgBox = new St.BoxLayout({ style_class: 'net-box', visible: false })
  • extension.js:282
    this._avgIcon = new St.Icon({ icon_name: 'network-transmit-receive-symbolic', style_class: 'net-icon' })
  • extension.js:283
    this._avgLabel = new St.Label({ text: '0.0 KB/s', style_class: 'net-label', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:116
            this._batteryBtn = new St.Button({
                style_class: 'right-island-btn',
                reactive: true, track_hover: true, can_focus: true,
                y_align: Clutter.ActorAlign.CENTER
            })
  • extension.js:125
            this._batteryIcon = new St.Icon({
                icon_name: 'battery-level-100-symbolic',
                style_class: 'battery-icon'
            })
  • extension.js:123
    this._batteryLabel = new St.Label({ text: '...', style_class: 'battery-label', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:75
    this._btIcon = new St.Icon({ icon_name: 'bluetooth-active-symbolic', style_class: 'system-icon' })
  • extension.js:368
    this._camBox = new St.BoxLayout({ style_class: 'privacy-box cam-box', visible: false, y_align: Clutter.ActorAlign.CENTER })
  • extension.js:33
    this._centerBoxLayout = new St.BoxLayout({ style_class: 'center-island-box' })
  • extension.js:27
            this._centerIsland = new St.Button({
                style_class: 'custom-island',
                y_align: Clutter.ActorAlign.CENTER,
                reactive: true, track_hover: true, can_focus: true
            })
  • extension.js:124
    this._chargingIcon = new St.Icon({ icon_name: 'battery-flash-symbolic', style_class: 'charging-icon', visible: false })
  • extension.js:226
    this._cpuIcon = new St.Icon({ gicon: Gio.Icon.new_for_string(`${this.path}/cpu-custom-symbolic.svg`), style_class: 'stats-icon cpu-icon' })
  • extension.js:225
    this._cpuIsland = new St.BoxLayout({ style_class: 'custom-island cpu-island', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:227
    this._cpuLabel = new St.Label({ text: '0.0%', style_class: 'stats-label cpu-label', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:269
    this._downBox = new St.BoxLayout({ style_class: 'net-box' })
  • extension.js:271
    this._downLabel = new St.Label({ text: '0.0 KB/s', style_class: 'net-label', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:193
            this._logoIcon = new St.Icon({
                style_class: 'logo-icon'
            })
  • extension.js:186
            this._logoIsland = new St.Bin({
                style_class: 'logo-island',
                y_align: Clutter.ActorAlign.CENTER,
                reactive: true, track_hover: true, can_focus: true
            })
  • extension.js:36
    this._mediaArt = new St.Icon({ style_class: 'media-art', visible: false })
  • extension.js:43
    this._mediaWave = new St.BoxLayout({ style_class: 'media-wave', visible: false, y_align: Clutter.ActorAlign.CENTER })
  • extension.js:364
    this._micBox = new St.BoxLayout({ style_class: 'privacy-box mic-box', visible: false, y_align: Clutter.ActorAlign.CENTER })
  • extension.js:266
    this._netBoxLayout = new St.BoxLayout({ style_class: 'net-island-layout' })
  • extension.js:260
            this._netIsland = new St.Button({
                style_class: 'custom-island net-island',
                y_align: Clutter.ActorAlign.CENTER,
                reactive: true, track_hover: true, can_focus: true
            })
  • extension.js:161
            this._powerIsland = new St.Button({
                style_class: 'custom-island power-island',
                y_align: Clutter.ActorAlign.CENTER,
                reactive: true, track_hover: true, can_focus: true
            })
  • extension.js:357
            this._privacyIsland = new St.BoxLayout({
                style_class: 'custom-island privacy-island',
                y_align: Clutter.ActorAlign.CENTER,
                reactive: true, track_hover: true, can_focus: true,
                visible: false
            })
  • extension.js:67
            this._quickSettingsBtn = new St.Button({
                style_class: 'right-island-btn',
                reactive: true, track_hover: true, can_focus: true,
                y_align: Clutter.ActorAlign.CENTER
            })
  • extension.js:245
    this._ramIcon = new St.Icon({ gicon: Gio.Icon.new_for_string(`${this.path}/ram-custom-symbolic.svg`), style_class: 'stats-icon ram-icon' })
  • extension.js:244
    this._ramIsland = new St.BoxLayout({ style_class: 'custom-island ram-island', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:246
    this._ramLabel = new St.Label({ text: '0.0%', style_class: 'stats-label ram-label', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:62
            this._rightIsland = new St.BoxLayout({
                style_class: 'custom-island right-island',
                y_align: Clutter.ActorAlign.CENTER
            })
  • extension.js:113
    this._separator = new St.Label({ text: '|', style_class: 'island-separator', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:37
            this._timeLabel = new St.Label({
                text: this._getFormattedTime(),
                y_align: Clutter.ActorAlign.CENTER,
                style_class: 'time-label'
            })
  • extension.js:307
    this._todoBoxLayout = new St.BoxLayout({ y_align: Clutter.ActorAlign.CENTER })
  • extension.js:1330
    this._todoEntry = new St.Entry({ hint_text: 'Add a task...', style_class: 'todo-entry', x_expand: true })
  • extension.js:301
            this._todoIsland = new St.Button({
                style_class: 'custom-island todo-island',
                y_align: Clutter.ActorAlign.CENTER,
                reactive: true, track_hover: true, can_focus: true
            })
  • extension.js:315
            this._todoLabel = new St.Label({
                text: '0/0',
                style_class: 'todo-label',
                y_align: Clutter.ActorAlign.CENTER
            })
  • extension.js:1356
    this._todoListContainer = new St.BoxLayout({ vertical: true, style_class: 'todo-list-container' })
  • extension.js:343
    this._tooltipLabel = new St.Label({ style_class: 'tooltip-text' })
  • extension.js:275
    this._upBox = new St.BoxLayout({ style_class: 'net-box' })
  • extension.js:277
    this._upLabel = new St.Label({ text: '0.0 KB/s', style_class: 'net-label', y_align: Clutter.ActorAlign.CENTER })
  • extension.js:1443
    this._uptimeItem = new PopupMenu.PopupMenuItem('Uptime: ...')
  • extension.js:76
    this._volIcon = new St.Icon({ icon_name: 'audio-volume-high-symbolic', style_class: 'system-icon', reactive: true })
  • extension.js:74
    this._wifiIcon = new St.Icon({ icon_name: 'network-wireless-signal-excellent-symbolic', style_class: 'system-icon', reactive: true })
  • extension.js:350
    this._workspacesIsland = new St.BoxLayout({ style_class: 'custom-island workspaces-island', y_align: Clutter.ActorAlign.CENTER })

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:142
            this._batteryBtn.connect('clicked', () => {
                this._showWattage = !this._showWattage;
                this._updateBattery();
            })
  • extension.js:155
            this._batteryBtn.connect('enter-event', () => {
                this._showTooltip(this._batteryBtn, this._getBatteryTooltip());
            })
  • extension.js:158
    this._batteryBtn.connect('leave-event', () => this._hideTooltip())
  • extension.js:53
            this._centerIsland.connect('clicked', () => {
                let dateMenu = Main.panel.statusArea.dateMenu;
                dateMenu.menu.sourceActor = this._centerIsland;
                dateMenu.menu.toggle();
            })
  • extension.js:231
            this._cpuIsland.connect('enter-event', async () => {
                this._isCpuHovered = true;
                this._showTooltip(this._cpuIsland, `CPU: Loading...`);
                let info = await this._getCpuInfoAsync();
                if (this._isCpuHovered) {
                    this._showTooltip(this._c
  • extension.js:239
            this._cpuIsland.connect('leave-event', () => {
                this._isCpuHovered = false;
                this._hideTooltip();
            })
  • extension.js:207
            this._logoIsland.connect('button-press-event', (actor, event) => {
                const button = event.get_button();
                if (button === 1) {
                    // Left-click
                    let actionType = this._settings.get_int('logo-action');
                    if (actionType === 1) {
        
  • extension.js:292
            this._netIsland.connect('clicked', () => {
                this._showNetCompact = !this._showNetCompact;
                this._updateNet();
            })
  • extension.js:169
            this._powerIsland.connect('clicked', () => {
                const cmd = this._settings.get_string('power-command');
                GLib.spawn_command_line_async(cmd);
            })
  • extension.js:378
            this._privacyIsland.connect('enter-event', () => {
                let text = [];
                if (this._activeMicApps.length > 0) {
                    text.push(`Microphone in use by:\n- ${this._activeMicApps.join('\n- ')}`);
                }
                if (this._activeCamApps.length > 0) {
             
  • extension.js:390
    this._privacyIsland.connect('leave-event', () => this._hideTooltip())
  • extension.js:107
            this._quickSettingsBtn.connect('clicked', () => {
                let qsMenu = Main.panel.statusArea.quickSettings.menu;
                qsMenu.sourceActor = this._rightIsland;
                qsMenu.toggle();
            })
  • extension.js:250
            this._ramIsland.connect('enter-event', () => {
                let details = this._ramDetailsText || 'Loading...';
                this._showTooltip(this._ramIsland, `Memory Details\nUsage: ${this._ramLabel.text}\nAmount: ${details}`);
            })
  • extension.js:254
    this._ramIsland.connect('leave-event', () => this._hideTooltip())
  • extension.js:330
            this._todoIsland.connect('clicked', () => {
                this._todoMenu.toggle();
            })
  • extension.js:91
            this._volIcon.connect('scroll-event', (actor, event) => {
                const direction = event.get_scroll_direction();
                if (direction === Clutter.ScrollDirection.UP) {
                    GLib.spawn_command_line_async('wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+');
                } else if 
  • extension.js:78
            this._wifiIcon.connect('enter-event', async () => {
                this._isWifiHovered = true;
                this._showTooltip(this._wifiIcon, 'WiFi: Loading...');
                let info = await this._getWifiInfoAsync();
                if (this._isWifiHovered) {
                    this._showTooltip(this.
  • extension.js:86
            this._wifiIcon.connect('leave-event', () => {
                this._isWifiHovered = false;
                this._hideTooltip();
            })
  • extension.js:516
    proxy.connect('g-properties-changed', () => this._updateMediaStatus())

All Versions

Version Status
3 Unreviewed
2 Rejected
1 Rejected

Previous Reviews on this Version

garrati auto- rejected
Auto-rejected because of new version 2 was uploaded