diff --git a/src/layer_shell.rs b/src/layer_shell.rs index 50c8f13..2330839 100644 --- a/src/layer_shell.rs +++ b/src/layer_shell.rs @@ -9,9 +9,10 @@ impl WlClient { let object: u32 = self.layer_shell_id.unwrap(); const OPCODE: u16 = 0; let msg_size: u16 = 28 + (NAMESPACE.len()+1).next_multiple_of(4) as u16; + let output: u32 = 0; + let mut request = vec![0u8; msg_size as usize]; let mut offset: usize = 0; - let output: u32 = 0; request.write_u32(&object, &mut offset); request.write_u16(&OPCODE, &mut offset); @@ -19,6 +20,7 @@ impl WlClient { self.current_id += 1; request.write_u32(&self.current_id, &mut offset); + self.layer_surface_id = Some(self.current_id); request.write_u32(&self.surface_id.unwrap(), &mut offset); request.write_u32(&output, &mut offset); request.write_u32(&OVERLAY, &mut offset); @@ -28,4 +30,44 @@ impl WlClient { 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; + + 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); + + request.write_u32(&width, &mut offset); + request.write_u32(&height, &mut offset); + + self.socket.write(&request)?; + + Ok(()) + } + + pub fn layer_surface_set_keyboard_interactivity(&mut self) -> Result<(), Box> { + let object: u32 = self.layer_surface_id.unwrap(); + const OPCODE: u16 = 4; + const MSG_SIZE: u16 = 12; + const EXCLUSIVE: u32 = 1; // exclusize keyboard focus + + 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); + + request.write_u32(&EXCLUSIVE, &mut offset); + + self.socket.write(&request)?; + + Ok(()) + } } diff --git a/src/wl_client.rs b/src/wl_client.rs index 8b7a73d..d8fa554 100644 --- a/src/wl_client.rs +++ b/src/wl_client.rs @@ -19,6 +19,7 @@ pub struct WlClient { pub surface_id: Option, pub xdg_wm_base_id: Option, pub layer_shell_id: Option, + pub layer_surface_id: Option, } impl WlClient { @@ -40,6 +41,7 @@ impl WlClient { surface_id: None, xdg_wm_base_id: None, layer_shell_id: None, + layer_surface_id: None, }; Ok(res) diff --git a/src/wl_registry.rs b/src/wl_registry.rs index c9655f3..8008d40 100644 --- a/src/wl_registry.rs +++ b/src/wl_registry.rs @@ -18,9 +18,11 @@ impl WlClient { println!("Initializing toplevel!"); self.wl_compositor_create_surface()?; self.layer_shell_get_layer_surface()?; + self.layer_surface_set_size(200, 200)?; self.wl_shm_create_pool()?; self.wl_shm_pool_create_buffer(0, 200, 200)?; self.wl_surface_attach()?; + self.layer_surface_set_keyboard_interactivity()?; Ok(()) }