Move format, create_pool, and create_buffer to wl_shm.rs

This commit is contained in:
2025-04-23 13:20:08 -07:00
parent 0d2db8f288
commit b6b3cefd2d
3 changed files with 97 additions and 92 deletions

View File

@@ -2,6 +2,7 @@
use std::{env, error::Error, io::{Read, Write}, os::unix::net::{UnixStream, SocketAncillary}, u32}; use std::{env, error::Error, io::{Read, Write}, os::unix::net::{UnixStream, SocketAncillary}, u32};
mod shm; mod shm;
mod wl_shm;
mod vec_utils; mod vec_utils;
pub use vec_utils::WlMessage; pub use vec_utils::WlMessage;
@@ -149,95 +150,6 @@ impl WlClient {
Ok(()) Ok(())
} }
fn wl_shm_format(event: &Vec<u8>) {
let mut offset = 0;
println!("Received pixel format: {:x}", event.read_u32(&mut offset));
}
fn wl_shm_create_pool(&mut self) -> Result<(), String> {
self.current_id += 1;
self.shm_pool = Some(match shm::ShmPool::new(4096, self.current_id) {
Ok(val) => val,
Err(err) => {
return Err(err.to_string());
}
});
let object = match self.shm_id {
Some(val) => val,
None => {
return Err("error in wl_shm_create_pool: shm_id not set!".to_string());
}
};
const OPCODE: u16 = 0;
const REQ_SIZE: u16 = 16;
let id = self.shm_pool.as_ref().unwrap().id;
let fds = [self.shm_pool.as_ref().unwrap().fd];
let shm_size = self.shm_pool.as_ref().unwrap().size;
let mut request = vec![0u8; REQ_SIZE as usize];
let mut offset: usize = 0;
// Request header
request.write_u32(&object, &mut offset);
request.write_u16(&OPCODE, &mut offset);
request.write_u16(&REQ_SIZE, &mut offset);
// Id, size of shm pool
request.write_u32(&id, &mut offset);
request.write_u32(&(shm_size as u32), &mut offset);
let mut ancillary_buf = [0u8; 32];
let mut ancillary = SocketAncillary::new(&mut ancillary_buf[..]);
if !ancillary.add_fds(&fds[..]) {
return Err("Error in wl_shm_create_pool: ancillary.add_fds failed".to_string());
}
match self.socket.send_vectored_with_ancillary(&[std::io::IoSlice::new(&request)], &mut ancillary) {
Ok(bytes) => {
assert!(bytes == REQ_SIZE as usize);
}
Err(err) => {
return Err(err.to_string());
}
};
Ok(())
}
fn wl_shm_pool_create_buffer(
&mut self,
shm_offset: u32,
width: u32,
height: u32
) -> Result<(), Box<dyn Error>> {
let object: u32 = self.shm_pool.as_ref().unwrap().id;
const REQ_SIZE: u16 = 32;
const OPCODE: u16 = 0;
let stride: u32 = width * 4;
self.current_id += 1;
let id = self.current_id;
let format = 0;
let mut offset: usize = 0;
let mut request = vec![0u8; REQ_SIZE as usize];
request.write_u32(&object, &mut offset);
request.write_u16(&OPCODE, &mut offset);
request.write_u16(&REQ_SIZE, &mut offset);
request.write_u32(&id, &mut offset);
request.write_u32(&shm_offset, &mut offset);
request.write_u32(&width, &mut offset);
request.write_u32(&height, &mut offset);
request.write_u32(&stride, &mut offset);
request.write_u32(&format, &mut offset);
self.socket.write(&request)?;
Ok(())
}
fn wl_registry_global(&mut self, event: &Vec<u8>) -> Result<(), Box<dyn Error>> { fn wl_registry_global(&mut self, event: &Vec<u8>) -> Result<(), Box<dyn Error>> {
let mut offset: usize = 0; let mut offset: usize = 0;

View File

@@ -65,9 +65,8 @@ impl WlMessage for Vec<u8> {
*offset += 4; *offset += 4;
let str = String::from_utf8( let str = String::from_utf8(
self[*offset..*offset+((str_len-1) as usize)] self[*offset..*offset+((str_len-1) as usize)]
.to_vec()) .to_vec()
.expect("String::from_utf8 failed in WlEvent::read_string()" ).expect("String::from_utf8 failed in WlEvent::read_string()");
);
*offset += (str_len+3 & u32::MAX-3) as usize; *offset += (str_len+3 & u32::MAX-3) as usize;
str str
} }

94
src/wl_shm.rs Normal file
View File

@@ -0,0 +1,94 @@
use std::{io::Write, error::Error, os::unix::net::SocketAncillary};
use crate::{WlClient, vec_utils::WlMessage, shm};
impl WlClient {
pub fn wl_shm_format(event: &Vec<u8>) {
let mut offset = 0;
println!("Received pixel format: {:x}", event.read_u32(&mut offset));
}
pub fn wl_shm_create_pool(&mut self) -> Result<(), String> {
self.current_id += 1;
self.shm_pool = Some(match shm::ShmPool::new(4096, self.current_id) {
Ok(val) => val,
Err(err) => {
return Err(err.to_string());
}
});
let object = match self.shm_id {
Some(val) => val,
None => {
return Err("error in wl_shm_create_pool: shm_id not set!".to_string());
}
};
const OPCODE: u16 = 0;
const REQ_SIZE: u16 = 16;
let id = self.shm_pool.as_ref().unwrap().id;
let fds = [self.shm_pool.as_ref().unwrap().fd];
let shm_size = self.shm_pool.as_ref().unwrap().size;
let mut request = vec![0u8; REQ_SIZE as usize];
let mut offset: usize = 0;
// Request header
request.write_u32(&object, &mut offset);
request.write_u16(&OPCODE, &mut offset);
request.write_u16(&REQ_SIZE, &mut offset);
// Id, size of shm pool
request.write_u32(&id, &mut offset);
request.write_u32(&(shm_size as u32), &mut offset);
let mut ancillary_buf = [0u8; 32];
let mut ancillary = SocketAncillary::new(&mut ancillary_buf[..]);
if !ancillary.add_fds(&fds[..]) {
return Err("Error in wl_shm_create_pool: ancillary.add_fds failed".to_string());
}
match self.socket.send_vectored_with_ancillary(&[std::io::IoSlice::new(&request)], &mut ancillary) {
Ok(bytes) => {
assert!(bytes == REQ_SIZE as usize);
}
Err(err) => {
return Err(err.to_string());
}
};
Ok(())
}
pub fn wl_shm_pool_create_buffer(
&mut self,
shm_offset: u32,
width: u32,
height: u32
) -> Result<(), Box<dyn Error>> {
let object: u32 = self.shm_pool.as_ref().unwrap().id;
const REQ_SIZE: u16 = 32;
const OPCODE: u16 = 0;
let stride: u32 = width * 4;
self.current_id += 1;
let id = self.current_id;
let format = 0;
let mut offset: usize = 0;
let mut request = vec![0u8; REQ_SIZE as usize];
request.write_u32(&object, &mut offset);
request.write_u16(&OPCODE, &mut offset);
request.write_u16(&REQ_SIZE, &mut offset);
request.write_u32(&id, &mut offset);
request.write_u32(&shm_offset, &mut offset);
request.write_u32(&width, &mut offset);
request.write_u32(&height, &mut offset);
request.write_u32(&stride, &mut offset);
request.write_u32(&format, &mut offset);
self.socket.write(&request)?;
Ok(())
}
}