Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6fc7e8bc8a | ||
|
|
96bfc1fd5a |
19 changed files with 1074 additions and 1020 deletions
544
plugin/Cargo.lock
generated
544
plugin/Cargo.lock
generated
|
|
@ -23,6 +23,64 @@ version = "1.0.102"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
|
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "async-broadcast"
|
||||||
|
version = "0.7.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532"
|
||||||
|
dependencies = [
|
||||||
|
"event-listener",
|
||||||
|
"event-listener-strategy",
|
||||||
|
"futures-core",
|
||||||
|
"pin-project-lite",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "async-recursion"
|
||||||
|
version = "1.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "async-trait"
|
||||||
|
version = "0.1.89"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "autocfg"
|
||||||
|
version = "1.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "2.11.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bumpalo"
|
||||||
|
version = "3.20.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bytes"
|
||||||
|
version = "1.11.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.2.61"
|
version = "1.2.61"
|
||||||
|
|
@ -97,6 +155,15 @@ dependencies = [
|
||||||
"unicode-width 0.2.2",
|
"unicode-width 0.2.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "concurrent-queue"
|
||||||
|
version = "2.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
|
||||||
|
dependencies = [
|
||||||
|
"crossbeam-utils",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "convert_case"
|
name = "convert_case"
|
||||||
version = "0.6.0"
|
version = "0.6.0"
|
||||||
|
|
@ -106,6 +173,12 @@ dependencies = [
|
||||||
"unicode-segmentation",
|
"unicode-segmentation",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossbeam-utils"
|
||||||
|
version = "0.8.21"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ctor"
|
name = "ctor"
|
||||||
version = "0.13.1"
|
version = "0.13.1"
|
||||||
|
|
@ -282,12 +355,76 @@ dependencies = [
|
||||||
"windows-sys",
|
"windows-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "endi"
|
||||||
|
version = "1.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "enumflags2"
|
||||||
|
version = "0.7.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef"
|
||||||
|
dependencies = [
|
||||||
|
"enumflags2_derive",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "enumflags2_derive"
|
||||||
|
version = "0.7.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "equivalent"
|
name = "equivalent"
|
||||||
version = "1.0.2"
|
version = "1.0.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "errno"
|
||||||
|
version = "0.3.14"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "event-listener"
|
||||||
|
version = "5.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"
|
||||||
|
dependencies = [
|
||||||
|
"concurrent-queue",
|
||||||
|
"parking",
|
||||||
|
"pin-project-lite",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "event-listener-strategy"
|
||||||
|
version = "0.5.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93"
|
||||||
|
dependencies = [
|
||||||
|
"event-listener",
|
||||||
|
"pin-project-lite",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fastrand"
|
||||||
|
version = "2.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "find-msvc-tools"
|
name = "find-msvc-tools"
|
||||||
version = "0.1.9"
|
version = "0.1.9"
|
||||||
|
|
@ -300,6 +437,49 @@ version = "0.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
|
checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-core"
|
||||||
|
version = "0.3.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-io"
|
||||||
|
version = "0.3.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-lite"
|
||||||
|
version = "2.6.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad"
|
||||||
|
dependencies = [
|
||||||
|
"fastrand",
|
||||||
|
"futures-core",
|
||||||
|
"futures-io",
|
||||||
|
"parking",
|
||||||
|
"pin-project-lite",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-task"
|
||||||
|
version = "0.3.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-util"
|
||||||
|
version = "0.3.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
|
||||||
|
dependencies = [
|
||||||
|
"futures-core",
|
||||||
|
"futures-task",
|
||||||
|
"pin-project-lite",
|
||||||
|
"slab",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "getrandom"
|
name = "getrandom"
|
||||||
version = "0.2.17"
|
version = "0.2.17"
|
||||||
|
|
@ -329,6 +509,12 @@ version = "0.17.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51"
|
checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hex"
|
||||||
|
version = "0.4.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indexmap"
|
name = "indexmap"
|
||||||
version = "2.14.0"
|
version = "2.14.0"
|
||||||
|
|
@ -364,6 +550,18 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "js-sys"
|
||||||
|
version = "0.3.97"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"futures-util",
|
||||||
|
"once_cell",
|
||||||
|
"wasm-bindgen",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lazy_static"
|
name = "lazy_static"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
|
|
@ -406,6 +604,12 @@ version = "0.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a44cd706ff0d503ee32b2071166510ca27e281228de10cd3aa8d35ff94560f81"
|
checksum = "a44cd706ff0d503ee32b2071166510ca27e281228de10cd3aa8d35ff94560f81"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "linux-raw-sys"
|
||||||
|
version = "0.12.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "log"
|
name = "log"
|
||||||
version = "0.4.29"
|
version = "0.4.29"
|
||||||
|
|
@ -427,6 +631,26 @@ version = "2.8.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
|
checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memoffset"
|
||||||
|
version = "0.9.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mio"
|
||||||
|
version = "1.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"wasi",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nova-plugin"
|
name = "nova-plugin"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
@ -440,8 +664,10 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
"tokio",
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
|
"zbus",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
@ -465,12 +691,37 @@ version = "0.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
|
checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ordered-stream"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50"
|
||||||
|
dependencies = [
|
||||||
|
"futures-core",
|
||||||
|
"pin-project-lite",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "parking"
|
||||||
|
version = "2.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pin-project-lite"
|
name = "pin-project-lite"
|
||||||
version = "0.2.17"
|
version = "0.2.17"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
|
checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro-crate"
|
||||||
|
version = "3.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f"
|
||||||
|
dependencies = [
|
||||||
|
"toml_edit",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.106"
|
version = "1.0.106"
|
||||||
|
|
@ -536,6 +787,19 @@ version = "0.8.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
|
checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustix"
|
||||||
|
version = "1.1.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
"errno",
|
||||||
|
"libc",
|
||||||
|
"linux-raw-sys",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustversion"
|
name = "rustversion"
|
||||||
version = "1.0.22"
|
version = "1.0.22"
|
||||||
|
|
@ -597,6 +861,17 @@ dependencies = [
|
||||||
"zmij",
|
"zmij",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_repr"
|
||||||
|
version = "0.1.20"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sharded-slab"
|
name = "sharded-slab"
|
||||||
version = "0.1.7"
|
version = "0.1.7"
|
||||||
|
|
@ -612,12 +887,38 @@ version = "1.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "signal-hook-registry"
|
||||||
|
version = "1.4.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
|
||||||
|
dependencies = [
|
||||||
|
"errno",
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "slab"
|
||||||
|
version = "0.4.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "smallvec"
|
name = "smallvec"
|
||||||
version = "1.15.1"
|
version = "1.15.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "socket2"
|
||||||
|
version = "0.6.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "static_assertions"
|
name = "static_assertions"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
|
|
@ -641,6 +942,19 @@ dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tempfile"
|
||||||
|
version = "3.27.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
|
||||||
|
dependencies = [
|
||||||
|
"fastrand",
|
||||||
|
"getrandom 0.3.4",
|
||||||
|
"once_cell",
|
||||||
|
"rustix",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "termcolor"
|
name = "termcolor"
|
||||||
version = "1.4.1"
|
version = "1.4.1"
|
||||||
|
|
@ -699,6 +1013,64 @@ dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tokio"
|
||||||
|
version = "1.52.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "110a78583f19d5cdb2c5ccf321d1290344e71313c6c37d43520d386027d18386"
|
||||||
|
dependencies = [
|
||||||
|
"bytes",
|
||||||
|
"libc",
|
||||||
|
"mio",
|
||||||
|
"pin-project-lite",
|
||||||
|
"signal-hook-registry",
|
||||||
|
"socket2",
|
||||||
|
"tokio-macros",
|
||||||
|
"tracing",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tokio-macros"
|
||||||
|
version = "2.7.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_datetime"
|
||||||
|
version = "1.1.1+spec-1.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7"
|
||||||
|
dependencies = [
|
||||||
|
"serde_core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_edit"
|
||||||
|
version = "0.25.11+spec-1.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b"
|
||||||
|
dependencies = [
|
||||||
|
"indexmap",
|
||||||
|
"toml_datetime",
|
||||||
|
"toml_parser",
|
||||||
|
"winnow",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_parser"
|
||||||
|
version = "1.1.2+spec-1.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
|
||||||
|
dependencies = [
|
||||||
|
"winnow",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tracing"
|
name = "tracing"
|
||||||
version = "0.1.44"
|
version = "0.1.44"
|
||||||
|
|
@ -760,6 +1132,17 @@ dependencies = [
|
||||||
"tracing-log",
|
"tracing-log",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "uds_windows"
|
||||||
|
version = "1.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e"
|
||||||
|
dependencies = [
|
||||||
|
"memoffset",
|
||||||
|
"tempfile",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-ident"
|
name = "unicode-ident"
|
||||||
version = "1.0.24"
|
version = "1.0.24"
|
||||||
|
|
@ -784,6 +1167,17 @@ version = "0.2.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
|
checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "uuid"
|
||||||
|
version = "1.23.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
|
||||||
|
dependencies = [
|
||||||
|
"js-sys",
|
||||||
|
"serde_core",
|
||||||
|
"wasm-bindgen",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "valuable"
|
name = "valuable"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
|
|
@ -805,6 +1199,51 @@ dependencies = [
|
||||||
"wit-bindgen",
|
"wit-bindgen",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wasm-bindgen"
|
||||||
|
version = "0.2.120"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "df52b6d9b87e0c74c9edfa1eb2d9bf85e5d63515474513aa50fa181b3c4f5db1"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"once_cell",
|
||||||
|
"rustversion",
|
||||||
|
"wasm-bindgen-macro",
|
||||||
|
"wasm-bindgen-shared",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wasm-bindgen-macro"
|
||||||
|
version = "0.2.120"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "78b1041f495fb322e64aca85f5756b2172e35cd459376e67f2a6c9dffcedb103"
|
||||||
|
dependencies = [
|
||||||
|
"quote",
|
||||||
|
"wasm-bindgen-macro-support",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wasm-bindgen-macro-support"
|
||||||
|
version = "0.2.120"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9dcd0ff20416988a18ac686d4d4d0f6aae9ebf08a389ff5d29012b05af2a1b41"
|
||||||
|
dependencies = [
|
||||||
|
"bumpalo",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
"wasm-bindgen-shared",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wasm-bindgen-shared"
|
||||||
|
version = "0.2.120"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "49757b3c82ebf16c57d69365a142940b384176c24df52a087fb748e2085359ea"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi-util"
|
name = "winapi-util"
|
||||||
version = "0.1.11"
|
version = "0.1.11"
|
||||||
|
|
@ -829,14 +1268,119 @@ dependencies = [
|
||||||
"windows-link",
|
"windows-link",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winnow"
|
||||||
|
version = "1.0.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wit-bindgen"
|
name = "wit-bindgen"
|
||||||
version = "0.57.1"
|
version = "0.57.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
|
checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zbus"
|
||||||
|
version = "5.15.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c3bcbf15c8708d7fc1be0c993622e0a5cbd5e8b52bfa40afa4c3e0cd8d724ac1"
|
||||||
|
dependencies = [
|
||||||
|
"async-broadcast",
|
||||||
|
"async-recursion",
|
||||||
|
"async-trait",
|
||||||
|
"enumflags2",
|
||||||
|
"event-listener",
|
||||||
|
"futures-core",
|
||||||
|
"futures-lite",
|
||||||
|
"hex",
|
||||||
|
"libc",
|
||||||
|
"ordered-stream",
|
||||||
|
"rustix",
|
||||||
|
"serde",
|
||||||
|
"serde_repr",
|
||||||
|
"tokio",
|
||||||
|
"tracing",
|
||||||
|
"uds_windows",
|
||||||
|
"uuid",
|
||||||
|
"windows-sys",
|
||||||
|
"winnow",
|
||||||
|
"zbus_macros",
|
||||||
|
"zbus_names",
|
||||||
|
"zvariant",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zbus_macros"
|
||||||
|
version = "5.15.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "51fa5406ad9175a8c825a931f8cf347116b531b3634fcb0b627c290f1f2516ff"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro-crate",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
"zbus_names",
|
||||||
|
"zvariant",
|
||||||
|
"zvariant_utils",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zbus_names"
|
||||||
|
version = "4.3.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52d"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
"winnow",
|
||||||
|
"zvariant",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zmij"
|
name = "zmij"
|
||||||
version = "1.0.21"
|
version = "1.0.21"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
|
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zvariant"
|
||||||
|
version = "5.11.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1c1567a6ec68df868cbbfde844cfc6d81649fe5109a62b116b19fabd53e618ee"
|
||||||
|
dependencies = [
|
||||||
|
"endi",
|
||||||
|
"enumflags2",
|
||||||
|
"serde",
|
||||||
|
"winnow",
|
||||||
|
"zvariant_derive",
|
||||||
|
"zvariant_utils",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zvariant_derive"
|
||||||
|
version = "5.11.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c7d5b780599bbde114e39d9a0799577fad1ced5105d38515745f7b3099d8ceda"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro-crate",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
"zvariant_utils",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zvariant_utils"
|
||||||
|
version = "3.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6d464f5733ffa07a3164d656f18533caace9d0638596721355d73256a410d691"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"serde",
|
||||||
|
"syn",
|
||||||
|
"winnow",
|
||||||
|
]
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,14 @@ serde_json = "1.0.149"
|
||||||
dirs = "6.0.0"
|
dirs = "6.0.0"
|
||||||
tracing = "0.1.44"
|
tracing = "0.1.44"
|
||||||
tracing-subscriber = { version = "0.3.23", features = ["env-filter"] }
|
tracing-subscriber = { version = "0.3.23", features = ["env-filter"] }
|
||||||
|
zbus = { version = "5.15.0", default-features = false, features = ["tokio"] }
|
||||||
|
tokio = { version = "1.52.2", features = [
|
||||||
|
"macros",
|
||||||
|
"net",
|
||||||
|
"rt",
|
||||||
|
"sync",
|
||||||
|
"time",
|
||||||
|
] }
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
cxx-qt-build = "0.8.1"
|
cxx-qt-build = "0.8.1"
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ fn main() {
|
||||||
"src/system_stats.rs",
|
"src/system_stats.rs",
|
||||||
"src/cpu_service.rs",
|
"src/cpu_service.rs",
|
||||||
"src/modules_service.rs",
|
"src/modules_service.rs",
|
||||||
|
"src/systemd_service.rs",
|
||||||
"src/theme_service.rs",
|
"src/theme_service.rs",
|
||||||
];
|
];
|
||||||
if !bridge_files.iter().all(|p| manifest.join(p).exists()) {
|
if !bridge_files.iter().all(|p| manifest.join(p).exists()) {
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ pub mod cpu_service;
|
||||||
pub mod modules_service;
|
pub mod modules_service;
|
||||||
pub mod stats;
|
pub mod stats;
|
||||||
pub mod system_stats;
|
pub mod system_stats;
|
||||||
|
pub mod systemd_service;
|
||||||
pub mod theme_service;
|
pub mod theme_service;
|
||||||
|
|
||||||
#[ctor::ctor(unsafe)]
|
#[ctor::ctor(unsafe)]
|
||||||
|
|
|
||||||
|
|
@ -101,11 +101,9 @@ pub mod qobject {
|
||||||
#[qproperty(bool, dock_applet_mpris, cxx_name = "dockAppletMpris")]
|
#[qproperty(bool, dock_applet_mpris, cxx_name = "dockAppletMpris")]
|
||||||
#[qproperty(bool, dock_applet_notifications, cxx_name = "dockAppletNotifications")]
|
#[qproperty(bool, dock_applet_notifications, cxx_name = "dockAppletNotifications")]
|
||||||
#[qproperty(bool, dock_applet_power, cxx_name = "dockAppletPower")]
|
#[qproperty(bool, dock_applet_power, cxx_name = "dockAppletPower")]
|
||||||
// Systemd / machinectl bar modules.
|
// Unified systemd bar module (covers local + nspawn containers, and later remotes).
|
||||||
#[qproperty(bool, systemd_enable, cxx_name = "systemdEnable")]
|
#[qproperty(bool, systemd_enable, cxx_name = "systemdEnable")]
|
||||||
#[qproperty(i32, systemd_interval, cxx_name = "systemdInterval")]
|
#[qproperty(i32, systemd_interval, cxx_name = "systemdInterval")]
|
||||||
#[qproperty(bool, machinectl_enable, cxx_name = "machinectlEnable")]
|
|
||||||
#[qproperty(i32, machinectl_interval, cxx_name = "machinectlInterval")]
|
|
||||||
type ModulesService = super::ModulesServiceRust;
|
type ModulesService = super::ModulesServiceRust;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -522,8 +520,6 @@ mod data {
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub systemd: WithInterval,
|
pub systemd: WithInterval,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub machinectl: WithInterval,
|
|
||||||
#[serde(default)]
|
|
||||||
pub stats_daemon: StatsDaemon,
|
pub stats_daemon: StatsDaemon,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -599,8 +595,6 @@ pub struct ModulesServiceRust {
|
||||||
dock_applet_power: bool,
|
dock_applet_power: bool,
|
||||||
systemd_enable: bool,
|
systemd_enable: bool,
|
||||||
systemd_interval: i32,
|
systemd_interval: i32,
|
||||||
machinectl_enable: bool,
|
|
||||||
machinectl_interval: i32,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for ModulesServiceRust {
|
impl Default for ModulesServiceRust {
|
||||||
|
|
@ -684,8 +678,6 @@ impl ModulesServiceRust {
|
||||||
dock_applet_power: d.dock.applets.power,
|
dock_applet_power: d.dock.applets.power,
|
||||||
systemd_enable: d.systemd.enable,
|
systemd_enable: d.systemd.enable,
|
||||||
systemd_interval: d.systemd.interval,
|
systemd_interval: d.systemd.interval,
|
||||||
machinectl_enable: d.machinectl.enable,
|
|
||||||
machinectl_interval: d.machinectl.interval,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -746,7 +738,6 @@ fn parse_modules(raw: &str, path: &std::path::Path) -> ModulesData {
|
||||||
"lock",
|
"lock",
|
||||||
"dock",
|
"dock",
|
||||||
"systemd",
|
"systemd",
|
||||||
"machinectl",
|
|
||||||
"statsDaemon",
|
"statsDaemon",
|
||||||
];
|
];
|
||||||
for key in map.keys() {
|
for key in map.keys() {
|
||||||
|
|
|
||||||
273
plugin/src/systemd_service.rs
Normal file
273
plugin/src/systemd_service.rs
Normal file
|
|
@ -0,0 +1,273 @@
|
||||||
|
// In-process systemd state for nova-shell.
|
||||||
|
//
|
||||||
|
// Lists of units and machines are exposed to QML as JSON-encoded QString props
|
||||||
|
// (`failedUnitsJson`, `containersJson`) rather than QList<QVariantMap>. cxx-qt
|
||||||
|
// 0.8.1 does not implement QVariantValue for QVariantMap/QVariantList, and
|
||||||
|
// cxx-qt main on git regressed qt-build-utils to require QuickControls2.prl
|
||||||
|
// files that nixpkgs strips. Switch to QList<QVariantMap> when a release ships
|
||||||
|
// with both fixes.
|
||||||
|
|
||||||
|
use core::pin::Pin;
|
||||||
|
use cxx_qt_lib::QString;
|
||||||
|
use serde::Serialize;
|
||||||
|
use std::sync::OnceLock;
|
||||||
|
use tokio::runtime::Runtime;
|
||||||
|
use zbus::{Connection, proxy};
|
||||||
|
|
||||||
|
#[cxx_qt::bridge]
|
||||||
|
pub mod qobject {
|
||||||
|
unsafe extern "C++" {
|
||||||
|
include!("cxx-qt-lib/qstring.h");
|
||||||
|
type QString = cxx_qt_lib::QString;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "RustQt" {
|
||||||
|
#[qobject]
|
||||||
|
#[qml_element]
|
||||||
|
#[qml_singleton]
|
||||||
|
#[qproperty(QString, hostname)]
|
||||||
|
#[qproperty(QString, system_state, cxx_name = "systemState")]
|
||||||
|
#[qproperty(QString, user_state, cxx_name = "userState")]
|
||||||
|
#[qproperty(i32, failed_count, cxx_name = "failedCount")]
|
||||||
|
// JSON array: [{ name, description, subState, scope: "system"|"user", machine: "" | name }]
|
||||||
|
#[qproperty(QString, failed_units_json, cxx_name = "failedUnitsJson")]
|
||||||
|
// JSON array: [{ name, class, service, systemState, failedUnits: [...] }]
|
||||||
|
#[qproperty(QString, containers_json, cxx_name = "containersJson")]
|
||||||
|
type SystemdService = super::SystemdServiceRust;
|
||||||
|
|
||||||
|
#[qinvokable]
|
||||||
|
fn poll(self: Pin<&mut Self>);
|
||||||
|
|
||||||
|
#[qinvokable]
|
||||||
|
#[cxx_name = "restartUnit"]
|
||||||
|
fn restart_unit(self: Pin<&mut Self>, name: QString, scope: QString, machine: QString);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl cxx_qt::Initialize for SystemdService {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// systemd1.Manager.ListUnitsFiltered returns a(ssssssouso): name, description,
|
||||||
|
// load_state, active_state, sub_state, follower, unit_path, job_id, job_type, job_path.
|
||||||
|
type UnitTuple = (
|
||||||
|
String,
|
||||||
|
String,
|
||||||
|
String,
|
||||||
|
String,
|
||||||
|
String,
|
||||||
|
String,
|
||||||
|
zbus::zvariant::OwnedObjectPath,
|
||||||
|
u32,
|
||||||
|
String,
|
||||||
|
zbus::zvariant::OwnedObjectPath,
|
||||||
|
);
|
||||||
|
|
||||||
|
#[proxy(
|
||||||
|
interface = "org.freedesktop.systemd1.Manager",
|
||||||
|
default_service = "org.freedesktop.systemd1",
|
||||||
|
default_path = "/org/freedesktop/systemd1"
|
||||||
|
)]
|
||||||
|
trait SystemdManager {
|
||||||
|
#[zbus(property)]
|
||||||
|
fn system_state(&self) -> zbus::Result<String>;
|
||||||
|
|
||||||
|
fn list_units_filtered(&self, states: Vec<&str>) -> zbus::Result<Vec<UnitTuple>>;
|
||||||
|
|
||||||
|
fn restart_unit(&self, name: &str, mode: &str)
|
||||||
|
-> zbus::Result<zbus::zvariant::OwnedObjectPath>;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[proxy(
|
||||||
|
interface = "org.freedesktop.machine1.Manager",
|
||||||
|
default_service = "org.freedesktop.machine1",
|
||||||
|
default_path = "/org/freedesktop/machine1"
|
||||||
|
)]
|
||||||
|
trait Machined {
|
||||||
|
fn list_machines(
|
||||||
|
&self,
|
||||||
|
) -> zbus::Result<Vec<(String, String, String, zbus::zvariant::OwnedObjectPath)>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize)]
|
||||||
|
struct UnitJson<'a> {
|
||||||
|
name: &'a str,
|
||||||
|
description: &'a str,
|
||||||
|
#[serde(rename = "subState")]
|
||||||
|
sub_state: &'a str,
|
||||||
|
scope: &'a str,
|
||||||
|
machine: &'a str,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize)]
|
||||||
|
struct ContainerJson<'a> {
|
||||||
|
name: &'a str,
|
||||||
|
class: &'a str,
|
||||||
|
service: &'a str,
|
||||||
|
#[serde(rename = "systemState")]
|
||||||
|
system_state: &'a str,
|
||||||
|
#[serde(rename = "failedUnits")]
|
||||||
|
failed_units: Vec<UnitJson<'a>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct SystemdServiceRust {
|
||||||
|
hostname: QString,
|
||||||
|
system_state: QString,
|
||||||
|
user_state: QString,
|
||||||
|
failed_count: i32,
|
||||||
|
failed_units_json: QString,
|
||||||
|
containers_json: QString,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for SystemdServiceRust {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
hostname: QString::from(read_hostname()),
|
||||||
|
system_state: QString::from("unknown"),
|
||||||
|
user_state: QString::from("unknown"),
|
||||||
|
failed_count: 0,
|
||||||
|
failed_units_json: QString::from("[]"),
|
||||||
|
containers_json: QString::from("[]"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_hostname() -> String {
|
||||||
|
std::fs::read_to_string("/etc/hostname")
|
||||||
|
.map(|s| s.trim().to_string())
|
||||||
|
.unwrap_or_else(|_| "localhost".to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rt() -> &'static Runtime {
|
||||||
|
static RT: OnceLock<Runtime> = OnceLock::new();
|
||||||
|
RT.get_or_init(|| {
|
||||||
|
tokio::runtime::Builder::new_current_thread()
|
||||||
|
.enable_all()
|
||||||
|
.build()
|
||||||
|
.expect("tokio runtime")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn fetch_failed(bus: &Connection) -> (String, Vec<UnitTuple>) {
|
||||||
|
let mut state = String::from("unknown");
|
||||||
|
let mut units = Vec::new();
|
||||||
|
if let Ok(mgr) = SystemdManagerProxy::new(bus).await {
|
||||||
|
if let Ok(s) = mgr.system_state().await {
|
||||||
|
state = s;
|
||||||
|
}
|
||||||
|
if let Ok(u) = mgr.list_units_filtered(vec!["failed"]).await {
|
||||||
|
units = u;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(state, units)
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn poll_async() -> (
|
||||||
|
String,
|
||||||
|
String,
|
||||||
|
Vec<UnitTuple>,
|
||||||
|
Vec<UnitTuple>,
|
||||||
|
Vec<(String, String, String)>,
|
||||||
|
) {
|
||||||
|
let mut sys_state = String::from("unknown");
|
||||||
|
let mut sys_units = Vec::new();
|
||||||
|
let mut user_state = String::from("unknown");
|
||||||
|
let mut user_units = Vec::new();
|
||||||
|
let mut machines = Vec::new();
|
||||||
|
|
||||||
|
if let Ok(c) = Connection::system().await {
|
||||||
|
let (s, u) = fetch_failed(&c).await;
|
||||||
|
sys_state = s;
|
||||||
|
sys_units = u;
|
||||||
|
if let Ok(m) = MachinedProxy::new(&c).await {
|
||||||
|
if let Ok(list) = m.list_machines().await {
|
||||||
|
machines = list
|
||||||
|
.into_iter()
|
||||||
|
.filter(|(name, _, _, _)| name != ".host")
|
||||||
|
.map(|(n, c, s, _)| (n, c, s))
|
||||||
|
.collect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let Ok(c) = Connection::session().await {
|
||||||
|
let (s, u) = fetch_failed(&c).await;
|
||||||
|
user_state = s;
|
||||||
|
user_units = u;
|
||||||
|
}
|
||||||
|
|
||||||
|
(sys_state, user_state, sys_units, user_units, machines)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn unit_jsons<'a>(units: &'a [UnitTuple], scope: &'a str, machine: &'a str) -> Vec<UnitJson<'a>> {
|
||||||
|
units
|
||||||
|
.iter()
|
||||||
|
.map(|u| UnitJson {
|
||||||
|
name: &u.0,
|
||||||
|
description: &u.1,
|
||||||
|
sub_state: &u.4,
|
||||||
|
scope,
|
||||||
|
machine,
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
impl cxx_qt::Initialize for qobject::SystemdService {
|
||||||
|
fn initialize(self: Pin<&mut Self>) {
|
||||||
|
self.poll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl qobject::SystemdService {
|
||||||
|
fn poll(mut self: Pin<&mut Self>) {
|
||||||
|
let (sys_state, user_state, sys_units, user_units, machines) = rt().block_on(poll_async());
|
||||||
|
|
||||||
|
let mut all_failed: Vec<UnitJson> = Vec::with_capacity(sys_units.len() + user_units.len());
|
||||||
|
all_failed.extend(unit_jsons(&sys_units, "system", ""));
|
||||||
|
all_failed.extend(unit_jsons(&user_units, "user", ""));
|
||||||
|
let count = all_failed.len() as i32;
|
||||||
|
let failed_json = serde_json::to_string(&all_failed).unwrap_or_else(|_| "[]".into());
|
||||||
|
|
||||||
|
let containers: Vec<ContainerJson> = machines
|
||||||
|
.iter()
|
||||||
|
.map(|(n, c, s)| ContainerJson {
|
||||||
|
name: n,
|
||||||
|
class: c,
|
||||||
|
service: s,
|
||||||
|
system_state: "unknown",
|
||||||
|
failed_units: Vec::new(),
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
let containers_json = serde_json::to_string(&containers).unwrap_or_else(|_| "[]".into());
|
||||||
|
|
||||||
|
self.as_mut().set_system_state(QString::from(sys_state));
|
||||||
|
self.as_mut().set_user_state(QString::from(user_state));
|
||||||
|
self.as_mut()
|
||||||
|
.set_failed_units_json(QString::from(failed_json));
|
||||||
|
self.as_mut().set_failed_count(count);
|
||||||
|
self.as_mut()
|
||||||
|
.set_containers_json(QString::from(containers_json));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn restart_unit(self: Pin<&mut Self>, name: QString, scope: QString, machine: QString) {
|
||||||
|
let name = name.to_string();
|
||||||
|
let scope = scope.to_string();
|
||||||
|
let machine = machine.to_string();
|
||||||
|
let _ = self;
|
||||||
|
rt().block_on(async move {
|
||||||
|
// Local-only restart for now. Container/remote restart comes later.
|
||||||
|
if !machine.is_empty() {
|
||||||
|
tracing::warn!(target: "nova_plugin", machine = %machine, "container restart not yet implemented");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let conn = match scope.as_str() {
|
||||||
|
"user" => Connection::session().await,
|
||||||
|
_ => Connection::system().await,
|
||||||
|
};
|
||||||
|
let Ok(conn) = conn else { return };
|
||||||
|
let Ok(mgr) = SystemdManagerProxy::new(&conn).await else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
if let Err(e) = mgr.restart_unit(&name, "replace").await {
|
||||||
|
tracing::warn!(target: "nova_plugin", unit = %name, error = %e, "restart_unit failed");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,354 +0,0 @@
|
||||||
pragma ComponentBehavior: Bound
|
|
||||||
|
|
||||||
import QtQuick
|
|
||||||
import "../services" as S
|
|
||||||
import NovaStats as NS
|
|
||||||
|
|
||||||
Column {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
required property color accentColor
|
|
||||||
property bool active: true
|
|
||||||
|
|
||||||
property bool _localExpanded: true
|
|
||||||
|
|
||||||
// Localhost section header
|
|
||||||
Item {
|
|
||||||
width: root.width
|
|
||||||
height: 32
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.leftMargin: 4
|
|
||||||
anchors.rightMargin: 4
|
|
||||||
color: _localHdrHover.hovered ? NS.ThemeService.base02 : "transparent"
|
|
||||||
radius: NS.ThemeService.radius
|
|
||||||
z: -1
|
|
||||||
}
|
|
||||||
|
|
||||||
HoverHandler {
|
|
||||||
id: _localHdrHover
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: 12
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
text: " localhost"
|
|
||||||
color: NS.ThemeService.base05
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: _localStateChip
|
|
||||||
anchors.right: _localChevron.left
|
|
||||||
anchors.rightMargin: 8
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
visible: S.SystemdService.systemState !== "unknown"
|
|
||||||
color: {
|
|
||||||
const st = S.SystemdService.systemState;
|
|
||||||
if (st === "running")
|
|
||||||
return NS.ThemeService.base0B;
|
|
||||||
if (st === "degraded")
|
|
||||||
return NS.ThemeService.base0A;
|
|
||||||
return NS.ThemeService.base08;
|
|
||||||
}
|
|
||||||
opacity: 0.85
|
|
||||||
radius: 3
|
|
||||||
width: _localStateLbl.width + 8
|
|
||||||
height: 14
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: _localStateLbl
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: S.SystemdService.systemState
|
|
||||||
color: NS.ThemeService.base00
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 3
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: _localChevron
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.rightMargin: 12
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
text: root._localExpanded ? "" : ""
|
|
||||||
color: NS.ThemeService.base04
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 2
|
|
||||||
font.family: NS.ThemeService.iconFontFamily
|
|
||||||
}
|
|
||||||
|
|
||||||
TapHandler {
|
|
||||||
onTapped: root._localExpanded = !root._localExpanded
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Localhost expanded content
|
|
||||||
Column {
|
|
||||||
visible: root._localExpanded
|
|
||||||
width: root.width
|
|
||||||
|
|
||||||
// System sub-section
|
|
||||||
Item {
|
|
||||||
width: root.width
|
|
||||||
height: 22
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: 24
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
text: "SYSTEM"
|
|
||||||
color: NS.ThemeService.base03
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 3
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
font.letterSpacing: 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Repeater {
|
|
||||||
model: S.SystemdService.systemUnits
|
|
||||||
delegate: SystemdUnitRow {
|
|
||||||
required property var modelData
|
|
||||||
unitName: modelData.name
|
|
||||||
description: modelData.description
|
|
||||||
subState: modelData.subState
|
|
||||||
isUser: false
|
|
||||||
machineName: ""
|
|
||||||
accentColor: root.accentColor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
visible: S.SystemdService.systemUnits.length === 0
|
|
||||||
width: root.width
|
|
||||||
height: 22
|
|
||||||
Text {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: "no failures"
|
|
||||||
color: NS.ThemeService.base0B
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 2
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// User sub-section
|
|
||||||
Item {
|
|
||||||
width: root.width
|
|
||||||
height: 22
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: 24
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
text: "USER"
|
|
||||||
color: NS.ThemeService.base03
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 3
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
font.letterSpacing: 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Repeater {
|
|
||||||
model: S.SystemdService.userUnits
|
|
||||||
delegate: SystemdUnitRow {
|
|
||||||
required property var modelData
|
|
||||||
unitName: modelData.name
|
|
||||||
description: modelData.description
|
|
||||||
subState: modelData.subState
|
|
||||||
isUser: true
|
|
||||||
machineName: ""
|
|
||||||
accentColor: root.accentColor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
visible: S.SystemdService.userUnits.length === 0
|
|
||||||
width: root.width
|
|
||||||
height: 22
|
|
||||||
Text {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: "no failures"
|
|
||||||
color: NS.ThemeService.base0B
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 2
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Containers
|
|
||||||
Repeater {
|
|
||||||
model: S.MachinectlService.machines
|
|
||||||
|
|
||||||
delegate: Column {
|
|
||||||
id: _machineSection
|
|
||||||
required property var modelData
|
|
||||||
required property int index
|
|
||||||
|
|
||||||
property bool _expanded: false
|
|
||||||
property bool _loading: false
|
|
||||||
|
|
||||||
width: root.width
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: S.MachinectlService
|
|
||||||
function onMachineReady(machineName) {
|
|
||||||
if (machineName === _machineSection.modelData.name)
|
|
||||||
_machineSection._loading = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Separator {}
|
|
||||||
|
|
||||||
// Machine header
|
|
||||||
Item {
|
|
||||||
width: _machineSection.width
|
|
||||||
height: 32
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.leftMargin: 4
|
|
||||||
anchors.rightMargin: 4
|
|
||||||
color: _mHdrHover.hovered ? NS.ThemeService.base02 : "transparent"
|
|
||||||
radius: NS.ThemeService.radius
|
|
||||||
z: -1
|
|
||||||
}
|
|
||||||
|
|
||||||
HoverHandler {
|
|
||||||
id: _mHdrHover
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: 12
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
text: " " + _machineSection.modelData.name
|
|
||||||
color: NS.ThemeService.base05
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
elide: Text.ElideRight
|
|
||||||
width: parent.width - 100
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: _mStateChip
|
|
||||||
anchors.right: _mChevron.left
|
|
||||||
anchors.rightMargin: 8
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
visible: _machineSection._expanded && !_machineSection._loading
|
|
||||||
color: {
|
|
||||||
const st = S.MachinectlService.machineState(_machineSection.modelData.name);
|
|
||||||
if (st === "running")
|
|
||||||
return NS.ThemeService.base0B;
|
|
||||||
if (st === "degraded")
|
|
||||||
return NS.ThemeService.base0A;
|
|
||||||
return st === "unknown" ? "transparent" : NS.ThemeService.base08;
|
|
||||||
}
|
|
||||||
opacity: 0.85
|
|
||||||
radius: 3
|
|
||||||
width: _mStateLbl.width + 8
|
|
||||||
height: 14
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: _mStateLbl
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: S.MachinectlService.machineState(_machineSection.modelData.name)
|
|
||||||
color: NS.ThemeService.base00
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 3
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: _mChevron
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.rightMargin: 12
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
text: _machineSection._expanded ? "" : ""
|
|
||||||
color: NS.ThemeService.base04
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 2
|
|
||||||
font.family: NS.ThemeService.iconFontFamily
|
|
||||||
}
|
|
||||||
|
|
||||||
TapHandler {
|
|
||||||
onTapped: {
|
|
||||||
_machineSection._expanded = !_machineSection._expanded;
|
|
||||||
if (_machineSection._expanded) {
|
|
||||||
_machineSection._loading = true;
|
|
||||||
S.MachinectlService.fetchMachine(_machineSection.modelData.name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Machine expanded content
|
|
||||||
Column {
|
|
||||||
visible: _machineSection._expanded
|
|
||||||
width: _machineSection.width
|
|
||||||
|
|
||||||
Item {
|
|
||||||
visible: _machineSection._loading
|
|
||||||
width: _machineSection.width
|
|
||||||
height: 28
|
|
||||||
Text {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: "loading..."
|
|
||||||
color: NS.ThemeService.base04
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 2
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// System units inside the container
|
|
||||||
Item {
|
|
||||||
visible: !_machineSection._loading
|
|
||||||
width: _machineSection.width
|
|
||||||
height: 22
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: 24
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
text: "SYSTEM"
|
|
||||||
color: NS.ThemeService.base03
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 3
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
font.letterSpacing: 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Repeater {
|
|
||||||
model: !_machineSection._loading ? S.MachinectlService.machineUnits(_machineSection.modelData.name) : []
|
|
||||||
delegate: SystemdUnitRow {
|
|
||||||
required property var modelData
|
|
||||||
unitName: modelData.name
|
|
||||||
description: modelData.description
|
|
||||||
subState: modelData.subState
|
|
||||||
isUser: false
|
|
||||||
machineName: _machineSection.modelData.name
|
|
||||||
accentColor: root.accentColor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
visible: !_machineSection._loading && S.MachinectlService.machineUnits(_machineSection.modelData.name).length === 0
|
|
||||||
width: _machineSection.width
|
|
||||||
height: 22
|
|
||||||
Text {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: "no failures"
|
|
||||||
color: NS.ThemeService.base0B
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 2
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
width: 1
|
|
||||||
height: 4
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -9,156 +9,43 @@ Column {
|
||||||
|
|
||||||
required property color accentColor
|
required property color accentColor
|
||||||
property bool active: true
|
property bool active: true
|
||||||
// Emitted when content resizes; parent can connect to extend panel-close grace.
|
|
||||||
signal contentResized
|
signal contentResized
|
||||||
|
|
||||||
// Section header: state label + unit count
|
onHeightChanged: root.contentResized()
|
||||||
Item {
|
|
||||||
|
// Local machine header + units
|
||||||
|
SystemdMachineSection {
|
||||||
width: root.width
|
width: root.width
|
||||||
height: 28
|
accentColor: root.accentColor
|
||||||
|
machineName: ""
|
||||||
Text {
|
title: S.SystemdService.hostname
|
||||||
anchors.left: parent.left
|
marker: " this machine"
|
||||||
anchors.leftMargin: 12
|
systemState: S.SystemdService.systemState
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
units: S.SystemdService.failedUnits
|
||||||
text: "SYSTEM"
|
startExpanded: true
|
||||||
color: NS.ThemeService.base03
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 3
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
font.letterSpacing: 1
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.rightMargin: 12
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
visible: S.SystemdService.systemState !== "unknown"
|
|
||||||
color: {
|
|
||||||
const st = S.SystemdService.systemState;
|
|
||||||
if (st === "running")
|
|
||||||
return NS.ThemeService.base0B;
|
|
||||||
if (st === "degraded")
|
|
||||||
return NS.ThemeService.base0A;
|
|
||||||
return NS.ThemeService.base08;
|
|
||||||
}
|
|
||||||
opacity: 0.85
|
|
||||||
radius: 3
|
|
||||||
width: _sysStateLbl.width + 8
|
|
||||||
height: 14
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: _sysStateLbl
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: S.SystemdService.systemState
|
|
||||||
color: NS.ThemeService.base00
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 3
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Containers
|
||||||
Repeater {
|
Repeater {
|
||||||
model: S.SystemdService.systemUnits
|
model: S.SystemdService.containers
|
||||||
|
|
||||||
delegate: SystemdUnitRow {
|
delegate: Column {
|
||||||
|
id: _row
|
||||||
required property var modelData
|
required property var modelData
|
||||||
unitName: modelData.name
|
width: root.width
|
||||||
description: modelData.description
|
|
||||||
subState: modelData.subState
|
|
||||||
isUser: false
|
|
||||||
machineName: ""
|
|
||||||
accentColor: root.accentColor
|
|
||||||
onHeightChanged: root.contentResized()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
Separator {}
|
||||||
visible: S.SystemdService.systemUnits.length === 0
|
|
||||||
width: root.width
|
|
||||||
height: 24
|
|
||||||
|
|
||||||
Text {
|
SystemdMachineSection {
|
||||||
anchors.centerIn: parent
|
width: _row.width
|
||||||
text: "no failed system units"
|
accentColor: root.accentColor
|
||||||
color: NS.ThemeService.base0B
|
machineName: _row.modelData.name
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 2
|
title: _row.modelData.name
|
||||||
font.family: NS.ThemeService.fontFamily
|
marker: ""
|
||||||
}
|
systemState: _row.modelData.systemState ?? "unknown"
|
||||||
}
|
units: _row.modelData.failedUnits ?? []
|
||||||
|
startExpanded: (_row.modelData.failedUnits ?? []).length > 0
|
||||||
Separator {}
|
|
||||||
|
|
||||||
// User section
|
|
||||||
Item {
|
|
||||||
width: root.width
|
|
||||||
height: 28
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: 12
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
text: "USER"
|
|
||||||
color: NS.ThemeService.base03
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 3
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
font.letterSpacing: 1
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.rightMargin: 12
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
visible: S.SystemdService.userState !== "unknown"
|
|
||||||
color: {
|
|
||||||
const st = S.SystemdService.userState;
|
|
||||||
if (st === "running")
|
|
||||||
return NS.ThemeService.base0B;
|
|
||||||
if (st === "degraded")
|
|
||||||
return NS.ThemeService.base0A;
|
|
||||||
return NS.ThemeService.base08;
|
|
||||||
}
|
}
|
||||||
opacity: 0.85
|
|
||||||
radius: 3
|
|
||||||
width: _userStateLbl.width + 8
|
|
||||||
height: 14
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: _userStateLbl
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: S.SystemdService.userState
|
|
||||||
color: NS.ThemeService.base00
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 3
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Repeater {
|
|
||||||
model: S.SystemdService.userUnits
|
|
||||||
|
|
||||||
delegate: SystemdUnitRow {
|
|
||||||
required property var modelData
|
|
||||||
unitName: modelData.name
|
|
||||||
description: modelData.description
|
|
||||||
subState: modelData.subState
|
|
||||||
isUser: true
|
|
||||||
machineName: ""
|
|
||||||
accentColor: root.accentColor
|
|
||||||
onHeightChanged: root.contentResized()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
visible: S.SystemdService.userUnits.length === 0
|
|
||||||
width: root.width
|
|
||||||
height: 24
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: "no failed user units"
|
|
||||||
color: NS.ThemeService.base0B
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 2
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
111
shell/applets/SystemdMachineSection.qml
Normal file
111
shell/applets/SystemdMachineSection.qml
Normal file
|
|
@ -0,0 +1,111 @@
|
||||||
|
pragma ComponentBehavior: Bound
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import "../services" as S
|
||||||
|
import NovaStats as NS
|
||||||
|
|
||||||
|
// One section of the systemd applet: a header with title + state chip,
|
||||||
|
// expandable list of failed units underneath.
|
||||||
|
Column {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
required property color accentColor
|
||||||
|
required property string machineName
|
||||||
|
required property string title
|
||||||
|
required property string marker
|
||||||
|
required property string systemState
|
||||||
|
required property var units
|
||||||
|
property bool startExpanded: false
|
||||||
|
|
||||||
|
width: parent?.width ?? 0
|
||||||
|
|
||||||
|
property bool _expanded: startExpanded
|
||||||
|
|
||||||
|
Item {
|
||||||
|
width: root.width
|
||||||
|
height: 32
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.leftMargin: 4
|
||||||
|
anchors.rightMargin: 4
|
||||||
|
color: _hdrHover.hovered ? NS.ThemeService.base02 : "transparent"
|
||||||
|
radius: NS.ThemeService.radius
|
||||||
|
z: -1
|
||||||
|
}
|
||||||
|
|
||||||
|
HoverHandler {
|
||||||
|
id: _hdrHover
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: 12
|
||||||
|
anchors.right: _stateChip.left
|
||||||
|
anchors.rightMargin: 6
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
text: root.title + (root.marker !== "" ? " " + root.marker : "")
|
||||||
|
color: NS.ThemeService.base05
|
||||||
|
font.pixelSize: NS.ThemeService.fontSize
|
||||||
|
font.family: NS.ThemeService.fontFamily
|
||||||
|
elide: Text.ElideRight
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: _stateChip
|
||||||
|
anchors.right: _chevron.left
|
||||||
|
anchors.rightMargin: 8
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
visible: root.systemState !== "unknown"
|
||||||
|
color: {
|
||||||
|
const st = root.systemState;
|
||||||
|
if (st === "running")
|
||||||
|
return NS.ThemeService.base0B;
|
||||||
|
if (st === "degraded")
|
||||||
|
return NS.ThemeService.base0A;
|
||||||
|
return NS.ThemeService.base08;
|
||||||
|
}
|
||||||
|
opacity: 0.85
|
||||||
|
radius: 3
|
||||||
|
width: _stateLbl.width + 8
|
||||||
|
height: 14
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: _stateLbl
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: root.systemState
|
||||||
|
color: NS.ThemeService.base00
|
||||||
|
font.pixelSize: NS.ThemeService.fontSize - 3
|
||||||
|
font.family: NS.ThemeService.fontFamily
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: _chevron
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.rightMargin: 12
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
text: root._expanded ? "" : ""
|
||||||
|
color: NS.ThemeService.base04
|
||||||
|
font.pixelSize: NS.ThemeService.fontSize - 2
|
||||||
|
font.family: NS.ThemeService.iconFontFamily
|
||||||
|
}
|
||||||
|
|
||||||
|
TapHandler {
|
||||||
|
onTapped: root._expanded = !root._expanded
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
model: root._expanded ? root.units : []
|
||||||
|
delegate: SystemdUnitRow {
|
||||||
|
required property var modelData
|
||||||
|
unitName: modelData.name
|
||||||
|
description: modelData.description ?? ""
|
||||||
|
subState: modelData.subState ?? ""
|
||||||
|
scope: modelData.scope ?? "system"
|
||||||
|
machineName: root.machineName
|
||||||
|
accentColor: root.accentColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,233 +8,95 @@ Item {
|
||||||
required property string unitName
|
required property string unitName
|
||||||
required property string description
|
required property string description
|
||||||
required property string subState
|
required property string subState
|
||||||
required property bool isUser
|
required property string scope
|
||||||
property string machineName: ""
|
required property string machineName
|
||||||
required property color accentColor
|
required property color accentColor
|
||||||
|
|
||||||
property string _jText: ""
|
|
||||||
property bool _expanded: false
|
|
||||||
property bool _loading: false
|
|
||||||
|
|
||||||
width: parent?.width ?? 0
|
width: parent?.width ?? 0
|
||||||
height: _row.height + (_expanded ? _journalArea.height : 0)
|
height: 28
|
||||||
|
|
||||||
Behavior on height {
|
HoverHandler {
|
||||||
NumberAnimation {
|
id: _rowHover
|
||||||
duration: 150
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.leftMargin: 4
|
||||||
|
anchors.rightMargin: 4
|
||||||
|
color: _rowHover.hovered ? NS.ThemeService.base02 : "transparent"
|
||||||
|
radius: NS.ThemeService.radius
|
||||||
|
z: -1
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: 12
|
||||||
|
anchors.right: _subStateTag.left
|
||||||
|
anchors.rightMargin: 6
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
text: root.unitName
|
||||||
|
color: NS.ThemeService.base05
|
||||||
|
font.pixelSize: NS.ThemeService.fontSize - 1
|
||||||
|
font.family: NS.ThemeService.fontFamily
|
||||||
|
elide: Text.ElideRight
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: _subStateTag
|
||||||
|
anchors.right: _restartBtn.left
|
||||||
|
anchors.rightMargin: 6
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
color: NS.ThemeService.base08
|
||||||
|
opacity: 0.85
|
||||||
|
radius: 3
|
||||||
|
width: _subStateLbl.width + 8
|
||||||
|
height: 14
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: _subStateLbl
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: root.subState
|
||||||
|
color: NS.ThemeService.base00
|
||||||
|
font.pixelSize: NS.ThemeService.fontSize - 3
|
||||||
|
font.family: NS.ThemeService.fontFamily
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
// Restart button only visible while hovering the row. = fa-refresh
|
||||||
target: S.SystemdService
|
|
||||||
enabled: root.machineName === ""
|
|
||||||
function onJournalReady(unitName, isUser, text) {
|
|
||||||
if (unitName === root.unitName && isUser === root.isUser) {
|
|
||||||
root._jText = text;
|
|
||||||
root._loading = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: S.MachinectlService
|
|
||||||
enabled: root.machineName !== ""
|
|
||||||
function onMachineJournalReady(mname, unitName, text) {
|
|
||||||
if (mname === root.machineName && unitName === root.unitName) {
|
|
||||||
root._jText = text;
|
|
||||||
root._loading = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function _fetchJournal() {
|
|
||||||
root._loading = true;
|
|
||||||
root._jText = "";
|
|
||||||
if (root.machineName === "")
|
|
||||||
S.SystemdService.fetchJournal(root.unitName, root.isUser);
|
|
||||||
else
|
|
||||||
S.MachinectlService.fetchMachineJournal(root.machineName, root.unitName);
|
|
||||||
}
|
|
||||||
|
|
||||||
function _doRestart() {
|
|
||||||
if (root.machineName === "")
|
|
||||||
S.SystemdService.restartUnit(root.unitName, root.isUser);
|
|
||||||
else
|
|
||||||
S.MachinectlService.restartMachineUnit(root.machineName, root.unitName);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Row
|
|
||||||
Item {
|
Item {
|
||||||
id: _row
|
id: _restartBtn
|
||||||
width: parent.width
|
anchors.right: parent.right
|
||||||
height: 32
|
anchors.rightMargin: 8
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
Rectangle {
|
width: 24
|
||||||
anchors.fill: parent
|
height: 24
|
||||||
anchors.leftMargin: 4
|
opacity: _rowHover.hovered ? 1 : 0
|
||||||
anchors.rightMargin: 4
|
Behavior on opacity {
|
||||||
color: _rowHover.hovered ? NS.ThemeService.base02 : "transparent"
|
NumberAnimation {
|
||||||
radius: NS.ThemeService.radius
|
duration: 80
|
||||||
z: -1
|
}
|
||||||
}
|
|
||||||
|
|
||||||
HoverHandler {
|
|
||||||
id: _rowHover
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
anchors.left: parent.left
|
anchors.centerIn: parent
|
||||||
anchors.leftMargin: 12
|
text: ""
|
||||||
anchors.right: _subStateTag.left
|
color: _rHover.hovered ? root.accentColor : NS.ThemeService.base04
|
||||||
anchors.rightMargin: 6
|
font.pixelSize: NS.ThemeService.fontSize
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
font.family: NS.ThemeService.iconFontFamily
|
||||||
text: root.unitName
|
Behavior on color {
|
||||||
color: NS.ThemeService.base05
|
ColorAnimation {
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 1
|
duration: 80
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
elide: Text.ElideRight
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: _subStateTag
|
|
||||||
anchors.right: _restartBtn.left
|
|
||||||
anchors.rightMargin: 6
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
color: NS.ThemeService.base08
|
|
||||||
opacity: 0.85
|
|
||||||
radius: 3
|
|
||||||
width: _subStateLbl.width + 8
|
|
||||||
height: 14
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: _subStateLbl
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: root.subState
|
|
||||||
color: NS.ThemeService.base00
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 3
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restart button - = fa-refresh
|
|
||||||
Item {
|
|
||||||
id: _restartBtn
|
|
||||||
anchors.right: _expandBtn.left
|
|
||||||
anchors.rightMargin: 2
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
width: 24
|
|
||||||
height: 24
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: ""
|
|
||||||
color: _rHover.hovered ? root.accentColor : NS.ThemeService.base04
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize
|
|
||||||
font.family: NS.ThemeService.iconFontFamily
|
|
||||||
Behavior on color {
|
|
||||||
ColorAnimation {
|
|
||||||
duration: 80
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
HoverHandler {
|
|
||||||
id: _rHover
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
|
||||||
}
|
|
||||||
TapHandler {
|
|
||||||
onTapped: {
|
|
||||||
root._doRestart();
|
|
||||||
if (root._expanded) {
|
|
||||||
root._jText = "";
|
|
||||||
Qt.callLater(root._fetchJournal);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expand chevron - = fa-chevron-down, = fa-chevron-up
|
HoverHandler {
|
||||||
Item {
|
id: _rHover
|
||||||
id: _expandBtn
|
cursorShape: Qt.PointingHandCursor
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.rightMargin: 4
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
width: 24
|
|
||||||
height: 24
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: root._expanded ? "" : ""
|
|
||||||
color: _expHover.hovered ? root.accentColor : NS.ThemeService.base04
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 1
|
|
||||||
font.family: NS.ThemeService.iconFontFamily
|
|
||||||
Behavior on color {
|
|
||||||
ColorAnimation {
|
|
||||||
duration: 80
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
HoverHandler {
|
|
||||||
id: _expHover
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
|
||||||
}
|
|
||||||
TapHandler {
|
|
||||||
onTapped: {
|
|
||||||
root._expanded = !root._expanded;
|
|
||||||
if (root._expanded && root._jText === "")
|
|
||||||
root._fetchJournal();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
TapHandler {
|
||||||
|
enabled: _rowHover.hovered
|
||||||
// Journal area
|
onTapped: S.SystemdService.restartUnit(root.unitName, root.scope, root.machineName)
|
||||||
Item {
|
|
||||||
id: _journalArea
|
|
||||||
anchors.top: _row.bottom
|
|
||||||
width: parent.width
|
|
||||||
height: 120
|
|
||||||
visible: root._expanded
|
|
||||||
clip: true
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.leftMargin: 8
|
|
||||||
anchors.rightMargin: 8
|
|
||||||
anchors.bottomMargin: 4
|
|
||||||
color: NS.ThemeService.base01
|
|
||||||
radius: NS.ThemeService.radius
|
|
||||||
|
|
||||||
Text {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
visible: root._loading
|
|
||||||
text: "loading..."
|
|
||||||
color: NS.ThemeService.base04
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 2
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
}
|
|
||||||
|
|
||||||
Flickable {
|
|
||||||
id: _flick
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.margins: 6
|
|
||||||
visible: !root._loading
|
|
||||||
contentHeight: _jContent.height
|
|
||||||
clip: true
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: _jContent
|
|
||||||
width: _flick.width
|
|
||||||
text: root._jText
|
|
||||||
color: NS.ThemeService.base04
|
|
||||||
font.pixelSize: NS.ThemeService.fontSize - 3
|
|
||||||
font.family: NS.ThemeService.fontFamily
|
|
||||||
wrapMode: Text.WrapAnywhere
|
|
||||||
}
|
|
||||||
|
|
||||||
onContentHeightChanged: contentY = Math.max(0, contentHeight - height)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@ GpuApplet 1.0 GpuApplet.qml
|
||||||
HexWaveBackground 1.0 HexWaveBackground.qml
|
HexWaveBackground 1.0 HexWaveBackground.qml
|
||||||
HoverableListItem 1.0 HoverableListItem.qml
|
HoverableListItem 1.0 HoverableListItem.qml
|
||||||
InfoRow 1.0 InfoRow.qml
|
InfoRow 1.0 InfoRow.qml
|
||||||
MachinectlApplet 1.0 MachinectlApplet.qml
|
|
||||||
MemoryApplet 1.0 MemoryApplet.qml
|
MemoryApplet 1.0 MemoryApplet.qml
|
||||||
MprisApplet 1.0 MprisApplet.qml
|
MprisApplet 1.0 MprisApplet.qml
|
||||||
NetworkApplet 1.0 NetworkApplet.qml
|
NetworkApplet 1.0 NetworkApplet.qml
|
||||||
|
|
@ -19,6 +18,7 @@ PowerApplet 1.0 PowerApplet.qml
|
||||||
Separator 1.0 Separator.qml
|
Separator 1.0 Separator.qml
|
||||||
SparklineCanvas 1.0 SparklineCanvas.qml
|
SparklineCanvas 1.0 SparklineCanvas.qml
|
||||||
SystemdApplet 1.0 SystemdApplet.qml
|
SystemdApplet 1.0 SystemdApplet.qml
|
||||||
|
SystemdMachineSection 1.0 SystemdMachineSection.qml
|
||||||
SystemdUnitRow 1.0 SystemdUnitRow.qml
|
SystemdUnitRow 1.0 SystemdUnitRow.qml
|
||||||
TemperatureApplet 1.0 TemperatureApplet.qml
|
TemperatureApplet 1.0 TemperatureApplet.qml
|
||||||
VolumeApplet 1.0 VolumeApplet.qml
|
VolumeApplet 1.0 VolumeApplet.qml
|
||||||
|
|
|
||||||
|
|
@ -187,7 +187,6 @@ PanelWindow {
|
||||||
M.WeatherModule {}
|
M.WeatherModule {}
|
||||||
M.DiskModule {}
|
M.DiskModule {}
|
||||||
M.SystemdModule {}
|
M.SystemdModule {}
|
||||||
M.MachinectlModule {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Power + Dock
|
// Power + Dock
|
||||||
|
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
pragma ComponentBehavior: Bound
|
|
||||||
|
|
||||||
import QtQuick
|
|
||||||
import Quickshell
|
|
||||||
import "." as M
|
|
||||||
import "../services" as S
|
|
||||||
import "../applets" as C
|
|
||||||
import NovaStats as NS
|
|
||||||
|
|
||||||
M.BarModule {
|
|
||||||
id: root
|
|
||||||
active: NS.ModulesService.machinectlEnable
|
|
||||||
tooltip: {
|
|
||||||
const n = S.MachinectlService.machines.length;
|
|
||||||
return n === 0 ? "no containers" : n + " container" + (n === 1 ? "" : "s");
|
|
||||||
}
|
|
||||||
panelNamespace: "nova-machinectl"
|
|
||||||
panelContentWidth: 320
|
|
||||||
panelComponent: Component {
|
|
||||||
C.MachinectlApplet {
|
|
||||||
width: parent.width
|
|
||||||
accentColor: root.accentColor
|
|
||||||
active: root._showPanel
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: S.MachinectlService
|
|
||||||
function onMachineReady() {
|
|
||||||
root.keepPanelOpen(300);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
readonly property color _stateColor: S.MachinectlService.anyUnhealthy ? NS.ThemeService.base0A : root.accentColor
|
|
||||||
|
|
||||||
M.BarIcon {
|
|
||||||
icon: ""
|
|
||||||
color: root._stateColor
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
M.BarLabel {
|
|
||||||
label: S.MachinectlService.machines.length.toString()
|
|
||||||
minText: "9"
|
|
||||||
color: root._stateColor
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
pragma ComponentBehavior: Bound
|
pragma ComponentBehavior: Bound
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
import "../services" as S
|
||||||
import "../applets" as C
|
import "../applets" as C
|
||||||
|
|
@ -11,12 +10,11 @@ M.BarModule {
|
||||||
id: root
|
id: root
|
||||||
active: NS.ModulesService.systemdEnable
|
active: NS.ModulesService.systemdEnable
|
||||||
tooltip: {
|
tooltip: {
|
||||||
const sys = S.SystemdService.systemState;
|
const fc = S.SystemdService.failedCount;
|
||||||
const fc = S.SystemdService.totalFailedCount;
|
return fc === 0 ? "systemd: ok" : "systemd: " + fc + " failed";
|
||||||
return "systemd: " + sys + (fc > 0 ? " (" + fc + " failed)" : "");
|
|
||||||
}
|
}
|
||||||
panelNamespace: "nova-systemd"
|
panelNamespace: "nova-systemd"
|
||||||
panelContentWidth: 300
|
panelContentWidth: 320
|
||||||
panelComponent: Component {
|
panelComponent: Component {
|
||||||
C.SystemdApplet {
|
C.SystemdApplet {
|
||||||
width: parent.width
|
width: parent.width
|
||||||
|
|
@ -28,22 +26,12 @@ M.BarModule {
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: S.SystemdService
|
target: S.SystemdService
|
||||||
function onSystemUnitsChanged() {
|
function onFailedUnitsChanged() {
|
||||||
root.keepPanelOpen(300);
|
|
||||||
}
|
|
||||||
function onUserUnitsChanged() {
|
|
||||||
root.keepPanelOpen(300);
|
root.keepPanelOpen(300);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
readonly property color _stateColor: {
|
readonly property color _stateColor: S.SystemdService.failedCount > 0 ? NS.ThemeService.base0A : root.accentColor
|
||||||
const st = S.SystemdService.systemState;
|
|
||||||
if (st === "running")
|
|
||||||
return root.accentColor;
|
|
||||||
if (st === "degraded")
|
|
||||||
return NS.ThemeService.base0A;
|
|
||||||
return NS.ThemeService.base08;
|
|
||||||
}
|
|
||||||
|
|
||||||
M.BarIcon {
|
M.BarIcon {
|
||||||
icon: ""
|
icon: ""
|
||||||
|
|
@ -51,8 +39,8 @@ M.BarModule {
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
M.BarLabel {
|
M.BarLabel {
|
||||||
label: S.SystemdService.totalFailedCount > 0 ? S.SystemdService.totalFailedCount + " failed" : S.SystemdService.systemState
|
label: S.SystemdService.failedCount > 0 ? S.SystemdService.failedCount + " failed" : "ok"
|
||||||
minText: "degraded"
|
minText: "0 failed"
|
||||||
color: root._stateColor
|
color: root._stateColor
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@ DockModule 1.0 DockModule.qml
|
||||||
GpuModule 1.0 GpuModule.qml
|
GpuModule 1.0 GpuModule.qml
|
||||||
HoverPanel 1.0 HoverPanel.qml
|
HoverPanel 1.0 HoverPanel.qml
|
||||||
IdleInhibitorModule 1.0 IdleInhibitorModule.qml
|
IdleInhibitorModule 1.0 IdleInhibitorModule.qml
|
||||||
MachinectlModule 1.0 MachinectlModule.qml
|
|
||||||
MemoryModule 1.0 MemoryModule.qml
|
MemoryModule 1.0 MemoryModule.qml
|
||||||
MprisModule 1.0 MprisModule.qml
|
MprisModule 1.0 MprisModule.qml
|
||||||
NetworkModule 1.0 NetworkModule.qml
|
NetworkModule 1.0 NetworkModule.qml
|
||||||
|
|
|
||||||
|
|
@ -1,152 +0,0 @@
|
||||||
pragma Singleton
|
|
||||||
|
|
||||||
import QtQuick
|
|
||||||
import Quickshell.Io
|
|
||||||
import "." as S
|
|
||||||
import NovaStats as NS
|
|
||||||
|
|
||||||
QtObject {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
property var machines: []
|
|
||||||
|
|
||||||
// cache: machineName -> {state, units, loading}
|
|
||||||
property var _cache: ({})
|
|
||||||
|
|
||||||
readonly property bool anyUnhealthy: {
|
|
||||||
for (const k of Object.keys(_cache)) {
|
|
||||||
if ((_cache[k]?.units?.length ?? 0) > 0)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function machineState(name) {
|
|
||||||
return _cache[name]?.state ?? "unknown";
|
|
||||||
}
|
|
||||||
function machineUnits(name) {
|
|
||||||
return _cache[name]?.units ?? [];
|
|
||||||
}
|
|
||||||
function machineLoading(name) {
|
|
||||||
return _cache[name]?.loading ?? false;
|
|
||||||
}
|
|
||||||
|
|
||||||
signal machineReady(string machineName, string state, var units)
|
|
||||||
signal machineJournalReady(string machineName, string unitName, string text)
|
|
||||||
|
|
||||||
// Per-call state: kept on root (not on the inline Process objects) so qmllint can see them.
|
|
||||||
property string _machineName: ""
|
|
||||||
property string _journalMachine: ""
|
|
||||||
property string _journalUnit: ""
|
|
||||||
property string _restartMachine: ""
|
|
||||||
|
|
||||||
function fetchMachine(name) {
|
|
||||||
const c = Object.assign({}, _cache);
|
|
||||||
c[name] = Object.assign({}, c[name] ?? {}, {
|
|
||||||
loading: true
|
|
||||||
});
|
|
||||||
_cache = c;
|
|
||||||
|
|
||||||
root._machineName = name;
|
|
||||||
_machineProc.command = ["sh", "-c", "busctl get-property --json=short --machine=" + name + " org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager SystemState 2>/dev/null || echo '{}'; " + "busctl call --json=short --machine=" + name + " org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager ListUnitsFiltered as 1 failed 2>/dev/null || echo '{}'"];
|
|
||||||
if (_machineProc.running)
|
|
||||||
_machineProc.running = false;
|
|
||||||
_machineProc.running = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function fetchMachineJournal(machineName, unitName) {
|
|
||||||
root._journalMachine = machineName;
|
|
||||||
root._journalUnit = unitName;
|
|
||||||
_machineJournalProc.command = ["journalctl", "-M", machineName, "-u", unitName, "-n", "80", "--no-pager", "--output=short-precise"];
|
|
||||||
if (_machineJournalProc.running)
|
|
||||||
_machineJournalProc.running = false;
|
|
||||||
_machineJournalProc.running = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function restartMachineUnit(machineName, unitName) {
|
|
||||||
root._restartMachine = machineName;
|
|
||||||
_machineRestartProc.command = ["pkexec", "systemctl", "-M", machineName, "restart", unitName];
|
|
||||||
if (_machineRestartProc.running)
|
|
||||||
_machineRestartProc.running = false;
|
|
||||||
_machineRestartProc.running = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
property Timer _poll: Timer {
|
|
||||||
interval: NS.ModulesService.machinectlInterval ?? 15000
|
|
||||||
running: NS.ModulesService.machinectlEnable
|
|
||||||
repeat: true
|
|
||||||
triggeredOnStart: true
|
|
||||||
onTriggered: if (!root._listProc.running)
|
|
||||||
root._listProc.running = true
|
|
||||||
}
|
|
||||||
|
|
||||||
property Process _listProc: Process {
|
|
||||||
command: ["busctl", "call", "--json=short", "org.freedesktop.machine1", "/org/freedesktop/machine1", "org.freedesktop.machine1.Manager", "ListMachines"]
|
|
||||||
stdout: StdioCollector {
|
|
||||||
onStreamFinished: {
|
|
||||||
try {
|
|
||||||
const parsed = JSON.parse(text.trim());
|
|
||||||
const newMachines = (parsed.data?.[0] || []).map(m => ({
|
|
||||||
name: m[0],
|
|
||||||
class: m[1],
|
|
||||||
service: m[2]
|
|
||||||
}));
|
|
||||||
root.machines = newMachines;
|
|
||||||
// drop stale cache entries
|
|
||||||
const names = new Set(newMachines.map(m => m.name));
|
|
||||||
const c = {};
|
|
||||||
for (const k of Object.keys(root._cache)) {
|
|
||||||
if (names.has(k))
|
|
||||||
c[k] = root._cache[k];
|
|
||||||
}
|
|
||||||
root._cache = c;
|
|
||||||
} catch (e) {
|
|
||||||
root.machines = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2 lines of output: state, failed-units
|
|
||||||
property Process _machineProc: Process {
|
|
||||||
stdout: StdioCollector {
|
|
||||||
onStreamFinished: {
|
|
||||||
const lines = text.trim().split("\n");
|
|
||||||
let state = "unknown";
|
|
||||||
let units = [];
|
|
||||||
try {
|
|
||||||
state = JSON.parse(lines[0] ?? "").data || "unknown";
|
|
||||||
} catch (e) {}
|
|
||||||
try {
|
|
||||||
const parsed = JSON.parse(lines[1] ?? "");
|
|
||||||
units = (parsed.data?.[0] || []).map(u => ({
|
|
||||||
name: u[0],
|
|
||||||
description: u[1],
|
|
||||||
loadState: u[2],
|
|
||||||
activeState: u[3],
|
|
||||||
subState: u[4]
|
|
||||||
}));
|
|
||||||
} catch (e) {}
|
|
||||||
const c = Object.assign({}, root._cache);
|
|
||||||
c[root._machineName] = {
|
|
||||||
state: state,
|
|
||||||
units: units,
|
|
||||||
loading: false
|
|
||||||
};
|
|
||||||
root._cache = c;
|
|
||||||
root.machineReady(root._machineName, state, units);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
property Process _machineJournalProc: Process {
|
|
||||||
stdout: StdioCollector {
|
|
||||||
onStreamFinished: root.machineJournalReady(root._journalMachine, root._journalUnit, text)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
property Process _machineRestartProc: Process {
|
|
||||||
onRunningChanged: if (!running && root._restartMachine !== "")
|
|
||||||
root.fetchMachine(root._restartMachine)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,100 +1,53 @@
|
||||||
pragma Singleton
|
pragma Singleton
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell.Io
|
|
||||||
import "." as S
|
|
||||||
import NovaStats as NS
|
import NovaStats as NS
|
||||||
|
|
||||||
|
// Thin wrapper around NS.SystemdService: drives the poll Timer and parses the
|
||||||
|
// JSON-encoded list properties into JS arrays for QML consumers. Restart helper
|
||||||
|
// proxies through to the Rust singleton.
|
||||||
QtObject {
|
QtObject {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property string systemState: "unknown"
|
readonly property string hostname: NS.SystemdService.hostname
|
||||||
property string userState: "unknown"
|
readonly property string systemState: NS.SystemdService.systemState
|
||||||
property var systemUnits: []
|
readonly property string userState: NS.SystemdService.userState
|
||||||
property var userUnits: []
|
readonly property int failedCount: NS.SystemdService.failedCount
|
||||||
readonly property int totalFailedCount: systemUnits.length + userUnits.length
|
|
||||||
|
|
||||||
signal journalReady(string unitName, bool isUser, string text)
|
// Parsed [{ name, description, subState, scope, machine }, ...]
|
||||||
|
readonly property var failedUnits: {
|
||||||
function refresh() {
|
|
||||||
if (!_pollProc.running)
|
|
||||||
_pollProc.running = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Per-fetch journal state: kept here (not on the Process) so qmllint can see them.
|
|
||||||
property string _journalUnitName: ""
|
|
||||||
property bool _journalIsUser: false
|
|
||||||
|
|
||||||
function fetchJournal(unitName, isUser) {
|
|
||||||
_journalProc.command = isUser ? ["journalctl", "--user", "-u", unitName, "-n", "80", "--no-pager", "--output=short-precise"] : ["journalctl", "-u", unitName, "-n", "80", "--no-pager", "--output=short-precise"];
|
|
||||||
root._journalUnitName = unitName;
|
|
||||||
root._journalIsUser = isUser;
|
|
||||||
if (_journalProc.running)
|
|
||||||
_journalProc.running = false;
|
|
||||||
_journalProc.running = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function restartUnit(unitName, isUser) {
|
|
||||||
_restartProc.command = isUser ? ["systemctl", "--user", "restart", unitName] : ["pkexec", "systemctl", "restart", unitName];
|
|
||||||
if (_restartProc.running)
|
|
||||||
_restartProc.running = false;
|
|
||||||
_restartProc.running = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function _parseState(json) {
|
|
||||||
try {
|
try {
|
||||||
return JSON.parse(json).data || "unknown";
|
return JSON.parse(NS.SystemdService.failedUnitsJson);
|
||||||
} catch (e) {
|
|
||||||
return "unknown";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function _parseUnits(json) {
|
|
||||||
try {
|
|
||||||
const parsed = JSON.parse(json);
|
|
||||||
return (parsed.data?.[0] || []).map(u => ({
|
|
||||||
name: u[0],
|
|
||||||
description: u[1],
|
|
||||||
loadState: u[2],
|
|
||||||
activeState: u[3],
|
|
||||||
subState: u[4]
|
|
||||||
}));
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
property Timer _poll: Timer {
|
// Parsed [{ name, class, service, systemState, failedUnits: [...] }, ...]
|
||||||
interval: NS.ModulesService.systemdInterval ?? 15000
|
readonly property var containers: {
|
||||||
|
try {
|
||||||
|
return JSON.parse(NS.SystemdService.containersJson);
|
||||||
|
} catch (e) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function restartUnit(name, scope, machine) {
|
||||||
|
NS.SystemdService.restartUnit(name, scope ?? "system", machine ?? "");
|
||||||
|
}
|
||||||
|
|
||||||
|
function refresh() {
|
||||||
|
NS.SystemdService.poll();
|
||||||
|
}
|
||||||
|
|
||||||
|
property Timer _pollTimer: Timer {
|
||||||
|
interval: {
|
||||||
|
const ms = NS.ModulesService.systemdInterval;
|
||||||
|
return ms > 0 ? ms : 15000;
|
||||||
|
}
|
||||||
running: NS.ModulesService.systemdEnable
|
running: NS.ModulesService.systemdEnable
|
||||||
repeat: true
|
repeat: true
|
||||||
triggeredOnStart: true
|
triggeredOnStart: false
|
||||||
onTriggered: if (!root._pollProc.running)
|
onTriggered: NS.SystemdService.poll()
|
||||||
root._pollProc.running = true
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4 lines of output: systemState, systemUnits, userState, userUnits
|
|
||||||
property Process _pollProc: Process {
|
|
||||||
command: ["sh", "-c", "busctl get-property --json=short org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager SystemState 2>/dev/null || echo '{}'; " + "busctl call --json=short org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager ListUnitsFiltered as 1 failed 2>/dev/null || echo '{}'; " + "busctl --user get-property --json=short org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager SystemState 2>/dev/null || echo '{}'; " + "busctl --user call --json=short org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager ListUnitsFiltered as 1 failed 2>/dev/null || echo '{}'"]
|
|
||||||
stdout: StdioCollector {
|
|
||||||
onStreamFinished: {
|
|
||||||
const lines = text.trim().split("\n");
|
|
||||||
root.systemState = root._parseState(lines[0] ?? "");
|
|
||||||
root.systemUnits = root._parseUnits(lines[1] ?? "");
|
|
||||||
root.userState = root._parseState(lines[2] ?? "");
|
|
||||||
root.userUnits = root._parseUnits(lines[3] ?? "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
property Process _journalProc: Process {
|
|
||||||
stdout: StdioCollector {
|
|
||||||
onStreamFinished: root.journalReady(root._journalUnitName, root._journalIsUser, text)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
property Process _restartProc: Process {
|
|
||||||
onRunningChanged: if (!running)
|
|
||||||
root.refresh()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ singleton CpuService 1.0 CpuService.qml
|
||||||
singleton DockState 1.0 DockState.qml
|
singleton DockState 1.0 DockState.qml
|
||||||
singleton IdleInhibitService 1.0 IdleInhibitService.qml
|
singleton IdleInhibitService 1.0 IdleInhibitService.qml
|
||||||
singleton LockService 1.0 LockService.qml
|
singleton LockService 1.0 LockService.qml
|
||||||
singleton MachinectlService 1.0 MachinectlService.qml
|
|
||||||
singleton MprisService 1.0 MprisService.qml
|
singleton MprisService 1.0 MprisService.qml
|
||||||
singleton NetworkService 1.0 NetworkService.qml
|
singleton NetworkService 1.0 NetworkService.qml
|
||||||
singleton NiriIpc 1.0 NiriIpc.qml
|
singleton NiriIpc 1.0 NiriIpc.qml
|
||||||
|
|
|
||||||
|
|
@ -36,14 +36,6 @@ shell/applets/HexWaveBackground.qml: Type "QColor" of property "base0E" not foun
|
||||||
shell/applets/HoverableListItem.qml: Type "QColor" of property "base02" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/HoverableListItem.qml: Type "QColor" of property "base02" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/applets/InfoRow.qml: Type "QColor" of property "base04" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/InfoRow.qml: Type "QColor" of property "base04" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/applets/InfoRow.qml: Type "QColor" of property "base05" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/InfoRow.qml: Type "QColor" of property "base05" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/applets/MachinectlApplet.qml: Type "QColor" of property "base00" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
|
||||||
shell/applets/MachinectlApplet.qml: Type "QColor" of property "base02" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
|
||||||
shell/applets/MachinectlApplet.qml: Type "QColor" of property "base03" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
|
||||||
shell/applets/MachinectlApplet.qml: Type "QColor" of property "base04" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
|
||||||
shell/applets/MachinectlApplet.qml: Type "QColor" of property "base05" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
|
||||||
shell/applets/MachinectlApplet.qml: Type "QColor" of property "base08" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
|
||||||
shell/applets/MachinectlApplet.qml: Type "QColor" of property "base0A" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
|
||||||
shell/applets/MachinectlApplet.qml: Type "QColor" of property "base0B" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
|
||||||
shell/applets/MemoryApplet.qml: Type "QColor" of property "base02" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/MemoryApplet.qml: Type "QColor" of property "base02" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/applets/MemoryApplet.qml: Type "QColor" of property "base03" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/MemoryApplet.qml: Type "QColor" of property "base03" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/applets/MemoryApplet.qml: Type "QColor" of property "base0D" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/MemoryApplet.qml: Type "QColor" of property "base0D" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
|
|
@ -78,13 +70,14 @@ shell/applets/PowerApplet.qml: Type "QColor" of property "base0D" not found. Thi
|
||||||
shell/applets/PowerApplet.qml: Type "QColor" of property "base0E" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/PowerApplet.qml: Type "QColor" of property "base0E" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/applets/PowerApplet.qml: Unqualified access [unqualified]
|
shell/applets/PowerApplet.qml: Unqualified access [unqualified]
|
||||||
shell/applets/Separator.qml: Type "QColor" of property "base03" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/Separator.qml: Type "QColor" of property "base03" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/applets/SystemdApplet.qml: Type "QColor" of property "base00" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/SystemdMachineSection.qml: Type "QColor" of property "base00" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/applets/SystemdApplet.qml: Type "QColor" of property "base03" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/SystemdMachineSection.qml: Type "QColor" of property "base02" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/applets/SystemdApplet.qml: Type "QColor" of property "base08" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/SystemdMachineSection.qml: Type "QColor" of property "base04" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/applets/SystemdApplet.qml: Type "QColor" of property "base0A" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/SystemdMachineSection.qml: Type "QColor" of property "base05" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/applets/SystemdApplet.qml: Type "QColor" of property "base0B" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/SystemdMachineSection.qml: Type "QColor" of property "base08" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
|
shell/applets/SystemdMachineSection.qml: Type "QColor" of property "base0A" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
|
shell/applets/SystemdMachineSection.qml: Type "QColor" of property "base0B" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/applets/SystemdUnitRow.qml: Type "QColor" of property "base00" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/SystemdUnitRow.qml: Type "QColor" of property "base00" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/applets/SystemdUnitRow.qml: Type "QColor" of property "base01" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
|
||||||
shell/applets/SystemdUnitRow.qml: Type "QColor" of property "base02" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/SystemdUnitRow.qml: Type "QColor" of property "base02" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/applets/SystemdUnitRow.qml: Type "QColor" of property "base04" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/SystemdUnitRow.qml: Type "QColor" of property "base04" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/applets/SystemdUnitRow.qml: Type "QColor" of property "base05" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/applets/SystemdUnitRow.qml: Type "QColor" of property "base05" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
|
|
@ -182,7 +175,6 @@ shell/modules/HoverPanel.qml: Type PanelWindow is not creatable. [uncreatable-ty
|
||||||
shell/modules/HoverPanel.qml: Type margins is used but it is not resolved [unresolved-type]
|
shell/modules/HoverPanel.qml: Type margins is used but it is not resolved [unresolved-type]
|
||||||
shell/modules/HoverPanel.qml: unknown grouped property scope margins. [unqualified]
|
shell/modules/HoverPanel.qml: unknown grouped property scope margins. [unqualified]
|
||||||
shell/modules/IdleInhibitorModule.qml: Type "QColor" of property "base09" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/modules/IdleInhibitorModule.qml: Type "QColor" of property "base09" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/modules/MachinectlModule.qml: Type "QColor" of property "base0A" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
|
||||||
shell/modules/MemoryModule.qml: Unqualified access [unqualified]
|
shell/modules/MemoryModule.qml: Unqualified access [unqualified]
|
||||||
shell/modules/MprisModule.qml: Unqualified access [unqualified]
|
shell/modules/MprisModule.qml: Unqualified access [unqualified]
|
||||||
shell/modules/NetworkModule.qml: Type "QColor" of property "base08" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/modules/NetworkModule.qml: Type "QColor" of property "base08" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
|
|
@ -218,7 +210,6 @@ shell/modules/ScreenCorners.qml: Type PanelWindow is not creatable. [uncreatable
|
||||||
shell/modules/ScreenCorners.qml: Type margins is used but it is not resolved [unresolved-type]
|
shell/modules/ScreenCorners.qml: Type margins is used but it is not resolved [unresolved-type]
|
||||||
shell/modules/ScreenCorners.qml: Unqualified access [unqualified]
|
shell/modules/ScreenCorners.qml: Unqualified access [unqualified]
|
||||||
shell/modules/ScreenCorners.qml: unknown grouped property scope margins. [unqualified]
|
shell/modules/ScreenCorners.qml: unknown grouped property scope margins. [unqualified]
|
||||||
shell/modules/SystemdModule.qml: Type "QColor" of property "base08" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
|
||||||
shell/modules/SystemdModule.qml: Type "QColor" of property "base0A" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/modules/SystemdModule.qml: Type "QColor" of property "base0A" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/modules/TemperatureModule.qml: Type "QColor" of property "base08" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/modules/TemperatureModule.qml: Type "QColor" of property "base08" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
shell/modules/TemperatureModule.qml: Type "QColor" of property "base0A" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
shell/modules/TemperatureModule.qml: Type "QColor" of property "base0A" not found. This is likely due to a missing dependency entry or a type not being exposed declaratively. [unresolved-type]
|
||||||
|
|
|
||||||
Reference in a new issue