aboutsummaryrefslogtreecommitdiff
path: root/src/ipc
diff options
context:
space:
mode:
authorCharlie Le <20309750+CharlieQLe@users.noreply.github.com>2025-05-09 11:01:01 -0400
committerGitHub <noreply@github.com>2025-05-09 18:01:01 +0300
commit3cc67897afeabe6e0b1a6d035fde6f81010372d1 (patch)
treec9cbf0f465885460700bfa2de1f3a57bda3f0055 /src/ipc
parenta99489c6c0e2ccf27825fd8ed1b68466c1eebb24 (diff)
downloadniri-3cc67897afeabe6e0b1a6d035fde6f81010372d1.tar.gz
niri-3cc67897afeabe6e0b1a6d035fde6f81010372d1.tar.bz2
niri-3cc67897afeabe6e0b1a6d035fde6f81010372d1.zip
Implement IPC for the overview state (#1526)
* Implement IPC for the overview state * Update Overview IPC to maintain naming consistency, renamed OverviewToggled to be more clear, simplify overview state request on the server, consolidate ipc refresh * Fix Overview is_open in IPC client * Change opened to is_open * Update niri-ipc/src/lib.rs Co-authored-by: Ivan Molodetskikh <yalterz@gmail.com> * Update niri-ipc/src/state.rs Co-authored-by: Ivan Molodetskikh <yalterz@gmail.com> * Update src/ipc/client.rs Co-authored-by: Ivan Molodetskikh <yalterz@gmail.com> * Update src/ipc/client.rs Co-authored-by: Ivan Molodetskikh <yalterz@gmail.com> * Add overview state to EventStreamStatePart replicate and apply * Fix formatting * Rename Overview to OverviewState --------- Co-authored-by: Ivan Molodetskikh <yalterz@gmail.com>
Diffstat (limited to 'src/ipc')
-rw-r--r--src/ipc/client.rs27
-rw-r--r--src/ipc/server.rs28
2 files changed, 52 insertions, 3 deletions
diff --git a/src/ipc/client.rs b/src/ipc/client.rs
index d4165733..6f969703 100644
--- a/src/ipc/client.rs
+++ b/src/ipc/client.rs
@@ -5,8 +5,8 @@ use anyhow::{anyhow, bail, Context};
use niri_config::OutputName;
use niri_ipc::socket::Socket;
use niri_ipc::{
- Event, KeyboardLayouts, LogicalOutput, Mode, Output, OutputConfigChanged, Request, Response,
- Transform, Window,
+ Event, KeyboardLayouts, LogicalOutput, Mode, Output, OutputConfigChanged, Overview, Request,
+ Response, Transform, Window,
};
use serde_json::json;
@@ -32,6 +32,7 @@ pub fn handle_msg(msg: Msg, json: bool) -> anyhow::Result<()> {
Msg::KeyboardLayouts => Request::KeyboardLayouts,
Msg::EventStream => Request::EventStream,
Msg::RequestError => Request::ReturnError,
+ Msg::OverviewState => Request::OverviewState,
};
let socket = Socket::connect().context("error connecting to the niri socket")?;
@@ -435,9 +436,31 @@ pub fn handle_msg(msg: Msg, json: bool) -> anyhow::Result<()> {
Event::KeyboardLayoutSwitched { idx } => {
println!("Keyboard layout switched: {idx}");
}
+ Event::OverviewOpenedOrClosed { is_open: opened } => {
+ println!("Overview toggled: {opened}");
+ }
}
}
}
+ Msg::OverviewState => {
+ let Response::OverviewState(response) = response else {
+ bail!("unexpected response: expected Overview, got {response:?}");
+ };
+
+ if json {
+ let response =
+ serde_json::to_string(&response).context("error formatting response")?;
+ println!("{response}");
+ return Ok(());
+ }
+
+ let Overview { is_open } = response;
+ if is_open {
+ println!("Overview is open.");
+ } else {
+ println!("Overview is closed.");
+ }
+ }
}
Ok(())
diff --git a/src/ipc/server.rs b/src/ipc/server.rs
index 2c948cac..06ff0fd1 100644
--- a/src/ipc/server.rs
+++ b/src/ipc/server.rs
@@ -16,7 +16,9 @@ use futures_util::io::{AsyncReadExt, BufReader};
use futures_util::{select_biased, AsyncBufReadExt, AsyncWrite, AsyncWriteExt, FutureExt as _};
use niri_config::OutputName;
use niri_ipc::state::{EventStreamState, EventStreamStatePart as _};
-use niri_ipc::{Event, KeyboardLayouts, OutputConfigChanged, Reply, Request, Response, Workspace};
+use niri_ipc::{
+ Event, KeyboardLayouts, OutputConfigChanged, Overview, Reply, Request, Response, Workspace,
+};
use smithay::desktop::layer_map_for_output;
use smithay::input::pointer::{
CursorIcon, CursorImageStatus, Focus, GrabStartData as PointerGrabStartData,
@@ -428,6 +430,11 @@ async fn process(ctx: &ClientCtx, request: Request) -> Reply {
Response::FocusedOutput(output)
}
Request::EventStream => Response::Handled,
+ Request::OverviewState => {
+ let state = ctx.event_stream_state.borrow();
+ let is_open = state.overview.is_open;
+ Response::OverviewState(Overview { is_open })
+ }
};
Ok(response)
@@ -524,6 +531,7 @@ impl State {
pub fn ipc_refresh_layout(&mut self) {
self.ipc_refresh_workspaces();
self.ipc_refresh_windows();
+ self.ipc_refresh_overview();
}
fn ipc_refresh_workspaces(&mut self) {
@@ -690,4 +698,22 @@ impl State {
server.send_event(event);
}
}
+
+ pub fn ipc_refresh_overview(&mut self) {
+ let Some(server) = &self.niri.ipc_server else {
+ return;
+ };
+
+ let mut state = server.event_stream_state.borrow_mut();
+ let state = &mut state.overview;
+ let is_open = self.niri.layout.is_overview_open();
+
+ if state.is_open == is_open {
+ return;
+ }
+
+ let event = Event::OverviewOpenedOrClosed { is_open };
+ state.apply(event.clone());
+ server.send_event(event);
+ }
}