From 5034e0fc24d21bbfd3eab49a0f1de297d3c7e80f Mon Sep 17 00:00:00 2001 From: chlorospingus Date: Fri, 25 Apr 2025 01:45:10 -0700 Subject: [PATCH] Commit wl_surface, receive and ack configure on layer_surface --- src/layer_shell.rs | 33 ++++++++++++++++++++++++++++++--- src/surface.rs | 19 +++++++++++++++++++ src/wl_client.rs | 3 +++ src/wl_registry.rs | 6 +++++- 4 files changed, 57 insertions(+), 4 deletions(-) diff --git a/src/layer_shell.rs b/src/layer_shell.rs index 2330839..b697f7b 100644 --- a/src/layer_shell.rs +++ b/src/layer_shell.rs @@ -31,10 +31,37 @@ impl WlClient { Ok(()) } + pub fn layer_surface_configure(&mut self, event: &Vec) -> Result<(), Box> { + let mut offset: usize = 0; + let serial = event.read_u32(&mut offset); + let width = event.read_u32(&mut offset); + let height = event.read_u32(&mut offset); + + // TODO: Resize based on configure + + // Ack configure + let object = self.layer_surface_id.unwrap(); + const OPCODE: u16 = 6; + const MSG_SIZE: u16 = 12; + + let mut request = vec![0u8; MSG_SIZE as usize]; + offset = 0; + + request.write_u32(&object, &mut offset); + request.write_u16(&OPCODE, &mut offset); + request.write_u16(&MSG_SIZE, &mut offset); + + request.write_u32(&serial, &mut offset); + + self.socket.write(&request)?; + + Ok(()) + } + pub fn layer_surface_set_size(&mut self, width: u32, height: u32) -> Result<(), Box> { let object: u32 = self.layer_surface_id.unwrap(); const OPCODE: u16 = 0; - const MSG_SIZE: u16 = 16; + const MSG_SIZE: u16 = 20; let mut request = vec![0u8; MSG_SIZE as usize]; let mut offset: usize = 0; @@ -43,8 +70,8 @@ impl WlClient { request.write_u16(&OPCODE, &mut offset); request.write_u16(&MSG_SIZE, &mut offset); - request.write_u32(&width, &mut offset); - request.write_u32(&height, &mut offset); + request.write_u32(&width, &mut offset); + request.write_u32(&height, &mut offset); self.socket.write(&request)?; diff --git a/src/surface.rs b/src/surface.rs index 2ab7ade..d8d1af7 100644 --- a/src/surface.rs +++ b/src/surface.rs @@ -48,6 +48,7 @@ impl WlClient { let object = self.surface_id.unwrap(); const OPCODE: u16 = 1; const MSG_SIZE: u16 = 20; + let buffer = self.buffer_id.unwrap(); const X: u32 = 0; const Y: u32 = 0; @@ -57,6 +58,7 @@ impl WlClient { request.write_u32(&object, &mut offset); request.write_u16(&OPCODE, &mut offset); request.write_u16(&MSG_SIZE, &mut offset); + request.write_u32(&buffer, &mut offset); request.write_u32(&X, &mut offset); request.write_u32(&Y, &mut offset); @@ -65,6 +67,23 @@ impl WlClient { Ok(()) } + pub fn wl_surface_commit(&mut self) -> Result<(), Box> { + let object = self.surface_id.unwrap(); + const OPCODE: u16 = 6; + const MSG_SIZE: u16 = 8; + + let mut request = vec![0u8; MSG_SIZE as usize]; + let mut offset: usize = 0; + + request.write_u32(&object, &mut offset); + request.write_u16(&OPCODE, &mut offset); + request.write_u16(&MSG_SIZE, &mut offset); + + self.socket.write(&request)?; + + Ok(()) + } + pub fn xdg_wm_base_pong(&mut self, event: &Vec) -> Result<(), Box> { if self.xdg_wm_base_id.is_none() { return Err(Box::new(UnsetErr("xdg_wm_base_id".to_string()))); diff --git a/src/wl_client.rs b/src/wl_client.rs index d8fa554..86a15fc 100644 --- a/src/wl_client.rs +++ b/src/wl_client.rs @@ -74,6 +74,9 @@ impl WlClient { else if self.xdg_wm_base_id.is_some() && header.object == self.xdg_wm_base_id.unwrap() && header.opcode == 0 { // xdg_wm_base::ping self.xdg_wm_base_pong(&event)?; } + else if Some(header.object) == self.layer_surface_id && header.opcode == 0 { // zwlr_layer_surface::configure + self.layer_surface_configure(&event)?; + } else { println!( "Received event:\n\tObject: {}\n\tOpcode: {}\n\tSize: {}", diff --git a/src/wl_registry.rs b/src/wl_registry.rs index 8008d40..9a6027b 100644 --- a/src/wl_registry.rs +++ b/src/wl_registry.rs @@ -18,11 +18,15 @@ impl WlClient { println!("Initializing toplevel!"); self.wl_compositor_create_surface()?; self.layer_shell_get_layer_surface()?; + self.layer_surface_set_size(200, 200)?; + self.layer_surface_set_keyboard_interactivity()?; + self.wl_surface_commit()?; + self.wl_shm_create_pool()?; self.wl_shm_pool_create_buffer(0, 200, 200)?; self.wl_surface_attach()?; - self.layer_surface_set_keyboard_interactivity()?; + // self.wl_surface_commit()?; Ok(()) }