aboutsummaryrefslogtreecommitdiff
path: root/src/ipc/client.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-06-20 12:04:10 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2024-09-01 23:47:19 -0700
commit30b213601a4f71d65a2227fa68ffb1ab2a69f671 (patch)
treee68d9db212c6a4ac610ec0f80bb3e5db83950a67 /src/ipc/client.rs
parent8eb34b2e185aa0e0affea450226369cd3f9e6a78 (diff)
downloadniri-30b213601a4f71d65a2227fa68ffb1ab2a69f671.tar.gz
niri-30b213601a4f71d65a2227fa68ffb1ab2a69f671.tar.bz2
niri-30b213601a4f71d65a2227fa68ffb1ab2a69f671.zip
Implement the event stream IPC
Diffstat (limited to 'src/ipc/client.rs')
-rw-r--r--src/ipc/client.rs64
1 files changed, 61 insertions, 3 deletions
diff --git a/src/ipc/client.rs b/src/ipc/client.rs
index e9312933..ea6121dc 100644
--- a/src/ipc/client.rs
+++ b/src/ipc/client.rs
@@ -1,7 +1,7 @@
use anyhow::{anyhow, bail, Context};
use niri_ipc::{
- KeyboardLayouts, LogicalOutput, Mode, Output, OutputConfigChanged, Request, Response, Socket,
- Transform,
+ Event, KeyboardLayouts, LogicalOutput, Mode, Output, OutputConfigChanged, Request, Response,
+ Socket, Transform,
};
use serde_json::json;
@@ -21,12 +21,13 @@ pub fn handle_msg(msg: Msg, json: bool) -> anyhow::Result<()> {
},
Msg::Workspaces => Request::Workspaces,
Msg::KeyboardLayouts => Request::KeyboardLayouts,
+ Msg::EventStream => Request::EventStream,
Msg::RequestError => Request::ReturnError,
};
let socket = Socket::connect().context("error connecting to the niri socket")?;
- let reply = socket
+ let (reply, mut read_event) = socket
.send(request)
.context("error communicating with niri")?;
@@ -37,6 +38,7 @@ pub fn handle_msg(msg: Msg, json: bool) -> anyhow::Result<()> {
Socket::connect()
.and_then(|socket| socket.send(Request::Version))
.ok()
+ .map(|(reply, _read_event)| reply)
}
_ => None,
};
@@ -261,6 +263,62 @@ pub fn handle_msg(msg: Msg, json: bool) -> anyhow::Result<()> {
println!("{is_active}{idx} {name}");
}
}
+ Msg::EventStream => {
+ let Response::Handled = response else {
+ bail!("unexpected response: expected Handled, got {response:?}");
+ };
+
+ if !json {
+ println!("Started reading events.");
+ }
+
+ loop {
+ let event = read_event().context("error reading event from niri")?;
+
+ if json {
+ let event = serde_json::to_string(&event).context("error formatting event")?;
+ println!("{event}");
+ continue;
+ }
+
+ match event {
+ Event::WorkspacesChanged { workspaces } => {
+ println!("Workspaces changed: {workspaces:?}");
+ }
+ Event::WorkspaceActivated { id, focused } => {
+ let word = if focused { "focused" } else { "activated" };
+ println!("Workspace {word}: {id}");
+ }
+ Event::WorkspaceActiveWindowChanged {
+ workspace_id,
+ active_window_id,
+ } => {
+ println!(
+ "Workspace {workspace_id}: \
+ active window changed to {active_window_id:?}"
+ );
+ }
+ Event::WindowsChanged { windows } => {
+ println!("Windows changed: {windows:?}");
+ }
+ Event::WindowOpenedOrChanged { window } => {
+ println!("Window opened or changed: {window:?}");
+ }
+ Event::WindowClosed { id } => {
+ println!("Window closed: {id}");
+ }
+ Event::WindowFocusChanged { id } => {
+ println!("Window focus changed: {id:?}");
+ }
+ Event::KeyboardLayoutsChanged { keyboard_layouts } => {
+ println!("Keyboard layouts changed: {keyboard_layouts:?}");
+ }
+ Event::KeyboardLayoutSwitched { idx } => {
+ println!("Keyboard layout switched: {idx}");
+ }
+ }
+ }
+ }
}
Ok(())