Make `CosmicTextSystem` Linux-only (#14728)

张小白 created

Since `WindowsDispatcher` requires a minimum Windows version of Windows
10 Fall Creators Update (10.0.16299), and the `alacritty_terminal`
dependency relies on conPTY, an API introduced in the same version,
additionally, `DirectWriteTextSystem` also relies on Windows 10 Fall
Creators Update (10.0.16299), so it seems reasonable to make
`CosmicTextSystem` Linux-only. And we can use `DirectWriteTextSystem` on
the Windows platform exclusively. I hope this approach makes sense.

Release Notes:

- N/A

Change summary

crates/gpui/src/platform.rs                      |  8 --------
crates/gpui/src/platform/cosmic_text.rs          |  3 ---
crates/gpui/src/platform/linux.rs                |  2 ++
crates/gpui/src/platform/linux/text_system.rs    |  3 ---
crates/gpui/src/platform/test/platform.rs        |  2 +-
crates/gpui/src/platform/windows/direct_write.rs | 10 +++++-----
crates/gpui/src/platform/windows/platform.rs     | 11 +++--------
7 files changed, 11 insertions(+), 28 deletions(-)

Detailed changes

crates/gpui/src/platform.rs 🔗

@@ -4,9 +4,6 @@
 mod app_menu;
 mod keystroke;
 
-#[cfg(not(target_os = "macos"))]
-mod cosmic_text;
-
 #[cfg(target_os = "linux")]
 mod linux;
 
@@ -51,8 +48,6 @@ use uuid::Uuid;
 pub use app_menu::*;
 pub use keystroke::*;
 
-#[cfg(not(target_os = "macos"))]
-pub(crate) use cosmic_text::*;
 #[cfg(target_os = "linux")]
 pub(crate) use linux::*;
 #[cfg(target_os = "macos")]
@@ -105,7 +100,6 @@ pub fn guess_compositor() -> &'static str {
     }
 }
 
-// todo("windows")
 #[cfg(target_os = "windows")]
 pub(crate) fn current_platform(_headless: bool) -> Rc<dyn Platform> {
     Rc::new(WindowsPlatform::new())
@@ -413,8 +407,6 @@ pub(crate) trait PlatformTextSystem: Send + Sync {
         raster_bounds: Bounds<DevicePixels>,
     ) -> Result<(Size<DevicePixels>, Vec<u8>)>;
     fn layout_line(&self, text: &str, font_size: Pixels, runs: &[FontRun]) -> LineLayout;
-    #[cfg(target_os = "windows")]
-    fn destroy(&self);
 }
 
 #[derive(PartialEq, Eq, Hash, Clone)]

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

@@ -1,6 +1,7 @@
 mod dispatcher;
 mod headless;
 mod platform;
+mod text_system;
 mod wayland;
 mod x11;
 mod xdg_desktop_portal;
@@ -8,5 +9,6 @@ mod xdg_desktop_portal;
 pub(crate) use dispatcher::*;
 pub(crate) use headless::*;
 pub(crate) use platform::*;
+pub(crate) use text_system::*;
 pub(crate) use wayland::*;
 pub(crate) use x11::*;

crates/gpui/src/platform/cosmic_text/text_system.rs → crates/gpui/src/platform/linux/text_system.rs 🔗

@@ -177,9 +177,6 @@ impl PlatformTextSystem for CosmicTextSystem {
     fn layout_line(&self, text: &str, font_size: Pixels, runs: &[FontRun]) -> LineLayout {
         self.0.write().layout_line(text, font_size, runs)
     }
-
-    #[cfg(target_os = "windows")]
-    fn destroy(&self) {}
 }
 
 impl CosmicTextSystemState {

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

@@ -49,7 +49,7 @@ impl TestPlatform {
         let text_system = Arc::new(crate::platform::mac::MacTextSystem::new());
 
         #[cfg(target_os = "linux")]
-        let text_system = Arc::new(crate::platform::cosmic_text::CosmicTextSystem::new());
+        let text_system = Arc::new(crate::platform::linux::CosmicTextSystem::new());
 
         #[cfg(target_os = "windows")]
         let text_system = Arc::new(crate::platform::windows::DirectWriteTextSystem::new().unwrap());

crates/gpui/src/platform/windows/direct_write.rs 🔗

@@ -171,6 +171,11 @@ impl DirectWriteTextSystem {
             font_id_by_identifier: HashMap::default(),
         })))
     }
+
+    pub(crate) fn destroy(&self) {
+        let mut lock = self.0.write();
+        unsafe { ManuallyDrop::drop(&mut lock.components.bitmap_factory) };
+    }
 }
 
 impl PlatformTextSystem for DirectWriteTextSystem {
@@ -239,11 +244,6 @@ impl PlatformTextSystem for DirectWriteTextSystem {
                 ..Default::default()
             })
     }
-
-    fn destroy(&self) {
-        let mut lock = self.0.write();
-        unsafe { ManuallyDrop::drop(&mut lock.components.bitmap_factory) };
-    }
 }
 
 impl DirectWriteState {

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

@@ -49,7 +49,7 @@ pub(crate) struct WindowsPlatform {
     icon: HICON,
     background_executor: BackgroundExecutor,
     foreground_executor: ForegroundExecutor,
-    text_system: Arc<dyn PlatformTextSystem>,
+    text_system: Arc<DirectWriteTextSystem>,
     clipboard_hash_format: u32,
     clipboard_metadata_format: u32,
 }
@@ -90,13 +90,8 @@ impl WindowsPlatform {
         let dispatcher = Arc::new(WindowsDispatcher::new());
         let background_executor = BackgroundExecutor::new(dispatcher.clone());
         let foreground_executor = ForegroundExecutor::new(dispatcher);
-        let text_system = if let Some(direct_write) = DirectWriteTextSystem::new().log_err() {
-            log::info!("Using direct write text system.");
-            Arc::new(direct_write) as Arc<dyn PlatformTextSystem>
-        } else {
-            log::info!("Using cosmic text system.");
-            Arc::new(CosmicTextSystem::new()) as Arc<dyn PlatformTextSystem>
-        };
+        let text_system =
+            Arc::new(DirectWriteTextSystem::new().expect("Error creating DirectWriteTextSystem"));
         let icon = load_icon().unwrap_or_default();
         let state = RefCell::new(WindowsPlatformState::new());
         let raw_window_handles = RwLock::new(SmallVec::new());