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