1 use crate::platform::unix::x11::XConnection;
2 use glutin_glx_sys as ffi;
3
4 use std::sync::Arc;
5
6 pub fn get_visual_info_from_xid(xconn: &Arc<XConnection>, xid: ffi::VisualID) -> ffi::XVisualInfo {
7 assert_ne!(xid, 0);
8 let mut template: ffi::XVisualInfo = unsafe { std::mem::zeroed() };
9 template.visualid = xid;
10
11 let mut num_visuals = 0;
12 let vi = unsafe {
13 (xconn.xlib.XGetVisualInfo)(
14 xconn.display,
15 ffi::VisualIDMask,
16 &mut template,
17 &mut num_visuals,
18 )
19 };
20 xconn.check_errors().expect("Failed to call `XGetVisualInfo`");
21 assert!(!vi.is_null());
22 assert!(num_visuals == 1);
fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result23
24 let vi_copy = unsafe { std::ptr::read(vi as *const _) };
25 unsafe {
26 (xconn.xlib.XFree)(vi as *mut _);
27 }
28 vi_copy
29 }
30
31 #[derive(Clone, Copy, Debug)]
32 pub enum Lacks {
33 Transparency,
34 XID,
35 }
36
37 /// Should always check for lack of xid before lack of transparency.
deref(&self) -> &Self::Target38 pub fn examine_visual_info(
39 xconn: &Arc<XConnection>,
40 visual_infos: ffi::XVisualInfo,
41 want_transparency: bool,
42 want_xid: Option<ffi::VisualID>,
43 ) -> Result<(), Lacks> {
44 if let Some(want_xid) = want_xid {
45 if visual_infos.visualid != want_xid {
46 return Err(Lacks::XID);
47 }
48 }
49
50 unsafe {
51 if want_transparency {
52 let pict_format = (xconn.xrender.XRenderFindVisualFormat)(
53 xconn.display as *mut _,
54 visual_infos.visual,
55 );
56 if pict_format.is_null() {
57 return Err(Lacks::Transparency);
58 }
59
60 if (*pict_format).direct.alphaMask == 0 {
61 return Err(Lacks::Transparency);
62 }
63 }
64 }
65
66 return Ok(());
67 }
68
69 pub use super::select_config;
70 pub use crate::api::egl::SurfaceType;
71