Skip to content

Commit b0bfa41

Browse files
committed
feat: thread local broker, lazy static languages (fix log spam)
1 parent 4533d80 commit b0bfa41

File tree

9 files changed

+106
-111
lines changed

9 files changed

+106
-111
lines changed

crates/rnote-engine/src/document/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ pub use background::Background;
77
pub use format::Format;
88

99
// Imports
10-
use crate::engine::Spellchecker;
10+
use crate::engine::SPELLCHECK_DEFAULT_LANGUAGE;
1111
use crate::{Camera, CloneConfig, StrokeStore, WidgetFlags};
1212
use core::fmt::Display;
1313
use p2d::bounding_volume::{Aabb, BoundingVolume};
@@ -123,7 +123,7 @@ impl Default for Document {
123123
background: Background::default(),
124124
layout: Layout::default(),
125125
snap_positions: false,
126-
spellcheck_language: Spellchecker::default_language(),
126+
spellcheck_language: SPELLCHECK_DEFAULT_LANGUAGE.clone(),
127127
}
128128
}
129129
}

crates/rnote-engine/src/engine/import.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ impl Engine {
176176
store: &mut self.store,
177177
camera: &mut self.camera,
178178
audioplayer: &mut self.audioplayer,
179-
spellchecker: &mut self.spellchecker,
179+
spellcheck: &mut self.spellcheck,
180180
});
181181
widget_flags |= self.doc_resize_to_fit_content();
182182
widget_flags.redraw = true;
@@ -212,7 +212,7 @@ impl Engine {
212212
store: &mut self.store,
213213
camera: &mut self.camera,
214214
audioplayer: &mut self.audioplayer,
215-
spellchecker: &mut self.spellchecker,
215+
spellcheck: &mut self.spellcheck,
216216
});
217217
widget_flags |= self.doc_resize_to_fit_content();
218218
widget_flags.redraw = true;
@@ -446,7 +446,7 @@ impl Engine {
446446
store: &mut self.store,
447447
camera: &mut self.camera,
448448
audioplayer: &mut self.audioplayer,
449-
spellchecker: &mut self.spellchecker,
449+
spellcheck: &mut self.spellcheck,
450450
},
451451
);
452452
}
@@ -498,7 +498,7 @@ impl Engine {
498498
store: &mut self.store,
499499
camera: &mut self.camera,
500500
audioplayer: &mut self.audioplayer,
501-
spellchecker: &mut self.spellchecker,
501+
spellcheck: &mut self.spellcheck,
502502
});
503503

504504
widget_flags |= self.store.record(Instant::now());

crates/rnote-engine/src/engine/mod.rs

Lines changed: 57 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -25,64 +25,61 @@ use crate::strokes::textstroke::{TextAttribute, TextStyle};
2525
use crate::{render, AudioPlayer, CloneConfig, SelectionCollision, WidgetFlags};
2626
use crate::{Camera, Document, PenHolder, StrokeStore};
2727
use futures::channel::{mpsc, oneshot};
28+
use once_cell::sync::Lazy;
2829
use p2d::bounding_volume::{Aabb, BoundingVolume};
2930
use rnote_compose::eventresult::EventPropagation;
3031
use rnote_compose::ext::AabbExt;
3132
use rnote_compose::penevent::{PenEvent, ShortcutKey};
3233
use rnote_compose::{Color, SplitOrder};
3334
use serde::{Deserialize, Serialize};
35+
use std::cell::RefCell;
3436
use std::fmt::Debug;
3537
use std::path::PathBuf;
3638
use std::sync::Arc;
3739
use std::time::Instant;
3840
use tracing::{debug, error};
3941

