From 857b40dda436ee2ce5a57377856d2d3dce7878d1 Mon Sep 17 00:00:00 2001 From: ProtoShark Date: Mon, 24 Mar 2025 15:44:06 -0700 Subject: [PATCH] Read globals from wl_registry::global --- src/main.rs | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/src/main.rs b/src/main.rs index a81410d..de91bc7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,7 +23,6 @@ fn wl_connect() -> Result> { Ok(sock) } - fn wl_display_get_registry(wl_state: &mut WlState) -> Result<(), Box> { const OBJECT: u32 = 1; const OPCODE: u16 = 1; @@ -44,8 +43,29 @@ fn wl_display_get_registry(wl_state: &mut WlState) -> Result<(), Box> Ok(()) } -fn wl_registry_global(header: &WlHeader, wl_sock: &mut UnixStream) { - +fn wl_registry_global(header: &WlHeader, wl_state: &mut WlState) -> Result<(), Box> { + let mut event = vec![0; (header.size - 8).into()]; + wl_state.socket.read_exact(&mut event)?; + let mut offset = 0; + + let name = u32::from_ne_bytes(event[offset..offset+4].try_into()?); + offset += 4; + let interface_len = u32::from_ne_bytes(event[offset..offset+4].try_into()?); + offset += 4; + let interface = String::from_utf8(event[offset..offset+(interface_len as usize)].into())?; + offset += (interface_len+3 & u32::MAX-3) as usize; + let version = u32::from_ne_bytes(event[offset..offset+4].try_into()?); + + println!( + "Received global:\n\tName: {}\n\tInterface len: {}\n\tInterface: {}\n\tVersion: {}\n\tOffset: {}", + name, + interface_len, + interface, + version, + offset + ); + + Ok(()) } fn main() ->Result<(), Box> { @@ -60,7 +80,7 @@ fn main() ->Result<(), Box> { let mut wl_state = WlState { socket: wl_sock, - current_id: 0, + current_id: 1, registry_id: 0, }; @@ -69,17 +89,21 @@ fn main() ->Result<(), Box> { let mut header = [0u8; 8]; wl_state.socket.read_exact(&mut header)?; let header = WlHeader { - object: u32::from_ne_bytes(header[0..4].try_into().unwrap()), - opcode: u16::from_ne_bytes(header[4..6].try_into().unwrap()), - size: u16::from_ne_bytes(header[6..8].try_into().unwrap()) + object: u32::from_ne_bytes(header[0..4].try_into()?), + opcode: u16::from_ne_bytes(header[4..6].try_into()?), + size: u16::from_ne_bytes(header[6..8].try_into()?) }; println!( - "Object: {}\nOpcode: {}\nSize: {}", + "Received event:\n\tObject: {}\n\tOpcode: {}\n\tSize: {}", header.object, header.opcode, header.size ); + if header.object == wl_state.registry_id && header.opcode == 0 { + wl_registry_global(&header, &mut wl_state)?; + } + Ok(()) }