incular_platform/
system_environment.rs1use incular_config::{EdgeInsets, InputCapabilities, Locale, RuntimeEnvironment};
10use std::sync::{Arc, RwLock};
11
12#[derive(Clone, Debug, Default, PartialEq)]
14pub struct SystemEnvironmentPreferences {
15 pub locales: Option<Vec<Locale>>,
17 pub text_scale: Option<f32>,
20 pub reduced_motion: Option<bool>,
21 pub high_contrast: Option<bool>,
22 pub input: Option<InputCapabilities>,
23 pub safe_insets: Option<EdgeInsets>,
33 pub view_padding: Option<EdgeInsets>,
34 pub view_insets: Option<EdgeInsets>,
35}
36
37impl SystemEnvironmentPreferences {
38 pub fn apply_to(&self, environment: &mut RuntimeEnvironment) {
42 let defaults = RuntimeEnvironment::default();
43 environment.locales = self.locales.clone().unwrap_or(defaults.locales);
44 environment.text_scale = self.text_scale.unwrap_or(defaults.text_scale);
45 environment.reduced_motion = self.reduced_motion.unwrap_or(defaults.reduced_motion);
46 environment.high_contrast = self.high_contrast.unwrap_or(defaults.high_contrast);
47 environment.input = self.input.unwrap_or(defaults.input);
48 environment.safe_insets = self.safe_insets.unwrap_or(defaults.safe_insets);
49 environment.view_padding = self.view_padding.unwrap_or(defaults.view_padding);
50 environment.view_insets = self.view_insets.unwrap_or(defaults.view_insets);
51 }
52}
53
54pub trait SystemEnvironmentProvider {
56 fn snapshot(&self) -> SystemEnvironmentPreferences;
57}
58
59#[derive(Clone, Default)]
61pub struct MemorySystemEnvironmentProvider {
62 snapshot: Arc<RwLock<SystemEnvironmentPreferences>>,
63}
64
65impl MemorySystemEnvironmentProvider {
66 #[must_use]
67 pub fn new(snapshot: SystemEnvironmentPreferences) -> Self {
68 Self {
69 snapshot: Arc::new(RwLock::new(snapshot)),
70 }
71 }
72
73 pub fn replace(&self, snapshot: SystemEnvironmentPreferences) -> bool {
76 let mut current = self.snapshot.write().expect("environment provider lock");
77 if *current == snapshot {
78 return false;
79 }
80 *current = snapshot;
81 true
82 }
83}
84
85impl SystemEnvironmentProvider for MemorySystemEnvironmentProvider {
86 fn snapshot(&self) -> SystemEnvironmentPreferences {
87 self.snapshot
88 .read()
89 .expect("environment provider lock")
90 .clone()
91 }
92}
93
94#[must_use]
97pub fn canonicalize_system_locales(
98 locales: impl IntoIterator<Item = impl AsRef<str>>,
99) -> Vec<Locale> {
100 let mut result = Vec::new();
101 for value in locales {
102 let Ok(locale) = value.as_ref().parse::<Locale>() else {
103 continue;
104 };
105 if !result.contains(&locale) {
106 result.push(locale);
107 }
108 }
109 result
110}