gust_render/
event.rs

1//! Module to handle keyboard and mouse event one day
2use glfw;
3pub use glfw::WindowEvent as Events;
4use std::rc::Rc;
5use std::sync::mpsc::Receiver;
6use window::Window;
7
8#[macro_export]
9/// Should expand from pressed!(W) -> Events::Key(Key::W, _, Action::Pressed, _)
10macro_rules! pressed {
11    ($x:ident) => {
12        Events::Key(Key::$x, _, Action::Press, _)
13    }
14}
15
16#[macro_export]
17macro_rules! release {
18    ($x:ident) => {
19        Events::Key(Key::$x, _, Action::Release, _)
20    }
21}
22
23#[macro_export]
24macro_rules! repeat {
25    ($x:ident) => {
26        Events::Key(Key::$x, _, Action::Repeat, _)
27    }
28}
29
30pub type EventMessage<'a> = glfw::FlushedMessages<'a, (f64, Events)>;
31
32/// Event Wrap glfwEvent data
33pub type Event = (f64, Events);
34pub type EventReceiver = Rc<Receiver<(f64, glfw::WindowEvent)>>;
35
36pub struct EventHandler {
37    receiver: EventReceiver,
38}
39
40impl EventHandler {
41    pub fn new(window: &Window) -> EventHandler {
42        EventHandler {
43            receiver: Rc::clone(window.event()),
44        }
45    }
46
47    pub fn fetch(&self) -> EventIterator {
48        EventIterator::from(&*self)
49    }
50}
51
52impl<'a> Iterator for EventIterator<'a> {
53    type Item = Event;
54
55    fn next(&mut self) -> Option<Self::Item> {
56        self.fmsg.next()
57    }
58}
59
60/// EventIterator is an iterator on eventMessage to glob glfw Event system
61pub struct EventIterator<'a> {
62    fmsg: EventMessage<'a>,
63}
64
65impl<'a> From<&'a EventHandler> for EventIterator<'a> {
66    fn from(var: &'a EventHandler) -> EventIterator<'a> {
67        EventIterator {
68            fmsg: glfw::flush_messages(&var.receiver),
69        }
70    }
71}
72
73pub enum EventType {
74    Key,
75    Pos,
76    Close,
77    Size,
78    Refresh,
79    Focus,
80    Char,
81    CharMods,
82    MouseButton,
83    CursorPos,
84    CursorEnter,
85    Scroll,
86    FrameBuffer,
87}