Skip to content

Commit a9ed766

Browse files
Remove doc(hidden) hack for get_wrapped_event
Factor it out into a module higher up the tree.
1 parent 0d5fd95 commit a9ed766

File tree

5 files changed

+141
-154
lines changed

5 files changed

+141
-154
lines changed

src/ext/event.rs

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
use csfml_window_sys as sys;
2+
use csfml_window_sys::*;
3+
use window::event;
4+
5+
fn type_(evt: &mut sfEvent) -> *mut sfEventType {
6+
unsafe { ::std::mem::transmute(evt) }
7+
}
8+
9+
fn size(evt: &mut sfEvent) -> event::Event {
10+
let e: *mut sfSizeEvent = unsafe { ::std::mem::transmute(evt) };
11+
unsafe { event::Resized { width: (*e).width, height: (*e).height } }
12+
}
13+
14+
fn key(evt: &mut sfEvent, type_: sfEventType) -> event::Event {
15+
let e: *mut sfKeyEvent = unsafe { ::std::mem::transmute(evt) };
16+
let code = unsafe { ::std::mem::transmute((*e).code as i64) };
17+
let alt = unsafe { (*e).alt.to_bool() };
18+
let ctrl = unsafe { (*e).control.to_bool() };
19+
let shift = unsafe { (*e).shift.to_bool() };
20+
let system = unsafe { (*e).system.to_bool() };
21+
match type_ {
22+
sys::sfEvtKeyPressed => {
23+
event::KeyPressed {
24+
code: code,
25+
alt: alt,
26+
ctrl: ctrl,
27+
shift: shift,
28+
system: system
29+
}
30+
},
31+
sys::sfEvtKeyReleased => {
32+
event::KeyReleased {
33+
code: code,
34+
alt: alt,
35+
ctrl: ctrl,
36+
shift: shift,
37+
system: system
38+
}
39+
},
40+
_ => unreachable!()
41+
}
42+
}
43+
44+
fn text(evt: &mut sfEvent) -> event::Event {
45+
let e: *mut sfTextEvent = unsafe { ::std::mem::transmute(evt) };
46+
unsafe { event::TextEntered { code: ((*e).unicode as u8) as char } }
47+
}
48+
49+
fn mouse_move(evt: &mut sfEvent) -> event::Event {
50+
let e: *mut sfMouseMoveEvent = unsafe { ::std::mem::transmute(evt) };
51+
unsafe { event::MouseMoved {x: (*e).x, y: (*e).y } }
52+
}
53+
54+
fn mouse_button(evt: &mut sfEvent, type_: sfEventType) -> event::Event {
55+
let e: *mut sfMouseButtonEvent = unsafe { ::std::mem::transmute(evt) };
56+
let button = unsafe { ::std::mem::transmute((*e).button as u8) };
57+
let x = unsafe { (*e).x };
58+
let y = unsafe { (*e).y };
59+
60+
match type_ {
61+
sys::sfEvtMouseButtonReleased => event::MouseButtonReleased { button: button, x: x, y: y },
62+
sys::sfEvtMouseButtonPressed => event::MouseButtonPressed { button: button, x: x, y: y },
63+
_ => unreachable!()
64+
}
65+
}
66+
67+
fn mouse_wheel(evt: &mut sfEvent) -> event::Event {
68+
let e: *mut sfMouseWheelEvent = unsafe { ::std::mem::transmute(evt) };
69+
unsafe { event::MouseWheelMoved { delta: (*e).delta, x: (*e).x, y: (*e).y } }
70+
}
71+
72+
fn joystick_move(evt: &mut sfEvent) -> event::Event {
73+
let e: *mut sfJoystickMoveEvent = unsafe { ::std::mem::transmute(evt) };
74+
event::JoystickMoved {
75+
joystickid: unsafe { (*e).joystickid },
76+
axis: unsafe { ::std::mem::transmute((*e).axis as u8) },
77+
position: unsafe { (*e).position }
78+
}
79+
}
80+
81+
fn joystick_button(evt: &mut sfEvent, type_: sfEventType) -> event::Event {
82+
let e: *mut sfJoystickButtonEvent = unsafe { ::std::mem::transmute(evt) };
83+
let jid = unsafe { (*e).joystickid };
84+
let btn = unsafe { (*e).button };
85+
86+
match type_ {
87+
sys::sfEvtJoystickButtonPressed =>
88+
event::JoystickButtonPressed { joystickid: jid, button: btn },
89+
sys::sfEvtJoystickButtonReleased =>
90+
event::JoystickButtonReleased { joystickid: jid, button: btn },
91+
_ => unreachable!()
92+
}
93+
}
94+
95+
fn joystick_connect(evt: &mut sfEvent, type_: sfEventType) -> event::Event {
96+
let e: *mut sfJoystickConnectEvent = unsafe { ::std::mem::transmute(evt) };
97+
let jid = unsafe { (*e).joystickid };
98+
99+
match type_ {
100+
sys::sfEvtJoystickConnected => event::JoystickConnected { joystickid: jid },
101+
sys::sfEvtJoystickDisconnected => event::JoystickDisconnected { joystickid: jid},
102+
_ => unreachable!()
103+
}
104+
}
105+
106+
pub fn get_wrapped_event(event: &mut ::csfml_window_sys::sfEvent) -> event::Event {
107+
let type_ = unsafe { *type_(event) };
108+
109+
match type_ {
110+
sys::sfEvtClosed => event::Closed,
111+
sys::sfEvtResized => size(event),
112+
sys::sfEvtLostFocus => event::LostFocus,
113+
sys::sfEvtGainedFocus => event::GainedFocus,
114+
sys::sfEvtTextEntered => text(event),
115+
sys::sfEvtKeyPressed => key(event, type_),
116+
sys::sfEvtKeyReleased => key(event, type_),
117+
sys::sfEvtMouseWheelMoved => mouse_wheel(event),
118+
sys::sfEvtMouseButtonPressed => mouse_button(event, type_),
119+
sys::sfEvtMouseButtonReleased => mouse_button(event, type_),
120+
sys::sfEvtMouseMoved => mouse_move(event),
121+
sys::sfEvtMouseEntered => event::MouseEntered,
122+
sys::sfEvtMouseLeft => event::MouseLeft,
123+
sys::sfEvtJoystickButtonPressed => joystick_button(event, type_),
124+
sys::sfEvtJoystickButtonReleased => joystick_button(event, type_),
125+
sys::sfEvtJoystickMoved => joystick_move(event),
126+
sys::sfEvtJoystickConnected => joystick_connect(event, type_),
127+
sys::sfEvtJoystickDisconnected => joystick_connect(event, type_),
128+
_ => event::NoEvent
129+
}
130+
}

