Move format, create_pool, and create_buffer to wl_shm.rs
This commit is contained in:
90
src/main.rs
90
src/main.rs
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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
94
src/wl_shm.rs
Normal 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(())
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user