cranpose_services/
accessibility_state.rs1use cranpose_core::{CompositionLocal, CompositionLocalProvider, compositionLocalOf};
6use cranpose_macros::composable;
7
8#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
10pub struct AccessibilityState {
11 pub screen_reader_on: bool,
15}
16
17pub fn set_platform_accessibility_state(state: AccessibilityState) -> bool {
21 crate::thread_state::with(|thread| thread.accessibility_state.replace(state) != state)
22}
23
24pub fn platform_accessibility_state() -> AccessibilityState {
26 crate::thread_state::with(|state| state.accessibility_state.get())
27}
28
29pub fn local_accessibility_state() -> CompositionLocal<AccessibilityState> {
32 crate::composition_locals::cached_local(
33 |locals| &locals.accessibility_state,
34 || compositionLocalOf(platform_accessibility_state),
35 )
36}
37
38#[composable]
41pub fn ProvideAccessibilityState(state: AccessibilityState, content: impl FnOnce()) {
42 let local = local_accessibility_state();
43 CompositionLocalProvider([local.provides(state)], move || {
44 content();
45 });
46}
47
48#[cfg(test)]
49#[path = "tests/accessibility_state_tests.rs"]
50mod tests;