linux: only tick the main thread tasks and one at a time in the event loop

Dzmitry Malyshau created

Change summary

crates/gpui/screenshot.png                   | 0 
crates/gpui/src/platform/linux/dispatcher.rs | 7 +++++++
crates/gpui/src/platform/linux/platform.rs   | 7 +++----
3 files changed, 10 insertions(+), 4 deletions(-)

Detailed changes

crates/gpui/src/platform/linux/dispatcher.rs 🔗

@@ -46,6 +46,13 @@ impl LinuxDispatcher {
             main_thread_id: thread::current().id(),
         }
     }
+
+    pub fn tick_main(&self) {
+        assert!(self.is_main_thread());
+        if let Ok(runnable) = self.main_receiver.try_recv() {
+            runnable.run();
+        }
+    }
 }
 
 impl PlatformDispatcher for LinuxDispatcher {

crates/gpui/src/platform/linux/platform.rs 🔗

@@ -3,9 +3,8 @@
 use crate::{
     Action, AnyWindowHandle, BackgroundExecutor, Bounds, ClipboardItem, CursorStyle, DisplayId,
     ForegroundExecutor, Keymap, LinuxDispatcher, LinuxDisplay, LinuxTextSystem, LinuxWindow,
-    LinuxWindowState, Menu, PathPromptOptions, Platform, PlatformDispatcher as _, PlatformDisplay,
-    PlatformInput, PlatformTextSystem, PlatformWindow, Point, Result, SemanticVersion, Size, Task,
-    WindowOptions,
+    LinuxWindowState, Menu, PathPromptOptions, Platform, PlatformDisplay, PlatformInput,
+    PlatformTextSystem, PlatformWindow, Point, Result, SemanticVersion, Size, Task, WindowOptions,
 };
 
 use collections::{HashMap, HashSet};
@@ -121,7 +120,7 @@ impl Platform for LinuxPlatform {
                 }
                 _ => {}
             }
-            self.0.lock().dispatcher.tick(false);
+            self.0.lock().dispatcher.tick_main();
         }
     }