diff options
Diffstat (limited to 'src/x11/window')
-rw-r--r-- | src/x11/window/mod.rs | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/x11/window/mod.rs b/src/x11/window/mod.rs index d3c5163..efdc759 100644 --- a/src/x11/window/mod.rs +++ b/src/x11/window/mod.rs @@ -8,6 +8,7 @@ use std::sync::atomic::AtomicBool; use std::collections::RingBuf; use super::ffi; use std::sync::{Arc, Once, ONCE_INIT}; +use std::sync::{StaticMutex, MUTEX_INIT}; pub use self::monitor::{MonitorID, get_available_monitors, get_primary_monitor}; @@ -262,6 +263,10 @@ impl Window { // creating IM let im = unsafe { + // XOpenIM doesn't seem to be thread-safe + static GLOBAL_XOPENIM_LOCK: StaticMutex = MUTEX_INIT; + let _lock = GLOBAL_XOPENIM_LOCK.lock().unwrap(); + let im = ffi::XOpenIM(display, ptr::null(), ptr::null_mut(), ptr::null_mut()); if im.is_null() { return Err(OsError(format!("XOpenIM failed"))); @@ -562,8 +567,7 @@ impl Window { mem::transmute(buffer.as_mut_ptr()), buffer.len() as libc::c_int, ptr::null_mut(), ptr::null_mut()); - str::from_utf8(buffer.as_slice().slice_to(count as usize)) - .unwrap_or("").to_string() + str::from_utf8(&buffer.as_slice()[..count as usize]).unwrap_or("").to_string() }; for chr in written.as_slice().chars() { |