From 42f0671531155a2a468de31f9b3ea545d29c4eb1 Mon Sep 17 00:00:00 2001
From: Francesca Frangipane <francesca@comfysoft.net>
Date: Sat, 21 Apr 2018 11:53:57 -0400
Subject: [PATCH] x11: Windows are Sync again (#474)

* x11: Windows are Sync again

Fixes #472

* Add test ensuring that Window is Sync

Window must be Sync for Vulkano's Arc<FramebufferAbstract> to be usable.
---
 src/platform/linux/x11/mod.rs | 9 ++++++---
 tests/sync_object.rs          | 9 +++++++++
 2 files changed, 15 insertions(+), 3 deletions(-)
 create mode 100644 tests/sync_object.rs

diff --git a/src/platform/linux/x11/mod.rs b/src/platform/linux/x11/mod.rs
index f0e0fa01..a46f9195 100644
--- a/src/platform/linux/x11/mod.rs
+++ b/src/platform/linux/x11/mod.rs
@@ -1004,7 +1004,7 @@ pub struct Window {
     pub window: Arc<Window2>,
     display: Weak<XConnection>,
     windows: Weak<Mutex<HashMap<WindowId, WindowData>>>,
-    ime_sender: ImeSender,
+    ime_sender: Mutex<ImeSender>,
 }
 
 impl ::std::ops::Deref for Window {
@@ -1038,7 +1038,7 @@ impl Window {
             window: win,
             windows: Arc::downgrade(&x_events_loop.windows),
             display: Arc::downgrade(&x_events_loop.display),
-            ime_sender: x_events_loop.ime_sender.clone(),
+            ime_sender: Mutex::new(x_events_loop.ime_sender.clone()),
         })
     }
 
@@ -1049,7 +1049,10 @@ impl Window {
 
     #[inline]
     pub fn send_xim_spot(&self, x: i16, y: i16) {
-        let _ = self.ime_sender.send((self.window.id().0, x, y));
+        let _ = self.ime_sender
+            .lock()
+            .unwrap()
+            .send((self.window.id().0, x, y));
     }
 }
 
diff --git a/tests/sync_object.rs b/tests/sync_object.rs
new file mode 100644
index 00000000..eb9a06e3
--- /dev/null
+++ b/tests/sync_object.rs
@@ -0,0 +1,9 @@
+extern crate winit;
+
+fn needs_sync<T:Sync>() {}
+
+#[test]
+fn window_sync() {
+    // ensures that `winit::Window` implements `Sync`
+    needs_sync::<winit::Window>();
+}