diff --git a/Cargo.toml b/Cargo.toml index 2be8600b..b2afe43f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -114,7 +114,6 @@ tokio = { version = "1.24.2", optional = true } tracing = "0.1.41" unicode-segmentation = "1.6" url = "2.4.0" -ustr = { version = "1.0.0", features = ["serde"] } zbus = { version = "4.2.1", default-features = false, optional = true } [target.'cfg(unix)'.dependencies] diff --git a/src/config/mod.rs b/src/config/mod.rs index 14cf419e..5e264aed 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -6,14 +6,19 @@ use crate::cosmic_theme::Density; use cosmic_config::cosmic_config_derive::CosmicConfigEntry; use cosmic_config::{Config, CosmicConfigEntry}; -use iced::font::Family; use serde::{Deserialize, Serialize}; -use std::sync::{LazyLock, RwLock}; -use ustr::Ustr; +use std::collections::BTreeSet; +use std::sync::{LazyLock, Mutex, RwLock}; /// ID for the `CosmicTk` config. pub const ID: &str = "com.system76.CosmicTk"; +const MONO_FAMILY_DEFAULT: &str = "Fira Mono"; +const SANS_FAMILY_DEFAULT: &str = "Fira Sans"; + +/// Stores static strings of the family names for `iced::Font` compatibility. +pub static FAMILY_MAP: LazyLock>> = LazyLock::new(|| Mutex::default()); + pub static COSMIC_TK: LazyLock> = LazyLock::new(|| { RwLock::new( CosmicTk::config() @@ -67,12 +72,12 @@ pub fn interface_density() -> Density { #[allow(clippy::missing_panics_doc)] pub fn interface_font() -> FontConfig { - COSMIC_TK.read().unwrap().interface_font + COSMIC_TK.read().unwrap().interface_font.clone() } #[allow(clippy::missing_panics_doc)] pub fn monospace_font() -> FontConfig { - COSMIC_TK.read().unwrap().monospace_font + COSMIC_TK.read().unwrap().monospace_font.clone() } #[derive(Clone, CosmicConfigEntry, Debug, Eq, PartialEq)] @@ -113,13 +118,13 @@ impl Default for CosmicTk { header_size: Density::Standard, interface_density: Density::Standard, interface_font: FontConfig { - family: Ustr::from("Fira Sans"), + family: SANS_FAMILY_DEFAULT.to_owned(), weight: iced::font::Weight::Normal, stretch: iced::font::Stretch::Normal, style: iced::font::Style::Normal, }, monospace_font: FontConfig { - family: Ustr::from("Fira Mono"), + family: MONO_FAMILY_DEFAULT.to_owned(), weight: iced::font::Weight::Normal, stretch: iced::font::Stretch::Normal, style: iced::font::Style::Normal, @@ -134,9 +139,9 @@ impl CosmicTk { } } -#[derive(Copy, Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] pub struct FontConfig { - pub family: Ustr, + pub family: String, pub weight: iced::font::Weight, pub stretch: iced::font::Stretch, pub style: iced::font::Style, @@ -144,8 +149,19 @@ pub struct FontConfig { impl From for iced::Font { fn from(font: FontConfig) -> Self { + let mut family_map = FAMILY_MAP.lock().unwrap(); + + let name: &'static str = family_map + .get(font.family.as_str()) + .map(|&x| x) + .unwrap_or_else(|| { + let value = font.family.clone().leak(); + family_map.insert(value); + value + }); + Self { - family: iced::font::Family::Name(font.family.as_str()), + family: iced::font::Family::Name(name), weight: font.weight, stretch: font.stretch, style: font.style, diff --git a/src/widget/text_input/input.rs b/src/widget/text_input/input.rs index f440b59c..80bd8b54 100644 --- a/src/widget/text_input/input.rs +++ b/src/widget/text_input/input.rs @@ -1742,9 +1742,11 @@ where { let mut editor = Editor::new(unsecured_value, &mut state.cursor); - editor.insert( - text.unwrap_or_default().chars().next().unwrap_or_default(), - ); + let character = + text.unwrap_or_default().chars().next().unwrap_or_default(); + if !character.is_control() { + editor.insert(character); + } let contents = editor.contents(); let unsecured_value = Value::new(&contents); let message = (on_input)(contents);