This commit is contained in:
jmb05
2026-10-25 00:02:36 +02:00
parent d6a2c6afea
commit 4ca6596b1d
14 changed files with 351 additions and 386 deletions

164
Cargo.lock generated
View File

@@ -63,7 +63,7 @@ version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba"
dependencies = [ dependencies = [
"memchr 2.8.3", "memchr",
] ]
[[package]] [[package]]
@@ -416,7 +416,7 @@ dependencies = [
"hyper-util", "hyper-util",
"itoa", "itoa",
"matchit", "matchit",
"memchr 2.8.3", "memchr",
"mime", "mime",
"percent-encoding", "percent-encoding",
"pin-project-lite", "pin-project-lite",
@@ -679,9 +679,9 @@ dependencies = [
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.9.0" version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "877bf67ac8e52449eb2f9e98a344ea163beb70dd1f9eebe3cc5357dcfeaee4df" checksum = "86e055fa6e3e40ad6187ba25b6855eeb635d5271f8e0f0e1e9a5826b8d75bea0"
dependencies = [ dependencies = [
"find-msvc-tools", "find-msvc-tools",
"jobserver", "jobserver",
@@ -746,7 +746,7 @@ checksum = "13de944a44b5064ee5d3a5ceccc49a41bfec50f2580e66f82e87703acdb88b53"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"encoding_rs", "encoding_rs",
"memchr 2.8.3", "memchr",
] ]
[[package]] [[package]]
@@ -849,7 +849,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4356eba6976435498d05a311ee9fc486da3bc81c200d3f0d7dd9703b41913f92" checksum = "4356eba6976435498d05a311ee9fc486da3bc81c200d3f0d7dd9703b41913f92"
dependencies = [ dependencies = [
"bytes", "bytes",
"memchr 2.8.3", "memchr",
] ]
[[package]] [[package]]
@@ -1029,9 +1029,9 @@ dependencies = [
[[package]] [[package]]
name = "crypto-bigint" name = "crypto-bigint"
version = "0.7.5" version = "0.7.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a52aa3fcda4e6302a9f48734f234d35d4721b96f8fe07d073f07ce9df4f0271" checksum = "cc907c45bb7e9ef8fc3778defd0f3cd8c81288f1b4e748eba064948f20c47122"
dependencies = [ dependencies = [
"cpubits", "cpubits",
"ctutils", "ctutils",
@@ -1076,9 +1076,9 @@ dependencies = [
[[package]] [[package]]
name = "ctutils" name = "ctutils"
version = "0.4.4" version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12218662ccac37d9714f2191252553d67585b97df8c839cbe49e0bde278dc865" checksum = "38d28fb6aa7dd680b3ffd1a3e64e115c177bdba63c0ae7f9cd48129ff05c4fa0"
dependencies = [ dependencies = [
"cmov", "cmov",
"subtle", "subtle",
@@ -1170,26 +1170,25 @@ 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 = "ba69f2c53e320fc4abad17cb02bbbf04d1a36f18e9907f347589ec5991b3c6c5" checksum = "ba69f2c53e320fc4abad17cb02bbbf04d1a36f18e9907f347589ec5991b3c6c5"
dependencies = [ dependencies = [
"mccs", "mccs 0.1.3",
] ]
[[package]] [[package]]
name = "ddc-hi" name = "ddc-hi"
version = "0.4.1" version = "0.5.0-jmb1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "git+https://github.com/jmb05/ddc-hi-rs#3c105d7ce3333220d7304c34468c421cea5941a0"
checksum = "9c6747b17c926a2aa34739b30f1a6cc726e3a7baf0e2f69a4c03a95cf5de94de"
dependencies = [ dependencies = [
"anyhow",
"ddc", "ddc",
"ddc-i2c", "ddc-i2c",
"ddc-macos", "ddc-macos",
"ddc-winapi", "ddc-winapi",
"edid", "edid",
"log", "log",
"mccs", "mccs 0.2.0",
"mccs-caps", "mccs-caps",
"mccs-db", "mccs-db",
"nvapi", "nvapi",
"thiserror 2.0.21",
] ]
[[package]] [[package]]
@@ -1362,12 +1361,6 @@ dependencies = [
"litrs", "litrs",
] ]
[[package]]
name = "dtoa"
version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
[[package]] [[package]]
name = "dunce" name = "dunce"
version = "1.0.5" version = "1.0.5"
@@ -1417,11 +1410,10 @@ dependencies = [
[[package]] [[package]]
name = "edid" name = "edid"
version = "0.3.0" version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "git+https://github.com/jmb05/rust-edid#509d792617f521ea3797b70b547ac64a5fa35935"
checksum = "24ce75530893d834dcfe3bb67ce0e7dec489484e7cb4423ca31618af4bab24fe"
dependencies = [ dependencies = [
"nom", "nom 8.0.0",
] ]
[[package]] [[package]]
@@ -1432,9 +1424,9 @@ checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be"
[[package]] [[package]]
name = "elliptic-curve" name = "elliptic-curve"
version = "0.14.1" version = "0.14.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d65aa39b3a5c1c9c1b745c9a019234bb7a21b77abcb4f4d266d706e2d577d65" checksum = "0ad4496221fcfc21015fd8c0e26fcfab00504832dc0604f52acdd7bad2a8dc81"
dependencies = [ dependencies = [
"base16ct", "base16ct",
"crypto-bigint", "crypto-bigint",
@@ -1797,7 +1789,7 @@ dependencies = [
"futures-macro", "futures-macro",
"futures-sink", "futures-sink",
"futures-task", "futures-task",
"memchr 2.8.3", "memchr",
"pin-project-lite", "pin-project-lite",
"slab", "slab",
] ]
@@ -1985,7 +1977,7 @@ dependencies = [
"glib-sys", "glib-sys",
"gobject-sys", "gobject-sys",
"libc", "libc",
"memchr 2.8.3", "memchr",
"smallvec", "smallvec",
] ]
@@ -2972,12 +2964,6 @@ dependencies = [
"pkg-config", "pkg-config",
] ]
[[package]]
name = "linked-hash-map"
version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
[[package]] [[package]]
name = "linux-raw-sys" name = "linux-raw-sys"
version = "0.12.1" version = "0.12.1"
@@ -3118,25 +3104,30 @@ dependencies = [
] ]
[[package]] [[package]]
name = "mccs-caps" name = "mccs"
version = "0.1.3" 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 = "8eb961d01a3bb07969cfa276be2ab88c31d0fefa77a872696832732d6e9ec094" checksum = "2a63ab5297c9a7d5f8298a076b5f858c3c51ce84bf2f57a302d1d67ff9323360"
[[package]]
name = "mccs-caps"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47729c9dbef15d10c6a7ebb3157034265ccc2559e76ac10afb45ecc69ce09288"
dependencies = [ dependencies = [
"mccs", "mccs 0.2.0",
"nom", "nom 7.1.3",
] ]
[[package]] [[package]]
name = "mccs-db" name = "mccs-db"
version = "0.1.3" 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 = "3cdaa8fe19a1a1918becc1b8cbbbdc1058bc71411dff4de0a6ec6b5269f49d38" checksum = "3f407952e10e26ed81e89ebb45ecd3a153854ad74d956f6f4dcca4472b587dc5"
dependencies = [ dependencies = [
"mccs", "mccs 0.2.0",
"nom", "nom 7.1.3",
"serde", "serde",
"serde_derive",
"serde_yaml", "serde_yaml",
] ]
@@ -3146,15 +3137,6 @@ version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ebb8d8732c6a6df3d8f032a82911cfc747e00efb95cc46e8d0acd5b5b88570c" checksum = "7ebb8d8732c6a6df3d8f032a82911cfc747e00efb95cc46e8d0acd5b5b88570c"
[[package]]
name = "memchr"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "148fab2e51b4f1cfc66da2a7c32981d1d3c083a803978268bb11fe4b86925e7a"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "memchr" name = "memchr"
version = "2.8.3" version = "2.8.3"
@@ -3213,6 +3195,12 @@ dependencies = [
"unicase", "unicase",
] ]
[[package]]
name = "minimal-lexical"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.9.1" version = "0.9.1"
@@ -3366,11 +3354,21 @@ dependencies = [
[[package]] [[package]]
name = "nom" name = "nom"
version = "3.2.1" version = "7.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05aec50c70fd288702bcd93284a8444607f3292dbdf2a30de5ea5dcdbe72287b" checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
dependencies = [ dependencies = [
"memchr 1.0.2", "memchr",
"minimal-lexical",
]
[[package]]
name = "nom"
version = "8.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405"
dependencies = [
"memchr",
] ]
[[package]] [[package]]
@@ -4238,7 +4236,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "278e9268c93b9e498a2da46c34d90ba93a3255eb99009646398f34bc73ab36eb" checksum = "278e9268c93b9e498a2da46c34d90ba93a3255eb99009646398f34bc73ab36eb"
dependencies = [ dependencies = [
"bitflags 2.13.2", "bitflags 2.13.2",
"memchr 2.8.3", "memchr",
"unicase", "unicase",
] ]
@@ -4405,7 +4403,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr 2.8.3", "memchr",
"regex-automata", "regex-automata",
"regex-syntax", "regex-syntax",
] ]
@@ -4417,7 +4415,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr 2.8.3", "memchr",
"regex-syntax", "regex-syntax",
] ]
@@ -4923,7 +4921,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6"
dependencies = [ dependencies = [
"itoa", "itoa",
"memchr 2.8.3", "memchr",
"serde", "serde",
"serde_core", "serde_core",
"zmij", "zmij",
@@ -4974,14 +4972,15 @@ dependencies = [
[[package]] [[package]]
name = "serde_yaml" name = "serde_yaml"
version = "0.7.5" version = "0.9.34+deprecated"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef8099d3df28273c99a1728190c7a9f19d444c941044f64adf986bee7ec53051" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
dependencies = [ dependencies = [
"dtoa", "indexmap",
"linked-hash-map", "itoa",
"ryu",
"serde", "serde",
"yaml-rust", "unsafe-libyaml",
] ]
[[package]] [[package]]
@@ -5145,9 +5144,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
[[package]] [[package]]
name = "smallvec" name = "smallvec"
version = "1.16.3" version = "1.16.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b3dc8af474f516a851ff4bd12db780f948b9250ad37211e4eec0bccea54e01b" checksum = "d0d5d4b1981b8bbbb7aed204cae5726d683d5d6ac7e74ec54122ea28f315e7c8"
[[package]] [[package]]
name = "socket2" name = "socket2"
@@ -5324,7 +5323,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2071df9448915b71c4fe6d25deaf1c22f12bd234f01540b77312bb8e41361e6" checksum = "d2071df9448915b71c4fe6d25deaf1c22f12bd234f01540b77312bb8e41361e6"
dependencies = [ dependencies = [
"libc", "libc",
"memchr 2.8.3", "memchr",
"ntapi", "ntapi",
"objc2-core-foundation", "objc2-core-foundation",
"objc2-io-kit", "objc2-io-kit",
@@ -5912,6 +5911,12 @@ dependencies = [
"ctutils", "ctutils",
] ]
[[package]]
name = "unsafe-libyaml"
version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
[[package]] [[package]]
name = "untrusted" name = "untrusted"
version = "0.7.1" version = "0.7.1"
@@ -5960,9 +5965,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]] [[package]]
name = "uuid" name = "uuid"
version = "1.28.0" version = "1.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7cc1186384beb7dd8eedea376413fd654937285ea6c9cfbb928dc3043ea4b606" checksum = "4a0e2d11620c50695fe12bbbfde96b3477fe606e7284c22d505c12ce51214514"
dependencies = [ dependencies = [
"getrandom 0.4.3", "getrandom 0.4.3",
"js-sys", "js-sys",
@@ -6125,9 +6130,9 @@ dependencies = [
[[package]] [[package]]
name = "webpki-root-certs" name = "webpki-root-certs"
version = "1.0.10" version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58ec80e73fd8baf57bf0d9615554c75348bda990d6d5bbeab964dd068319fecb" checksum = "e49d0e65abc00c142e8f9428da991da9f1a250c39be97459901eb12b9b49f62a"
dependencies = [ dependencies = [
"rustls-pki-types", "rustls-pki-types",
] ]
@@ -6640,7 +6645,7 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81"
dependencies = [ dependencies = [
"memchr 2.8.3", "memchr",
] ]
[[package]] [[package]]
@@ -6710,15 +6715,6 @@ version = "0.8.29"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7" checksum = "e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7"
[[package]]
name = "yaml-rust"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
dependencies = [
"linked-hash-map",
]
[[package]] [[package]]
name = "yoke" name = "yoke"
version = "0.8.4" version = "0.8.4"

View File

@@ -31,7 +31,7 @@ hyper-util = { version = "0.1.21", features = ["tokio"] }
http-body-util = "0.1.5" http-body-util = "0.1.5"
brightness = { version = "0.8.0", features = ["blocking"] } brightness = { version = "0.8.0", features = ["blocking"] }
battery = "0.7.8" battery = "0.7.8"
ddc-hi = { version = "0.4.1", features = ["ddc-i2c"] } ddc-hi = { git = "https://github.com/jmb05/ddc-hi-rs" }
[build-dependencies] [build-dependencies]
glib-build-tools = "0.22.8" glib-build-tools = "0.22.8"

View File

@@ -307,8 +307,8 @@ impl BackendThread<MediaCommand, Sender<MediaCommand>> for MediaBackend {
loop { loop {
while let Ok(msg) = controller_rx.try_recv() { while let Ok(msg) = controller_rx.try_recv() {
match msg { match msg {
ControllerMsg::Request => { Request => {
let _ = instance_clone.lock().expect("Couldn't get lock").publish( instance_clone.lock().expect("Couldn't get lock").publish(
MediaCommand::Cmd( MediaCommand::Cmd(
controller.current_vol, controller.current_vol,
controller.current_mute, controller.current_mute,
@@ -319,7 +319,7 @@ impl BackendThread<MediaCommand, Sender<MediaCommand>> for MediaBackend {
ControllerMsg::NotifyServer => { ControllerMsg::NotifyServer => {
controller.query_default_device_blocking(); controller.query_default_device_blocking();
let _ = controller.query_state_blocking(); let _ = controller.query_state_blocking();
let _ = instance_clone.lock().expect("Couldn't get lock").publish( instance_clone.lock().expect("Couldn't get lock").publish(
MediaCommand::Cmd( MediaCommand::Cmd(
controller.current_vol, controller.current_vol,
controller.current_mute, controller.current_mute,
@@ -331,14 +331,13 @@ impl BackendThread<MediaCommand, Sender<MediaCommand>> for MediaBackend {
if controller.device_index.is_some_and(|i| i == idx) { if controller.device_index.is_some_and(|i| i == idx) {
let changed = controller.query_state_blocking(); let changed = controller.query_state_blocking();
if changed { if changed {
let _ = instance_clone instance_clone.lock().expect("Couldn't get lock").publish(
.lock() MediaCommand::Cmd(
.expect("Couldn't get lock")
.publish(MediaCommand::Cmd(
controller.current_vol, controller.current_vol,
controller.current_mute, controller.current_mute,
controller.device_bt.unwrap_or(false), controller.device_bt.unwrap_or(false),
)); ),
);
trace!( trace!(
&LOGGER, &LOGGER,
"Change: {} muted: {}", "Change: {} muted: {}",
@@ -350,7 +349,7 @@ impl BackendThread<MediaCommand, Sender<MediaCommand>> for MediaBackend {
} }
ControllerMsg::Set(volume, mute) => { ControllerMsg::Set(volume, mute) => {
controller.set_state(volume, mute); controller.set_state(volume, mute);
let _ = instance_clone.lock().expect("Couldn't get lock").publish( instance_clone.lock().expect("Couldn't get lock").publish(
MediaCommand::Cmd( MediaCommand::Cmd(
controller.current_vol, controller.current_vol,
controller.current_mute, controller.current_mute,

View File

@@ -15,7 +15,7 @@ use std::{fs, thread};
pub enum DisplayBackend { pub enum DisplayBackend {
Sysfs(BrightnessDevice), Sysfs(BrightnessDevice),
DdcCi(ddc_hi::Display), DdcCi(Box<ddc_hi::Display>),
} }
fn get_sysfs_dev(id: &str) -> Option<BrightnessDevice> { fn get_sysfs_dev(id: &str) -> Option<BrightnessDevice> {
@@ -47,7 +47,7 @@ impl DisplayBackend {
pub fn get_brightness(&mut self) -> Option<u8> { pub fn get_brightness(&mut self) -> Option<u8> {
match self { match self {
DisplayBackend::Sysfs(dev) => dev.get().and_then(|val| Ok(val as u8)).ok(), DisplayBackend::Sysfs(dev) => dev.get().map(|val| val as u8).ok(),
DisplayBackend::DdcCi(display) => { DisplayBackend::DdcCi(display) => {
if let Ok(val) = display.handle.get_vcp_feature(0x10) { if let Ok(val) = display.handle.get_vcp_feature(0x10) {
Some(val.value() as u8) Some(val.value() as u8)
@@ -70,12 +70,12 @@ struct DisplayData(DisplayBackend, u8);
impl DisplayData { impl DisplayData {
fn update(&mut self) -> bool { fn update(&mut self) -> bool {
if let Some(value) = self.0.get_brightness() { if let Some(value) = self.0.get_brightness()
if self.1 != value { && self.1 != value
{
self.1 = value; self.1 = value;
return true; return true;
} }
}
false false
} }
@@ -116,7 +116,7 @@ impl BackendThread<BrightnessMessage, Sender<BrightnessMessage>> for BrightnessM
subscribers: Vec::new(), subscribers: Vec::new(),
})); }));
let instance_clone = instance.clone(); let instance_clone = instance.clone();
std::thread::spawn(move || { thread::spawn(move || {
while let Ok(tx) = registration_rx.recv() { while let Ok(tx) = registration_rx.recv() {
if tx.send(BrightnessMessage::Init(f2b_tx.clone())).is_ok() { if tx.send(BrightnessMessage::Init(f2b_tx.clone())).is_ok() {
trace!(&LOGGER, "Added Brightness Subscriber: {tx:?}"); trace!(&LOGGER, "Added Brightness Subscriber: {tx:?}");
@@ -129,7 +129,7 @@ impl BackendThread<BrightnessMessage, Sender<BrightnessMessage>> for BrightnessM
} }
}); });
let instance_clone = instance.clone(); let instance_clone = instance.clone();
std::thread::spawn(move || { thread::spawn(move || {
while let Ok(mut msg) = f2b_rx.recv() { while let Ok(mut msg) = f2b_rx.recv() {
while let Ok(newer) = f2b_rx.try_recv() { while let Ok(newer) = f2b_rx.try_recv() {
msg = newer; msg = newer;
@@ -151,7 +151,7 @@ impl BackendThread<BrightnessMessage, Sender<BrightnessMessage>> for BrightnessM
.expect("Couldn't get lock") .expect("Couldn't get lock")
.display_cache .display_cache
.get(&id) .get(&id)
.and_then(|v| Some(v.1)) .map(|v| v.1)
{ {
instance_clone instance_clone
.lock() .lock()
@@ -216,8 +216,7 @@ impl BrightnessManager {
if path.file_name().eq("device") if path.file_name().eq("device")
&& let Ok(link) = fs::read_link(path.path()) && let Ok(link) = fs::read_link(path.path())
&& let Some(name) = link.file_name() && let Some(name) = link.file_name()
{ && name
if name
.to_str() .to_str()
.is_some_and(|name| name.eq(&format!("card1-{connector}"))) .is_some_and(|name| name.eq(&format!("card1-{connector}")))
{ {
@@ -235,7 +234,6 @@ impl BrightnessManager {
} }
} }
} }
}
let res = Self::ddcutil_bus_for_connector(&connector); let res = Self::ddcutil_bus_for_connector(&connector);
if let Ok(path) = res if let Ok(path) = res
&& let Ok(data) = fs::metadata(path) && let Ok(data) = fs::metadata(path)
@@ -244,7 +242,7 @@ impl BrightnessManager {
println!("Found DDC/CI display {connector}"); println!("Found DDC/CI display {connector}");
for display in ddc_hi::Display::enumerate() { for display in ddc_hi::Display::enumerate() {
if id.to_string().eq(&display.info.id) { if id.to_string().eq(&display.info.id) {
let mut backend = DisplayBackend::DdcCi(display); let mut backend = DisplayBackend::DdcCi(Box::new(display));
let value = backend.get_brightness().unwrap_or(60); let value = backend.get_brightness().unwrap_or(60);
self.display_cache self.display_cache
.insert(connector.clone(), DisplayData(backend, value)); .insert(connector.clone(), DisplayData(backend, value));
@@ -307,12 +305,12 @@ impl BrightnessManager {
} }
} }
if drm_connector.as_deref() == Some(connector) { if drm_connector.as_deref() == Some(connector)
if let Some(bus) = bus { && let Some(bus) = bus
{
return Ok(bus); return Ok(bus);
} }
} }
}
Err(std::io::Error::new( Err(std::io::Error::new(
std::io::ErrorKind::NotFound, std::io::ErrorKind::NotFound,

View File

@@ -39,7 +39,7 @@ impl PartialEq<Self> for NetworkInfo {
impl PartialOrd<Self> for NetworkInfo { impl PartialOrd<Self> for NetworkInfo {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> { fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(other.cmp(self)) Some(self.cmp(other))
} }
} }
@@ -82,8 +82,7 @@ impl From<ConnectionError> for ConnectError {
match value { match value {
ConnectionError::AuthFailed => ConnectError::AuthFailed, ConnectionError::AuthFailed => ConnectError::AuthFailed,
ConnectionError::NotFound => ConnectError::NotFound, ConnectionError::NotFound => ConnectError::NotFound,
ConnectionError::Dbus(err) => match err { ConnectionError::Dbus(Error::MethodError(name, ..)) => {
Error::MethodError(name, ..) => {
if name.eq(&ErrorName::try_from( if name.eq(&ErrorName::try_from(
"org.freedesktop.NetworkManager.Device.SpecificObjectNotFound", "org.freedesktop.NetworkManager.Device.SpecificObjectNotFound",
) )
@@ -95,8 +94,6 @@ impl From<ConnectionError> for ConnectError {
} }
} }
_ => ConnectError::Unknown, _ => ConnectError::Unknown,
},
_ => ConnectError::Unknown,
} }
} }
} }
@@ -208,8 +205,9 @@ impl BackendThread<NetworkState, UnboundedSender<NetworkCommand>> for NetworkBac
} else { } else {
match auth { match auth {
Auth::Open => { Auth::Open => {
if let Ok(networks) = nm.list_access_points(None).await { if let Ok(networks) = nm.list_access_points(None).await
if let Some(ap) = networks.iter().find(|net| net.ssid.eq(&ssid)) { && let Some(ap) = networks.iter().find(|net| net.ssid.eq(&ssid))
{
if ap.security.is_open() { if ap.security.is_open() {
instance_clone.connect(&nm, ssid, WifiSecurity::Open).await; instance_clone.connect(&nm, ssid, WifiSecurity::Open).await;
} else { } else {
@@ -217,7 +215,6 @@ impl BackendThread<NetworkState, UnboundedSender<NetworkCommand>> for NetworkBac
} }
} }
} }
}
Auth::Password(password) => instance_clone.connect(&nm, ssid, WifiSecurity::WpaPsk { psk: password }).await, Auth::Password(password) => instance_clone.connect(&nm, ssid, WifiSecurity::WpaPsk { psk: password }).await,
} }
} }
@@ -269,8 +266,9 @@ impl NetworkBackendHandle {
} }
async fn print_network_info(&self, nm: &NetworkManager, ssid: &str, level: Level) { async fn print_network_info(&self, nm: &NetworkManager, ssid: &str, level: Level) {
if let Ok(nets) = nm.list_networks(None).await { if let Ok(nets) = nm.list_networks(None).await
if let Some(net) = nets.iter().find(|net| net.ssid.eq(ssid)) { && let Some(net) = nets.iter().find(|net| net.ssid.eq(ssid))
{
log!(&LOGGER, level, "Network:"); log!(&LOGGER, level, "Network:");
log!(&LOGGER, level, " SSID: {}", net.ssid); log!(&LOGGER, level, " SSID: {}", net.ssid);
log!(&LOGGER, level, " Active: {}", net.is_active); log!(&LOGGER, level, " Active: {}", net.is_active);
@@ -287,7 +285,6 @@ impl NetworkBackendHandle {
log!(&LOGGER, level, " Addr(6): {:?}", net.ip6_address); log!(&LOGGER, level, " Addr(6): {:?}", net.ip6_address);
} }
} }
}
async fn handle_event( async fn handle_event(
&self, &self,
@@ -304,7 +301,7 @@ impl NetworkBackendHandle {
NetworkEvent::WirelessEnabledChanged => { NetworkEvent::WirelessEnabledChanged => {
if let Ok(state) = nm.wifi_state().await { if let Ok(state) = nm.wifi_state().await {
if !state.enabled { if !state.enabled {
let _ = self.publish(NetworkState::ChangeNetwork(None)); self.publish(NetworkState::ChangeNetwork(None));
} else { } else {
let _ = self.send_active_connection(nm).await; let _ = self.send_active_connection(nm).await;
} }
@@ -313,8 +310,9 @@ impl NetworkBackendHandle {
NetworkEvent::ActiveConnectionsChanged => { NetworkEvent::ActiveConnectionsChanged => {
let _ = self.send_active_connection(nm).await; let _ = self.send_active_connection(nm).await;
} }
NetworkEvent::DeviceChanged { interface } => match interface { NetworkEvent::DeviceChanged {
Some(interface) => match nm.active_vpn_connections().await { interface: Some(interface),
} => match nm.active_vpn_connections().await {
Ok(connections) => { Ok(connections) => {
let mut connected = false; let mut connected = false;
for conn in connections { for conn in connections {
@@ -322,15 +320,13 @@ impl NetworkBackendHandle {
connected = true; connected = true;
} }
} }
let _ = self.publish(NetworkState::VpnState { self.publish(NetworkState::VpnState {
profile: interface, profile: interface,
connected, connected,
}); });
} }
Err(err) => error!(&LOGGER, "Error getting active vpns: {}", err.to_string()), Err(err) => error!(&LOGGER, "Error getting active vpns: {}", err.to_string()),
}, },
None => {}
},
_ => {} _ => {}
} }
} }
@@ -443,7 +439,7 @@ impl NetworkBackendHandle {
secured: None, secured: None,
known: true, known: true,
}; };
let _ = self.publish(NetworkState::ChangeNetwork(Some(info))); self.publish(NetworkState::ChangeNetwork(Some(info)));
} }
ActiveConnection::Wifi(c) => { ActiveConnection::Wifi(c) => {
let info = NetworkInfo { let info = NetworkInfo {
@@ -453,13 +449,13 @@ impl NetworkBackendHandle {
secured: None, // Not relevant here secured: None, // Not relevant here
known: true, known: true,
}; };
let _ = self.publish(NetworkState::ChangeNetwork(Some(info))); self.publish(NetworkState::ChangeNetwork(Some(info)));
} }
_ => {} _ => {}
} }
} }
None => { None => {
let _ = self.publish(NetworkState::ChangeNetwork(None)); self.publish(NetworkState::ChangeNetwork(None));
} }
} }
} }
@@ -478,11 +474,8 @@ impl NetworkBackendHandle {
Ok::<bool, Box<dyn std::error::Error>>(active.iter().any(|vpn| vpn.name == profile)) Ok::<bool, Box<dyn std::error::Error>>(active.iter().any(|vpn| vpn.name == profile))
}; };
match operation.await { if let Ok(connected) = operation.await {
Ok(connected) => { self.publish(NetworkState::VpnState { profile, connected });
let _ = self.publish(NetworkState::VpnState { profile, connected });
}
Err(_) => {}
} }
} }
} }

View File

@@ -91,8 +91,9 @@ impl BackendThread<Stats, ()> for StatsBackend {
let mut battery_draw: f32 = 0.0; let mut battery_draw: f32 = 0.0;
let mut battery_time: u64 = 0; let mut battery_time: u64 = 0;
if let Ok(manager) = &manager { if let Ok(manager) = &manager
if let Ok(mut batteries) = manager.batteries() { && let Ok(mut batteries) = manager.batteries()
{
match batteries.next() { match batteries.next() {
Some(Ok(battery)) => { Some(Ok(battery)) => {
battery_charge = battery_charge =
@@ -103,14 +104,12 @@ impl BackendThread<Stats, ()> for StatsBackend {
battery battery
.time_to_full() .time_to_full()
.unwrap_or(Time::new::<millisecond>(0.0)) .unwrap_or(Time::new::<millisecond>(0.0))
.get::<millisecond>() .get::<millisecond>() as u64
as u64
} else if battery_state == State::Discharging { } else if battery_state == State::Discharging {
battery battery
.time_to_empty() .time_to_empty()
.unwrap_or(Time::new::<millisecond>(0.0)) .unwrap_or(Time::new::<millisecond>(0.0))
.get::<millisecond>() .get::<millisecond>() as u64
as u64
} else { } else {
0 0
}; };
@@ -119,7 +118,6 @@ impl BackendThread<Stats, ()> for StatsBackend {
None => {} None => {}
} }
} }
}
let msg = Stats { let msg = Stats {
cpu, cpu,

View File

@@ -89,15 +89,15 @@ impl TailscaleBackend {
match serde_json::from_slice::<serde_json::Value>(line) { match serde_json::from_slice::<serde_json::Value>(line) {
Ok(notification) => { Ok(notification) => {
if let Some(state) = notification.get("State") { if let Some(state) = notification.get("State")
if !state.is_null() { && !state.is_null()
{
let state = let state =
TailscaleState::try_from_value(state.as_i64().unwrap_or(4)) TailscaleState::try_from_value(state.as_i64().unwrap_or(4))
.unwrap_or(TailscaleState::Stopped); .unwrap_or(TailscaleState::Stopped);
instance.lock().expect("Couldn't get lock").publish(state); instance.lock().expect("Couldn't get lock").publish(state);
} }
} }
}
Err(err) => { Err(err) => {
eprintln!("Invalid Tailscale notification: {err}"); eprintln!("Invalid Tailscale notification: {err}");
} }
@@ -174,12 +174,12 @@ fn initial_state() -> TailscaleState {
.output() .output()
{ {
let val: Result<serde_json::Value, _> = serde_json::from_slice(&output.stdout); let val: Result<serde_json::Value, _> = serde_json::from_slice(&output.stdout);
if val.is_ok() { if let Ok(val) = val {
if let Some(res) = val.unwrap().get("BackendState").and_then(|v| v.as_str()) { if let Some(res) = val.get("BackendState").and_then(|v| v.as_str())
if res.eq("Running") { && res.eq("Running")
{
return TailscaleState::Running; return TailscaleState::Running;
} }
}
} else { } else {
error!(&LOGGER, "{:?}", val.err()); error!(&LOGGER, "{:?}", val.err());
} }

View File

@@ -45,14 +45,14 @@ impl BackendThread<WindowManagerEvent, ()> for HyprlandComms {
let inst_clone = instance.clone(); let inst_clone = instance.clone();
listener.add_workspace_changed_handler(move |workspace| { listener.add_workspace_changed_handler(move |workspace| {
if let WorkspaceType::Regular(name) = workspace.name { if let WorkspaceType::Regular(name) = workspace.name
if let Ok(id) = name.parse::<i32>() { && let Ok(id) = name.parse::<i32>()
{
inst_clone inst_clone
.lock() .lock()
.expect("Couldn't get Subscribers") .expect("Couldn't get Subscribers")
.publish(WindowManagerEvent::WorkspaceChanged(id)); .publish(WindowManagerEvent::WorkspaceChanged(id));
} }
}
}); });
let inst_clone = instance.clone(); let inst_clone = instance.clone();
@@ -84,14 +84,14 @@ impl BackendThread<WindowManagerEvent, ()> for HyprlandComms {
let inst_clone = instance.clone(); let inst_clone = instance.clone();
listener.add_workspace_deleted_handler(move |workspace| { listener.add_workspace_deleted_handler(move |workspace| {
if let WorkspaceType::Regular(name) = workspace.name { if let WorkspaceType::Regular(name) = workspace.name
if let Ok(id) = name.parse::<i32>() { && let Ok(id) = name.parse::<i32>()
{
inst_clone inst_clone
.lock() .lock()
.expect("Couldn't get Subscribers") .expect("Couldn't get Subscribers")
.publish(WindowManagerEvent::WorkspaceRemoved(id)); .publish(WindowManagerEvent::WorkspaceRemoved(id));
} }
}
}); });
let inst_clone = instance.clone(); let inst_clone = instance.clone();
@@ -159,11 +159,11 @@ impl BackendThread<WindowManagerEvent, ()> for HyprlandComms {
impl HyprlandComms { impl HyprlandComms {
fn monitor_id_from_workspace_id(id: WorkspaceId) -> Option<MonitorId> { fn monitor_id_from_workspace_id(id: WorkspaceId) -> Option<MonitorId> {
if let Ok(wss) = Workspaces::get() { if let Ok(wss) = Workspaces::get()
if let Some(ws) = wss.to_vec().iter().find(|ws| ws.id().unwrap() == id) { && let Some(ws) = wss.to_vec().iter().find(|ws| ws.id().unwrap() == id)
{
return ws.monitor_id; return ws.monitor_id;
} }
}
None None
} }

View File

@@ -1,3 +1,4 @@
use crate::LOGGER;
use glib::ControlFlow; use glib::ControlFlow;
use jmb_logger_rs::*; use jmb_logger_rs::*;
use notify::EventKind::{Create, Modify, Remove}; use notify::EventKind::{Create, Modify, Remove};
@@ -5,35 +6,30 @@ use notify::{RecommendedWatcher, RecursiveMode, Watcher};
use std::path::Path; use std::path::Path;
use std::sync::mpsc; use std::sync::mpsc;
use std::time::Duration; use std::time::Duration;
use crate::LOGGER;
pub fn parse_css() -> Option<String> { pub fn parse_css() -> Option<String> {
match grass::from_path( match grass::from_path("style/style.scss", &grass::Options::default()) {
"style/style.scss",
&grass::Options::default(),
) {
Ok(css) => { Ok(css) => {
debug!(&LOGGER, "(Re-)Loading CSS"); debug!(&LOGGER, "(Re-)Loading CSS");
Some(css) Some(css)
}, }
Err(err) => { Err(err) => {
error!(&LOGGER, "SCSS compilation failed: {err}"); error!(&LOGGER, "SCSS compilation failed: {err}");
None None
}, }
} }
} }
pub fn watch_css<F>(reload: F) -> RecommendedWatcher pub fn watch_css<F>(reload: F) -> RecommendedWatcher
where F: Fn(String) -> () + 'static { where
F: Fn(String) + 'static,
{
let (tx, rx) = mpsc::channel(); let (tx, rx) = mpsc::channel();
let mut watcher = notify::recommended_watcher(tx).unwrap(); let mut watcher = notify::recommended_watcher(tx).unwrap();
watcher watcher
.watch( .watch(Path::new("style"), RecursiveMode::Recursive)
Path::new("style"),
RecursiveMode::Recursive,
)
.unwrap(); .unwrap();
glib::timeout_add_local(Duration::from_millis(1000), move || { glib::timeout_add_local(Duration::from_millis(1000), move || {

View File

@@ -80,11 +80,7 @@ fn create_bar(
.expect("Tried taking unavailable Hyprland Channel Receiver"); .expect("Tried taking unavailable Hyprland Channel Receiver");
let player_opt = if let Ok(player_finder) = PlayerFinder::new() { let player_opt = if let Ok(player_finder) = PlayerFinder::new() {
if let Ok(player) = player_finder.find_active() { player_finder.find_active().ok()
Some(player)
} else {
None
}
} else { } else {
None None
}; };
@@ -105,21 +101,18 @@ fn create_bar(
window.set_anchor(Edge::Left, true); window.set_anchor(Edge::Left, true);
window.set_anchor(Edge::Right, true); window.set_anchor(Edge::Right, true);
window.set_margin(Edge::Top, 20); window.set_margin(Edge::Top, 20);
if let Some(monitor) = monitors.item(monitor_idx) { if let Some(monitor) = monitors.item(monitor_idx)
if let Ok(monitor) = monitor.downcast::<gdk::Monitor>() { && let Ok(monitor) = monitor.downcast::<gdk::Monitor>()
{
window.set_monitor(Some(&monitor)); window.set_monitor(Some(&monitor));
} }
}
window.set_exclusive_zone(30); window.set_exclusive_zone(30);
let mut buttons: HashMap<i32, Button> = HashMap::new(); let mut buttons: HashMap<i32, Button> = HashMap::new();
let (workspaces, submap) = workspaces_panel::build( let (workspaces, submap) = workspaces_panel::build(
&mut buttons, &mut buttons,
window window.monitor().and_then(|monitor| monitor_index(&monitor)),
.monitor()
.map(|monitor| monitor_index(&monitor))
.flatten(),
); );
let title_button: Option<Button>; let title_button: Option<Button>;
@@ -205,7 +198,7 @@ fn handle_wm_event(
for (&id, button) in buttons { for (&id, button) in buttons {
if id == workspace if id == workspace
&& current_monitor.as_ref().is_none_or(|cur_mon| { && current_monitor.as_ref().is_none_or(|cur_mon| {
monitor_index(&cur_mon).is_some_and(|idx| idx == monitor as u32) monitor_index(cur_mon).is_some_and(|idx| idx == monitor as u32)
}) })
{ {
button.set_visible(true); button.set_visible(true);

View File

@@ -136,8 +136,7 @@ impl ActionCentre {
glib::timeout_add_local(Duration::from_millis(100), move || { glib::timeout_add_local(Duration::from_millis(100), move || {
while let Ok(message) = net_rx.try_recv() { while let Ok(message) = net_rx.try_recv() {
match message { match message {
NetworkState::ChangeNetwork(info) => match info { NetworkState::ChangeNetwork(Some(info)) => {
Some(info) => {
for (name, widget) in wifi_networks_clone.borrow().iter() { for (name, widget) in wifi_networks_clone.borrow().iter() {
if name.eq(&info.name) { if name.eq(&info.name) {
widget.add_css_class("connected"); widget.add_css_class("connected");
@@ -146,24 +145,22 @@ impl ActionCentre {
} }
} }
} }
None => {}
},
NetworkState::Networks(networks) => { NetworkState::Networks(networks) => {
for network in &networks { for network in &networks {
let borrowed_wifi_networks_clone = wifi_networks_clone.borrow_mut(); let borrowed_wifi_networks_clone = wifi_networks_clone.borrow_mut();
let widget = borrowed_wifi_networks_clone.get(&network.name); let widget = borrowed_wifi_networks_clone.get(&network.name);
if widget.is_none() { if let Some(widget) = widget {
let idx = ((network.signal as f32 / 100.0)
* (WIFI_ICONS.len() - 1) as f32
+ 0.5) as usize;
widget.set_wifi_icon_from_name(WIFI_ICONS[idx]);
} else {
let widget = Self::create_wifi_widget( let widget = Self::create_wifi_widget(
&channels, &channels,
network, network,
borrowed_wifi_networks_clone, borrowed_wifi_networks_clone,
); );
content.append(&widget); content.append(&widget);
} else {
let idx = ((network.signal as f32 / 100.0)
* (WIFI_ICONS.len() - 1) as f32
+ 0.5) as usize;
widget.unwrap().set_wifi_icon_from_name(WIFI_ICONS[idx]);
} }
} }
let mut removal: Vec<String> = Vec::new(); let mut removal: Vec<String> = Vec::new();
@@ -179,7 +176,7 @@ impl ActionCentre {
} }
} }
NetworkState::Auth(ssid, auth) => { NetworkState::Auth(ssid, auth) => {
if let Some(widget) = Self::find_focused_widget((&window_clone).as_ref()) { if let Some(widget) = Self::find_focused_widget(window_clone.as_ref()) {
match auth { match auth {
AuthType::Password => { AuthType::Password => {
if widget.ssid().eq(&ssid) { if widget.ssid().eq(&ssid) {
@@ -268,7 +265,7 @@ impl ActionCentre {
wifi_networks: &Rc<RefCell<HashMap<String, WifiWidget>>>, wifi_networks: &Rc<RefCell<HashMap<String, WifiWidget>>>,
window: &ApplicationWindow, window: &ApplicationWindow,
) { ) {
for (_, widget) in wifi_networks.clone().borrow().iter() { for widget in wifi_networks.clone().borrow().values() {
let focused_inside = window.focus().is_some_and(|mut focus| { let focused_inside = window.focus().is_some_and(|mut focus| {
loop { loop {
if focus == *widget { if focus == *widget {
@@ -329,8 +326,6 @@ impl ActionCentre {
if !window.is_visible() { if !window.is_visible() {
self.animate_margin(-window.width() - 20, 20, ANIMATION_DURATION, || {}); self.animate_margin(-window.width() - 20, 20, ANIMATION_DURATION, || {});
window.present(); window.present();
} else {
return;
} }
} }

View File

@@ -17,23 +17,22 @@ pub fn build() -> Button {
title.set_visible(false); title.set_visible(false);
title.add_css_class("title"); title.add_css_class("title");
title.connect_clicked(|button| { title.connect_clicked(|button| {
if button.has_css_class("media") { if button.has_css_class("media")
if let Ok(player_finder) = PlayerFinder::new() { && let Ok(player_finder) = PlayerFinder::new()
if let Ok(player) = player_finder.find_active() { && let Ok(player) = player_finder.find_active()
{
let _ = player.play_pause(); let _ = player.play_pause();
} }
}
}
}); });
let right_click = GestureClick::new(); let right_click = GestureClick::new();
right_click.set_button(3); right_click.set_button(3);
right_click.connect_pressed(|_gesture, _n_press, _, _| { right_click.connect_pressed(|_gesture, _n_press, _, _| {
if let Ok(player_finder) = PlayerFinder::new() { if let Ok(player_finder) = PlayerFinder::new()
if let Ok(player) = player_finder.find_active() { && let Ok(player) = player_finder.find_active()
{
let _ = player.stop(); let _ = player.stop();
} }
}
}); });
title.add_controller(right_click); title.add_controller(right_click);
title title
@@ -41,14 +40,16 @@ pub fn build() -> Button {
pub fn manage_title(button_opt: &Option<Button>, player_opt: &Option<Player>) { pub fn manage_title(button_opt: &Option<Button>, player_opt: &Option<Player>) {
let mut handled = false; let mut handled = false;
if let Some(button) = button_opt { if let Some(button) = button_opt
if let Some(player) = player_opt { && let Some(player) = player_opt
if let Ok(status) = player.get_playback_status() { && let Ok(status) = player.get_playback_status()
if let Ok(metadata) = player.get_metadata() { && let Ok(metadata) = player.get_metadata()
{
match status { match status {
PlaybackStatus::Playing => { PlaybackStatus::Playing => {
button.set_visible(true); button.set_visible(true);
button.child() button
.child()
.and_downcast::<Label>() .and_downcast::<Label>()
.unwrap() .unwrap()
.set_label(&format!("{}", metadata.title().unwrap_or(""))); .set_label(&format!("{}", metadata.title().unwrap_or("")));
@@ -58,7 +59,8 @@ pub fn manage_title(button_opt: &Option<Button>, player_opt: &Option<Player>) {
} }
PlaybackStatus::Paused => { PlaybackStatus::Paused => {
button.set_visible(true); button.set_visible(true);
button.child() button
.child()
.and_downcast::<Label>() .and_downcast::<Label>()
.unwrap() .unwrap()
.set_label(&format!("{}", metadata.title().unwrap_or(""))); .set_label(&format!("{}", metadata.title().unwrap_or("")));
@@ -66,10 +68,7 @@ pub fn manage_title(button_opt: &Option<Button>, player_opt: &Option<Player>) {
button.remove_css_class("playing"); button.remove_css_class("playing");
handled = true; handled = true;
} }
PlaybackStatus::Stopped => {}, PlaybackStatus::Stopped => {}
}
}
}
} }
if !handled { if !handled {
button.set_visible(true); button.set_visible(true);
@@ -87,7 +86,8 @@ pub fn set_title(title: &str, title_button: &Option<Button>) {
} else { } else {
button.set_visible(true); button.set_visible(true);
} }
button.child() button
.child()
.and_downcast::<Label>() .and_downcast::<Label>()
.unwrap() .unwrap()
.set_label(&HyprlandComms::get_current_title()); .set_label(&HyprlandComms::get_current_title());

View File

@@ -148,7 +148,7 @@ pub fn build(
button.remove_css_class("on") button.remove_css_class("on")
} }
} else { } else {
if let Ok(_) = child.as_mut().unwrap().kill() { if child.as_mut().unwrap().kill().is_ok() {
let _ = child.take(); let _ = child.take();
button.add_css_class("on"); button.add_css_class("on");
} }
@@ -316,10 +316,9 @@ pub fn build(
glib::timeout_add_local(Duration::from_millis(1000), move || { glib::timeout_add_local(Duration::from_millis(1000), move || {
let timestamp = time_format::now().unwrap(); let timestamp = time_format::now().unwrap();
let time_str = time_format::strftime_local("%H:%M", timestamp).unwrap_or(String::new()); let time_str = time_format::strftime_local("%H:%M", timestamp).unwrap_or_default();
time.set_title(&time_str); time.set_title(&time_str);
let time_sec = let time_sec = time_format::strftime_local(":%S %Y-%m-%d", timestamp).unwrap_or_default();
time_format::strftime_local(":%S %Y-%m-%d", timestamp).unwrap_or(String::new());
time_hidden.set_label(&time_sec); time_hidden.set_label(&time_sec);
ControlFlow::Continue ControlFlow::Continue
}); });
@@ -332,8 +331,7 @@ pub fn build(
let hypridle = channels.hypridle(); let hypridle = channels.hypridle();
glib::timeout_add_local(Duration::from_millis(100), move || { glib::timeout_add_local(Duration::from_millis(100), move || {
while let Ok(command) = media_rx.try_recv() { while let Ok(command) = media_rx.try_recv() {
match command { if let MediaCommand::Cmd(vol, mute, bt) = command {
MediaCommand::Cmd(vol, mute, bt) => {
changed_progr.set(true); changed_progr.set(true);
volume.set_value(vol as f64); volume.set_value(vol as f64);
changed_progr.set(false); changed_progr.set(false);
@@ -355,25 +353,20 @@ pub fn build(
} }
volume.imp().second_icon.set_visible(bt); volume.imp().second_icon.set_visible(bt);
} }
_ => {}
}
} }
while let Ok(message) = br_rx.try_recv() { while let Ok(message) = br_rx.try_recv() {
match message { if let BrightnessMessage::Value(mon, value) = message
BrightnessMessage::Value(mon, value) => { && monitor.eq(&mon)
if monitor.eq(&mon) { {
brightness.set_value(value as f64); brightness.set_value(value as f64);
let idx = ((value as f32 / 100.0) * (BRIGHTNESS_ICONS.len() - 1) as f32 let idx =
+ 0.5) as usize; ((value as f32 / 100.0) * (BRIGHTNESS_ICONS.len() - 1) as f32 + 0.5) as usize;
brightness brightness
.imp() .imp()
.main_icon .main_icon
.set_font_icon(BRIGHTNESS_ICONS[idx]); .set_font_icon(BRIGHTNESS_ICONS[idx]);
} }
} }
_ => {}
}
}
if let Ok(mut hypridle) = hypridle.try_lock() { if let Ok(mut hypridle) = hypridle.try_lock() {
if hypridle.is_none() { if hypridle.is_none() {
caffeine_button.add_css_class("on"); caffeine_button.add_css_class("on");
@@ -416,8 +409,7 @@ pub fn build(
} }
} }
} }
NetworkState::VpnState { connected, profile } => match profile.as_str() { NetworkState::VpnState { connected, profile } if profile.as_str() == "wg" => {
"wg" => {
if connected { if connected {
wg_button.add_css_class("on"); wg_button.add_css_class("on");
} else { } else {
@@ -425,8 +417,6 @@ pub fn build(
} }
} }
_ => {} _ => {}
},
_ => {}
} }
} }
while let Ok(tailscale_state) = ts_rx.try_recv() { while let Ok(tailscale_state) = ts_rx.try_recv() {
@@ -468,9 +458,8 @@ pub fn build(
} }
} }
for gpu in stats.gpus { if let Some(gpu) = stats.gpus.into_iter().next() {
gpu_label.set_label(&format!("{}%", gpu.1)); gpu_label.set_label(&format!("{}%", gpu.1));
break;
} }
set_battery_css_classes(&battery_widget, stats.battery_state, stats.battery_charge); set_battery_css_classes(&battery_widget, stats.battery_state, stats.battery_charge);

View File

@@ -7,7 +7,10 @@ use hyprland::prelude::HyprDataActive;
use jmb_logger_rs::*; use jmb_logger_rs::*;
use std::collections::HashMap; use std::collections::HashMap;
pub(crate) fn build(buttons: &mut HashMap<i32, Button>, monitor: Option<u32>) -> (gtk::Box, Button) { pub(crate) fn build(
buttons: &mut HashMap<i32, Button>,
monitor: Option<u32>,
) -> (gtk::Box, Button) {
let workspaces = gtk::Box::new(Orientation::Horizontal, 0); let workspaces = gtk::Box::new(Orientation::Horizontal, 0);
workspaces.set_halign(Align::Start); workspaces.set_halign(Align::Start);
workspaces.set_valign(Align::Center); workspaces.set_valign(Align::Center);
@@ -24,13 +27,12 @@ pub(crate) fn build(buttons: &mut HashMap<i32, Button>, monitor: Option<u32>) ->
let initial_workspace = Workspace::get_active() let initial_workspace = Workspace::get_active()
.ok() .ok()
.map(|workspace| workspace.id().unwrap_or(1) as i32) .map(|workspace| workspace.id().unwrap_or(1))
.unwrap_or(1); .unwrap_or(1);
let is_active_ws_on_current_monitor = Workspace::get_active() let is_active_ws_on_current_monitor = Workspace::get_active()
.ok() .ok()
.map(|ws| ws.monitor_id) .and_then(|ws| ws.monitor_id)
.flatten()
.is_some_and(|id| monitor.is_some_and(|other_id| id == other_id as i128)); .is_some_and(|id| monitor.is_some_and(|other_id| id == other_id as i128));
if workspace == initial_workspace && is_active_ws_on_current_monitor { if workspace == initial_workspace && is_active_ws_on_current_monitor {
@@ -41,8 +43,14 @@ pub(crate) fn build(buttons: &mut HashMap<i32, Button>, monitor: Option<u32>) ->
button.set_visible(true); button.set_visible(true);
} }
button.connect_clicked(move |_button| { button.connect_clicked(move |_button| {
if let Err(err) = HyprlandComms::dispatch(&format!("hl.dsp.focus({{ workspace = {workspace} }})")) { if let Err(err) =
warn!(&LOGGER, "Couldn't change workspace focus {}", err.to_string()); HyprlandComms::dispatch(&format!("hl.dsp.focus({{ workspace = {workspace} }})"))
{
warn!(
&LOGGER,
"Couldn't change workspace focus {}",
err.to_string()
);
} }
}); });
workspaces.append(&button); workspaces.append(&button);