#![deny(missing_docs)]
#[cfg(doctest)]
#[doc = include_str!("../README.md")]
pub struct ReadmeDoctests;
#[cfg(desktop)]
mod a11y;
#[cfg(web)]
mod a11y_web;
#[cfg(web)]
mod address;
#[cfg(android)]
mod android_autofill;
#[cfg(android)]
mod android_clipboard;
#[cfg(android)]
mod android_ime;
#[cfg(android)]
mod android_link;
#[cfg(android)]
mod android_settings;
#[cfg(android)]
mod android_system_bars;
mod app;
mod application;
#[cfg(any(android, test))]
mod autofill;
mod caret;
mod command;
mod gesture;
#[cfg(any(web, test))]
mod history;
mod hover;
#[cfg(any(android, test))]
mod ime;
#[cfg(desktop)]
mod instance;
mod link;
#[cfg(feature = "net")]
pub mod net;
mod reload;
mod remote;
#[cfg(not(web))]
pub(crate) mod runtime;
mod selection;
mod subscription;
mod theming;
#[cfg(web)]
mod web_clipboard;
mod widget_app;
#[cfg(any(test, feature = "testing"))]
#[doc(hidden)]
pub use app::testing;
pub use app::App;
pub use application::{Application, Lifecycle, LocationStrategy};
pub use command::Command;
pub use link::{link_among, location_of_link};
pub use remote::RemoteData;
pub use subscription::Subscription;
pub use widget_app::FrusApp;
#[cfg(feature = "net")]
pub use net::{fetch, fetch_bytes, FetchError, Method, Request, MAX_RESPONSE_BYTES};
pub use frus_widgets::{Brightness, Locale, Orientation, ScrollPhysics, SizeClass, ThemeMode};
#[cfg(android)]
pub use winit::platform::android::activity::AndroidApp;
#[doc(hidden)]
pub use anyhow;
#[doc(hidden)]
pub use log;
#[macro_export]
macro_rules! main {
($app:expr $(,)?) => {
#[cfg(not(any(target_os = "android", target_arch = "wasm32")))]
pub fn run() -> $crate::anyhow::Result<()> {
$crate::run($app)
}
#[cfg(target_os = "android")]
#[no_mangle]
fn android_main(android_app: $crate::AndroidApp) {
if let ::core::result::Result::Err(err) = $crate::run_android($app, android_app) {
$crate::log::error!("frus (android) stopped: {:#}", err);
}
}
#[cfg(target_arch = "wasm32")]
#[::wasm_bindgen::prelude::wasm_bindgen(start)]
pub fn start() {
if let ::core::result::Result::Err(err) = $crate::run_web($app) {
$crate::log::error!("frus (web) stopped: {:#}", err);
}
}
};
}
#[cfg(desktop)]
pub fn run<A: Application>(mut app: A) -> anyhow::Result<()> {
env_logger::init();
reload::restore_from_env(&mut app);
if let Some(id) = app.instance_id() {
match instance::claim(&id, link::link_among(std::env::args()).as_deref()) {
instance::Claim::Handed => return Ok(()),
instance::Claim::First(server) => instance::serve_into_queue(server),
}
}
let event_loop = winit::event_loop::EventLoop::<A::Message>::with_user_event().build()?;
event_loop.set_control_flow(winit::event_loop::ControlFlow::Wait);
let proxy = event_loop.create_proxy();
let mut app = App::new(app, proxy);
event_loop.run_app(&mut app)?;
Ok(())
}
#[cfg(ios)]
pub fn run<A: Application>(app: A) -> anyhow::Result<()> {
let event_loop = winit::event_loop::EventLoop::<A::Message>::with_user_event().build()?;
event_loop.set_control_flow(winit::event_loop::ControlFlow::Wait);
let proxy = event_loop.create_proxy();
let mut app = App::new(app, proxy);
event_loop.run_app(&mut app)?;
Ok(())
}
#[cfg(web)]
pub fn run_web<A: Application + 'static>(app: A) -> anyhow::Result<()> {
use winit::platform::web::EventLoopExtWebSys;
console_error_panic_hook::set_once();
let _ = console_log::init_with_level(log::Level::Info);
let event_loop = winit::event_loop::EventLoop::<A::Message>::with_user_event().build()?;
event_loop.set_control_flow(winit::event_loop::ControlFlow::Wait);
let proxy = event_loop.create_proxy();
let app = App::new(app, proxy);
event_loop.spawn_app(app);
Ok(())
}
#[cfg(android)]
pub fn run_android<A: Application>(app: A, android_app: AndroidApp) -> anyhow::Result<()> {
use winit::platform::android::EventLoopBuilderExtAndroid;
android_logger::init_once(
android_logger::Config::default().with_max_level(log::LevelFilter::Info),
);
let event_loop = winit::event_loop::EventLoop::<A::Message>::with_user_event()
.with_android_app(android_app.clone())
.build()?;
event_loop.set_control_flow(winit::event_loop::ControlFlow::Wait);
let proxy = event_loop.create_proxy();
let mut app = App::new(app, proxy);
android_ime::install(&android_app);
app.set_android_app(android_app);
event_loop.run_app(&mut app)?;
std::process::exit(0);
}