40-
pub struct Spellchecker {
41-
broker: enchant::Broker,
42-
pub dict: Option<enchant::Dict>,
42+
thread_local! {
43+
static SPELLCHECK_BROKER: RefCell<enchant::Broker> = RefCell::new(enchant::Broker::new());
4344
}
4445

45-
impl Spellchecker {
46-
pub fn default_language() -> Option<String> {
47-
let available_languages = Self::available_languages();
48-
49-
for system_language in glib::language_names() {
50-
for available_language in &available_languages {
51-
if system_language.contains(available_language) {
52-
debug!(
53-
"found default spellcheck language: {:?}",
54-
available_language
55-
);
56-
57-
return Some(available_language.to_string());
58-
}
59-
}
60-
}
61-
62-
None
63-
}
64-
65-
pub fn available_languages() -> Vec<String> {
66-
enchant::Broker::new()
46+
pub static SPELLCHECK_AVAILABLE_LANGUAGES: Lazy<Vec<String>> = Lazy::new(|| {
47+
SPELLCHECK_BROKER.with_borrow_mut(|broker| {
48+
broker
6749
.list_dicts()
6850
.iter()
6951
.map(|dict| dict.lang.to_owned())
7052
.collect()
71-
}
72-
}
53+
})
54+
});
7355

74-
impl Default for Spellchecker {
75-
fn default() -> Self {
76-
Self {
77-
broker: enchant::Broker::new(),
78-
dict: None,
56+
pub static SPELLCHECK_DEFAULT_LANGUAGE: Lazy<Option<String>> = Lazy::new(|| {
57+
let available_languages = SPELLCHECK_AVAILABLE_LANGUAGES.clone();
58+
59+
for system_language in glib::language_names() {
60+
for available_language in &available_languages {
61+
if system_language.contains(available_language) {
62+
debug!(
63+
"found default spellcheck language: {:?}",
64+
available_language
65+
);
66+
67+
return Some(available_language.to_string());
68+
}
7969
}
8070
}
71+
72+
None
73+
});
74+
75+
#[derive(Default)]
76+
pub struct Spellcheck {
77+
pub dict: Option<enchant::Dict>,
8178
}
8279

83-
impl Debug for Spellchecker {
80+
impl Debug for Spellcheck {
8481
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
85-
f.debug_struct("Spellchecker")
82+
f.debug_struct("Spellcheck")
8683
.field(
8784
"dict",
8885
&self
@@ -104,7 +101,7 @@ pub struct EngineView<'a> {
104101
pub store: &'a StrokeStore,
105102
pub camera: &'a Camera,
106103
pub audioplayer: &'a Option<AudioPlayer>,
107-
pub spellchecker: &'a Spellchecker,
104+
pub spellcheck: &'a Spellcheck,
108105
}
109106

110107
/// A mutable view into the engine, excluding the penholder.
@@ -116,7 +113,7 @@ pub struct EngineViewMut<'a> {
116113
pub store: &'a mut StrokeStore,
117114
pub camera: &'a mut Camera,
118115
pub audioplayer: &'a mut Option<AudioPlayer>,
119-
pub spellchecker: &'a mut Spellchecker,
116+
pub spellcheck: &'a mut Spellcheck,
120117
}
121118

122119
impl<'a> EngineViewMut<'a> {
@@ -129,7 +126,7 @@ impl<'a> EngineViewMut<'a> {
129126
store: self.store,
130127
camera: self.camera,
131128
audioplayer: self.audioplayer,
132-
spellchecker: self.spellchecker,
129+
spellcheck: self.spellcheck,
133130
}
134131
}
135132
}
@@ -237,7 +234,7 @@ pub struct Engine {
237234
#[serde(skip)]
238235
audioplayer: Option<AudioPlayer>,
239236
#[serde(skip)]
240-
pub spellchecker: Spellchecker,
237+
spellcheck: Spellcheck,
241238
#[serde(skip)]
242239
visual_debug: bool,
243240
// the task sender. Must not be modified, only cloned.
@@ -275,7 +272,7 @@ impl Default for Engine {
275272
optimize_epd: false,
276273

277274
audioplayer: None,
278-
spellchecker: Spellchecker::default(),
275+
spellcheck: Spellcheck::default(),
279276
visual_debug: false,
280277
tasks_tx: EngineTaskSender(tasks_tx),
281278
tasks_rx: Some(EngineTaskReceiver(tasks_rx)),
@@ -309,7 +306,7 @@ impl Engine {
309306
store: &self.store,
310307
camera: &self.camera,
311308
audioplayer: &self.audioplayer,
312-
spellchecker: &self.spellchecker,
309+
spellcheck: &self.spellcheck,
313310
}
314311
}
315312

@@ -322,7 +319,7 @@ impl Engine {
322319
store: &mut self.store,
323320
camera: &mut self.camera,
324321
audioplayer: &mut self.audioplayer,
325-
spellchecker: &mut self.spellchecker,
322+
spellcheck: &mut self.spellcheck,
326323
}
327324
}
328325

@@ -356,15 +353,13 @@ impl Engine {
356353
}
357354

358355
pub fn refresh_spellcheck_language(&mut self) {
359-
self.spellchecker.dict = self
356+
self.spellcheck.dict = self
360357
.document
361358
.spellcheck_language
362359
.as_ref()
363360
.and_then(|language| {
364-
self.spellchecker
365-
.broker
366-
.request_dict(language.as_str())
367-
.ok()
361+
SPELLCHECK_BROKER
362+
.with_borrow_mut(|broker| broker.request_dict(language.as_str()).ok())
368363
});
369364

370365
if let Pen::Typewriter(typewriter) = self.penholder.current_pen_ref() {
@@ -375,7 +370,7 @@ impl Engine {
375370
store: &mut self.store,
376371
camera: &mut self.camera,
377372
audioplayer: &mut self.audioplayer,
378-
spellchecker: &mut self.spellchecker,
373+
spellcheck: &mut self.spellcheck,
379374
});
380375
}
381376
}
@@ -579,7 +574,7 @@ impl Engine {
579574
store: &mut self.store,
580575
camera: &mut self.camera,
581576
audioplayer: &mut self.audioplayer,
582-
spellchecker: &mut self.spellchecker,
577+
spellcheck: &mut self.spellcheck,
583578
},
584579
)
585580
}
@@ -600,7 +595,7 @@ impl Engine {
600595
store: &mut self.store,
601596
camera: &mut self.camera,
602597
audioplayer: &mut self.audioplayer,
603-
spellchecker: &mut self.spellchecker,
598+
spellcheck: &mut self.spellcheck,
604599
},
605600
)
606601
}
@@ -616,7 +611,7 @@ impl Engine {
616611
store: &mut self.store,
617612
camera: &mut self.camera,
618613
audioplayer: &mut self.audioplayer,
619-
spellchecker: &mut self.spellchecker,
614+
spellcheck: &mut self.spellcheck,
620615
},
621616
)
622617
}
@@ -635,7 +630,7 @@ impl Engine {
635630
store: &mut self.store,
636631
camera: &mut self.camera,
637632
audioplayer: &mut self.audioplayer,
638-
spellchecker: &mut self.spellchecker,
633+
spellcheck: &mut self.spellcheck,
639634
},
640635
)
641636
}
@@ -651,7 +646,7 @@ impl Engine {
651646
store: &mut self.store,
652647
camera: &mut self.camera,
653648
audioplayer: &mut self.audioplayer,
654-
spellchecker: &mut self.spellchecker,
649+
spellcheck: &mut self.spellcheck,
655650
},
656651
)
657652
}
@@ -666,7 +661,7 @@ impl Engine {
666661
store: &mut self.store,
667662
camera: &mut self.camera,
668663
audioplayer: &mut self.audioplayer,
669-
spellchecker: &mut self.spellchecker,
664+
spellcheck: &mut self.spellcheck,
670665
})
671666
}
672667

