From 00114b8626f4810ed95d8922389cdc80e8575831 Mon Sep 17 00:00:00 2001 From: VictorBenitoGR Date: Mon, 4 May 2026 12:48:56 -0600 Subject: [PATCH 1/2] fix(panel): hide empty monitor groups --- Resource_Monitor@Ory0n/extension.js | 7 ++ Resource_Monitor@Ory0n/panel/mainGui.js | 28 +++++ Resource_Monitor@Ory0n/services/visibility.js | 21 ++++ tests/runtime-smoke.js | 103 ++++++++++++++++++ 4 files changed, 159 insertions(+) diff --git a/Resource_Monitor@Ory0n/extension.js b/Resource_Monitor@Ory0n/extension.js index 155ee6c..25382db 100644 --- a/Resource_Monitor@Ory0n/extension.js +++ b/Resource_Monitor@Ory0n/extension.js @@ -53,6 +53,7 @@ import { applySecondarySeparatorStyle, buildMainGui, createMainGui, + syncMainGuiVisibility, } from "./panel/mainGui.js"; import { detectCapabilities, @@ -1679,6 +1680,10 @@ const ResourceMonitor = GObject.registerClass( syncThermalCpuVisibility(this); } + _syncMainGuiVisibility() { + syncMainGuiVisibility(this); + } + _refreshHandler(forceGpu = false) { return refreshHandler(this, forceGpu); } @@ -1839,6 +1844,8 @@ const ResourceMonitor = GObject.registerClass( element.hide(); }); } + + this._syncMainGuiVisibility(); } _basicItemWidth(width, element) { diff --git a/Resource_Monitor@Ory0n/panel/mainGui.js b/Resource_Monitor@Ory0n/panel/mainGui.js index df0a6e0..ca1ff60 100644 --- a/Resource_Monitor@Ory0n/panel/mainGui.js +++ b/Resource_Monitor@Ory0n/panel/mainGui.js @@ -3,6 +3,7 @@ import Gio from "gi://Gio"; import St from "gi://St"; import { DiskContainerSpace, DiskContainerStats, GpuContainer } from "./containers.js"; +import { getPanelGroupVisibility } from "../services/visibility.js"; function _addStyleClasses(actor, classes) { classes.forEach((cssClass) => actor.add_style_class_name(cssClass)); @@ -325,8 +326,35 @@ export function buildMainGui(indicator) { }); applySecondarySeparatorStyle(indicator); + syncMainGuiVisibility(indicator); if (indicator._box.get_parent() !== indicator) { indicator.add_child(indicator._box); } } + +export function syncMainGuiVisibility(indicator) { + const visibility = getPanelGroupVisibility(indicator); + const groupsByItem = { + cpu: indicator._cpuGroup, + ram: indicator._ramGroup, + swap: indicator._swapGroup, + stats: indicator._diskStatsGroup, + space: indicator._diskSpaceGroup, + eth: indicator._ethGroup, + wlan: indicator._wlanGroup, + gpu: indicator._gpuGroup, + }; + + Object.entries(groupsByItem).forEach(([item, group]) => { + if (!group) { + return; + } + + if (visibility[item]) { + group.show(); + } else { + group.hide(); + } + }); +} diff --git a/Resource_Monitor@Ory0n/services/visibility.js b/Resource_Monitor@Ory0n/services/visibility.js index d68563f..b0b9a68 100644 --- a/Resource_Monitor@Ory0n/services/visibility.js +++ b/Resource_Monitor@Ory0n/services/visibility.js @@ -36,6 +36,27 @@ export function hasVisibleGpu(indicator) { ); } +export function getPanelGroupVisibility(indicator) { + return { + cpu: + indicator._cpuStatus || + hasVisibleCpuFrequency(indicator) || + indicator._cpuLoadAverageStatus || + hasVisibleThermalCpuTemperature(indicator), + ram: indicator._ramStatus, + swap: indicator._swapStatus, + stats: indicator._diskStatsStatus, + space: indicator._diskSpaceStatus, + eth: + indicator._netEthStatus && + (indicator._nmEthStatus || !indicator._netAutoHideStatus), + wlan: + indicator._netWlanStatus && + (indicator._nmWlanStatus || !indicator._netAutoHideStatus), + gpu: hasVisibleGpu(indicator), + }; +} + export function syncCpuFrequencyVisibility(indicator) { indicator._basicItemStatus( hasVisibleCpuFrequency(indicator), diff --git a/tests/runtime-smoke.js b/tests/runtime-smoke.js index 700054b..153d9e5 100644 --- a/tests/runtime-smoke.js +++ b/tests/runtime-smoke.js @@ -16,6 +16,7 @@ import { parseLoadAverage, } from "../Resource_Monitor@Ory0n/runtime/metrics.js"; import { buildNetworkSample } from "../Resource_Monitor@Ory0n/runtime/network.js"; +import { getPanelGroupVisibility } from "../Resource_Monitor@Ory0n/services/visibility.js"; function assert(condition, message) { if (!condition) { @@ -42,6 +43,43 @@ function assertThrows(callback, message) { } } +function createVisibilityIndicator(overrides = {}) { + const defaults = { + _capabilities: { + cpuFrequency: false, + gpu: false, + thermalHwmon: false, + }, + _cpuStatus: false, + _cpuFrequencyStatus: false, + _cpuLoadAverageStatus: false, + _thermalCpuTemperatureStatus: false, + _thermalCpuTemperatureDevices: [], + _ramStatus: false, + _swapStatus: false, + _diskStatsStatus: false, + _diskSpaceStatus: false, + _netEthStatus: false, + _netWlanStatus: false, + _netAutoHideStatus: false, + _nmEthStatus: false, + _nmWlanStatus: false, + _gpuStatus: false, + _thermalGpuTemperatureStatus: false, + _gpuDevices: [], + _thermalGpuTemperatureDevices: [], + }; + + return { + ...defaults, + ...overrides, + _capabilities: { + ...defaults._capabilities, + ...(overrides._capabilities ?? {}), + }, + }; +} + function testDiskSerializationRoundtrip() { const serialized = serializeDiskEntry({ device: "/dev/nvme0n1p2", @@ -340,6 +378,68 @@ function testLoadAverageInvalidInputFallback() { ); } +function testPanelGroupVisibilityRamOnly() { + const visibility = getPanelGroupVisibility( + createVisibilityIndicator({ + _ramStatus: true, + }) + ); + + assert(visibility.ram === true, "RAM group should be visible"); + assert(visibility.cpu === false, "CPU group should be hidden"); + assert(visibility.swap === false, "Swap group should be hidden"); + assert(visibility.stats === false, "Disk stats group should be hidden"); + assert(visibility.space === false, "Disk space group should be hidden"); + assert(visibility.eth === false, "Ethernet group should be hidden"); + assert(visibility.wlan === false, "Wi-Fi group should be hidden"); + assert(visibility.gpu === false, "GPU group should be hidden"); +} + +function testPanelGroupVisibilityCpuSecondaryMetric() { + const visibility = getPanelGroupVisibility( + createVisibilityIndicator({ + _capabilities: { + cpuFrequency: true, + }, + _cpuFrequencyStatus: true, + }) + ); + + assert( + visibility.cpu === true, + "CPU group should be visible for CPU frequency without CPU usage" + ); + assert(visibility.ram === false, "RAM group should be hidden"); +} + +function testPanelGroupVisibilityNetworkAutoHide() { + const disconnected = getPanelGroupVisibility( + createVisibilityIndicator({ + _netAutoHideStatus: true, + _netEthStatus: true, + _nmEthStatus: false, + }) + ); + + assert( + disconnected.eth === false, + "Ethernet group should be hidden when auto-hide is enabled and disconnected" + ); + + const connected = getPanelGroupVisibility( + createVisibilityIndicator({ + _netAutoHideStatus: true, + _netEthStatus: true, + _nmEthStatus: true, + }) + ); + + assert( + connected.eth === true, + "Ethernet group should be visible when auto-hide is enabled and connected" + ); +} + testDiskSerializationRoundtrip(); testLegacySettingsEntriesAreRejected(); testGpuSerializationRoundtrip(); @@ -352,5 +452,8 @@ testDiskStatsSectorConversion(); testNetworkCounterReset(); testNetworkParsingWithoutTrailingNewline(); testLoadAverageInvalidInputFallback(); +testPanelGroupVisibilityRamOnly(); +testPanelGroupVisibilityCpuSecondaryMetric(); +testPanelGroupVisibilityNetworkAutoHide(); console.log("Runtime smoke tests passed."); From bb9198f5dc0b8d107e5f87dded9d13f55f09184a Mon Sep 17 00:00:00 2001 From: VictorBenitoGR Date: Wed, 6 May 2026 14:30:43 -0600 Subject: [PATCH 2/2] fix(panel): avoid iconless layout spacing --- Resource_Monitor@Ory0n/extension.js | 10 +++- Resource_Monitor@Ory0n/panel/mainGui.js | 63 +++++++++++++++++-------- Resource_Monitor@Ory0n/stylesheet.css | 8 ++++ 3 files changed, 60 insertions(+), 21 deletions(-) diff --git a/Resource_Monitor@Ory0n/extension.js b/Resource_Monitor@Ory0n/extension.js index 25382db..2d58d7e 100644 --- a/Resource_Monitor@Ory0n/extension.js +++ b/Resource_Monitor@Ory0n/extension.js @@ -633,8 +633,8 @@ const ResourceMonitor = GObject.registerClass( createMainGui(this); } - _buildMainGui() { - buildMainGui(this); + _buildMainGui(options = {}) { + buildMainGui(this, options); } // SETTINGS @@ -855,8 +855,14 @@ const ResourceMonitor = GObject.registerClass( } _iconsStatusChanged() { + const previousIconsStatus = this._iconsStatus; this._iconsStatus = this._settings.get_boolean(ICONS_STATUS); + if (previousIconsStatus !== this._iconsStatus && this._box?.get_parent()) { + this._box.remove_all_children(); + this._buildMainGui({ refresh: false }); + } + if (this._iconsStatus) { if ( this._cpuStatus || diff --git a/Resource_Monitor@Ory0n/panel/mainGui.js b/Resource_Monitor@Ory0n/panel/mainGui.js index ca1ff60..0d2dd23 100644 --- a/Resource_Monitor@Ory0n/panel/mainGui.js +++ b/Resource_Monitor@Ory0n/panel/mainGui.js @@ -11,6 +11,7 @@ function _addStyleClasses(actor, classes) { function _createGroupBox(name) { const box = new St.BoxLayout({ + x_align: Clutter.ActorAlign.CENTER, style_class: "resource-monitor-group", }); box.add_style_class_name(`resource-monitor-group-${name}`); @@ -98,8 +99,8 @@ export function applySecondarySeparatorStyle(indicator) { } } -function _appendCpuChildren(indicator, addChild, iconsPosition) { - if (iconsPosition === "left") { +function _appendCpuChildren(indicator, addChild, iconsPosition, iconsStatus) { + if (iconsStatus && iconsPosition === "left") { addChild(indicator._cpuIcon); } @@ -117,38 +118,46 @@ function _appendCpuChildren(indicator, addChild, iconsPosition) { addChild(indicator._cpuLoadAverageValue); addChild(indicator._cpuLoadAverageBracketEnd); - if (iconsPosition !== "left") { + if (iconsStatus && iconsPosition !== "left") { addChild(indicator._cpuIcon); } } -function _appendSimpleChildren(icon, value, unit, addChild, iconsPosition) { - if (iconsPosition === "left") { +function _appendSimpleChildren( + icon, + value, + unit, + addChild, + iconsPosition, + iconsStatus +) { + if (iconsStatus && iconsPosition === "left") { addChild(icon); } addChild(value); addChild(unit); - if (iconsPosition !== "left") { + if (iconsStatus && iconsPosition !== "left") { addChild(icon); } } -function _appendSingleBoxChildren(icon, box, addChild, iconsPosition) { - if (iconsPosition === "left") { +function _appendSingleBoxChildren(icon, box, addChild, iconsPosition, iconsStatus) { + if (iconsStatus && iconsPosition === "left") { addChild(icon); } addChild(box); - if (iconsPosition !== "left") { + if (iconsStatus && iconsPosition !== "left") { addChild(icon); } } export function createMainGui(indicator) { indicator._box = new St.BoxLayout({ + x_align: Clutter.ActorAlign.CENTER, style_class: "resource-monitor-box", }); indicator._cpuGroup = _createGroupBox("cpu"); @@ -231,17 +240,26 @@ export function createMainGui(indicator) { indicator._gpuBox = new GpuContainer(); } -export function buildMainGui(indicator) { - indicator._refreshGui(); +export function buildMainGui(indicator, options = {}) { + const { refresh = true } = options; + + if (refresh) { + indicator._refreshGui(); + } const iconsPosition = indicator._iconsPosition; + const iconsStatus = indicator._iconsStatus; indicator._box.remove_style_class_name("resource-monitor-icons-left"); indicator._box.remove_style_class_name("resource-monitor-icons-right"); + indicator._box.remove_style_class_name("resource-monitor-icons-hidden"); indicator._box.add_style_class_name( iconsPosition === "left" ? "resource-monitor-icons-left" : "resource-monitor-icons-right" ); + if (!iconsStatus) { + indicator._box.add_style_class_name("resource-monitor-icons-hidden"); + } const groupsByItem = { cpu: indicator._cpuGroup, @@ -255,7 +273,7 @@ export function buildMainGui(indicator) { }; _replaceGroupChildren(indicator._cpuGroup, (addChild) => - _appendCpuChildren(indicator, addChild, iconsPosition) + _appendCpuChildren(indicator, addChild, iconsPosition, iconsStatus) ); _replaceGroupChildren(indicator._ramGroup, (addChild) => _appendSimpleChildren( @@ -263,7 +281,8 @@ export function buildMainGui(indicator) { indicator._ramValue, indicator._ramUnit, addChild, - iconsPosition + iconsPosition, + iconsStatus ) ); _replaceGroupChildren(indicator._swapGroup, (addChild) => @@ -272,7 +291,8 @@ export function buildMainGui(indicator) { indicator._swapValue, indicator._swapUnit, addChild, - iconsPosition + iconsPosition, + iconsStatus ) ); _replaceGroupChildren(indicator._diskStatsGroup, (addChild) => @@ -280,7 +300,8 @@ export function buildMainGui(indicator) { indicator._diskStatsIcon, indicator._diskStatsBox, addChild, - iconsPosition + iconsPosition, + iconsStatus ) ); _replaceGroupChildren(indicator._diskSpaceGroup, (addChild) => @@ -288,7 +309,8 @@ export function buildMainGui(indicator) { indicator._diskSpaceIcon, indicator._diskSpaceBox, addChild, - iconsPosition + iconsPosition, + iconsStatus ) ); _replaceGroupChildren(indicator._ethGroup, (addChild) => @@ -297,7 +319,8 @@ export function buildMainGui(indicator) { indicator._ethValue, indicator._ethUnit, addChild, - iconsPosition + iconsPosition, + iconsStatus ) ); _replaceGroupChildren(indicator._wlanGroup, (addChild) => @@ -306,7 +329,8 @@ export function buildMainGui(indicator) { indicator._wlanValue, indicator._wlanUnit, addChild, - iconsPosition + iconsPosition, + iconsStatus ) ); _replaceGroupChildren(indicator._gpuGroup, (addChild) => @@ -314,7 +338,8 @@ export function buildMainGui(indicator) { indicator._gpuIcon, indicator._gpuBox, addChild, - iconsPosition + iconsPosition, + iconsStatus ) ); diff --git a/Resource_Monitor@Ory0n/stylesheet.css b/Resource_Monitor@Ory0n/stylesheet.css index 895dbeb..c5960ab 100644 --- a/Resource_Monitor@Ory0n/stylesheet.css +++ b/Resource_Monitor@Ory0n/stylesheet.css @@ -2,6 +2,10 @@ spacing: 0.35em; } +.resource-monitor-box.resource-monitor-icons-hidden { + spacing: 0.65em; +} + .resource-monitor-group { spacing: 0.05em; } @@ -16,6 +20,10 @@ padding-right: 0.3em; } +.resource-monitor-box.resource-monitor-icons-hidden .resource-monitor-unit { + padding-right: 0; +} + .resource-monitor-bracket { padding-left: 0.05em; padding-right: 0.05em;