mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2024-12-23 22:01:31 +11:00
Merge pull request #144 from jwilm/fix-x11-wait-event-busy-loop
Fix busy loop in X11 WaitEventsIterator
This commit is contained in:
commit
449f7d9d90
|
@ -158,18 +158,26 @@ impl<'a> Iterator for PollEventsIterator<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut xev = unsafe { mem::uninitialized() };
|
let mut xev = unsafe { mem::uninitialized() };
|
||||||
let res = unsafe { (xlib.XCheckMaskEvent)(self.window.x.display.display, -1, &mut xev) };
|
|
||||||
|
|
||||||
if res == 0 {
|
// Get the next X11 event. XNextEvent will block if there's no
|
||||||
let res = unsafe { (xlib.XCheckTypedEvent)(self.window.x.display.display, ffi::ClientMessage, &mut xev) };
|
// events available; checking the count first ensures an event will
|
||||||
|
// be returned without blocking.
|
||||||
if res == 0 {
|
//
|
||||||
let res = unsafe { (xlib.XCheckTypedEvent)(self.window.x.display.display, ffi::GenericEvent, &mut xev) };
|
// Functions like XCheckTypedEvent can prevent events from being
|
||||||
if res == 0 {
|
// popped if they are of the wrong type in which case winit would
|
||||||
return None;
|
// enter a busy loop. To avoid that, XNextEvent is used to pop
|
||||||
}
|
// events off the queue since it will accept any event type.
|
||||||
|
unsafe {
|
||||||
|
let count = (xlib.XPending)(self.window.x.display.display);
|
||||||
|
if count == 0 {
|
||||||
|
return None;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
let res = (xlib.XNextEvent)(self.window.x.display.display, &mut xev);
|
||||||
|
|
||||||
|
// Can res ever be none zero if count is > 0?
|
||||||
|
assert!(res == 0);
|
||||||
|
};
|
||||||
|
|
||||||
match xev.get_type() {
|
match xev.get_type() {
|
||||||
ffi::MappingNotify => {
|
ffi::MappingNotify => {
|
||||||
|
|
Loading…
Reference in a new issue