171 lines
5.5 KiB
Rust
171 lines
5.5 KiB
Rust
#![cfg(feature = "extra-traits")]
|
|
|
|
use x11rb_protocol::errors::ParseError;
|
|
use x11rb_protocol::protocol::xproto::{Setup, VisualClass};
|
|
use x11rb_protocol::x11_utils::TryParse;
|
|
|
|
fn get_setup_data() -> Vec<u8> {
|
|
let mut s = Vec::new();
|
|
|
|
let vendor_len: u16 = 2;
|
|
let num_pixmap_formats: u8 = 1;
|
|
let roots_len: u8 = 18;
|
|
let header: u16 = 10;
|
|
let length: u16 =
|
|
header + vendor_len + 2 * u16::from(num_pixmap_formats) + u16::from(roots_len);
|
|
|
|
s.extend([1, 0]); // Status "success" and padding
|
|
s.extend(11u16.to_ne_bytes()); // major version
|
|
s.extend(0u16.to_ne_bytes()); // minor version
|
|
s.extend(length.to_ne_bytes()); // length
|
|
s.extend(0x1234_5678u32.to_ne_bytes()); // release number
|
|
s.extend(0x1000_0000u32.to_ne_bytes()); // resource id base
|
|
s.extend(0x0000_00ffu32.to_ne_bytes()); // resource id mask
|
|
s.extend(0u32.to_ne_bytes()); // motion buffer size
|
|
s.extend(6u16.to_ne_bytes()); // vendor length
|
|
s.extend(0x100u16.to_ne_bytes()); // maximum request length
|
|
s.push(1); // roots length
|
|
s.push(num_pixmap_formats); // pixmap formats length
|
|
s.push(1); // image byte order: MSB first
|
|
s.push(1); // bitmap format bit order: MSB first
|
|
s.push(0); // scanline unit
|
|
s.push(0); // scanline pad
|
|
s.push(0); // min keycode
|
|
s.push(0xff); // max keycode
|
|
s.extend([0, 0, 0, 0]); // padding
|
|
assert_eq!(s.len(), usize::from(header) * 4);
|
|
|
|
s.extend("Vendor ".bytes()); // vendor + padding
|
|
assert_eq!(s.len(), usize::from(header + vendor_len) * 4);
|
|
|
|
// Pixmap formats, we said above there is one entry
|
|
s.push(15); // depth
|
|
s.push(42); // bits per pixel
|
|
s.push(21); // scanline pad
|
|
s.extend([0, 0, 0, 0, 0]); // padding
|
|
assert_eq!(
|
|
s.len(),
|
|
4 * usize::from(header + vendor_len + 2 * u16::from(num_pixmap_formats))
|
|
);
|
|
|
|
// Screens, we said above there is one entry
|
|
s.extend(1u32.to_ne_bytes()); // root window
|
|
s.extend(2u32.to_ne_bytes()); // default colormap
|
|
s.extend(3u32.to_ne_bytes()); // white pixel
|
|
s.extend(4u32.to_ne_bytes()); // black pixel
|
|
s.extend(0u32.to_ne_bytes()); // current input masks
|
|
s.extend(0u16.to_ne_bytes()); // width in pixels
|
|
s.extend(0u16.to_ne_bytes()); // height in pixels
|
|
s.extend(0u16.to_ne_bytes()); // width in mm
|
|
s.extend(0u16.to_ne_bytes()); // height in mm
|
|
s.extend(0u16.to_ne_bytes()); // min installed maps
|
|
s.extend(0u16.to_ne_bytes()); // max installed maps
|
|
s.extend(0u32.to_ne_bytes()); // root visual
|
|
s.extend([0, 0, 0, 1]); // backing stores, save unders, root depths, allowed depths len
|
|
|
|
// one depth entry
|
|
s.extend([99, 0]); // depth and padding
|
|
s.extend(1u16.to_ne_bytes()); // width visuals len
|
|
s.extend([0, 0, 0, 0]); // padding
|
|
|
|
// one visualtype entry
|
|
s.extend(80u32.to_ne_bytes()); // visualid
|
|
s.extend([2, 4]); // class and bits per rgb value
|
|
s.extend(81u16.to_ne_bytes()); // colormap entries
|
|
s.extend(82u32.to_ne_bytes()); // red mask
|
|
s.extend(83u32.to_ne_bytes()); // green mask
|
|
s.extend(84u32.to_ne_bytes()); // blue mask
|
|
s.extend([0, 0, 0, 0]); // padding
|
|
|
|
assert_eq!(s.len(), usize::from(length) * 4);
|
|
|
|
s
|
|
}
|
|
|
|
#[test]
|
|
fn parse_setup() -> Result<(), ParseError> {
|
|
let setup = get_setup_data();
|
|
let (setup, remaining) = Setup::try_parse(&setup)?;
|
|
|
|
assert_eq!(remaining.len(), 0);
|
|
|
|
assert_eq!(
|
|
(1, 11, 0),
|
|
(
|
|
setup.status,
|
|
setup.protocol_major_version,
|
|
setup.protocol_minor_version
|
|
)
|
|
);
|
|
assert_eq!(0x1234_5678, setup.release_number);
|
|
assert_eq!((0, 0xff), (setup.min_keycode, setup.max_keycode));
|
|
assert_eq!(b"Vendor", &setup.vendor[..]);
|
|
|
|
assert_eq!(1, setup.pixmap_formats.len());
|
|
let format = &setup.pixmap_formats[0];
|
|
assert_eq!(15, format.depth);
|
|
assert_eq!(42, format.bits_per_pixel);
|
|
assert_eq!(21, format.scanline_pad);
|
|
|
|
assert_eq!(1, setup.roots.len());
|
|
let root = &setup.roots[0];
|
|
assert_eq!(
|
|
(1, 2, 3, 4),
|
|
(
|
|
root.root,
|
|
root.default_colormap,
|
|
root.white_pixel,
|
|
root.black_pixel
|
|
)
|
|
);
|
|
|
|
assert_eq!(1, root.allowed_depths.len());
|
|
let depth = &root.allowed_depths[0];
|
|
assert_eq!(99, depth.depth);
|
|
|
|
assert_eq!(1, depth.visuals.len());
|
|
let visual = &depth.visuals[0];
|
|
assert_eq!(80, visual.visual_id);
|
|
assert_eq!(VisualClass::STATIC_COLOR, visual.class);
|
|
assert_eq!(4, visual.bits_per_rgb_value);
|
|
assert_eq!(81, visual.colormap_entries);
|
|
assert_eq!(82, visual.red_mask);
|
|
assert_eq!(83, visual.green_mask);
|
|
assert_eq!(84, visual.blue_mask);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[cfg(feature = "xinput")]
|
|
#[test]
|
|
fn parse_xi_get_property_reply_format_0() {
|
|
let mut s = vec![
|
|
1, // response_type
|
|
0, // pad
|
|
];
|
|
s.extend(0u16.to_ne_bytes()); // sequence
|
|
s.extend(0u32.to_ne_bytes()); // length
|
|
s.extend(0u32.to_ne_bytes()); // type
|
|
s.extend(0u32.to_ne_bytes()); // bytes_after
|
|
s.extend(0u32.to_ne_bytes()); // num_items
|
|
s.push(0); // format
|
|
s.extend([0; 11]); // pad
|
|
|
|
use x11rb_protocol::protocol::xinput::{XIGetPropertyItems, XIGetPropertyReply};
|
|
let empty: &[u8] = &[];
|
|
assert_eq!(
|
|
XIGetPropertyReply::try_parse(&s),
|
|
Ok((
|
|
XIGetPropertyReply {
|
|
sequence: 0,
|
|
length: 0,
|
|
type_: 0,
|
|
bytes_after: 0,
|
|
num_items: 0,
|
|
items: XIGetPropertyItems::InvalidValue(0),
|
|
},
|
|
empty,
|
|
)),
|
|
);
|
|
}
|