1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
use std::ptr; use std::rc::Rc; use super::DisplayIter; use super::ffi::*; #[derive(Debug)] pub struct Server { raw: *mut xcb_connection_t, screenp: i32, setup: *const xcb_setup_t } impl Server { pub fn displays(slf: Rc<Server>) -> DisplayIter { unsafe { DisplayIter::new(slf) } } pub fn default() -> Result<Server, Error> { Server::connect(ptr::null()) } pub fn connect(addr: *const i8) -> Result<Server, Error> { unsafe { let mut screenp = 0; let raw = xcb_connect(addr, &mut screenp); let error = xcb_connection_has_error(raw); if error != 0 { xcb_disconnect(raw); Err(Error::from(error)) } else { let setup = xcb_get_setup(raw); Ok(Server { raw, screenp, setup }) } } } pub fn raw(&self) -> *mut xcb_connection_t { self.raw } pub fn screenp(&self) -> i32 { self.screenp } pub fn setup(&self) -> *const xcb_setup_t { self.setup } } impl Drop for Server { fn drop(&mut self) { unsafe { xcb_disconnect(self.raw); } } } #[derive(Clone, Copy, Debug)] pub enum Error { Generic, UnsupportedExtension, InsufficientMemory, RequestTooLong, ParseError, InvalidScreen } impl From<i32> for Error { fn from(x: i32) -> Error { use self::Error::*; match x { 2 => UnsupportedExtension, 3 => InsufficientMemory, 4 => RequestTooLong, 5 => ParseError, 6 => InvalidScreen, _ => Generic } } }