diff --git a/src/cli.rs b/src/cli.rs index 3e6f0651..303fe29c 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -7,6 +7,7 @@ mod generate; mod idle; mod input; mod log; +mod pid; mod quit; mod randr; mod reexec; @@ -98,6 +99,8 @@ pub enum Cmd { Tree(TreeArgs), /// Prints the Jay version and exits. Version, + /// Prints the Jay PID and exits. + Pid, #[cfg(feature = "it")] RunTests, } @@ -236,6 +239,7 @@ pub fn main() { Cmd::Clients(a) => clients::main(cli.global, a), Cmd::Tree(a) => tree::main(cli.global, a), Cmd::Version => version::main(cli.global), + Cmd::Pid => pid::main(cli.global), #[cfg(feature = "it")] Cmd::RunTests => crate::it::run_tests(), Cmd::Reexec(a) => reexec::main(cli.global, a), diff --git a/src/cli/pid.rs b/src/cli/pid.rs new file mode 100644 index 00000000..ce75262f --- /dev/null +++ b/src/cli/pid.rs @@ -0,0 +1,29 @@ +use { + crate::{ + cli::GlobalArgs, + tools::tool_client::{Handle, ToolClient, with_tool_client}, + wire::jay_compositor::{GetPid, Pid}, + }, + std::rc::Rc, +}; + +pub fn main(global: GlobalArgs) { + with_tool_client(global.log_level, |tc| async move { + let pid = Rc::new(P { tc: tc.clone() }); + run(pid).await; + }); +} + +struct P { + tc: Rc, +} + +async fn run(p: Rc

) { + let tc = &p.tc; + let comp = tc.jay_compositor().await; + tc.send(GetPid { self_id: comp }); + Pid::handle(tc, comp, (), |_, pid| { + println!("{}", pid.pid); + }); + tc.round_trip().await; +} diff --git a/src/ifs/jay_compositor.rs b/src/ifs/jay_compositor.rs index 443a944d..d0f8c3d4 100644 --- a/src/ifs/jay_compositor.rs +++ b/src/ifs/jay_compositor.rs @@ -77,7 +77,7 @@ global_base!(JayCompositorGlobal, JayCompositor, JayCompositorError); impl Global for JayCompositorGlobal { fn version(&self) -> u32 { - 26 + 27 } fn required_caps(&self) -> ClientCaps { @@ -533,6 +533,14 @@ impl JayCompositorRequestHandler for JayCompositor { self.client.add_client_obj(&obj)?; Ok(()) } + + fn get_pid(&self, _req: GetPid, _slf: &Rc) -> Result<(), Self::Error> { + self.client.event(Pid { + self_id: self.id, + pid: self.client.state.pid, + }); + Ok(()) + } } object_base! { diff --git a/src/state.rs b/src/state.rs index 2d624d5b..652f50a0 100644 --- a/src/state.rs +++ b/src/state.rs @@ -149,7 +149,6 @@ use { }; pub struct State { - #[expect(dead_code)] pub pid: c::pid_t, pub kb_ctx: KbvmContext, pub backend: CloneCell>, diff --git a/src/tools/tool_client.rs b/src/tools/tool_client.rs index a4242a89..3464fed8 100644 --- a/src/tools/tool_client.rs +++ b/src/tools/tool_client.rs @@ -334,7 +334,7 @@ impl ToolClient { self_id: s.registry, name: s.jay_compositor.0, interface: JayCompositor.name(), - version: s.jay_compositor.1.min(25), + version: s.jay_compositor.1.min(27), id: id.into(), }); self.jay_compositor.set(Some(id)); diff --git a/src/wl_usr/usr_ifs/usr_jay_compositor.rs b/src/wl_usr/usr_ifs/usr_jay_compositor.rs index 8ad821ec..3d0a7287 100644 --- a/src/wl_usr/usr_ifs/usr_jay_compositor.rs +++ b/src/wl_usr/usr_ifs/usr_jay_compositor.rs @@ -234,6 +234,10 @@ impl JayCompositorEventHandler for UsrJayCompositor { } Ok(()) } + + fn pid(&self, _ev: Pid, _slf: &Rc) -> Result<(), Self::Error> { + Ok(()) + } } usr_object_base! { diff --git a/wire/jay_compositor.txt b/wire/jay_compositor.txt index 23b200d0..019f9ea3 100644 --- a/wire/jay_compositor.txt +++ b/wire/jay_compositor.txt @@ -131,6 +131,10 @@ request get_sync_file_surface (since = 26) { surface: id(wl_surface), } +request get_pid (since = 27) { + +} + # events event client_id { @@ -145,3 +149,7 @@ event seat { event capabilities { cap: array(pod(u16)), } + +event pid (since = 27) { + pid: pod(uapi::c::pid_t), +}