@@ -866,7 +861,7 @@ impl Engine {
866861
store: &mut self.store,
867862
camera: &mut self.camera,
868863
audioplayer: &mut self.audioplayer,
869-
spellchecker: &mut self.spellchecker,
864+
spellcheck: &mut self.spellcheck,
870865
})
871866
}
872867

@@ -882,7 +877,7 @@ impl Engine {
882877
store: &self.store,
883878
camera: &self.camera,
884879
audioplayer: &self.audioplayer,
885-
spellchecker: &self.spellchecker,
880+
spellcheck: &self.spellcheck,
886881
})
887882
}
888883

@@ -898,7 +893,7 @@ impl Engine {
898893
store: &mut self.store,
899894
camera: &mut self.camera,
900895
audioplayer: &mut self.audioplayer,
901-
spellchecker: &mut self.spellchecker,
896+
spellcheck: &mut self.spellcheck,
902897
})
903898
}
904899

@@ -1008,7 +1003,7 @@ impl Engine {
10081003
store: &mut self.store,
10091004
camera: &mut self.camera,
10101005
audioplayer: &mut self.audioplayer,
1011-
spellchecker: &mut self.spellchecker,
1006+
spellcheck: &mut self.spellcheck,
10121007
},
10131008
)
10141009
}
@@ -1026,7 +1021,7 @@ impl Engine {
10261021
store: &mut self.store,
10271022
camera: &mut self.camera,
10281023
audioplayer: &mut self.audioplayer,
1029-
spellchecker: &mut self.spellchecker,
1024+
spellcheck: &mut self.spellcheck,
10301025
})
10311026
}
10321027
widget_flags
@@ -1047,7 +1042,7 @@ impl Engine {
10471042
store: &mut self.store,
10481043
camera: &mut self.camera,
10491044
audioplayer: &mut self.audioplayer,
1050-
spellchecker: &mut self.spellchecker,
1045+
spellcheck: &mut self.spellcheck,
10511046
},
10521047
)
10531048
}
@@ -1066,7 +1061,7 @@ impl Engine {
10661061
store: &mut self.store,
10671062
camera: &mut self.camera,
10681063
audioplayer: &mut self.audioplayer,
1069-
spellchecker: &mut self.spellchecker,
1064+
spellcheck: &mut self.spellcheck,
10701065
},
10711066
)
10721067
}
@@ -1086,7 +1081,7 @@ impl Engine {
10861081
store: &mut self.store,
10871082
camera: &mut self.camera,
10881083
audioplayer: &mut self.audioplayer,
1089-
spellchecker: &mut self.spellchecker,
1084+
spellcheck: &mut self.spellcheck,
10901085
},
10911086
)
10921087
} else {
@@ -1099,7 +1094,7 @@ impl Engine {
10991094
store: &mut self.store,
11001095
camera: &mut self.camera,
11011096
audioplayer: &mut self.audioplayer,
1102-
spellchecker: &mut self.spellchecker,
1097+
spellcheck: &mut self.spellcheck,
11031098
},
11041099
)
11051100
}

crates/rnote-engine/src/engine/rendering.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ impl Engine {
199199
store: &self.store,
200200
camera: &self.camera,
201201
audioplayer: &self.audioplayer,
202-
spellchecker: &self.spellchecker,
202+
spellcheck: &self.spellcheck,
203203
},
204204
)?;
205205

crates/rnote-engine/src/engine/visual_debug.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ pub(crate) fn draw_stroke_debug_to_gtk_snapshot(
235235
store: &engine.store,
236236
camera: &engine.camera,
237237
audioplayer: &engine.audioplayer,
238-
spellchecker: &engine.spellchecker,
238+
spellcheck: &engine.spellcheck,
239239
}) {
240240
draw_bounds_to_gtk_snapshot(bounds, COLOR_SELECTOR_BOUNDS, snapshot, border_widths);
241241
}

0 commit comments

Comments
 (0)