@@ -25,64 +25,61 @@ use crate::strokes::textstroke::{TextAttribute, TextStyle};
2525use crate :: { render, AudioPlayer , CloneConfig , SelectionCollision , WidgetFlags } ;
2626use crate :: { Camera , Document , PenHolder , StrokeStore } ;
2727use futures:: channel:: { mpsc, oneshot} ;
28+ use once_cell:: sync:: Lazy ;
2829use p2d:: bounding_volume:: { Aabb , BoundingVolume } ;
2930use rnote_compose:: eventresult:: EventPropagation ;
3031use rnote_compose:: ext:: AabbExt ;
3132use rnote_compose:: penevent:: { PenEvent , ShortcutKey } ;
3233use rnote_compose:: { Color , SplitOrder } ;
3334use serde:: { Deserialize , Serialize } ;
35+ use std:: cell:: RefCell ;
3436use std:: fmt:: Debug ;
3537use std:: path:: PathBuf ;
3638use std:: sync:: Arc ;
3739use std:: time:: Instant ;
3840use 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
122119impl < ' 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 }
0 commit comments