aboutsummaryrefslogtreecommitdiff
path: root/src/ipc/client.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipc/client.rs')
-rw-r--r--src/ipc/client.rs40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/ipc/client.rs b/src/ipc/client.rs
index ea6121dc..0f4d6228 100644
--- a/src/ipc/client.rs
+++ b/src/ipc/client.rs
@@ -20,6 +20,7 @@ pub fn handle_msg(msg: Msg, json: bool) -> anyhow::Result<()> {
action: action.clone(),
},
Msg::Workspaces => Request::Workspaces,
+ Msg::Windows => Request::Windows,
Msg::KeyboardLayouts => Request::KeyboardLayouts,
Msg::EventStream => Request::EventStream,
Msg::RequestError => Request::ReturnError,
@@ -155,6 +156,45 @@ pub fn handle_msg(msg: Msg, json: bool) -> anyhow::Result<()> {
println!("No window is focused.");
}
}
+ Msg::Windows => {
+ let Response::Windows(mut windows) = response else {
+ bail!("unexpected response: expected Windows, got {response:?}");
+ };
+
+ if json {
+ let windows =
+ serde_json::to_string(&windows).context("error formatting response")?;
+ println!("{windows}");
+ return Ok(());
+ }
+
+ windows.sort_unstable_by(|a, b| a.id.cmp(&b.id));
+
+ for window in windows {
+ let focused = if window.is_focused { " (focused)" } else { "" };
+ println!("Window ID {}:{focused}", window.id);
+
+ if let Some(title) = window.title {
+ println!(" Title: \"{title}\"");
+ } else {
+ println!(" Title: (unset)");
+ }
+
+ if let Some(app_id) = window.app_id {
+ println!(" App ID: \"{app_id}\"");
+ } else {
+ println!(" App ID: (unset)");
+ }
+
+ if let Some(workspace_id) = window.workspace_id {
+ println!(" Workspace ID: {workspace_id}");
+ } else {
+ println!(" Workspace ID: (none)");
+ }
+
+ println!();
+ }
+ }
Msg::FocusedOutput => {
let Response::FocusedOutput(output) = response else {
bail!("unexpected response: expected FocusedOutput, got {response:?}");