poll_event

This commit is contained in:
2026-05-23 10:49:32 +02:00
parent 2f8d23f6cd
commit 2d81471820
3 changed files with 23 additions and 11 deletions
+9 -6
View File
@@ -31,14 +31,11 @@ fn main() {
while !p.should_close() { while !p.should_close() {
p.poll_events(None); p.poll_events(None);
// drain_events() borrowt &mut self → close erst nach dem Loop setzen. while let Some(ev) = p.poll_event() {
let mut close = false;
for ev in p.drain_events() {
if let Event::Key { key: Key::Escape, pressed: true, .. } = ev { if let Event::Key { key: Key::Escape, pressed: true, .. } = ev {
close = true; p.request_close();
} }
} }
if close { p.request_close(); }
let (w, _h) = p.framebuffer_size(); let (w, _h) = p.framebuffer_size();
let fb = p.framebuffer_mut(); let fb = p.framebuffer_mut();
@@ -58,8 +55,14 @@ fn main() {
Default = 800×600 Fenster, 320×240 Framebuffer, 4:3, `palette::RGB332`. Default = 800×600 Fenster, 320×240 Framebuffer, 4:3, `palette::RGB332`.
- `Platform::new(cfg)` Fenster + GPU-Pipeline aufsetzen. - `Platform::new(cfg)` Fenster + GPU-Pipeline aufsetzen.
- `poll_events(timeout)` winit-Events einlesen (`None` = blockierend). - `poll_events(timeout)` winit-Events einlesen (`None` = blockierend).
- `poll_event() -> Option<Event>` ein Event aus der Queue holen. Gibt
`&mut self` nach jedem Call frei, sodass im Loop direkt auf die Platform
reagiert werden kann (`request_close`, `set_mouse_capture`, `palette_mut` …).
Empfohlen für die normale Event-Schleife.
- `drain_events()` Iterator über `Event` (`Key`, `Char`, `MouseMove`, - `drain_events()` Iterator über `Event` (`Key`, `Char`, `MouseMove`,
`MouseBtn`, `Resize`, `CloseRequested`). `MouseBtn`, `Resize`, `CloseRequested`). Borrowt `&mut self` bis der
Iterator fertig ist — Reaktionen auf die Platform müssen dann nach dem
Loop angewandt werden. Nützlich für reines Loggen/Filtern.
- `framebuffer_mut()` `&mut [u8]` der Länge `w*h`, je Pixel ein Paletten-Index. - `framebuffer_mut()` `&mut [u8]` der Länge `w*h`, je Pixel ein Paletten-Index.
- `palette_mut()` / `palette()` `&mut [[u8; 3]; 256]` bzw. `&[...]`; Schreibzugriff - `palette_mut()` / `palette()` `&mut [[u8; 3]; 256]` bzw. `&[...]`; Schreibzugriff
markiert die Palette dirty, der nächste `present()` lädt sie hoch. markiert die Palette dirty, der nächste `present()` lädt sie hoch.
+6 -5
View File
@@ -28,17 +28,18 @@ fn main() {
// Event schlafen — gut für statische UIs, schlecht für Animation. // Event schlafen — gut für statische UIs, schlecht für Animation.
p.poll_events(Some(Duration::from_millis(0))); p.poll_events(Some(Duration::from_millis(0)));
// drain_events() borrowt &mut self → Aktionen auf p erst nach dem Loop. // poll_event() gibt &mut self nach jedem Call wieder frei → Aktionen
let mut close = false; // auf p (request_close, set_mouse_capture, palette_mut …) sind direkt
for ev in p.drain_events() { // im Loop erlaubt. drain_events() existiert weiter für den Fall, dass
// nur gelesen wird.
while let Some(ev) = p.poll_event() {
match ev { match ev {
Event::Key { key: Key::Escape, pressed: true, .. } => close = true, Event::Key { key: Key::Escape, pressed: true, .. } => p.request_close(),
Event::MouseMove { x, y } => mouse = (x, y), Event::MouseMove { x, y } => mouse = (x, y),
Event::MouseBtn { button: MouseButton::Left, pressed } => paint = pressed, Event::MouseBtn { button: MouseButton::Left, pressed } => paint = pressed,
_ => {} _ => {}
} }
} }
if close { p.request_close(); }
let (w, h) = p.framebuffer_size(); let (w, h) = p.framebuffer_size();
let fb = p.framebuffer_mut(); let fb = p.framebuffer_mut();
+8
View File
@@ -311,6 +311,14 @@ impl Platform {
self.event_queue.drain(..) self.event_queue.drain(..)
} }
/// Holt ein einzelnes Event aus der Queue. Gibt `&mut self` nach jedem Call
/// wieder frei, im Gegensatz zu `drain_events()` — sodass im Loop direkt
/// auf die Platform reagiert werden kann (`request_close`, `set_mouse_capture`,
/// `palette_mut` …).
pub fn poll_event(&mut self) -> Option<Event> {
self.event_queue.pop_front()
}
pub fn framebuffer_mut(&mut self) -> &mut [u8] { &mut self.framebuffer } pub fn framebuffer_mut(&mut self) -> &mut [u8] { &mut self.framebuffer }
pub fn framebuffer_size(&self) -> (u32, u32) { self.framebuffer_size } pub fn framebuffer_size(&self) -> (u32, u32) { self.framebuffer_size }