From da664565b1e17ddf9ec763581bb940fbd80861b4 Mon Sep 17 00:00:00 2001 From: bbedward Date: Mon, 10 Aug 2026 18:29:59 -0400 Subject: [PATCH] dgop: drop dgop as an external dependency and use dgop/gops internally fixes #3033 --- README.md | 4 +- core/cmd/dms/commands_doctor.go | 1 - core/go.mod | 20 +- core/go.sum | 44 +++- core/internal/distros/arch.go | 4 +- core/internal/distros/base.go | 4 - core/internal/distros/debian.go | 24 -- core/internal/distros/fedora.go | 2 - core/internal/distros/gentoo.go | 2 - core/internal/distros/manual_packages.go | 64 ----- core/internal/distros/opensuse.go | 2 - core/internal/distros/ubuntu.go | 53 ---- core/internal/distros/void.go | 2 - core/internal/server/dgop/handlers.go | 91 +++++++ core/internal/server/router.go | 6 + core/internal/server/server.go | 80 +----- distro/debian/dms-git/debian/control | 1 - distro/fedora/dms-git.spec | 1 - distro/nix/common.nix | 1 - distro/nix/options.nix | 6 +- distro/opensuse/dms-git.spec | 1 - distro/ubuntu/dms-git/debian/control | 1 - distro/void/srcpkgs/dms-git/template | 2 +- quickshell/Modals/ProcessListModal.qml | 3 +- .../ControlCenter/Widgets/DiskUsagePill.qml | 2 +- quickshell/Services/DgopService.qml | 239 +++++++----------- 26 files changed, 258 insertions(+), 402 deletions(-) create mode 100644 core/internal/server/dgop/handlers.go diff --git a/README.md b/README.md index e4ac18402..fe1943c26 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ One command installs DMS and all dependencies on Arch, Fedora, Debian, Ubuntu, o Wallpaper-based color schemes that automatically theme GTK, Qt, terminals, editors (vscode, vscodium), and more using [matugen](https://github.com/InioX/matugen) and dank16. **System Monitoring** -Real-time CPU, RAM, GPU metrics and temperatures with [dgop](https://github.com/AvengeMedia/dgop). Process list with search and management. +Real-time CPU, RAM, GPU metrics and temperatures built into the dms daemon (powered by [dgop](https://github.com/AvengeMedia/dgop)). Process list with search and management. **Powerful Launcher** Spotlight-style search for applications, files ([dsearch](https://github.com/AvengeMedia/danksearch)), emojis, running windows, calculator, and commands. Extensible with plugins. @@ -142,7 +142,7 @@ DMS is one piece of the suite. The rest lives in its own repos: - [dank-greeter](https://github.com/AvengeMedia/dank-greeter) - greetd login screen with the Dank Material aesthetic. The Greeter tab in DMS settings is the front-end for it. - [dankcalendar](https://github.com/AvengeMedia/dankcalendar) - Local, Google, Microsoft, and CalDAV calendars for the dank desktop. -- [dgop](https://github.com/AvengeMedia/dgop) - System monitoring CLI and API that powers the process list and dashboard widgets. +- [dgop](https://github.com/AvengeMedia/dgop) - System monitoring TUI and Go library; its library powers the process list and dashboard widgets inside the dms daemon. - [dsearch](https://github.com/AvengeMedia/danksearch) - Fast file search that powers file results in the launcher. - [dank-qml-common](https://github.com/AvengeMedia/dank-qml-common) - Shared QML widgets and components used by DMS, dank-greeter, and dankcalendar. - [dankgo](https://github.com/AvengeMedia/dankgo) - Common Go modules behind the single binary apps. diff --git a/core/cmd/dms/commands_doctor.go b/core/cmd/dms/commands_doctor.go index 31fbc613c..51dc31f0f 100644 --- a/core/cmd/dms/commands_doctor.go +++ b/core/cmd/dms/commands_doctor.go @@ -903,7 +903,6 @@ func checkOptionalDependencies() []checkResult { important bool }{ {"matugen", "matugen", "Dynamic theming", true}, - {"dgop", "dgop", "System monitoring", true}, {"cava", "cava", "Audio visualizer", true}, {"khal", "khal", "Calendar events", false}, {"danksearch", "dsearch", "File search", false}, diff --git a/core/go.mod b/core/go.mod index 06f242176..7c52dbdfd 100644 --- a/core/go.mod +++ b/core/go.mod @@ -3,6 +3,7 @@ module github.com/AvengeMedia/DankMaterialShell/core go 1.26.4 require ( + github.com/AvengeMedia/dgop v0.2.4-0.20260808141551-f559f2f31d2a github.com/Wifx/gonetworkmanager/v2 v2.2.0 github.com/alecthomas/chroma/v2 v2.27.0 github.com/charmbracelet/bubbles v1.0.0 @@ -35,8 +36,10 @@ require ( github.com/clipperhouse/uax29/v2 v2.7.0 // indirect github.com/cloudflare/circl v1.6.4 // indirect github.com/coder/websocket v1.8.15 // indirect + github.com/danielgtaylor/huma/v2 v2.39.1 // indirect github.com/dblohm7/wingoes v0.0.0-20260526185140-fb298caac7ca // indirect github.com/dlclark/regexp2/v2 v2.5.1 // indirect + github.com/ebitengine/purego v0.10.2 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/fogleman/gg v1.3.0 // indirect github.com/fxamacker/cbor/v2 v2.9.2 // indirect @@ -44,25 +47,32 @@ require ( github.com/go-git/go-billy/v6 v6.0.0-alpha.1 // indirect github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 // indirect github.com/go-logfmt/logfmt v0.6.1 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/jsimonetti/rtnetlink v1.4.2 // indirect github.com/kevinburke/ssh_config v1.6.0 // indirect github.com/klauspost/cpuid/v2 v2.4.0 // indirect + github.com/lufia/plan9stats v0.0.0-20260802145828-341c2f0c90b5 // indirect github.com/mdlayher/netlink v1.11.2 // indirect github.com/mdlayher/socket v0.6.1 // indirect github.com/mitchellh/go-ps v1.0.0 // indirect github.com/pjbgf/sha1cd v0.6.0 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/power-devops/perfstat v0.0.0-20260805114148-88456608a4f6 // indirect github.com/sergi/go-diff v1.4.0 // indirect + github.com/shirou/gopsutil/v4 v4.26.7 // indirect github.com/stretchr/objx v0.5.3 // indirect github.com/tailscale/go-winio v0.0.0-20231025203758-c4f33415bf55 // indirect + github.com/tklauser/go-sysconf v0.4.0 // indirect + github.com/tklauser/numcpus v0.12.0 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/yeqown/reedsolomon v1.0.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect golang.org/x/crypto v0.54.0 // indirect - golang.org/x/exp v0.0.0-20260709172345-9ea1abe57597 // indirect + golang.org/x/exp v0.0.0-20260727155853-b88d891fe743 // indirect golang.org/x/net v0.57.0 // indirect golang.org/x/sync v0.22.0 // indirect golang.zx2c4.com/wireguard/windows v1.0.1 // indirect @@ -81,10 +91,10 @@ require ( github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/go-git/go-git/v6 v6.0.0-alpha.4 github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/lucasb-eyer/go-colorful v1.4.0 - github.com/mattn/go-isatty v0.0.23 - github.com/mattn/go-localereader v0.0.1 // indirect - github.com/mattn/go-runewidth v0.0.24 // indirect + github.com/lucasb-eyer/go-colorful v1.4.1 + github.com/mattn/go-isatty v0.0.24 + github.com/mattn/go-localereader v0.0.2-0.20220822084749-2491eb6c1c75 // indirect + github.com/mattn/go-runewidth v0.0.27 // indirect github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/termenv v0.16.0 // indirect diff --git a/core/go.sum b/core/go.sum index b6f0f4dde..dbee6781b 100644 --- a/core/go.sum +++ b/core/go.sum @@ -2,6 +2,8 @@ filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= github.com/AvengeMedia/dankgo v0.0.0-20260730184236-239485829b0b h1:UwX1H4BkzazL7ips9ljnHzBXGttYARcIi5Njj9aqIt4= github.com/AvengeMedia/dankgo v0.0.0-20260730184236-239485829b0b/go.mod h1:xt8RldAfti0QCWidwYIzsSSoJWsE61WgEhTu2H9UpD4= +github.com/AvengeMedia/dgop v0.2.4-0.20260808141551-f559f2f31d2a h1:bGwK4G22ixHUs5NBeNy4JYMKUMMFoZtQz180OnbSFKE= +github.com/AvengeMedia/dgop v0.2.4-0.20260808141551-f559f2f31d2a/go.mod h1:2kt1u9YgHwi2npqB5ago8kwZdFrHlPGXv3PM/vwRHfY= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/ProtonMail/go-crypto v1.4.1 h1:9RfcZHqEQUvP8RzecWEUafnZVtEvrBVL9BiF67IQOfM= @@ -57,6 +59,8 @@ github.com/coder/websocket v1.8.15/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6p github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creachadair/taskgroup v0.13.2 h1:3KyqakBuFsm3KkXi/9XIb0QcA8tEzLHLgaoidf0MdVc= github.com/creachadair/taskgroup v0.13.2/go.mod h1:i3V1Zx7H8RjwljUEeUWYT30Lmb9poewSb2XI1yTwD0g= +github.com/danielgtaylor/huma/v2 v2.39.1 h1:0kwF4ltQoYZ+IU55VPy+BcGekzgF44R64daTGde1H+g= +github.com/danielgtaylor/huma/v2 v2.39.1/go.mod h1:zcnQ38duIJ3VUHwFaBoZ6x8T+KN/mr33oyqxcj0HTug= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -67,6 +71,8 @@ github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55k github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dlclark/regexp2/v2 v2.5.1 h1:E5Ug7Dh264W1ymdySmiHNcDG7fmsR307APCE5R07a20= github.com/dlclark/regexp2/v2 v2.5.1/go.mod h1:avUrQvPaLz2DrFNHJF0taWAFFX2C1GMSSoeiqFjcBmU= +github.com/ebitengine/purego v0.10.2 h1:W809HbnvzAxgdm+aOvlSekrM16wGCdT/e76+9tS7gzE= +github.com/ebitengine/purego v0.10.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= @@ -83,6 +89,8 @@ github.com/gaissmai/bart v0.26.1 h1:+w4rnLGNlA2GDVn382Tfe3jOsK5vOr5n4KmigJ9lbTo= github.com/gaissmai/bart v0.26.1/go.mod h1:GREWQfTLRWz/c5FTOsIw+KkscuFkIV5t8Rp7Nd1Td5c= github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= +github.com/go-chi/chi/v5 v5.3.1 h1:3j4HZLGZQ3JpMCrPJF/Jl3mYJfWLKBfNJ6quurUGCf8= +github.com/go-chi/chi/v5 v5.3.1/go.mod h1:R+tYY2hNuVUUjxoPtqUdgBqevM9s9njzkTLutVsOCto= github.com/go-git/gcfg/v2 v2.0.2 h1:MY5SIIfTGGEMhdA7d7JePuVVxtKL7Hp+ApGDJAJ7dpo= github.com/go-git/gcfg/v2 v2.0.2/go.mod h1:/lv2NsxvhepuMrldsFilrgct6pxzpGdSRC13ydTLSLs= github.com/go-git/go-billy/v6 v6.0.0-alpha.1 h1:xVjAR4oUvrKy7/Xuw/lLlV3gkxR3KO2H8W+MamuVVsQ= @@ -95,6 +103,9 @@ github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 h1:KZaTBSy github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg= github.com/go-logfmt/logfmt v0.6.1 h1:4hvbpePJKnIzH1B+8OR/JPbTx37NktoI9LE2QZBBkvE= github.com/go-logfmt/logfmt v0.6.1/go.mod h1:EV2pOAQoZaT1ZXZbqDl5hrymndi4SY9ED9/z6CO0XAk= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ= github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c= @@ -105,6 +116,8 @@ github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUv github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= @@ -126,14 +139,16 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lucasb-eyer/go-colorful v1.4.0 h1:UtrWVfLdarDgc44HcS7pYloGHJUjHV/4FwW4TvVgFr4= -github.com/lucasb-eyer/go-colorful v1.4.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/mattn/go-isatty v0.0.23 h1:cYwCQTQf3HB6xUC+BtyCLZNr7IzbOmoZbmssVNzSyiQ= -github.com/mattn/go-isatty v0.0.23/go.mod h1:nMCL3Zebbrt45jsMDgnfIwz6ydEQApk5oEI3HqDio6A= +github.com/lucasb-eyer/go-colorful v1.4.1 h1:1EO+WB73+EH8EVbzlrG3KLAfEypQWVHIBqlTf+2hNss= +github.com/lucasb-eyer/go-colorful v1.4.1/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lufia/plan9stats v0.0.0-20260802145828-341c2f0c90b5 h1:eveIIGn4BGM3qknO74omf6HYr30/exH+eVUTuAgwjZ0= +github.com/lufia/plan9stats v0.0.0-20260802145828-341c2f0c90b5/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/mattn/go-isatty v0.0.24 h1:tGZZoVgT/KiqK1c8ocVLeDS8BSWMRd47J3Lbz7vsReI= +github.com/mattn/go-isatty v0.0.24/go.mod h1:nMCL3Zebbrt45jsMDgnfIwz6ydEQApk5oEI3HqDio6A= github.com/mattn/go-localereader v0.0.2-0.20220822084749-2491eb6c1c75 h1:P8UmIzZMYDR+NGImiFvErt6VWfIRPuGM+vyjiEdkmIw= github.com/mattn/go-localereader v0.0.2-0.20220822084749-2491eb6c1c75/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= -github.com/mattn/go-runewidth v0.0.24 h1:cpokDiIn0MGnhdHwuWnJBITySJ20QyNGnY2kR/ay2DU= -github.com/mattn/go-runewidth v0.0.24/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/mattn/go-runewidth v0.0.27 h1:Feg/Oou5zI/wnpgDF6omIU0OokC9GxLC/WRknhVlIR0= +github.com/mattn/go-runewidth v0.0.27/go.mod h1:3qAiGCV4Koz/yuveO58qUefmUTRm8r0IGEXZ9jeHp/8= github.com/mdlayher/netlink v1.11.2 h1:HKh2jqe+omdSWcQ88nrT7INE61B0NXfiSPFdgL4YbNI= github.com/mdlayher/netlink v1.11.2/go.mod h1:uT2Yc/QLaZubzDpZIBi9d4GoeLwtp3x1AMeqSRrK2sA= github.com/mdlayher/socket v0.6.1 h1:M7uj2NtuujUY4mYr1C57NmfNiRHbkKpnBxO856lsc3A= @@ -155,6 +170,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20260805114148-88456608a4f6 h1:jL3a8soXdzuTCcRnKhOmtcsVOObdDTFf4O2B403HPRU= +github.com/power-devops/perfstat v0.0.0-20260805114148-88456608a4f6/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= @@ -164,6 +181,8 @@ github.com/sblinch/kdl-go v0.0.0-20260121213736-8b7053306ca6 h1:JsjzqC6ymELkN4Xl github.com/sblinch/kdl-go v0.0.0-20260121213736-8b7053306ca6/go.mod h1:b3oNGuAKOQzhsCKmuLc/urEOPzgHj6fB8vl8bwTBh28= github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw= github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/shirou/gopsutil/v4 v4.26.7 h1:IXzpHz/dkMRYAhKkOXr1HB6SuzWU3eoyyeWe7g3bNZc= +github.com/shirou/gopsutil/v4 v4.26.7/go.mod h1:5O9FjBiXoTDFatIWjZZosqj4pV0DRtLx598xGbBehzM= github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= @@ -182,6 +201,10 @@ github.com/tailscale/go-winio v0.0.0-20231025203758-c4f33415bf55 h1:Gzfnfk2TWrk8 github.com/tailscale/go-winio v0.0.0-20231025203758-c4f33415bf55/go.mod h1:4k4QO+dQ3R5FofL+SanAUZe+/QfeK0+OIuwDIRu2vSg= github.com/tailscale/wireguard-go v0.0.0-20260527010701-b48af7099cad h1:Ky26FR5yZ5IKEB0xtm5A8xSTb06ImY7kxBFrvgOmJSg= github.com/tailscale/wireguard-go v0.0.0-20260527010701-b48af7099cad/go.mod h1:6SerzcvHWQchKO2BfNdmquA77CHSECZuFl+D9fp4RnI= +github.com/tklauser/go-sysconf v0.4.0 h1:7H0uAN+7RkwWRaxhYXDLqa5V3LPrJeV8wmD9dRUgPQU= +github.com/tklauser/go-sysconf v0.4.0/go.mod h1:8mTNWyog7H+MpKijp4VmKJAd2bbYQ2zuUwkYRbUArPI= +github.com/tklauser/numcpus v0.12.0 h1:NR85qdvHA9pFse3x3weVZ0r0ST8R6l5RHbZrlRaqob4= +github.com/tklauser/numcpus v0.12.0/go.mod h1:ABHeXzJnr/qqwguhClkZKT1/8VABcYrsyUiUGobwWJg= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= @@ -197,6 +220,8 @@ github.com/yuin/goldmark v1.8.4 h1:oat/nd3U6NeQqFEL3xpEJq7d7c86NI+DbSNGAs4xnjA= github.com/yuin/goldmark v1.8.4/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc h1:+IAOyRda+RLrxa1WC7umKOZRsGq4QrFFMYApOeHzQwQ= github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc/go.mod h1:ovIvrum6DQJA4QsJSovrkC4saKHQVs7TvcaeO8AIl5I= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.etcd.io/bbolt v1.5.0 h1:S7GAl7Fxv12yohbwFfIbQCGDWbQbtDGPET4P/bD4lxU= go.etcd.io/bbolt v1.5.0/go.mod h1:mkltfYE5aUHQxUct9N9V+Kp7aSjFqjgrhcXIS70Lrdk= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= @@ -206,8 +231,8 @@ go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBs go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= golang.org/x/crypto v0.54.0 h1:YLIA59K4fiNzHzjnZt2tUJQjQtUWfWbeHBqKtk3eScw= golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk= -golang.org/x/exp v0.0.0-20260709172345-9ea1abe57597 h1:qLvzZeaANDgyVOA8pyHCOStGlXn0rseXma+GQjeuv2g= -golang.org/x/exp v0.0.0-20260709172345-9ea1abe57597/go.mod h1:EdfpwwqSu+0Li0mzskwHU6FWDV3t9Q+RZDo3QMUtL3Q= +golang.org/x/exp v0.0.0-20260727155853-b88d891fe743 h1:ex206bKw+v3K0dm3andkrIF+ijyQKJG1pLgwQ2PYdQM= +golang.org/x/exp v0.0.0-20260727155853-b88d891fe743/go.mod h1:EdfpwwqSu+0Li0mzskwHU6FWDV3t9Q+RZDo3QMUtL3Q= golang.org/x/image v0.44.0 h1:+tDekMZED9+LrtB3G5xzRggpVh9CARjZqROla3R3R+I= golang.org/x/image v0.44.0/go.mod h1:V8K3KE9KKKE+pLpQDOeN18w9oacNSvy1tDOirTu4xtY= golang.org/x/mod v0.38.0 h1:MECBjubtXD7yj4HrhIUcywNaGeNVUdfVnxmPajOk4yk= @@ -216,7 +241,10 @@ golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE= golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU= golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0= diff --git a/core/internal/distros/arch.go b/core/internal/distros/arch.go index 7b7b05ca9..4f1ec1e78 100644 --- a/core/internal/distros/arch.go +++ b/core/internal/distros/arch.go @@ -118,7 +118,6 @@ func (a *ArchDistribution) DetectDependenciesWithTerminal(ctx context.Context, w } dependencies = append(dependencies, a.detectMatugen()) - dependencies = append(dependencies, a.detectDgop()) dependencies = append(dependencies, a.detectDanksearch()) dependencies = append(dependencies, a.detectDankCalendar()) @@ -219,7 +218,6 @@ func (a *ArchDistribution) GetPackageMappingWithVariants(wm deps.WindowManager, "quickshell": a.getQuickshellMapping(variants["quickshell"]), "dms-greeter": a.getDMSGreeterMapping(variants["dms-greeter"]), "matugen": a.getMatugenMapping(variants["matugen"]), - "dgop": {Name: "dgop", Repository: RepoTypeSystem}, "ghostty": {Name: "ghostty", Repository: RepoTypeSystem}, "kitty": {Name: "kitty", Repository: RepoTypeSystem}, "alacritty": {Name: "alacritty", Repository: RepoTypeSystem}, @@ -659,7 +657,7 @@ func (a *ArchDistribution) installAURPackages(ctx context.Context, packages []st } func (a *ArchDistribution) reorderAURPackages(packages []string) []string { - dmsDepencies := []string{"quickshell", "quickshell-git", "dgop"} + dmsDepencies := []string{"quickshell", "quickshell-git"} var deps []string var others []string diff --git a/core/internal/distros/base.go b/core/internal/distros/base.go index 603225a14..e61690c71 100644 --- a/core/internal/distros/base.go +++ b/core/internal/distros/base.go @@ -103,10 +103,6 @@ func (b *BaseDistribution) detectMatugen() deps.Dependency { return b.detectCommand("matugen", "Material Design color generation tool") } -func (b *BaseDistribution) detectDgop() deps.Dependency { - return b.detectCommand("dgop", "Desktop portal management tool") -} - func (b *BaseDistribution) detectDanksearch() deps.Dependency { return b.detectOptionalPackage("danksearch", "File indexing and search service", b.commandExists("dsearch") || b.commandExists("danksearch")) } diff --git a/core/internal/distros/debian.go b/core/internal/distros/debian.go index 1c5ac4a10..0bf2a6ff2 100644 --- a/core/internal/distros/debian.go +++ b/core/internal/distros/debian.go @@ -70,7 +70,6 @@ func (d *DebianDistribution) DetectDependenciesWithTerminal(ctx context.Context, } dependencies = append(dependencies, d.detectMatugen()) - dependencies = append(dependencies, d.detectDgop()) dependencies = append(dependencies, d.detectDanksearch()) dependencies = append(dependencies, d.detectDankCalendar()) @@ -135,7 +134,6 @@ func (d *DebianDistribution) GetPackageMappingWithVariants(wm deps.WindowManager "quickshell": d.getQuickshellMapping(variants["quickshell"]), "dms-greeter": {Name: "dms-greeter", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, "matugen": {Name: "matugen", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, - "dgop": {Name: "dgop", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, "ghostty": {Name: "ghostty", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, "danksearch": {Name: "danksearch", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, "dankcalendar": {Name: "dankcalendar-git", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, @@ -668,10 +666,6 @@ func (d *DebianDistribution) installBuildDependencies(ctx context.Context, manua if err := d.installRust(ctx, sudoPassword, progressChan); err != nil { return fmt.Errorf("failed to install Rust: %w", err) } - case "dgop": - if err := d.installGo(ctx, sudoPassword, progressChan); err != nil { - return fmt.Errorf("failed to install Go: %w", err) - } } } @@ -730,24 +724,6 @@ func (d *DebianDistribution) installRust(ctx context.Context, sudoPassword strin return nil } -func (d *DebianDistribution) installGo(ctx context.Context, sudoPassword string, progressChan chan<- InstallProgressMsg) error { - if d.commandExists("go") { - return nil - } - - progressChan <- InstallProgressMsg{ - Phase: PhaseSystemPackages, - Progress: 0.87, - Step: "Installing Go...", - IsComplete: false, - NeedsSudo: true, - CommandInfo: "sudo apt-get install golang-go", - } - - installCmd := privesc.ExecCommand(ctx, sudoPassword, "DEBIAN_FRONTEND=noninteractive apt-get install -y golang-go") - return d.runWithProgress(installCmd, progressChan, PhaseSystemPackages, 0.87, 0.90) -} - func (d *DebianDistribution) InstallManualPackages(ctx context.Context, packages []string, variantMap map[string]deps.PackageVariant, sudoPassword string, progressChan chan<- InstallProgressMsg) error { if len(packages) == 0 { return nil diff --git a/core/internal/distros/fedora.go b/core/internal/distros/fedora.go index 2899c7833..0d476fbb6 100644 --- a/core/internal/distros/fedora.go +++ b/core/internal/distros/fedora.go @@ -103,7 +103,6 @@ func (f *FedoraDistribution) DetectDependenciesWithTerminal(ctx context.Context, } dependencies = append(dependencies, f.detectMatugen()) - dependencies = append(dependencies, f.detectDgop()) dependencies = append(dependencies, f.detectDanksearch()) dependencies = append(dependencies, f.detectDankCalendar()) @@ -139,7 +138,6 @@ func (f *FedoraDistribution) GetPackageMappingWithVariants(wm deps.WindowManager "dms-greeter": {Name: "dms-greeter", Repository: RepoTypeCOPR, RepoURL: "avengemedia/danklinux"}, "matugen": {Name: "matugen", Repository: RepoTypeCOPR, RepoURL: "avengemedia/danklinux"}, "dms (DankMaterialShell)": f.getDmsMapping(variants["dms (DankMaterialShell)"]), - "dgop": {Name: "dgop", Repository: RepoTypeCOPR, RepoURL: "avengemedia/danklinux"}, "danksearch": {Name: "danksearch", Repository: RepoTypeCOPR, RepoURL: "avengemedia/danklinux"}, "dankcalendar": {Name: "dankcalendar-git", Repository: RepoTypeCOPR, RepoURL: "avengemedia/danklinux"}, } diff --git a/core/internal/distros/gentoo.go b/core/internal/distros/gentoo.go index 7bf9f7d96..ed1a1e863 100644 --- a/core/internal/distros/gentoo.go +++ b/core/internal/distros/gentoo.go @@ -117,7 +117,6 @@ func (g *GentooDistribution) DetectDependenciesWithTerminal(ctx context.Context, } dependencies = append(dependencies, g.detectMatugen()) - dependencies = append(dependencies, g.detectDgop()) dependencies = append(dependencies, g.detectDanksearch()) return dependencies, nil @@ -176,7 +175,6 @@ func (g *GentooDistribution) GetPackageMappingWithVariants(wm deps.WindowManager "quickshell": g.getQuickshellMapping(variants["quickshell"]), "matugen": {Name: "x11-misc/matugen", Repository: RepoTypeGURU, AcceptKeywords: archKeyword}, "dms (DankMaterialShell)": g.getDmsMapping(), - "dgop": {Name: "gui-apps/dgop", Repository: RepoTypeGURU, AcceptKeywords: archKeyword}, "danksearch": {Name: "gui-apps/danksearch", Repository: RepoTypeGURU, AcceptKeywords: archKeyword}, } diff --git a/core/internal/distros/manual_packages.go b/core/internal/distros/manual_packages.go index 2540f55d4..9ef218864 100644 --- a/core/internal/distros/manual_packages.go +++ b/core/internal/distros/manual_packages.go @@ -59,10 +59,6 @@ func (m *ManualPackageInstaller) InstallManualPackages(ctx context.Context, pack if err := m.installDankMaterialShell(ctx, variant, sudoPassword, progressChan); err != nil { return fmt.Errorf("failed to install DankMaterialShell: %w", err) } - case "dgop": - if err := m.installDgop(ctx, sudoPassword, progressChan); err != nil { - return fmt.Errorf("failed to install dgop: %w", err) - } case "niri": if err := m.installNiri(ctx, sudoPassword, progressChan); err != nil { return fmt.Errorf("failed to install niri: %w", err) @@ -95,66 +91,6 @@ func (m *ManualPackageInstaller) InstallManualPackages(ctx context.Context, pack return nil } -func (m *ManualPackageInstaller) installDgop(ctx context.Context, sudoPassword string, progressChan chan<- InstallProgressMsg) error { - m.log("Installing dgop from source...") - - homeDir := os.Getenv("HOME") - if homeDir == "" { - return fmt.Errorf("HOME environment variable not set") - } - - cacheDir := filepath.Join(homeDir, ".cache", "dankinstall") - if err := os.MkdirAll(cacheDir, 0o755); err != nil { - return fmt.Errorf("failed to create cache directory: %w", err) - } - - tmpDir := filepath.Join(cacheDir, "dgop-build") - if err := os.MkdirAll(tmpDir, 0o755); err != nil { - return fmt.Errorf("failed to create temp directory: %w", err) - } - defer os.RemoveAll(tmpDir) - - progressChan <- InstallProgressMsg{ - Phase: PhaseSystemPackages, - Progress: 0.1, - Step: "Cloning dgop repository...", - IsComplete: false, - CommandInfo: "git clone https://github.com/AvengeMedia/dgop.git", - } - - cloneCmd := exec.CommandContext(ctx, "git", "clone", "https://github.com/AvengeMedia/dgop.git", tmpDir) - if err := cloneCmd.Run(); err != nil { - m.logError("failed to clone dgop repository", err) - return fmt.Errorf("failed to clone dgop repository: %w", err) - } - - buildCmd := exec.CommandContext(ctx, "make") - buildCmd.Dir = tmpDir - buildCmd.Env = append(os.Environ(), "TMPDIR="+cacheDir) - if err := m.runWithProgressStep(buildCmd, progressChan, PhaseSystemPackages, 0.4, 0.7, "Building dgop..."); err != nil { - return fmt.Errorf("failed to build dgop: %w", err) - } - - progressChan <- InstallProgressMsg{ - Phase: PhaseSystemPackages, - Progress: 0.7, - Step: "Installing dgop...", - IsComplete: false, - NeedsSudo: true, - CommandInfo: "sudo make install", - } - - installCmd := privesc.ExecCommand(ctx, sudoPassword, "make install") - installCmd.Dir = tmpDir - if err := installCmd.Run(); err != nil { - m.logError("failed to install dgop", err) - return fmt.Errorf("failed to install dgop: %w", err) - } - - m.log("dgop installed successfully from source") - return nil -} - func (m *ManualPackageInstaller) installNiri(ctx context.Context, sudoPassword string, progressChan chan<- InstallProgressMsg) error { m.log("Installing niri from source...") diff --git a/core/internal/distros/opensuse.go b/core/internal/distros/opensuse.go index aa5733299..56f05c9e1 100644 --- a/core/internal/distros/opensuse.go +++ b/core/internal/distros/opensuse.go @@ -90,7 +90,6 @@ func (o *OpenSUSEDistribution) DetectDependenciesWithTerminal(ctx context.Contex } dependencies = append(dependencies, o.detectMatugen()) - dependencies = append(dependencies, o.detectDgop()) dependencies = append(dependencies, o.detectDanksearch()) dependencies = append(dependencies, o.detectDankCalendar()) @@ -130,7 +129,6 @@ func (o *OpenSUSEDistribution) GetPackageMappingWithVariants(wm deps.WindowManag "dms-greeter": {Name: "dms-greeter", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, "ghostty": {Name: "ghostty", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, "matugen": {Name: "matugen", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, - "dgop": {Name: "dgop", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, "danksearch": {Name: "danksearch", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, "dankcalendar": {Name: "dankcalendar-git", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, } diff --git a/core/internal/distros/ubuntu.go b/core/internal/distros/ubuntu.go index f1fe0ed1e..f9f8fe947 100644 --- a/core/internal/distros/ubuntu.go +++ b/core/internal/distros/ubuntu.go @@ -79,7 +79,6 @@ func (u *UbuntuDistribution) DetectDependenciesWithTerminal(ctx context.Context, } dependencies = append(dependencies, u.detectMatugen()) - dependencies = append(dependencies, u.detectDgop()) dependencies = append(dependencies, u.detectDanksearch()) dependencies = append(dependencies, u.detectDankCalendar()) @@ -124,7 +123,6 @@ func (u *UbuntuDistribution) GetPackageMappingWithVariants(wm deps.WindowManager "quickshell": u.getQuickshellMapping(variants["quickshell"]), "dms-greeter": {Name: "dms-greeter", Repository: RepoTypePPA, RepoURL: "ppa:avengemedia/danklinux"}, "matugen": {Name: "matugen", Repository: RepoTypePPA, RepoURL: "ppa:avengemedia/danklinux"}, - "dgop": {Name: "dgop", Repository: RepoTypePPA, RepoURL: "ppa:avengemedia/danklinux"}, "ghostty": {Name: "ghostty", Repository: RepoTypePPA, RepoURL: "ppa:avengemedia/danklinux"}, "danksearch": {Name: "danksearch", Repository: RepoTypePPA, RepoURL: "ppa:avengemedia/danklinux"}, "dankcalendar": {Name: "dankcalendar-git", Repository: RepoTypePPA, RepoURL: "ppa:avengemedia/danklinux"}, @@ -577,10 +575,6 @@ func (u *UbuntuDistribution) installBuildDependencies(ctx context.Context, manua if err := u.installRust(ctx, sudoPassword, progressChan); err != nil { return fmt.Errorf("failed to install Rust: %w", err) } - case "dgop": - if err := u.installGo(ctx, sudoPassword, progressChan); err != nil { - return fmt.Errorf("failed to install Go: %w", err) - } } } @@ -640,53 +634,6 @@ func (u *UbuntuDistribution) installRust(ctx context.Context, sudoPassword strin return nil } -func (u *UbuntuDistribution) installGo(ctx context.Context, sudoPassword string, progressChan chan<- InstallProgressMsg) error { - if u.commandExists("go") { - return nil - } - - progressChan <- InstallProgressMsg{ - Phase: PhaseSystemPackages, - Progress: 0.87, - Step: "Adding Go PPA repository...", - IsComplete: false, - NeedsSudo: true, - CommandInfo: "sudo add-apt-repository ppa:longsleep/golang-backports", - } - - addPPACmd := privesc.ExecCommand(ctx, sudoPassword, - "add-apt-repository -y ppa:longsleep/golang-backports") - if err := u.runWithProgress(addPPACmd, progressChan, PhaseSystemPackages, 0.87, 0.88); err != nil { - return fmt.Errorf("failed to add Go PPA: %w", err) - } - - progressChan <- InstallProgressMsg{ - Phase: PhaseSystemPackages, - Progress: 0.88, - Step: "Updating package lists...", - IsComplete: false, - NeedsSudo: true, - CommandInfo: "sudo apt-get update", - } - - updateCmd := privesc.ExecCommand(ctx, sudoPassword, "apt-get update") - if err := u.runWithProgress(updateCmd, progressChan, PhaseSystemPackages, 0.88, 0.89); err != nil { - return fmt.Errorf("failed to update package lists after adding Go PPA: %w", err) - } - - progressChan <- InstallProgressMsg{ - Phase: PhaseSystemPackages, - Progress: 0.89, - Step: "Installing Go...", - IsComplete: false, - NeedsSudo: true, - CommandInfo: "sudo apt-get install golang-go", - } - - installCmd := privesc.ExecCommand(ctx, sudoPassword, "apt-get install -y golang-go") - return u.runWithProgress(installCmd, progressChan, PhaseSystemPackages, 0.89, 0.90) -} - func (u *UbuntuDistribution) InstallManualPackages(ctx context.Context, packages []string, variantMap map[string]deps.PackageVariant, sudoPassword string, progressChan chan<- InstallProgressMsg) error { if len(packages) == 0 { return nil diff --git a/core/internal/distros/void.go b/core/internal/distros/void.go index c3b10923a..545c75092 100644 --- a/core/internal/distros/void.go +++ b/core/internal/distros/void.go @@ -83,7 +83,6 @@ func (v *VoidDistribution) DetectDependenciesWithTerminal(ctx context.Context, w } dependencies = append(dependencies, v.detectMatugen()) - dependencies = append(dependencies, v.detectDgop()) dependencies = append(dependencies, v.detectDanksearch()) dependencies = append(dependencies, v.detectDankCalendar()) @@ -183,7 +182,6 @@ func (v *VoidDistribution) GetPackageMappingWithVariants(wm deps.WindowManager, "matugen": {Name: "matugen", Repository: RepoTypeSystem}, "dms (DankMaterialShell)": v.getDmsMapping(variants["dms (DankMaterialShell)"]), "dms-greeter": {Name: "dms-greeter", Repository: RepoTypeXBPS, RepoURL: VoidDMSRepo}, - "dgop": {Name: "dgop", Repository: RepoTypeXBPS, RepoURL: VoidDankLinuxRepo}, "danksearch": {Name: "danksearch", Repository: RepoTypeXBPS, RepoURL: VoidDankLinuxRepo}, "dankcalendar": {Name: "dankcalendar", Repository: RepoTypeXBPS, RepoURL: VoidDankLinuxRepo}, } diff --git a/core/internal/server/dgop/handlers.go b/core/internal/server/dgop/handlers.go new file mode 100644 index 000000000..e79d63985 --- /dev/null +++ b/core/internal/server/dgop/handlers.go @@ -0,0 +1,91 @@ +package dgop + +import ( + "context" + "fmt" + "time" + + "github.com/AvengeMedia/DankMaterialShell/core/internal/server/models" + "github.com/AvengeMedia/dankgo/ipc/params" + "github.com/AvengeMedia/dgop/gops" +) + +const metaTimeout = 10 * time.Second + +var util = gops.NewGopsUtil() + +func HandleRequest(conn *models.Conn, req models.Request) { + switch req.Method { + case "dgop.meta": + handleMeta(conn, req) + case "dgop.gpu": + handleGPU(conn, req) + case "dgop.hardware": + handleHardware(conn, req) + case "dgop.modules": + handleModules(conn, req) + default: + models.RespondError(conn, req.ID, fmt.Sprintf("unknown method: %s", req.Method)) + } +} + +func handleMeta(conn *models.Conn, req models.Request) { + modules := params.StringSlice(req.Params, "modules") + if len(modules) == 0 { + models.RespondError(conn, req.ID, "modules is required") + return + } + + metaParams := gops.MetaParams{ + SortBy: gops.ProcSortBy(params.StringOpt(req.Params, "sort", string(gops.SortByCPU))), + ProcLimit: params.IntOpt(req.Params, "limit", 20), + EnableCPU: !params.BoolLoose(req.Params, "noCpu"), + MergeChildren: params.BoolLoose(req.Params, "mergeChildren"), + GPUPciIds: params.StringSlice(req.Params, "gpuPciIds"), + CPUCursor: params.StringOpt(req.Params, "cpuCursor", ""), + ProcCursor: params.StringOpt(req.Params, "procCursor", ""), + NetRateCursor: params.StringOpt(req.Params, "netRateCursor", ""), + DiskRateCursor: params.StringOpt(req.Params, "diskRateCursor", ""), + } + + ctx, cancel := context.WithTimeout(context.Background(), metaTimeout) + defer cancel() + + meta, err := util.GetMeta(ctx, modules, metaParams) + if err != nil { + models.RespondError(conn, req.ID, err.Error()) + return + } + + models.Respond(conn, req.ID, meta) +} + +func handleGPU(conn *models.Conn, req models.Request) { + gpu, err := util.GetGPUInfo() + if err != nil { + models.RespondError(conn, req.ID, err.Error()) + return + } + + models.Respond(conn, req.ID, gpu) +} + +func handleHardware(conn *models.Conn, req models.Request) { + hw, err := util.GetSystemHardware() + if err != nil { + models.RespondError(conn, req.ID, err.Error()) + return + } + + models.Respond(conn, req.ID, hw) +} + +func handleModules(conn *models.Conn, req models.Request) { + modules, err := util.GetModules() + if err != nil { + models.RespondError(conn, req.ID, err.Error()) + return + } + + models.Respond(conn, req.ID, modules) +} diff --git a/core/internal/server/router.go b/core/internal/server/router.go index 6117f1139..97af4f0d7 100644 --- a/core/internal/server/router.go +++ b/core/internal/server/router.go @@ -10,6 +10,7 @@ import ( "github.com/AvengeMedia/DankMaterialShell/core/internal/server/clipboard" "github.com/AvengeMedia/DankMaterialShell/core/internal/server/cups" serverDbus "github.com/AvengeMedia/DankMaterialShell/core/internal/server/dbus" + serverDgop "github.com/AvengeMedia/DankMaterialShell/core/internal/server/dgop" "github.com/AvengeMedia/DankMaterialShell/core/internal/server/evdev" "github.com/AvengeMedia/DankMaterialShell/core/internal/server/freedesktop" "github.com/AvengeMedia/DankMaterialShell/core/internal/server/location" @@ -112,6 +113,11 @@ func RouteRequest(conn *models.Conn, req models.Request) { return } + if strings.HasPrefix(req.Method, "dgop.") { + serverDgop.HandleRequest(conn, req) + return + } + if strings.HasPrefix(req.Method, "browser.") || strings.HasPrefix(req.Method, "apppicker.") { if appPickerManager == nil { models.RespondError(conn, req.ID, "apppicker manager not initialized") diff --git a/core/internal/server/server.go b/core/internal/server/server.go index 4db14806c..6e1c328e4 100644 --- a/core/internal/server/server.go +++ b/core/internal/server/server.go @@ -36,7 +36,7 @@ import ( "github.com/AvengeMedia/dankgo/syncmap" ) -const APIVersion = 29 +const APIVersion = 30 var CLIVersion = "dev" @@ -390,77 +390,7 @@ func routeRequestRecovered(conn *models.Conn, req models.Request) { } func getCapabilities() Capabilities { - caps := []string{"plugins"} - - if networkManager != nil { - caps = append(caps, "network") - } - - if loginctlManager != nil { - caps = append(caps, "loginctl") - } - - if freedesktopManager != nil { - caps = append(caps, "freedesktop") - } - - if waylandManager != nil { - caps = append(caps, "gamma") - } - - if bluezManager != nil { - caps = append(caps, "bluetooth") - } - - if appPickerManager != nil { - caps = append(caps, "browser") - } - - if cupsAvailable() { - caps = append(caps, "cups") - } - - if tailscaleManager != nil && tailscaleManager.IsAvailable() { - caps = append(caps, "tailscale") - } - - if brightnessManager != nil { - caps = append(caps, "brightness") - } - - if wlrOutputManager != nil { - caps = append(caps, "wlroutput") - } - - if evdevManager != nil { - caps = append(caps, "evdev") - } - - if clipboardManager != nil { - caps = append(caps, "clipboard") - } - - if themeModeManager != nil { - caps = append(caps, "theme.auto") - } - - if wallpaperManager != nil { - caps = append(caps, "wallpaper") - } - - if dbusManager != nil { - caps = append(caps, "dbus") - } - - if sysUpdateManager != nil { - caps = append(caps, "sysupdate") - } - - return Capabilities{Capabilities: caps} -} - -func getServerInfo() ServerInfo { - caps := []string{"plugins"} + caps := []string{"plugins", "dgop"} if networkManager != nil { caps = append(caps, "network") @@ -530,10 +460,14 @@ func getServerInfo() ServerInfo { caps = append(caps, "sysupdate") } + return Capabilities{Capabilities: caps} +} + +func getServerInfo() ServerInfo { return ServerInfo{ APIVersion: APIVersion, CLIVersion: CLIVersion, - Capabilities: caps, + Capabilities: getCapabilities().Capabilities, } } diff --git a/distro/debian/dms-git/debian/control b/distro/debian/dms-git/debian/control index 2b1ee7a82..7dcf4a16a 100644 --- a/distro/debian/dms-git/debian/control +++ b/distro/debian/dms-git/debian/control @@ -15,7 +15,6 @@ Depends: ${misc:Depends}, accountsservice, cava, danksearch, - dgop, matugen, qml6-module-qtcore, qml6-module-qtmultimedia, diff --git a/distro/fedora/dms-git.spec b/distro/fedora/dms-git.spec index 837a16189..cbe929350 100644 --- a/distro/fedora/dms-git.spec +++ b/distro/fedora/dms-git.spec @@ -29,7 +29,6 @@ BuildRequires: systemd-rpm-macros Requires: (quickshell-git or quickshell) Requires: accountsservice Requires: dms-cli = %{epoch}:%{version}-%{release} -Requires: dgop # Core utilities (Recommended for DMS functionality) Recommends: cava diff --git a/distro/nix/common.nix b/distro/nix/common.nix index 2f99bdcec..288e0b061 100644 --- a/distro/nix/common.nix +++ b/distro/nix/common.nix @@ -11,7 +11,6 @@ in packages = [ cfg.package ] - ++ lib.optional cfg.enableSystemMonitoring cfg.dgop.package ++ lib.optionals cfg.enableVPN [ pkgs.glib pkgs.networkmanager diff --git a/distro/nix/options.nix b/distro/nix/options.nix index 428b3fc32..8b4b676ea 100644 --- a/distro/nix/options.nix +++ b/distro/nix/options.nix @@ -39,14 +39,10 @@ in }; }; - dgop = { - package = lib.mkPackageOption pkgs "dgop" { }; - }; - enableSystemMonitoring = lib.mkOption { type = types.bool; default = true; - description = "Add needed dependencies to use system monitoring widgets"; + description = "Enable system monitoring widgets and keybinds"; }; enableVPN = lib.mkOption { diff --git a/distro/opensuse/dms-git.spec b/distro/opensuse/dms-git.spec index 4907784c8..58f8eddfe 100644 --- a/distro/opensuse/dms-git.spec +++ b/distro/opensuse/dms-git.spec @@ -18,7 +18,6 @@ BuildRequires: systemd-rpm-macros Requires: (quickshell-git or quickshell) Requires: accountsservice -Requires: dgop Recommends: cava Recommends: danksearch diff --git a/distro/ubuntu/dms-git/debian/control b/distro/ubuntu/dms-git/debian/control index 79c7d1f9b..e0f22835f 100644 --- a/distro/ubuntu/dms-git/debian/control +++ b/distro/ubuntu/dms-git/debian/control @@ -16,7 +16,6 @@ Depends: ${misc:Depends}, accountsservice, cava, danksearch, - dgop, matugen, qml6-module-qtcore, qml6-module-qtmultimedia, diff --git a/distro/void/srcpkgs/dms-git/template b/distro/void/srcpkgs/dms-git/template index cbd9d2ef2..c0b11c9cd 100644 --- a/distro/void/srcpkgs/dms-git/template +++ b/distro/void/srcpkgs/dms-git/template @@ -34,7 +34,7 @@ conflicts="dms" provides="dms-${version}_${revision}" # Optional feature deps are listed in distro/void/README.md. -depends="quickshell accountsservice dgop matugen dbus elogind" +depends="quickshell accountsservice matugen dbus elogind" pre_build() { make sync-shell diff --git a/quickshell/Modals/ProcessListModal.qml b/quickshell/Modals/ProcessListModal.qml index 1fc3b1041..f398f1bf7 100644 --- a/quickshell/Modals/ProcessListModal.qml +++ b/quickshell/Modals/ProcessListModal.qml @@ -1,6 +1,5 @@ import QtQuick import QtQuick.Layouts -import Quickshell import Quickshell.Wayland import qs.Common import qs.Modules.ProcessList @@ -214,7 +213,7 @@ DankFloatingWindow { } StyledText { - text: I18n.tr("The 'dgop' tool is required for system monitoring.\nPlease install dgop to use this feature.", "dgop unavailable error message") + text: I18n.tr("DMS_SOCKET not available") font.pixelSize: Theme.fontSizeMedium color: Theme.surfaceText anchors.horizontalCenter: parent.horizontalCenter diff --git a/quickshell/Modules/ControlCenter/Widgets/DiskUsagePill.qml b/quickshell/Modules/ControlCenter/Widgets/DiskUsagePill.qml index 0dd2f46bf..d821fb219 100644 --- a/quickshell/Modules/ControlCenter/Widgets/DiskUsagePill.qml +++ b/quickshell/Modules/ControlCenter/Widgets/DiskUsagePill.qml @@ -46,7 +46,7 @@ CompoundPill { secondaryText: { if (!DgopService.dgopAvailable) { - return I18n.tr("dgop not available"); + return I18n.tr("DMS_SOCKET not available"); } if (!selectedMount) { return I18n.tr("No disk data available"); diff --git a/quickshell/Services/DgopService.qml b/quickshell/Services/DgopService.qml index 406bdf4cc..2c1383a37 100644 --- a/quickshell/Services/DgopService.qml +++ b/quickshell/Services/DgopService.qml @@ -4,6 +4,7 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell import Quickshell.Io +import Quickshell.Services.UPower import qs.Common import qs.Services @@ -12,9 +13,11 @@ Singleton { readonly property var log: Log.scoped("DgopService") property int refCount: 0 - property int updateInterval: refCount > 0 ? 3000 : 30000 + readonly property bool powerSaver: PowerProfileWatcher.currentProfile === PowerProfile.PowerSaver + property int updateInterval: refCount > 0 ? (powerSaver ? 6000 : 3000) : (powerSaver ? 60000 : 30000) property bool isUpdating: false - property bool dgopAvailable: false + readonly property bool dgopAvailable: DMSService.isConnected && DMSService.capabilities.includes("dgop") + property bool sessionGpuIdsSeeded: false property var moduleRefCounts: ({}) property var enabledModules: [] @@ -23,7 +26,6 @@ Singleton { property int processLimit: 20 property string processSort: "cpu" property bool noCpu: false - property int dgopProcessPid: 0 // Cursor data for accurate CPU calculations property string cpuCursor: "" @@ -152,6 +154,8 @@ Singleton { if (!enabledModules.includes("processes")) { procCursor = ""; processSampleCount = 0; + allProcesses = []; + processes = []; } } } @@ -200,33 +204,55 @@ Singleton { } function updateAllStats() { - if (dgopAvailable && refCount > 0 && enabledModules.length > 0) { - isUpdating = true; - dgopProcess.running = true; - } else { + if (!dgopAvailable || refCount === 0 || enabledModules.length === 0) { isUpdating = false; + return; } + if (isUpdating) + return; + + const params = buildMetaParams(); + if (!params) + return; + + isUpdating = true; + DMSService.sendRequest("dgop.meta", params, response => { + if (!response.result) { + log.warn("dgop.meta failed:", response.error || "empty result"); + isUpdating = false; + return; + } + parseData(response.result); + }); } function initializeGpuMetadata() { if (!dgopAvailable) return; - gpuInitProcess.running = true; + DMSService.sendRequest("dgop.gpu", null, response => { + if (!response.result) { + log.warn("dgop.gpu failed:", response.error || "empty result"); + return; + } + parseData(response.result); + }); } function initializeSystemMetadata() { if (!dgopAvailable) return; - systemInitProcess.running = true; + DMSService.sendRequest("dgop.hardware", null, response => { + if (!response.result) { + log.warn("dgop.hardware failed:", response.error || "empty result"); + return; + } + parseData(response.result); + }); } - function buildDgopCommand() { - const cmd = ["dgop", "meta", "--json"]; - - if (enabledModules.length === 0) { - // Don't run if no modules are needed - return []; - } + function buildMetaParams() { + if (enabledModules.length === 0) + return null; // Replace 'gpu' with 'gpu-temp' when we have PCI IDs to monitor const finalModules = []; @@ -238,41 +264,40 @@ Singleton { } } - // Add gpu-temp module automatically when we have PCI IDs to monitor if (gpuPciIds.length > 0 && finalModules.indexOf("gpu-temp") === -1) { finalModules.push("gpu-temp"); } + const params = {}; if (enabledModules.indexOf("all") !== -1) { - cmd.push("--modules", "all"); + params.modules = ["all"]; } else if (finalModules.length > 0) { - const moduleList = finalModules.join(","); - cmd.push("--modules", moduleList); + params.modules = finalModules; } else { - return []; + return null; } - // Add cursor data if available for accurate CPU percentages + // Cursor data enables accurate CPU percentages between samples if ((enabledModules.includes("cpu") || enabledModules.includes("all")) && cpuCursor) { - cmd.push("--cpu-cursor", cpuCursor); + params.cpuCursor = cpuCursor; } if ((enabledModules.includes("processes") || enabledModules.includes("all")) && procCursor) { - cmd.push("--proc-cursor", procCursor); + params.procCursor = procCursor; } if (gpuPciIds.length > 0) { - cmd.push("--gpu-pci-ids", gpuPciIds.join(",")); + params.gpuPciIds = gpuPciIds; } if (enabledModules.indexOf("processes") !== -1 || enabledModules.indexOf("all") !== -1) { - cmd.push("--limit", "100"); // Get more data for client sorting - cmd.push("--sort", "cpu"); // Always get CPU sorted data + params.limit = 100; // Get more data for client sorting + params.sort = "cpu"; if (noCpu) { - cmd.push("--no-cpu"); + params.noCpu = true; } } - return cmd; + return params; } function parseData(data) { @@ -291,6 +316,10 @@ Singleton { if (cpu.cursor) { cpuCursor = cpu.cursor; } + + if (cpuSampleCount === 1) { + primeTimer.restart(); + } } if (data.memory) { @@ -370,34 +399,34 @@ Singleton { } if (data.processes && Array.isArray(data.processes)) { - const newProcesses = []; processSampleCount++; - const ourPid = dgopProcessPid; - - for (const proc of data.processes) { - if (ourPid > 0 && proc.pid === ourPid) - continue; - - const cpuUsage = processSampleCount >= 2 ? (proc.cpu || 0) : 0; - - newProcesses.push({ - "pid": proc.pid || 0, - "ppid": proc.ppid || 0, - "cpu": cpuUsage, - "memoryPercent": proc.memoryPercent || proc.pssPercent || 0, - "memoryKB": proc.memoryKB || proc.pssKB || 0, - "command": proc.command || "", - "fullCommand": proc.fullCommand || "", - "username": proc.username || "", - "displayName": (proc.command && proc.command.length > 15) ? proc.command.substring(0, 15) + "..." : (proc.command || "") - }); - } - allProcesses = newProcesses; - applySorting(); if (data.cursor) { procCursor = data.cursor; } + + // First sample has no CPU deltas; use it for the cursor only and + // resample quickly so the visible list gets real values in one update + if (processSampleCount === 1) { + primeTimer.restart(); + } else { + const newProcesses = []; + for (const proc of data.processes) { + newProcesses.push({ + "pid": proc.pid || 0, + "ppid": proc.ppid || 0, + "cpu": proc.cpu || 0, + "memoryPercent": proc.memoryPercent || proc.pssPercent || 0, + "memoryKB": proc.memoryKB || proc.pssKB || 0, + "command": proc.command || "", + "fullCommand": proc.fullCommand || "", + "username": proc.username || "", + "displayName": (proc.command && proc.command.length > 15) ? proc.command.substring(0, 15) + "..." : (proc.command || "") + }); + } + allProcesses = newProcesses; + applySorting(); + } } const gpuData = (data.gpu && data.gpu.gpus) || data.gpus; @@ -575,6 +604,12 @@ Singleton { processes = sorted.slice(0, processLimit); } + Timer { + id: primeTimer + interval: 1000 + onTriggered: root.updateAllStats() + } + Timer { id: updateTimer interval: root.updateInterval @@ -584,98 +619,17 @@ Singleton { onTriggered: root.updateAllStats() } - Process { - id: dgopProcess - command: root.buildDgopCommand() - running: false - onStarted: dgopProcessPid = processId ?? 0 - onExited: exitCode => { - if (exitCode !== 0) { - log.warn("Dgop process failed with exit code:", exitCode); - isUpdating = false; - } - } - stdout: StdioCollector { - onStreamFinished: { - if (text.trim()) { - try { - const data = JSON.parse(text.trim()); - parseData(data); - } catch (e) { - log.warn("Failed to parse dgop JSON:", e); - log.warn("Raw text was:", text.substring(0, 200)); - isUpdating = false; - } - } - } - } - } + onDgopAvailableChanged: { + if (!dgopAvailable) + return; - Process { - id: gpuInitProcess - command: ["dgop", "gpu", "--json"] - running: false - onExited: exitCode => { - if (exitCode !== 0) { - log.warn("GPU init process failed with exit code:", exitCode); - } - } - stdout: StdioCollector { - onStreamFinished: { - if (text.trim()) { - try { - const data = JSON.parse(text.trim()); - parseData(data); - } catch (e) { - log.warn("Failed to parse GPU init JSON:", e); - } - } - } - } - } + initializeGpuMetadata(); + initializeSystemMetadata(); - Process { - id: systemInitProcess - command: ["dgop", "hardware", "--json"] - running: false - onExited: exitCode => { - if (exitCode !== 0) { - log.warn("System init process failed with exit code:", exitCode); - } - } - stdout: StdioCollector { - onStreamFinished: { - if (text.trim()) { - try { - const data = JSON.parse(text.trim()); - parseData(data); - } catch (e) { - log.warn("Failed to parse system init JSON:", e); - } - } - } - } - } - - Process { - id: dgopCheckProcess - command: ["sh", "-c", "command -v dgop"] - running: false - onExited: exitCode => { - dgopAvailable = (exitCode === 0); - if (dgopAvailable) { - initializeGpuMetadata(); - initializeSystemMetadata(); - if (SessionData.enabledGpuPciIds && SessionData.enabledGpuPciIds.length > 0) { - for (const pciId of SessionData.enabledGpuPciIds) { - addGpuPciId(pciId); - } - if (refCount > 0 && enabledModules.length > 0) { - updateAllStats(); - } - } - } else { - log.warn("dgop is not installed or not in PATH"); + if (!sessionGpuIdsSeeded && SessionData.enabledGpuPciIds && SessionData.enabledGpuPciIds.length > 0) { + sessionGpuIdsSeeded = true; + for (const pciId of SessionData.enabledGpuPciIds) { + addGpuPciId(pciId); } } } @@ -720,7 +674,6 @@ Singleton { } Component.onCompleted: { - dgopCheckProcess.running = true; osReleaseProcess.running = true; } }