aboutsummaryrefslogtreecommitdiff
path: root/niri-ipc/src/socket.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 /niri-ipc/src/socket.rs
parent8eb34b2e185aa0e0affea450226369cd3f9e6a78 (diff)
downloadniri-30b213601a4f71d65a2227fa68ffb1ab2a69f671.tar.gz
niri-30b213601a4f71d65a2227fa68ffb1ab2a69f671.tar.bz2
niri-30b213601a4f71d65a2227fa68ffb1ab2a69f671.zip
Implement the event stream IPC
Diffstat (limited to 'niri-ipc/src/socket.rs')
-rw-r--r--niri-ipc/src/socket.rs18
1 files changed, 15 insertions, 3 deletions
diff --git a/niri-ipc/src/socket.rs b/niri-ipc/src/socket.rs
index 3964f000..d629f1a4 100644
--- a/niri-ipc/src/socket.rs
+++ b/niri-ipc/src/socket.rs
@@ -6,7 +6,7 @@ use std::net::Shutdown;
use std::os::unix::net::UnixStream;
use std::path::Path;
-use crate::{Reply, Request};
+use crate::{Event, Reply, Request};
/// Name of the environment variable containing the niri IPC socket path.
pub const SOCKET_PATH_ENV: &str = "NIRI_SOCKET";
@@ -47,7 +47,11 @@ impl Socket {
/// * `Ok(Ok(response))`: successful [`Response`](crate::Response) from niri
/// * `Ok(Err(message))`: error message from niri
/// * `Err(error)`: error communicating with niri
- pub fn send(self, request: Request) -> io::Result<Reply> {
+ ///
+ /// This method also returns a blocking function that you can call to keep reading [`Event`]s
+ /// after requesting an [`EventStream`][Request::EventStream]. This function is not useful
+ /// otherwise.
+ pub fn send(self, request: Request) -> io::Result<(Reply, impl FnMut() -> io::Result<Event>)> {
let Self { mut stream } = self;
let mut buf = serde_json::to_string(&request).unwrap();
@@ -60,6 +64,14 @@ impl Socket {
reader.read_line(&mut buf)?;
let reply = serde_json::from_str(&buf)?;
- Ok(reply)
+
+ let events = move || {
+ buf.clear();
+ reader.read_line(&mut buf)?;
+ let event = serde_json::from_str(&buf)?;
+ Ok(event)
+ };
+
+ Ok((reply, events))
}
}