diff --git a/libretrogd/src/system/event.rs b/libretrogd/src/system/event.rs index ae7ce62..886d8a7 100644 --- a/libretrogd/src/system/event.rs +++ b/libretrogd/src/system/event.rs @@ -187,3 +187,38 @@ impl From for SystemEvent { } } } + +pub trait SystemEventHandler { + /// Processes the data from the given [`SystemEvent`]. Returns true if the processing actually + /// recognized the passed event, or false if the event was ignored. + fn handle_event(&mut self, event: &SystemEvent) -> bool; +} + +pub struct SystemEventIterator<'a> { + iter: sdl2::event::EventPollIterator<'a>, +} + +impl Iterator for SystemEventIterator<'_> { + type Item = SystemEvent; + + fn next(&mut self) -> Option { + self.iter.next().map(|e| e.into()) + } +} + +pub struct SystemEventPump { + sdl_event_pump: sdl2::EventPump, +} + +impl SystemEventPump { + pub fn from(pump: sdl2::EventPump) -> Self { + SystemEventPump { + sdl_event_pump: pump, + } + } + + pub fn poll_iter(&mut self) -> SystemEventIterator { + self.sdl_event_pump.pump_events(); + SystemEventIterator { iter: self.sdl_event_pump.poll_iter() } + } +} diff --git a/libretrogd/src/system/mod.rs b/libretrogd/src/system/mod.rs index 668bcc2..20e2fe9 100644 --- a/libretrogd/src/system/mod.rs +++ b/libretrogd/src/system/mod.rs @@ -1,7 +1,7 @@ use std::fmt::Formatter; use byte_slice_cast::AsByteSlice; -use sdl2::{AudioSubsystem, EventPump, Sdl, TimerSubsystem, VideoSubsystem}; +use sdl2::{AudioSubsystem, Sdl, TimerSubsystem, VideoSubsystem}; use sdl2::audio::AudioSpecDesired; use sdl2::pixels::PixelFormatEnum; use sdl2::render::{Texture, WindowCanvas}; @@ -310,6 +310,8 @@ impl SystemBuilder { audio.resume(); let audio_queue = AudioQueue::new(&audio); + let event_pump = SystemEventPump::from(sdl_event_pump); + // create input device objects, exposed to the application let keyboard = Keyboard::new(); @@ -323,7 +325,6 @@ impl SystemBuilder { sdl_canvas, sdl_texture, sdl_texture_pitch, - sdl_event_pump, texture_pixels, audio, audio_queue, @@ -332,6 +333,7 @@ impl SystemBuilder { font, keyboard, mouse, + event_pump, target_framerate: self.target_framerate, target_framerate_delta: None, next_tick: 0, @@ -351,7 +353,6 @@ pub struct System { sdl_canvas: WindowCanvas, sdl_texture: Texture, sdl_texture_pitch: usize, - sdl_event_pump: EventPump, texture_pixels: Box<[u32]>, @@ -387,6 +388,8 @@ pub struct System { /// The current mouse state. To ensure it is updated each frame, you should call /// [`System::do_events`] or [`System::do_events_with`] each frame. pub mouse: Mouse, + + pub event_pump: SystemEventPump, } impl std::fmt::Debug for System { @@ -481,8 +484,7 @@ impl System { { self.keyboard.update(); self.mouse.update(); - self.sdl_event_pump.pump_events(); - for event in self.sdl_event_pump.poll_iter() { + for event in self.event_pump.poll_iter() { let event = event.into(); self.keyboard.handle_event(&event); self.mouse.handle_event(&event);