diff --git a/winit-orbital/src/event_loop.rs b/winit-orbital/src/event_loop.rs index 8ef97156c..2247e5ec3 100644 --- a/winit-orbital/src/event_loop.rs +++ b/winit-orbital/src/event_loop.rs @@ -639,7 +639,15 @@ impl EventLoop { // Wait for event if needed. let mut event = syscall::Event::default(); - self.window_target.event_socket.read(&mut event).unwrap(); + loop { + match self.window_target.event_socket.read(&mut event) { + Ok(_) => break, + Err(syscall::Error { errno: syscall::EINTR }) => continue, + Err(err) => { + return Err(os_error!(format!("failed to read event: {err}")).into()); + }, + } + } // TODO: handle spurious wakeups (redraw caused wakeup but redraw already handled) match requested_resume { diff --git a/winit/src/changelog/unreleased.md b/winit/src/changelog/unreleased.md index b3a435f9d..62121352c 100644 --- a/winit/src/changelog/unreleased.md +++ b/winit/src/changelog/unreleased.md @@ -47,3 +47,4 @@ changelog entry. ### Fixed - On X11, fix `set_hittest` not working on some window managers. +- On Redox, handle `EINTR` when reading from `event_socket` instead of panicking.