Custom GNOME bar with island design, CPU, RAM, network monitors, and todo list
Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.
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()`.
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.
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`.
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.
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())
| Version | Status |
|---|---|
| 3 | Unreviewed |
| 2 | Rejected |
| 1 | Rejected |