use fltk_sys::fl;
use std::sync::{
Arc, LazyLock, Mutex,
atomic::{AtomicBool, Ordering},
};
pub(crate) static IS_INIT: AtomicBool = AtomicBool::new(false);
pub(crate) static FONTS: LazyLock<Arc<Mutex<Vec<String>>>> = LazyLock::new(|| {
Arc::from(Mutex::from(vec![
"Helvetica".to_owned(),
"HelveticaBold".to_owned(),
"HelveticaItalic".to_owned(),
"HelveticaBoldItalic".to_owned(),
"Courier".to_owned(),
"CourierBold".to_owned(),
"CourierItalic".to_owned(),
"CourierBoldItalic".to_owned(),
"Times".to_owned(),
"TimesBold".to_owned(),
"TimesItalic".to_owned(),
"TimesBoldItalic".to_owned(),
"Symbol".to_owned(),
"Screen".to_owned(),
"ScreenBold".to_owned(),
"Zapfdingbats".to_owned(),
]))
});
static UI_THREAD: LazyLock<std::thread::ThreadId> = LazyLock::new(|| std::thread::current().id());
pub fn init_all() {
unsafe {
fl::Fl_init_all();
#[cfg(not(feature = "single-threaded"))]
assert!((fl::Fl_lock() == 0), "fltk-rs requires threading support!");
#[cfg(feature = "enable-glwindow")]
{
unsafe extern "C" {
pub fn open_gl() -> i32;
}
open_gl();
}
if !IS_INIT.load(Ordering::Relaxed) {
IS_INIT.store(true, Ordering::Relaxed);
}
}
}
#[doc(hidden)]
pub fn is_ui_thread() -> bool {
*UI_THREAD == std::thread::current().id()
}
pub fn is_initialized() -> bool {
IS_INIT.load(Ordering::Relaxed)
}
pub fn disable_wayland() {
unsafe { fl::Fl_disable_wayland() }
}