diff --git a/Cargo.lock b/Cargo.lock index ebfd75c..5227abe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -109,6 +109,15 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +[[package]] +name = "bar-ws-monitor" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "swayipc", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -782,6 +791,38 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "serde" +version = "1.0.209" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.209" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + [[package]] name = "signal-hook" version = "0.3.17" @@ -862,6 +903,28 @@ dependencies = [ "syn", ] +[[package]] +name = "swayipc" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daa5d19f881f372e225095e297072e2e3ee1c4e9e3a46cafe5f5cf70f1313f29" +dependencies = [ + "serde", + "serde_json", + "swayipc-types", +] + +[[package]] +name = "swayipc-types" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e487a656336f74341c70a73a289f68d9ba3cab579ba776352ea0c6cdf603fcda" +dependencies = [ + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "syn" version = "2.0.60" diff --git a/Cargo.toml b/Cargo.toml index e35ff11..7d9f635 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] resolver = "2" -members = [ +members = [ "programs/bar-ws-monitor", "programs/jrnl" ] diff --git a/modules/desktop-environment/home/panels/eww/configDir/bottomBar/bottomBar.yuck b/modules/desktop-environment/home/panels/eww/configDir/bottomBar/bottomBar.yuck index 2a2da02..68c8a9f 100644 --- a/modules/desktop-environment/home/panels/eww/configDir/bottomBar/bottomBar.yuck +++ b/modules/desktop-environment/home/panels/eww/configDir/bottomBar/bottomBar.yuck @@ -15,7 +15,7 @@ (centerbox (box :halign "start" - (label :text "left") + (workspaceWidget) ) (box :halign "center" @@ -39,3 +39,19 @@ ) ) ) + +(defwidget workspaceWidget [] + (box + :class "workspaces" + (for workspace in workspaces + (button + (label :markup "${workspace.name}") + ) + ) + ) +) + +(deflisten workspaces + :initial "[]" + "bar-ws-monitor" +) diff --git a/modules/desktop-environment/home/panels/eww/configDir/scripts/workspaces.nu b/modules/desktop-environment/home/panels/eww/configDir/scripts/workspaces.nu deleted file mode 100644 index 6e72651..0000000 --- a/modules/desktop-environment/home/panels/eww/configDir/scripts/workspaces.nu +++ /dev/null @@ -1,3 +0,0 @@ -def main [] { - mut workspaces = waymsg -rt get_workspaces | from json | select name focused urgent; -} diff --git a/modules/desktop-environment/home/sway/default.nix b/modules/desktop-environment/home/sway/default.nix index 781b6c4..2522cc6 100644 --- a/modules/desktop-environment/home/sway/default.nix +++ b/modules/desktop-environment/home/sway/default.nix @@ -26,22 +26,6 @@ ]; }; - programs.waybar = { - enable = true; - systemd = { - enable = true; - target = "sway-session.target"; - }; - settings = { - interactiveBar = { - layer = "top"; - position = "bottom"; - modules-left = ["sway/workspaces" "sway/mode"]; - modules-right = ["wlr/taskbar"]; - }; - }; - }; - wayland.windowManager.sway = { enable = true; systemd = { @@ -80,7 +64,7 @@ }; startup = [ { - command = "eww open topBar"; + command = "eww open topBar; eww open bottomBar"; } { command = "pkill nm-applet; sleep 1 && nm-applet"; diff --git a/programs/bar-ws-monitor/Cargo.toml b/programs/bar-ws-monitor/Cargo.toml new file mode 100644 index 0000000..5c1a1f6 --- /dev/null +++ b/programs/bar-ws-monitor/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "bar-ws-monitor" +version = "0.1.0" +edition = "2021" + +[dependencies] +serde = { version = "1.0.209", features = [ "derive" ] } +serde_json = "1.0.127" +swayipc = "3.0.2" diff --git a/programs/bar-ws-monitor/src/main.rs b/programs/bar-ws-monitor/src/main.rs new file mode 100644 index 0000000..b911272 --- /dev/null +++ b/programs/bar-ws-monitor/src/main.rs @@ -0,0 +1,53 @@ +use core::panic; + +use serde::Serialize; +use swayipc::{Connection, Event, EventType, Fallible, Workspace, WorkspaceChange}; + +fn main() -> Fallible<()> { + let mut con = Connection::new()?; + let mut workspaces: Vec = con + .get_workspaces()? + .into_iter() + .map(|ws| ws.into()) + .collect(); + println!("{}", serde_json::ser::to_string(&workspaces).unwrap()); + + for ev in con.subscribe([EventType::Workspace])? { + // the lazy/ugly solution! + // we create a new connection and request workspaces again and again and again + // TODO: properly handle events one by one + let mut con = Connection::new()?; + workspaces = con + .get_workspaces()? + .into_iter() + .map(|ws| ws.into()) + .collect(); + println!("{}", serde_json::ser::to_string(&workspaces).unwrap()); + } + + Ok(()) +} + +#[derive(Debug, Serialize)] +struct WsData { + name: String, + focused: bool, + urgent: bool, +} + +impl From for WsData { + fn from( + Workspace { + name, + focused, + urgent, + .. + }: Workspace, + ) -> Self { + WsData { + name, + focused, + urgent, + } + } +}