// This is for the cool memory indicator on the sidebar // For the right pill of the bar, see system.js const { Gdk, Gtk } = imports.gi; const GObject = imports.gi.GObject; const Lang = imports.lang; import { App, Service, Utils, Widget } from '../imports.js'; import Bluetooth from 'resource:///com/github/Aylur/ags/service/bluetooth.js'; import Hyprland from 'resource:///com/github/Aylur/ags/service/hyprland.js'; import Network from 'resource:///com/github/Aylur/ags/service/network.js'; const { execAsync, exec } = Utils; import { CircularProgress } from "./lib/circularprogress.js"; import { MaterialIcon } from "./lib/materialicon.js"; let cpuUsageQueue = []; const CPU_HISTORY_LENGTH = 10; export const ModuleSysInfo = (props = {}) => { const swapCircle = Widget({ type: CircularProgress, className: 'sidebar-memory-swap-circprog', valign: 'center', }); const ramCircle = Widget({ type: CircularProgress, className: 'sidebar-memory-ram-circprog margin-right-10', // margin right 10 here cuz overlay can't have margins itself valign: 'center', }); const cpuCircle = Widget.Box({ children: [Widget({ type: CircularProgress, className: 'sidebar-cpu-circprog margin-right-10', // margin right 10 here cuz overlay can't have margins itself valign: 'center', })] }); const memoryCircles = Widget.Box({ homogeneous: true, children: [Widget.Overlay({ child: ramCircle, overlays: [ swapCircle, ] })] }); const ramText = Widget.Label({ halign: 'start', xalign: 0, className: 'txt txt-small', }); const swapText = Widget.Label({ halign: 'start', xalign: 0, className: 'txt txt-small', }); const memoryText = Widget.Box({ vertical: true, valign: 'center', className: 'spacing-v--5', children: [ Widget.Box({ className: 'spacing-h-5', children: [ MaterialIcon('memory', 'large', { setup: icon => icon.toggleClassName('txt', true) }), ramText ] }), Widget.Box({ className: 'spacing-h-5', children: [ MaterialIcon('swap_horiz', 'large', { setup: icon => icon.toggleClassName('txt', true) }), swapText ] }), ] }); return Widget.Box({ ...props, className: 'sidebar-group-nopad', children: [Widget.Scrollable({ hexpand: true, vscroll: 'never', hscroll: 'automatic', child: Widget.Box({ className: 'sidebar-sysinfo-grouppad spacing-h--5', children: [ memoryCircles, memoryText, // cpuCircle, // maybe make cpu a graph? ], connections: [ [3000, () => { // Get memory info const ramString = exec(`bash -c 'free -h --si | rg "Mem:"'`); const [ramTotal, ramUsed] = ramString.split(/\s+/).slice(1, 3); const ramPerc = Number(exec(`bash -c "printf '%.1f' \\\"$(free -m | rg Mem | awk '{print ($3/$2)*100}')\\\""`)); const swapString = exec(`bash -c 'free -h --si | rg "Swap:"'`); const [swapTotal, swapUsed] = swapString.split(/\s+/).slice(1, 3); const swapPerc = Number(exec(`bash -c "printf '%.1f' \\\"$(free -m | rg Swap | awk '{print ($3/$2)*100}')\\\""`)); // const cpuPerc = parseFloat(exec(`bash -c "top -bn1 | grep 'Cpu(s)' | awk '{print $2 + $4}'"`)); // Set circular progress (font size cuz hack for anims) ramCircle.style = `font-size: ${ramPerc}px;` swapCircle.style = `font-size: ${swapPerc}px;` ramText.label = `${ramUsed} / ${ramTotal}`; swapText.label = `${swapUsed} / ${swapTotal}`; }] ] }) })] }); };