#[allow(unused_imports)]
use crate::cookie::Cookie;
#[allow(unused_imports)]
use crate::cookie::FixedCookie;
#[allow(unused_imports)]
use crate::cookie::VoidCookie;
#[allow(unused_imports)]
use crate::util::FixedLengthSerialize;
#[allow(unused_imports)]
use crate::util::VariableLengthSerialize;
pub fn query_version<IO, XS>(
io: &mut IO,
xcb_state: &mut XS,
major_version: u16,
minor_version: u16,
forget: bool,
) -> crate::error::Result<FixedCookie<crate::proto::record::QueryVersionReply, 12>>
where
IO: crate::con::SocketIo,
XS: crate::con::XcbState,
{
let major_opcode = xcb_state
.major_opcode(crate::proto::record::EXTENSION_NAME)
.ok_or(crate::error::Error::MissingExtension(
crate::proto::record::EXTENSION_NAME,
))?;
let length: [u8; 2] = (2u16).to_ne_bytes();
let major_version_bytes = major_version.serialize_fixed();
let minor_version_bytes = minor_version.serialize_fixed();
io.use_write_buffer(|buf| {
buf.get_mut(..8)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&[
major_opcode,
0,
length[0],
length[1],
major_version_bytes[0],
major_version_bytes[1],
minor_version_bytes[0],
minor_version_bytes[1],
]);
Ok::<usize, crate::error::Error>(8)
})?;
let seq = if forget {
xcb_state.next_seq()
} else {
xcb_state.keep_and_return_next_seq()
};
Ok(FixedCookie::new(seq))
}
pub fn create_context<IO, XS>(
io: &mut IO,
xcb_state: &mut XS,
context: crate::proto::record::Context,
element_header: crate::proto::record::ElementHeader,
num_client_specs: u32,
num_ranges: u32,
client_specs: &[crate::proto::record::ClientSpec],
ranges: &[crate::proto::record::Range],
forget: bool,
) -> crate::error::Result<VoidCookie>
where
IO: crate::con::SocketIo,
XS: crate::con::XcbState,
{
let major_opcode = xcb_state
.major_opcode(crate::proto::record::EXTENSION_NAME)
.ok_or(crate::error::Error::MissingExtension(
crate::proto::record::EXTENSION_NAME,
))?;
io.use_write_buffer(|buf_ptr| {
let num_client_specs =
u32::try_from(num_client_specs).map_err(|_| crate::error::Error::Serialize)?;
let num_ranges = u32::try_from(num_ranges).map_err(|_| crate::error::Error::Serialize)?;
buf_ptr
.get_mut(4..8)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&context.serialize_fixed());
buf_ptr
.get_mut(8..9)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&element_header.serialize_fixed());
buf_ptr
.get_mut(12..16)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(
&(u32::try_from(num_client_specs).map_err(|_| crate::error::Error::Serialize)?)
.serialize_fixed(),
);
buf_ptr
.get_mut(16..20)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(
&(u32::try_from(num_ranges).map_err(|_| crate::error::Error::Serialize)?)
.serialize_fixed(),
);
let list_len = client_specs.len() * 4;
crate::util::fixed_vec_serialize_into(
buf_ptr
.get_mut(20..)
.ok_or(crate::error::Error::Serialize)?,
client_specs,
)?;
let mut offset = list_len + 20;
let list_len = ranges.len() * 24;
crate::util::fixed_vec_serialize_into(
buf_ptr
.get_mut(offset..)
.ok_or(crate::error::Error::Serialize)?,
ranges,
)?;
offset += list_len;
let mut offset = offset + (4 - (offset % 4)) % 4;
buf_ptr
.get_mut(0..2)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&[major_opcode, 1]);
debug_assert!(offset % 4 == 0, "Bad request length offset {offset}");
let word_len = offset / 4;
if let Ok(len) = u16::try_from(word_len) {
let length: [u8; 2] = len.to_ne_bytes();
buf_ptr
.get_mut(2..4)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&length);
} else {
if word_len > xcb_state.max_request_size() {
return Err(crate::error::Error::TooLargeRequest);
}
buf_ptr
.get_mut(2..4)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&[0, 0]);
let length: [u8; 4] = u32::try_from(word_len)
.map_err(|_| crate::error::Error::TooLargeRequest)?
.checked_add(1)
.ok_or(crate::error::Error::TooLargeRequest)?
.to_ne_bytes();
buf_ptr.copy_within(4..offset, 8);
buf_ptr
.get_mut(4..8)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&length);
offset += 4;
}
Ok::<usize, crate::error::Error>(offset)
})?;
let seq = if forget {
xcb_state.next_seq()
} else {
xcb_state.keep_and_return_next_seq()
};
Ok(VoidCookie::new(seq))
}
pub fn register_clients<IO, XS>(
io: &mut IO,
xcb_state: &mut XS,
context: crate::proto::record::Context,
element_header: crate::proto::record::ElementHeader,
num_client_specs: u32,
num_ranges: u32,
client_specs: &[crate::proto::record::ClientSpec],
ranges: &[crate::proto::record::Range],
forget: bool,
) -> crate::error::Result<VoidCookie>
where
IO: crate::con::SocketIo,
XS: crate::con::XcbState,
{
let major_opcode = xcb_state
.major_opcode(crate::proto::record::EXTENSION_NAME)
.ok_or(crate::error::Error::MissingExtension(
crate::proto::record::EXTENSION_NAME,
))?;
io.use_write_buffer(|buf_ptr| {
let num_client_specs =
u32::try_from(num_client_specs).map_err(|_| crate::error::Error::Serialize)?;
let num_ranges = u32::try_from(num_ranges).map_err(|_| crate::error::Error::Serialize)?;
buf_ptr
.get_mut(4..8)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&context.serialize_fixed());
buf_ptr
.get_mut(8..9)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&element_header.serialize_fixed());
buf_ptr
.get_mut(12..16)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(
&(u32::try_from(num_client_specs).map_err(|_| crate::error::Error::Serialize)?)
.serialize_fixed(),
);
buf_ptr
.get_mut(16..20)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(
&(u32::try_from(num_ranges).map_err(|_| crate::error::Error::Serialize)?)
.serialize_fixed(),
);
let list_len = client_specs.len() * 4;
crate::util::fixed_vec_serialize_into(
buf_ptr
.get_mut(20..)
.ok_or(crate::error::Error::Serialize)?,
client_specs,
)?;
let mut offset = list_len + 20;
let list_len = ranges.len() * 24;
crate::util::fixed_vec_serialize_into(
buf_ptr
.get_mut(offset..)
.ok_or(crate::error::Error::Serialize)?,
ranges,
)?;
offset += list_len;
let mut offset = offset + (4 - (offset % 4)) % 4;
buf_ptr
.get_mut(0..2)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&[major_opcode, 2]);
debug_assert!(offset % 4 == 0, "Bad request length offset {offset}");
let word_len = offset / 4;
if let Ok(len) = u16::try_from(word_len) {
let length: [u8; 2] = len.to_ne_bytes();
buf_ptr
.get_mut(2..4)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&length);
} else {
if word_len > xcb_state.max_request_size() {
return Err(crate::error::Error::TooLargeRequest);
}
buf_ptr
.get_mut(2..4)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&[0, 0]);
let length: [u8; 4] = u32::try_from(word_len)
.map_err(|_| crate::error::Error::TooLargeRequest)?
.checked_add(1)
.ok_or(crate::error::Error::TooLargeRequest)?
.to_ne_bytes();
buf_ptr.copy_within(4..offset, 8);
buf_ptr
.get_mut(4..8)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&length);
offset += 4;
}
Ok::<usize, crate::error::Error>(offset)
})?;
let seq = if forget {
xcb_state.next_seq()
} else {
xcb_state.keep_and_return_next_seq()
};
Ok(VoidCookie::new(seq))
}
pub fn unregister_clients<IO, XS>(
io: &mut IO,
xcb_state: &mut XS,
context: crate::proto::record::Context,
client_specs: &[crate::proto::record::ClientSpec],
forget: bool,
) -> crate::error::Result<VoidCookie>
where
IO: crate::con::SocketIo,
XS: crate::con::XcbState,
{
let major_opcode = xcb_state
.major_opcode(crate::proto::record::EXTENSION_NAME)
.ok_or(crate::error::Error::MissingExtension(
crate::proto::record::EXTENSION_NAME,
))?;
io.use_write_buffer(|buf_ptr| {
let num_client_specs =
u32::try_from(client_specs.len()).map_err(|_| crate::error::Error::Serialize)?;
buf_ptr
.get_mut(4..8)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&context.serialize_fixed());
buf_ptr
.get_mut(8..12)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(
&(u32::try_from(num_client_specs).map_err(|_| crate::error::Error::Serialize)?)
.serialize_fixed(),
);
let list_len = client_specs.len() * 4;
crate::util::fixed_vec_serialize_into(
buf_ptr
.get_mut(12..)
.ok_or(crate::error::Error::Serialize)?,
client_specs,
)?;
let mut offset = list_len + 12;
let mut offset = offset + (4 - (offset % 4)) % 4;
buf_ptr
.get_mut(0..2)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&[major_opcode, 3]);
debug_assert!(offset % 4 == 0, "Bad request length offset {offset}");
let word_len = offset / 4;
if let Ok(len) = u16::try_from(word_len) {
let length: [u8; 2] = len.to_ne_bytes();
buf_ptr
.get_mut(2..4)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&length);
} else {
if word_len > xcb_state.max_request_size() {
return Err(crate::error::Error::TooLargeRequest);
}
buf_ptr
.get_mut(2..4)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&[0, 0]);
let length: [u8; 4] = u32::try_from(word_len)
.map_err(|_| crate::error::Error::TooLargeRequest)?
.checked_add(1)
.ok_or(crate::error::Error::TooLargeRequest)?
.to_ne_bytes();
buf_ptr.copy_within(4..offset, 8);
buf_ptr
.get_mut(4..8)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&length);
offset += 4;
}
Ok::<usize, crate::error::Error>(offset)
})?;
let seq = if forget {
xcb_state.next_seq()
} else {
xcb_state.keep_and_return_next_seq()
};
Ok(VoidCookie::new(seq))
}
pub fn get_context<IO, XS>(
io: &mut IO,
xcb_state: &mut XS,
context: crate::proto::record::Context,
forget: bool,
) -> crate::error::Result<Cookie<crate::proto::record::GetContextReply>>
where
IO: crate::con::SocketIo,
XS: crate::con::XcbState,
{
let major_opcode = xcb_state
.major_opcode(crate::proto::record::EXTENSION_NAME)
.ok_or(crate::error::Error::MissingExtension(
crate::proto::record::EXTENSION_NAME,
))?;
let length: [u8; 2] = (2u16).to_ne_bytes();
let context_bytes = context.serialize_fixed();
io.use_write_buffer(|buf| {
buf.get_mut(..8)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&[
major_opcode,
4,
length[0],
length[1],
context_bytes[0],
context_bytes[1],
context_bytes[2],
context_bytes[3],
]);
Ok::<usize, crate::error::Error>(8)
})?;
let seq = if forget {
xcb_state.next_seq()
} else {
xcb_state.keep_and_return_next_seq()
};
Ok(Cookie::new(seq))
}
pub fn enable_context<IO, XS>(
io: &mut IO,
xcb_state: &mut XS,
context: crate::proto::record::Context,
forget: bool,
) -> crate::error::Result<Cookie<crate::proto::record::EnableContextReply>>
where
IO: crate::con::SocketIo,
XS: crate::con::XcbState,
{
let major_opcode = xcb_state
.major_opcode(crate::proto::record::EXTENSION_NAME)
.ok_or(crate::error::Error::MissingExtension(
crate::proto::record::EXTENSION_NAME,
))?;
let length: [u8; 2] = (2u16).to_ne_bytes();
let context_bytes = context.serialize_fixed();
io.use_write_buffer(|buf| {
buf.get_mut(..8)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&[
major_opcode,
5,
length[0],
length[1],
context_bytes[0],
context_bytes[1],
context_bytes[2],
context_bytes[3],
]);
Ok::<usize, crate::error::Error>(8)
})?;
let seq = if forget {
xcb_state.next_seq()
} else {
xcb_state.keep_and_return_next_seq()
};
Ok(Cookie::new(seq))
}
pub fn disable_context<IO, XS>(
io: &mut IO,
xcb_state: &mut XS,
context: crate::proto::record::Context,
forget: bool,
) -> crate::error::Result<VoidCookie>
where
IO: crate::con::SocketIo,
XS: crate::con::XcbState,
{
let major_opcode = xcb_state
.major_opcode(crate::proto::record::EXTENSION_NAME)
.ok_or(crate::error::Error::MissingExtension(
crate::proto::record::EXTENSION_NAME,
))?;
let length: [u8; 2] = (2u16).to_ne_bytes();
let context_bytes = context.serialize_fixed();
io.use_write_buffer(|buf| {
buf.get_mut(..8)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&[
major_opcode,
6,
length[0],
length[1],
context_bytes[0],
context_bytes[1],
context_bytes[2],
context_bytes[3],
]);
Ok::<usize, crate::error::Error>(8)
})?;
let seq = if forget {
xcb_state.next_seq()
} else {
xcb_state.keep_and_return_next_seq()
};
Ok(VoidCookie::new(seq))
}
pub fn free_context<IO, XS>(
io: &mut IO,
xcb_state: &mut XS,
context: crate::proto::record::Context,
forget: bool,
) -> crate::error::Result<VoidCookie>
where
IO: crate::con::SocketIo,
XS: crate::con::XcbState,
{
let major_opcode = xcb_state
.major_opcode(crate::proto::record::EXTENSION_NAME)
.ok_or(crate::error::Error::MissingExtension(
crate::proto::record::EXTENSION_NAME,
))?;
let length: [u8; 2] = (2u16).to_ne_bytes();
let context_bytes = context.serialize_fixed();
io.use_write_buffer(|buf| {
buf.get_mut(..8)
.ok_or(crate::error::Error::Serialize)?
.copy_from_slice(&[
major_opcode,
7,
length[0],
length[1],
context_bytes[0],
context_bytes[1],
context_bytes[2],
context_bytes[3],
]);
Ok::<usize, crate::error::Error>(8)
})?;
let seq = if forget {
xcb_state.next_seq()
} else {
xcb_state.keep_and_return_next_seq()
};
Ok(VoidCookie::new(seq))
}