baseview 0.4.0

Low-level windowing system geared towards making audio plugin UIs.
Documentation
use crate::wrappers::win32::window::{HWnd, PostMessageExt, SyncHwnd};
use std::sync::{Arc, OnceLock};
use std::time::Duration;

pub struct WindowWakerSource {
    data: Arc<OnceLock<SyncHwnd>>,
}

impl WindowWakerSource {
    pub fn new() -> Self {
        Self { data: Arc::new(OnceLock::new()) }
    }

    pub fn set(&self, hwnd: HWnd) {
        let Ok(()) = self.data.set(hwnd.into()) else { unreachable!() };
    }

    pub fn waker(&self) -> WindowWaker {
        WindowWaker { shared: Arc::clone(&self.data) }
    }
}

#[derive(Clone)]
pub struct WindowWaker {
    shared: Arc<OnceLock<SyncHwnd>>,
}

impl WindowWaker {
    pub fn request_redraw(&self) {
        self.request_redraw_after(Duration::ZERO)
    }

    pub fn request_redraw_after(&self, duration: Duration) {
        let Some(hwnd) = self.shared.get() else { return };
        hwnd.post_request_redraw(duration)
    }

    pub fn request_poll(&self) {
        let Some(hwnd) = self.shared.get() else { return };
        hwnd.post_request_poll()
    }
}