Use iced FontSystem and fix #122

This commit is contained in:
Jeremy Soller 2024-02-15 15:23:41 -07:00
parent 76c659fb21
commit 38058fb2e6
No known key found for this signature in database
GPG key ID: D02FD439211AF56F
3 changed files with 34 additions and 32 deletions

View file

@ -6,6 +6,7 @@ use cosmic::{
cosmic_theme, executor, cosmic_theme, executor,
font::Font, font::Font,
iced::{ iced::{
advanced::graphics::text::font_system,
clipboard, event, clipboard, event,
futures::{self, SinkExt}, futures::{self, SinkExt},
keyboard::{self, Modifiers}, keyboard::{self, Modifiers},
@ -18,7 +19,7 @@ use cosmic::{
Application, ApplicationExt, Apply, Element, Application, ApplicationExt, Apply, Element,
}; };
use cosmic_files::dialog::{Dialog, DialogKind, DialogMessage, DialogResult}; use cosmic_files::dialog::{Dialog, DialogKind, DialogMessage, DialogResult};
use cosmic_text::{Cursor, Edit, Family, FontSystem, Selection, SwashCache, SyntaxSystem, ViMode}; use cosmic_text::{Cursor, Edit, Family, Selection, SwashCache, SyntaxSystem, ViMode};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::{ use std::{
any::TypeId, any::TypeId,
@ -65,8 +66,6 @@ mod tab;
use self::text_box::text_box; use self::text_box::text_box;
mod text_box; mod text_box;
//TODO: re-use iced FONT_SYSTEM
static FONT_SYSTEM: OnceLock<Mutex<FontSystem>> = OnceLock::new();
static ICON_CACHE: OnceLock<Mutex<IconCache>> = OnceLock::new(); static ICON_CACHE: OnceLock<Mutex<IconCache>> = OnceLock::new();
static LINE_NUMBER_CACHE: OnceLock<Mutex<LineNumberCache>> = OnceLock::new(); static LINE_NUMBER_CACHE: OnceLock<Mutex<LineNumberCache>> = OnceLock::new();
static SWASH_CACHE: OnceLock<Mutex<SwashCache>> = OnceLock::new(); static SWASH_CACHE: OnceLock<Mutex<SwashCache>> = OnceLock::new();
@ -78,7 +77,6 @@ pub fn icon_cache_get(name: &'static str, size: u16) -> icon::Icon {
} }
fn main() -> Result<(), Box<dyn std::error::Error>> { fn main() -> Result<(), Box<dyn std::error::Error>> {
FONT_SYSTEM.get_or_init(|| Mutex::new(FontSystem::new()));
ICON_CACHE.get_or_init(|| Mutex::new(IconCache::new())); ICON_CACHE.get_or_init(|| Mutex::new(IconCache::new()));
LINE_NUMBER_CACHE.get_or_init(|| Mutex::new(LineNumberCache::new())); LINE_NUMBER_CACHE.get_or_init(|| Mutex::new(LineNumberCache::new()));
SWASH_CACHE.get_or_init(|| Mutex::new(SwashCache::new())); SWASH_CACHE.get_or_init(|| Mutex::new(SwashCache::new()));
@ -972,8 +970,8 @@ impl App {
.iter() .iter()
.position(|theme_name| theme_name == &self.config.syntax_theme_light); .position(|theme_name| theme_name == &self.config.syntax_theme_light);
let font_selected = { let font_selected = {
let font_system = FONT_SYSTEM.get().unwrap().lock().unwrap(); let mut font_system = font_system().write().unwrap();
let current_font_name = font_system.db().family_name(&Family::Monospace); let current_font_name = font_system.raw().db().family_name(&Family::Monospace);
self.font_names self.font_names
.iter() .iter()
.position(|font_name| font_name == current_font_name) .position(|font_name| font_name == current_font_name)
@ -1063,8 +1061,9 @@ impl Application for App {
fn init(core: Core, flags: Self::Flags) -> (Self, Command<Self::Message>) { fn init(core: Core, flags: Self::Flags) -> (Self, Command<Self::Message>) {
// Update font name from config // Update font name from config
{ {
let mut font_system = FONT_SYSTEM.get().unwrap().lock().unwrap(); let mut font_system = font_system().write().unwrap();
font_system font_system
.raw()
.db_mut() .db_mut()
.set_monospace_family(&flags.config.font_name); .set_monospace_family(&flags.config.font_name);
} }
@ -1073,10 +1072,10 @@ impl Application for App {
let font_names = { let font_names = {
let mut font_names = Vec::new(); let mut font_names = Vec::new();
let font_system = FONT_SYSTEM.get().unwrap().lock().unwrap(); let mut font_system = font_system().write().unwrap();
//TODO: do not repeat, used in Tab::new //TODO: do not repeat, used in Tab::new
let attrs = cosmic_text::Attrs::new().family(Family::Monospace); let attrs = cosmic_text::Attrs::new().family(Family::Monospace);
for face in font_system.db().faces() { for face in font_system.raw().db().faces() {
if attrs.matches(face) && face.monospaced { if attrs.matches(face) && face.monospaced {
//TODO: get localized name if possible //TODO: get localized name if possible
let font_name = face let font_name = face
@ -1343,8 +1342,8 @@ impl Application for App {
if font_name != &self.config.font_name { if font_name != &self.config.font_name {
// Update font name from config // Update font name from config
{ {
let mut font_system = FONT_SYSTEM.get().unwrap().lock().unwrap(); let mut font_system = font_system().write().unwrap();
font_system.db_mut().set_monospace_family(font_name); font_system.raw().db_mut().set_monospace_family(font_name);
} }
// Reset line number cache // Reset line number cache
@ -2127,7 +2126,9 @@ impl Application for App {
None => popover.show_popup(false), None => popover.show_popup(false),
}; };
tab_column = tab_column.push(popover); tab_column = tab_column.push(popover);
tab_column = tab_column.push(text(status).font(Font::MONOSPACE)); if !status.is_empty() {
tab_column = tab_column.push(text(status).font(Font::MONOSPACE));
}
} }
Some(Tab::GitDiff(tab)) => { Some(Tab::GitDiff(tab)) => {
let mut diff_widget = widget::column::with_capacity(tab.diff.hunks.len()); let mut diff_widget = widget::column::with_capacity(tab.diff.hunks.len());

View file

@ -1,7 +1,7 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
use cosmic::{ use cosmic::{
iced::Point, iced::{advanced::graphics::text::font_system, Point},
widget::{icon, Icon}, widget::{icon, Icon},
}; };
use cosmic_text::{Attrs, Buffer, Edit, Shaping, SyntaxEditor, ViEditor, Wrap}; use cosmic_text::{Attrs, Buffer, Edit, Shaping, SyntaxEditor, ViEditor, Wrap};
@ -12,7 +12,7 @@ use std::{
sync::{Arc, Mutex}, sync::{Arc, Mutex},
}; };
use crate::{fl, git::GitDiff, mime_icon, Config, FALLBACK_MIME_ICON, FONT_SYSTEM, SYNTAX_SYSTEM}; use crate::{fl, git::GitDiff, mime_icon, Config, FALLBACK_MIME_ICON, SYNTAX_SYSTEM};
pub enum Tab { pub enum Tab {
Editor(EditorTab), Editor(EditorTab),
@ -47,7 +47,7 @@ impl EditorTab {
let mut buffer = Buffer::new_empty(config.metrics()); let mut buffer = Buffer::new_empty(config.metrics());
buffer.set_text( buffer.set_text(
&mut FONT_SYSTEM.get().unwrap().lock().unwrap(), font_system().write().unwrap().raw(),
"", "",
attrs, attrs,
Shaping::Advanced, Shaping::Advanced,
@ -75,8 +75,8 @@ impl EditorTab {
pub fn set_config(&mut self, config: &Config) { pub fn set_config(&mut self, config: &Config) {
let mut editor = self.editor.lock().unwrap(); let mut editor = self.editor.lock().unwrap();
let mut font_system = FONT_SYSTEM.get().unwrap().lock().unwrap(); let mut font_system = font_system().write().unwrap();
let mut editor = editor.borrow_with(&mut font_system); let mut editor = editor.borrow_with(font_system.raw());
editor.set_auto_indent(config.auto_indent); editor.set_auto_indent(config.auto_indent);
editor.set_passthrough(!config.vim_bindings); editor.set_passthrough(!config.vim_bindings);
editor.set_tab_width(config.tab_width); editor.set_tab_width(config.tab_width);
@ -93,8 +93,8 @@ impl EditorTab {
pub fn open(&mut self, path: PathBuf) { pub fn open(&mut self, path: PathBuf) {
let mut editor = self.editor.lock().unwrap(); let mut editor = self.editor.lock().unwrap();
let mut font_system = FONT_SYSTEM.get().unwrap().lock().unwrap(); let mut font_system = font_system().write().unwrap();
let mut editor = editor.borrow_with(&mut font_system); let mut editor = editor.borrow_with(font_system.raw());
match editor.load_text(&path, self.attrs) { match editor.load_text(&path, self.attrs) {
Ok(()) => { Ok(()) => {
log::info!("opened {:?}", path); log::info!("opened {:?}", path);
@ -115,8 +115,8 @@ impl EditorTab {
pub fn reload(&mut self) { pub fn reload(&mut self) {
let mut editor = self.editor.lock().unwrap(); let mut editor = self.editor.lock().unwrap();
let mut font_system = FONT_SYSTEM.get().unwrap().lock().unwrap(); let mut font_system = font_system().write().unwrap();
let mut editor = editor.borrow_with(&mut font_system); let mut editor = editor.borrow_with(font_system.raw());
if let Some(path) = &self.path_opt { if let Some(path) = &self.path_opt {
// Save scroll // Save scroll
let scroll = editor.with_buffer(|buffer| buffer.scroll()); let scroll = editor.with_buffer(|buffer| buffer.scroll());

View file

@ -3,6 +3,7 @@
use cosmic::{ use cosmic::{
cosmic_theme::palette::{blend::Compose, WithAlpha}, cosmic_theme::palette::{blend::Compose, WithAlpha},
iced::{ iced::{
advanced::graphics::text::font_system,
event::{Event, Status}, event::{Event, Status},
keyboard::{Event as KeyEvent, Modifiers}, keyboard::{Event as KeyEvent, Modifiers},
mouse::{self, Button, Event as MouseEvent, ScrollDelta}, mouse::{self, Button, Event as MouseEvent, ScrollDelta},
@ -32,7 +33,7 @@ use std::{
time::{Duration, Instant}, time::{Duration, Instant},
}; };
use crate::{line_number::LineNumberKey, FONT_SYSTEM, LINE_NUMBER_CACHE, SWASH_CACHE}; use crate::{line_number::LineNumberKey, LINE_NUMBER_CACHE, SWASH_CACHE};
pub struct TextBox<'a, Message> { pub struct TextBox<'a, Message> {
editor: &'a Mutex<ViEditor<'static, 'static>>, editor: &'a Mutex<ViEditor<'static, 'static>>,
@ -231,7 +232,7 @@ where
let mut editor = self.editor.lock().unwrap(); let mut editor = self.editor.lock().unwrap();
//TODO: set size? //TODO: set size?
editor editor
.borrow_with(&mut FONT_SYSTEM.get().unwrap().lock().unwrap()) .borrow_with(font_system().write().unwrap().raw())
.shape_as_needed(true); .shape_as_needed(true);
editor.with_buffer(|buffer| { editor.with_buffer(|buffer| {
@ -333,7 +334,7 @@ where
let image_w = image_w - scrollbar_w; let image_w = image_w - scrollbar_w;
// Lock font system (used throughout) // Lock font system (used throughout)
let mut font_system = FONT_SYSTEM.get().unwrap().lock().unwrap(); let mut font_system = font_system().write().unwrap();
// Calculate line number information // Calculate line number information
let (line_number_chars, editor_offset_x) = if self.line_numbers { let (line_number_chars, editor_offset_x) = if self.line_numbers {
@ -351,7 +352,7 @@ where
let mut line_number_cache = LINE_NUMBER_CACHE.get().unwrap().lock().unwrap(); let mut line_number_cache = LINE_NUMBER_CACHE.get().unwrap().lock().unwrap();
if let Some(layout_line) = line_number_cache if let Some(layout_line) = line_number_cache
.get( .get(
&mut font_system, font_system.raw(),
LineNumberKey { LineNumberKey {
number: 1, number: 1,
width: line_number_chars, width: line_number_chars,
@ -380,7 +381,7 @@ where
// Set metrics and size // Set metrics and size
editor.with_buffer_mut(|buffer| { editor.with_buffer_mut(|buffer| {
buffer.set_metrics_and_size( buffer.set_metrics_and_size(
&mut font_system, font_system.raw(),
metrics, metrics,
(image_w - editor_offset_x) as f32, (image_w - editor_offset_x) as f32,
image_h as f32, image_h as f32,
@ -388,7 +389,7 @@ where
}); });
// Shape and layout as needed // Shape and layout as needed
editor.shape_as_needed(&mut font_system, true); editor.shape_as_needed(font_system.raw(), true);
let mut handle_opt = state.handle_opt.lock().unwrap(); let mut handle_opt = state.handle_opt.lock().unwrap();
if editor.redraw() || handle_opt.is_none() { if editor.redraw() || handle_opt.is_none() {
@ -453,7 +454,7 @@ where
if let Some(layout_line) = line_number_cache if let Some(layout_line) = line_number_cache
.get( .get(
&mut font_system, font_system.raw(),
LineNumberKey { LineNumberKey {
number: line_number, number: line_number,
width: line_number_chars, width: line_number_chars,
@ -475,7 +476,7 @@ where
layout_glyph.physical((0., line_y), metrics.font_size); layout_glyph.physical((0., line_y), metrics.font_size);
swash_cache.with_pixels( swash_cache.with_pixels(
&mut font_system, font_system.raw(),
physical_glyph.cache_key, physical_glyph.cache_key,
gutter_foreground, gutter_foreground,
|x, y, color| { |x, y, color| {
@ -501,7 +502,7 @@ where
} }
// Draw editor // Draw editor
editor.draw(&mut font_system, &mut swash_cache, |x, y, w, h, color| { editor.draw(font_system.raw(), &mut swash_cache, |x, y, w, h, color| {
draw_rect( draw_rect(
pixels, pixels,
Canvas { Canvas {
@ -687,8 +688,8 @@ where
let mut editor = self.editor.lock().unwrap(); let mut editor = self.editor.lock().unwrap();
let buffer_size = editor.with_buffer(|buffer| buffer.size()); let buffer_size = editor.with_buffer(|buffer| buffer.size());
let last_changed = editor.changed(); let last_changed = editor.changed();
let mut font_system = FONT_SYSTEM.get().unwrap().lock().unwrap(); let mut font_system = font_system().write().unwrap();
let mut editor = editor.borrow_with(&mut font_system); let mut editor = editor.borrow_with(font_system.raw());
let mut status = Status::Ignored; let mut status = Status::Ignored;
match event { match event {