#[cfg(target_os = "android")]
pub mod android;
#[cfg(feature = "android-jni")]
pub mod android_jni;
#[cfg(any(target_os = "ohos", feature = "harmony"))]
pub mod harmony;
#[cfg(target_os = "ios")]
pub mod ios;
#[cfg(any(target_os = "linux", doc))]
pub mod linux;
#[cfg(target_os = "macos")]
pub mod macos;
#[cfg(all(target_os = "macos", any(feature = "macos", feature = "objc2-macos")))]
pub mod macos_objc2;
#[cfg(feature = "mobile-api")]
pub mod mobile;
#[cfg(all(target_os = "linux", feature = "wayland-native"))]
pub mod wayland;
#[cfg(target_os = "windows")]
pub mod windows;
#[cfg(feature = "wasm")]
pub mod wasm;
pub mod accessibility;
pub mod clipboard;
pub mod clipboard_stubs;
mod contract;
pub mod detector;
#[cfg(feature = "holographic")]
pub mod holographic;
pub mod ime;
#[cfg(target_os = "linux")]
pub mod ime_linux;
#[cfg(target_os = "macos")]
pub mod ime_macos;
pub mod ime_stubs;
#[cfg(target_os = "windows")]
pub mod ime_windows;
pub(crate) mod runtime;
pub mod state;
mod stub;
pub mod types;
pub mod virtual_keyboard;
pub use crate::platform::contract::{negotiate_capability_contract, CapabilityContract};
pub use crate::platform::contract::{EmbeddedCapabilityContract, NativeCapabilityContract};
pub use crate::platform::runtime::RuntimeGuiMode;
pub use crate::platform::runtime::{capabilities, get_platform, init, quit, run};
pub use crate::platform::runtime::{dpi_scale_factor, runtime_gui_mode, runtime_gui_mode_for};
#[cfg(feature = "mobile-api")]
pub use crate::platform::runtime::{mobile_attach_to_native_view, mobile_backend_name};
pub use crate::platform::stub::StubPlatform;
pub use crate::platform::types::*;
pub fn wire_focus_manager_to_a11y(fm: &mut crate::event::focus::FocusManager) {
let platform = get_platform();
if let Some(bridge) = platform.accessibility_bridge() {
let bridge_ptr: *const dyn crate::platform::accessibility::AccessibilityBridge =
bridge as *const dyn crate::platform::accessibility::AccessibilityBridge;
fm.set_a11y_callback(Box::new(move |id| {
let bridge = unsafe { &*bridge_ptr };
bridge.notify_focus_changed(id);
}));
}
}
#[cfg(test)]
mod tests {
use crate::event::focus::FocusManager;
#[test]
fn wire_focus_manager_to_a11y_no_panic_when_no_bridge() {
let mut fm = FocusManager::new();
super::wire_focus_manager_to_a11y(&mut fm);
assert!(fm.focused_widget().is_none());
}
}