src/graphics/render_window.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ use graphics::{Drawable, Color, CircleShape, RectangleShape, Text, Sprite, Verte
4242
use sfml_types::sfBool;
4343
use csfml_graphics_sys as ffi;
4444
use std::marker::PhantomData;
45+
use ext;
4546

4647
/// Window that can serve as a target for 2D drawing.
4748
///
@@ -199,7 +200,7 @@ impl RenderWindow {
199200
ffi::sfRenderWindow_pollEvent(self.render_window, &mut event)
200201
}.to_bool();
201202
if have_event {
202-
event::raw::get_wrapped_event(&mut event)
203+
ext::event::get_wrapped_event(&mut event)
203204
} else {
204205
event::NoEvent
205206
}
@@ -222,7 +223,7 @@ impl RenderWindow {
222223
ffi::sfRenderWindow_waitEvent(self.render_window, &mut event)
223224
}.to_bool();
224225
if have_event {
225-
event::raw::get_wrapped_event(&mut event)
226+
ext::event::get_wrapped_event(&mut event)
226227
} else {
227228
event::NoEvent
228229
}
@@ -867,7 +868,7 @@ impl<'a> Iterator for Events<'a> {
867868
fn next(&mut self) -> Option<event::Event> {
868869
let mut event = ::csfml_window_sys::sfEvent { data: [032; 6] };
869870
if unsafe { ffi::sfRenderWindow_pollEvent(self.render_window, &mut event) }.to_bool() {
870-
Some(event::raw::get_wrapped_event(&mut event))
871+
Some(ext::event::get_wrapped_event(&mut event))
871872
} else {
872873
None
873874
}

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ extern crate csfml_network_sys;
105105

106106
mod inputstream;
107107
mod raw_conv;
108+
mod ext {
109+
pub mod event;
110+
}
108111

109112
pub mod system;
110113
pub mod window;

src/window/event.rs

Lines changed: 0 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -158,151 +158,3 @@ pub enum Event {
158158
/// No Event
159159
NoEvent
160160
}
161-
162-
#[doc(hidden)]
163-
#[allow(non_upper_case_globals, non_camel_case_types)]
164-
pub mod raw {
165-
use csfml_window_sys::*;
166-
167-
trait sfEventExt {
168-
fn type_(&mut self) -> *mut sfEventType;
169-
fn size(&mut self) -> super::Event;
170-
fn key(&mut self, type_: sfEventType) -> super::Event;
171-
fn text(&mut self) -> super::Event;
172-
fn mouse_move(&mut self) -> super::Event;
173-
fn mouse_button(&mut self, type_: sfEventType) -> super::Event;
174-
fn mouse_wheel(&mut self) -> super::Event;
175-
fn joystick_move(&mut self) -> super::Event;
176-
fn joystick_button(&mut self, type_: sfEventType) -> super::Event;
177-
fn joystick_connect(&mut self, type_: sfEventType) -> super::Event;
178-
}
179-
180-
impl sfEventExt for sfEvent {
181-
fn type_(&mut self) -> *mut sfEventType {
182-
unsafe { ::std::mem::transmute(self) }
183-
}
184-
185-
fn size(&mut self) -> super::Event {
186-
let e: *mut sfSizeEvent = unsafe { ::std::mem::transmute(self) };
187-
unsafe { super::Resized { width: (*e).width, height: (*e).height } }
188-
}
189-
190-
fn key(&mut self, type_: sfEventType) -> super::Event {
191-
let e: *mut sfKeyEvent = unsafe { ::std::mem::transmute(self) };
192-
let code = unsafe { ::std::mem::transmute((*e).code as i64) };
193-
let alt = unsafe { (*e).alt.to_bool() };
194-
let ctrl = unsafe { (*e).control.to_bool() };
195-
let shift = unsafe { (*e).shift.to_bool() };
196-
let system = unsafe { (*e).system.to_bool() };
197-
match type_ {
198-
sfEvtKeyPressed => {
199-
super::KeyPressed {
200-
code: code,
201-
alt: alt,
202-
ctrl: ctrl,
203-
shift: shift,
204-
system: system
205-
}
206-
},
207-
sfEvtKeyReleased => {
208-
super::KeyReleased {
209-
code: code,
210-
alt: alt,
211-
ctrl: ctrl,
212-
shift: shift,
213-
system: system
214-
}
215-
},
216-
_ => unreachable!()
217-
}
218-
}
219-
220-
fn text(&mut self) -> super::Event {
221-
let e: *mut sfTextEvent = unsafe { ::std::mem::transmute(self) };
222-
unsafe { super::TextEntered { code: ((*e).unicode as u8) as char } }
223-
}
224-
225-
fn mouse_move(&mut self) -> super::Event {
226-
let e: *mut sfMouseMoveEvent = unsafe { ::std::mem::transmute(self) };
227-
unsafe { super::MouseMoved {x: (*e).x, y: (*e).y } }
228-
}
229-
230-
fn mouse_button(&mut self, type_: sfEventType) -> super::Event {
231-
let e: *mut sfMouseButtonEvent = unsafe { ::std::mem::transmute(self) };
232-
let button = unsafe { ::std::mem::transmute((*e).button as u8) };
233-
let x = unsafe { (*e).x };
234-
let y = unsafe { (*e).y };
235-
236-
match type_ {
237-
sfEvtMouseButtonReleased => super::MouseButtonReleased { button: button, x: x, y: y },
238-
sfEvtMouseButtonPressed => super::MouseButtonPressed { button: button, x: x, y: y },
239-
_ => unreachable!()
240-
}
241-
}
242-
243-
fn mouse_wheel(&mut self) -> super::Event {
244-
let e: *mut sfMouseWheelEvent = unsafe { ::std::mem::transmute(self) };
245-
unsafe { super::MouseWheelMoved { delta: (*e).delta, x: (*e).x, y: (*e).y } }
246-
}
247-
248-
fn joystick_move(&mut self) -> super::Event {
249-
let e: *mut sfJoystickMoveEvent = unsafe { ::std::mem::transmute(self) };
250-
super::JoystickMoved {
251-
joystickid: unsafe { (*e).joystickid },
252-
axis: unsafe { ::std::mem::transmute((*e).axis as u8) },
253-
position: unsafe { (*e).position }
254-
}
255-
}
256-
257-
fn joystick_button(&mut self, type_: sfEventType) -> super::Event {
258-
let e: *mut sfJoystickButtonEvent = unsafe { ::std::mem::transmute(self) };
259-
let jid = unsafe { (*e).joystickid };
260-
let btn = unsafe { (*e).button };
261-
262-
match type_ {
263-
sfEvtJoystickButtonPressed =>
264-
super::JoystickButtonPressed { joystickid: jid, button: btn },
265-
sfEvtJoystickButtonReleased =>
266-
super::JoystickButtonReleased { joystickid: jid, button: btn },
267-
_ => unreachable!()
268-
}
269-
}
270-
271-
fn joystick_connect(&mut self, type_: sfEventType) -> super::Event {
272-
let e: *mut sfJoystickConnectEvent = unsafe { ::std::mem::transmute(self) };
273-
let jid = unsafe { (*e).joystickid };
274-
275-
match type_ {
276-
sfEvtJoystickConnected => super::JoystickConnected { joystickid: jid },
277-
sfEvtJoystickDisconnected => super::JoystickDisconnected { joystickid: jid},
278-
_ => unreachable!()
279-
}
280-
}
281-
}
282-
283-
pub fn get_wrapped_event(event: &mut ::csfml_window_sys::sfEvent) -> super::Event {
284-
let type_ = unsafe { *event.type_() };
285-
286-
match type_ {
287-
sfEvtClosed => super::Closed,
288-
sfEvtResized => event.size(),
289-
sfEvtLostFocus => super::LostFocus,
290-
sfEvtGainedFocus => super::GainedFocus,
291-
sfEvtTextEntered => event.text(),
292-
sfEvtKeyPressed => event.key(type_),
293-
sfEvtKeyReleased => event.key(type_),
294-
sfEvtMouseWheelMoved => event.mouse_wheel(),
295-
sfEvtMouseButtonPressed => event.mouse_button(type_),
296-
sfEvtMouseButtonReleased => event.mouse_button(type_),
297-
sfEvtMouseMoved => event.mouse_move(),
298-
sfEvtMouseEntered => super::MouseEntered,
299-
sfEvtMouseLeft => super::MouseLeft,
300-
sfEvtJoystickButtonPressed => event.joystick_button(type_),
301-
sfEvtJoystickButtonReleased => event.joystick_button(type_),
302-
sfEvtJoystickMoved => event.joystick_move(),
303-
sfEvtJoystickConnected => event.joystick_connect(type_),
304-
sfEvtJoystickDisconnected => event.joystick_connect(type_),
305-
_ => super::NoEvent
306-
}
307-
}
308-
}

src/window/window.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ use sfml_types::{Vector2i, Vector2u};
3939

4040
use sfml_types::sfBool;
4141
use csfml_window_sys as ffi;
42+
use ext;
4243

4344
///
4445
/// Window manipulation
@@ -153,7 +154,7 @@ impl Window {
153154
ffi::sfWindow_pollEvent(self.window, &mut event).to_bool()
154155
};
155156
if have_event {
156-
event::raw::get_wrapped_event(&mut event)
157+
ext::event::get_wrapped_event(&mut event)
157158
} else {
158159
event::NoEvent
159160
}
@@ -176,7 +177,7 @@ impl Window {
176177
ffi::sfWindow_waitEvent(self.window, &mut event).to_bool()
177178
};
178179
if have_event {
179-
event::raw::get_wrapped_event(&mut event)
180+
ext::event::get_wrapped_event(&mut event)
180181
} else {
181182
event::NoEvent
182183
}
@@ -441,7 +442,7 @@ impl<'a> Iterator for Events<'a> {
441442
fn next(&mut self) -> Option<event::Event> {
442443
let mut event = ffi::sfEvent { data: [032; 6] };
443444
if unsafe { ffi::sfWindow_pollEvent(self.window, &mut event) }.to_bool() {
444-
Some(event::raw::get_wrapped_event(&mut event))
445+
Some(ext::event::get_wrapped_event(&mut event))
445446
} else {
446447
None
447448
}

0 commit comments

Comments
 (0)