aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-05-08 08:28:47 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-05-08 08:30:49 +0400
commitc61940c40eff7a4b2a237429e0ff2c352c41d68d (patch)
tree5fbf0e4c897ef01af4f4e8965119e59ddca665d5 /src
parented2b6d3894d115ac82c4d3e36ee0083e797d48da (diff)
downloadniri-c61940c40eff7a4b2a237429e0ff2c352c41d68d.tar.gz
niri-c61940c40eff7a4b2a237429e0ff2c352c41d68d.tar.bz2
niri-c61940c40eff7a4b2a237429e0ff2c352c41d68d.zip
ipc: Wait until action is processed before returning
Diffstat (limited to 'src')
-rw-r--r--src/ipc/server.rs15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/ipc/server.rs b/src/ipc/server.rs
index 534fb072..5c3f27e6 100644
--- a/src/ipc/server.rs
+++ b/src/ipc/server.rs
@@ -120,7 +120,10 @@ async fn handle_client(ctx: ClientCtx, stream: Async<'_, UnixStream>) -> anyhow:
.map_err(|err| err.to_string());
let requested_error = matches!(request, Ok(Request::ReturnError));
- let reply = request.and_then(|request| process(&ctx, request));
+ let reply = match request {
+ Ok(request) => process(&ctx, request).await,
+ Err(err) => Err(err),
+ };
if let Err(err) = &reply {
if !requested_error {
@@ -134,7 +137,7 @@ async fn handle_client(ctx: ClientCtx, stream: Async<'_, UnixStream>) -> anyhow:
Ok(())
}
-fn process(ctx: &ClientCtx, request: Request) -> Reply {
+async fn process(ctx: &ClientCtx, request: Request) -> Reply {
let response = match request {
Request::ReturnError => return Err(String::from("example compositor error")),
Request::Version => Response::Version(version()),
@@ -163,10 +166,18 @@ fn process(ctx: &ClientCtx, request: Request) -> Reply {
Response::FocusedWindow(window)
}
Request::Action(action) => {
+ let (tx, rx) = async_channel::bounded(1);
+
let action = niri_config::Action::from(action);
ctx.event_loop.insert_idle(move |state| {
state.do_action(action, false);
+ let _ = tx.send_blocking(());
});
+
+ // Wait until the action has been processed before returning. This is important for a
+ // few actions, for instance for DoScreenTransition this wait ensures that the screen
+ // contents were sampled into the texture.
+ let _ = rx.recv().await;
Response::Handled
}
Request::Output { output, action } => {