1use glfw;
3pub use glfw::WindowEvent as Events;
4use std::rc::Rc;
5use std::sync::mpsc::Receiver;
6use window::Window;
7
8#[macro_export]
9macro_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
32pub 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
60pub 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}