From d0dc55349c915074b1e2d17f3d52cc605fd0f9bf Mon Sep 17 00:00:00 2001 From: Samuel Onoja Date: Fri, 25 Sep 2026 04:15:48 +0100 Subject: [PATCH] feat: expose layout controls over IPC --- README.md | 3 ++- compositor/src/ipc.rs | 5 +++++ docs/ferese-window-manager-spec.md | 5 ++++- feresectl/src/main.rs | 9 +++++++-- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 61c76ea..c2c7cfd 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,8 @@ cargo run -p feresectl -- get-workspaces ``` The v0 IPC slice also supports `move`, `resize`, `move-to-workspace`, -`toggle-floating`, `toggle-fullscreen`, `close`, `get-focused-window`, and +`toggle-floating`, `toggle-fullscreen`, `toggle-layout`, `cycle-column-width`, +`center-column`, `consume`, `expel`, `close`, `get-focused-window`, and `get-outputs`. Requests use versioned, 1 MiB-limited length-prefixed JSON. The runtime directory and socket are restricted to modes `0700` and `0600`, and the server rejects peers whose effective UID differs from the compositor's. diff --git a/compositor/src/ipc.rs b/compositor/src/ipc.rs index 0bc04e0..a436233 100644 --- a/compositor/src/ipc.rs +++ b/compositor/src/ipc.rs @@ -172,6 +172,11 @@ impl Ferese { "move-to-workspace" => self.move_focused_to_workspace(workspace_arg(args)?), "toggle-floating" => self.toggle_focused_floating(), "toggle-fullscreen" => self.toggle_focused_fullscreen(), + "toggle-layout" => self.toggle_layout_mode(), + "cycle-column-width" => self.cycle_focused_column_width(), + "center-column" => self.center_focused_column(), + "consume" => self.consume_focused_window(), + "expel" => self.expel_focused_window(), "close" => self.close_focused_window(), "get-focused-window" => return Ok(self.focused_window_json()), "get-workspaces" => return Ok(self.workspaces_json()), diff --git a/docs/ferese-window-manager-spec.md b/docs/ferese-window-manager-spec.md index 3258c47..f100053 100644 --- a/docs/ferese-window-manager-spec.md +++ b/docs/ferese-window-manager-spec.md @@ -1311,7 +1311,10 @@ User-control commands are: focus move resize workspace move-to-workspace toggle-floating -toggle-fullscreen close +toggle-fullscreen toggle-layout +cycle-column-width center-column +consume expel +close reload-config get-focused-window get-workspaces get-outputs get-config set-config diff --git a/feresectl/src/main.rs b/feresectl/src/main.rs index 6f43d56..eb87a76 100644 --- a/feresectl/src/main.rs +++ b/feresectl/src/main.rs @@ -47,7 +47,8 @@ fn parse_args(args: impl IntoIterator) -> Result<(String, Value), .map_err(|_| format!("{} requires a positive workspace index", command))?; json!({ "index": index }) } - "toggle-floating" | "toggle-fullscreen" | "close" | "get-focused-window" + "toggle-floating" | "toggle-fullscreen" | "toggle-layout" | "cycle-column-width" + | "center-column" | "consume" | "expel" | "close" | "get-focused-window" | "get-workspaces" | "get-outputs" => { if !positional.is_empty() { return Err(format!("{command} does not accept arguments")); @@ -77,7 +78,7 @@ fn socket_path() -> Result { } fn usage() -> String { - "usage: feresectl \n feresectl \n feresectl ".to_owned() + "usage: feresectl \n feresectl \n feresectl \n feresectl \n feresectl ".to_owned() } #[cfg(test)] @@ -98,6 +99,10 @@ mod tests { .1, json!({ "index": 7 }) ); + assert_eq!( + parse_args(["cycle-column-width".to_owned()]).unwrap(), + ("cycle-column-width".to_owned(), json!({})) + ); } #[test]