mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2025-02-24 00:37:43 +11:00
commit
4f2515f91e
2 changed files with 34 additions and 10 deletions
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "winit"
|
name = "winit"
|
||||||
version = "0.6.3"
|
version = "0.6.4"
|
||||||
authors = ["The winit contributors, Pierre Krieger <pierre.krieger1708@gmail.com>"]
|
authors = ["The winit contributors, Pierre Krieger <pierre.krieger1708@gmail.com>"]
|
||||||
description = "Cross-platform window creation library."
|
description = "Cross-platform window creation library."
|
||||||
keywords = ["windowing"]
|
keywords = ["windowing"]
|
||||||
|
|
|
@ -103,6 +103,24 @@ impl EventsLoop {
|
||||||
|
|
||||||
pub fn interrupt(&self) {
|
pub fn interrupt(&self) {
|
||||||
self.interrupted.store(true, ::std::sync::atomic::Ordering::Relaxed);
|
self.interrupted.store(true, ::std::sync::atomic::Ordering::Relaxed);
|
||||||
|
|
||||||
|
// Push an event on the X event queue so that methods like run_forever will advance.
|
||||||
|
let mut xev = ffi::XClientMessageEvent {
|
||||||
|
type_: ffi::ClientMessage,
|
||||||
|
window: self.root,
|
||||||
|
format: 32,
|
||||||
|
message_type: 0,
|
||||||
|
serial: 0,
|
||||||
|
send_event: 0,
|
||||||
|
display: self.display.display,
|
||||||
|
data: unsafe { mem::zeroed() },
|
||||||
|
};
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
(self.display.xlib.XSendEvent)(self.display.display, self.root, 0, 0, mem::transmute(&mut xev));
|
||||||
|
(self.display.xlib.XFlush)(self.display.display);
|
||||||
|
self.display.check_errors().expect("Failed to call XSendEvent after wakeup");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn poll_events<F>(&self, mut callback: F)
|
pub fn poll_events<F>(&self, mut callback: F)
|
||||||
|
@ -111,16 +129,22 @@ impl EventsLoop {
|
||||||
let xlib = &self.display.xlib;
|
let xlib = &self.display.xlib;
|
||||||
|
|
||||||
let mut xev = unsafe { mem::uninitialized() };
|
let mut xev = unsafe { mem::uninitialized() };
|
||||||
unsafe {
|
loop {
|
||||||
// Ensure XNextEvent won't block
|
// Get next event
|
||||||
let count = (xlib.XPending)(self.display.display);
|
unsafe {
|
||||||
if count == 0 {
|
// Ensure XNextEvent won't block
|
||||||
return;
|
let count = (xlib.XPending)(self.display.display);
|
||||||
|
if count == 0 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
(xlib.XNextEvent)(self.display.display, &mut xev);
|
||||||
|
}
|
||||||
|
self.process_event(&mut xev, &mut callback);
|
||||||
|
if self.interrupted.load(::std::sync::atomic::Ordering::Relaxed) {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
(xlib.XNextEvent)(self.display.display, &mut xev);
|
|
||||||
}
|
}
|
||||||
self.process_event(&mut xev, &mut callback);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run_forever<F>(&self, mut callback: F)
|
pub fn run_forever<F>(&self, mut callback: F)
|
||||||
|
@ -228,7 +252,7 @@ impl EventsLoop {
|
||||||
|
|
||||||
let mut ev_mods = ModifiersState::default();
|
let mut ev_mods = ModifiersState::default();
|
||||||
|
|
||||||
let mut keysym = unsafe {
|
let keysym = unsafe {
|
||||||
(self.display.xlib.XKeycodeToKeysym)(self.display.display, xkev.keycode as ffi::KeyCode, 0)
|
(self.display.xlib.XKeycodeToKeysym)(self.display.display, xkev.keycode as ffi::KeyCode, 0)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue