Make CosmicTextSystem Linux-only (#14728)

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
This commit is contained in:
张小白 2024-07-26 01:40:49 +08:00 committed by GitHub
parent a60b3b9389
commit 82d6ad4616
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 11 additions and 28 deletions

View file

@ -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)]

View file

@ -1,3 +0,0 @@
mod text_system;
pub(crate) use text_system::*;

View file

@ -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::*;

View file

@ -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 {

View file

@ -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());

View file

@ -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 {

View file

@ -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());