use std::os::unix::io;
use libdrm::drm;
use dharma::{EventHandler, EventKind, event_kind};
use qualia::StatePublishing;
struct PageFlipContext<P> where P: StatePublishing {
state_publisher: P,
}
impl<P> PageFlipContext<P> where P: StatePublishing {
pub fn new(state_publisher: P) -> Self {
PageFlipContext { state_publisher: state_publisher }
}
}
impl<P> drm::EventContext for PageFlipContext<P> where P: StatePublishing {
#[allow(unused_variables)]
fn vblank_handler(&mut self, fd: io::RawFd, sequence: u32, sec: u32, usec: u32, data: i32) {
self.state_publisher.emit_vblank(data);
}
#[allow(unused_variables)]
fn page_flip_handler(&mut self, fd: io::RawFd, sequence: u32, sec: u32, usec: u32, data: i32) {
self.state_publisher.emit_page_flip(data);
}
}
pub struct PageFlipEventHandler<P> where P: StatePublishing {
drm_fd: io::RawFd,
state_publisher: P,
}
impl<P> PageFlipEventHandler<P> where P: StatePublishing {
pub fn new(fd: io::RawFd, state_publisher: P) -> Self {
PageFlipEventHandler {
drm_fd: fd,
state_publisher: state_publisher,
}
}
}
impl<P> EventHandler for PageFlipEventHandler<P> where P: 'static + StatePublishing + Send + Clone {
fn get_fd(&self) -> io::RawFd {
self.drm_fd
}
fn process_event(&mut self, event_kind: EventKind) {
if event_kind.intersects(event_kind::READ) {
let ctx = Box::new(PageFlipContext::new(self.state_publisher.clone()));
drm::handle_event(self.drm_fd, ctx);
} else if event_kind.intersects(event_kind::HANGUP) {
}
}
}