diff --git a/src/x11/window/mod.rs b/src/x11/window/mod.rs index efdc759d..d412ce07 100644 --- a/src/x11/window/mod.rs +++ b/src/x11/window/mod.rs @@ -7,7 +7,7 @@ use std::cell::Cell; use std::sync::atomic::AtomicBool; use std::collections::RingBuf; use super::ffi; -use std::sync::{Arc, Once, ONCE_INIT}; +use std::sync::{Arc, Once, ONCE_INIT, Weak}; use std::sync::{StaticMutex, MUTEX_INIT}; pub use self::monitor::{MonitorID, get_available_monitors, get_primary_monitor}; @@ -36,7 +36,7 @@ fn ensure_thread_init() { fn with_c_str(s: &str, f: F) -> T where F: FnOnce(*const libc::c_char) -> T { use std::ffi::CString; let c_str = CString::from_slice(s.as_bytes()); - f(c_str.as_slice_with_nul().as_ptr()) + f(c_str.as_slice_with_nul().as_ptr()) } struct XWindow { @@ -50,6 +50,9 @@ struct XWindow { im: ffi::XIM, } +unsafe impl Send for XWindow {} +unsafe impl Sync for XWindow {} + unsafe impl Send for Window {} unsafe impl Sync for Window {} @@ -74,25 +77,30 @@ impl Drop for XWindow { #[derive(Clone)] pub struct WindowProxy { - x: Arc, + x: Weak, } impl WindowProxy { pub fn wakeup_event_loop(&self) { - let mut xev = ffi::XClientMessageEvent { - type_: ffi::ClientMessage, - window: self.x.window, - format: 32, - message_type: 0, - serial: 0, - send_event: 0, - display: self.x.display, - l: [0, 0, 0, 0, 0], - }; + match self.x.upgrade() { + Some(x) => { + let mut xev = ffi::XClientMessageEvent { + type_: ffi::ClientMessage, + window: x.window, + format: 32, + message_type: 0, + serial: 0, + send_event: 0, + display: x.display, + l: [0, 0, 0, 0, 0], + }; - unsafe { - ffi::XSendEvent(self.x.display, self.x.window, 0, 0, mem::transmute(&mut xev)); - ffi::XFlush(self.x.display); + unsafe { + ffi::XSendEvent(x.display, x.window, 0, 0, mem::transmute(&mut xev)); + ffi::XFlush(x.display); + } + } + None => {} } } } @@ -488,7 +496,7 @@ impl Window { pub fn create_window_proxy(&self) -> WindowProxy { WindowProxy { - x: self.x.clone() + x: self.x.downgrade() } }