#![feature(concat_idents)]
#![feature(type_ascription)]
#![feature(conservative_impl_trait)]
extern crate drm_sys;
extern crate libc;
extern crate smallvec;
#[macro_use]
extern crate error_chain;
#[macro_use]
mod util;
use util::*;
use control::Control;
use control::MasterControl;
pub mod result;
pub mod control;
use std::os::unix::io::{RawFd, AsRawFd};
use std::ptr::null_mut;
use libc::{ioctl, c_void, c_char};
use drm_sys::*;
use self::result::Result;
#[derive(Debug)]
pub struct DriverInfo {
ver: (i32, i32, i32),
name: Array<c_char>,
date: Array<c_char>,
desc: Array<c_char>
}
#[derive(Debug)]
pub struct AuthToken(u32);
#[derive(Debug)]
pub enum ClientCapability {
Stereo3D = DRM_CLIENT_CAP_STEREO_3D as isize,
UniversalPlanes = DRM_CLIENT_CAP_UNIVERSAL_PLANES as isize,
Atomic = DRM_CLIENT_CAP_ATOMIC as isize
}
pub trait Device : AsRawFd + Sized {
fn magic(&self) -> Result<AuthToken> {
let raw: drm_auth_t = Default::default();
ioctl!(self, MACRO_DRM_IOCTL_GET_MAGIC, &raw);
Ok(AuthToken(raw.magic))
}
fn stats(&self) -> Result<()> {
unimplemented!()
}
fn set_client_cap(&self, cap: ClientCapability, set: bool) -> Result<()> {
let mut raw: drm_set_client_cap = Default::default();
raw.capability = cap as u64;
raw.value = set as u64;
ioctl!(self, MACRO_DRM_IOCTL_SET_CLIENT_CAP, &raw);
Ok(())
}
fn wait_vblan(&self) -> () {
unimplemented!()
}
}
pub trait UnprivilegedDevice : Device {
fn set_master<'a>(&'a self) -> Result<MasterRef<'a, Self>> {
ioctl!(self, MACRO_DRM_IOCTL_SET_MASTER, null_mut() as *mut c_void);
Ok(MasterRef(self))
}
}
pub trait MasterDevice : Device {
fn drop_master(&self) -> Result<()> {
ioctl!(self, MACRO_DRM_IOCTL_DROP_MASTER, null_mut() as *mut c_void);
Ok(())
}
}
#[derive(Debug)]
pub struct MasterRef<'a, T>(&'a T) where T: 'a + Device;
impl<'a, T> AsRawFd for MasterRef<'a, T> where T: 'a + Device {
fn as_raw_fd(&self) -> RawFd {
self.0.as_raw_fd()
}
}
impl<'a, T> Device for MasterRef<'a, T> where T: 'a + Device {}
impl<'a, T> MasterDevice for MasterRef<'a, T> where T: 'a + Device {}
impl<'a, T> Control for MasterRef<'a, T> where T: 'a + Device {}
impl<'a, T> MasterControl for MasterRef<'a, T> where T: 'a + Device {}