portlight 0.0.2

Cross-platform window management for audio plugins
Documentation
use std::cell::RefCell;
use std::rc::Rc;

use crate::{Event, EventLoop, Response, Size, Window, WindowOptions};

pub fn leak() {
    struct State {
        window: Option<Window>,
    }

    impl State {
        fn handle_event(&mut self, _event: Event) -> Response {
            Response::Ignore
        }
    }

    let event_loop = EventLoop::new().unwrap();
    let event_loop_weak = Rc::downgrade(&event_loop.state);

    let state = Rc::new(RefCell::new(State { window: None }));
    let state_weak = Rc::downgrade(&state);

    let window = WindowOptions::new()
        .size(Size::new(1.0, 1.0))
        .open(&event_loop, {
            let state = Rc::downgrade(&state);
            move |event| state.upgrade().unwrap().borrow_mut().handle_event(event)
        })
        .unwrap();
    let window_weak = Rc::downgrade(&window.state);
    state.borrow_mut().window = Some(window);

    assert!(event_loop_weak.upgrade().is_some());
    assert!(state_weak.upgrade().is_some());
    assert!(window_weak.upgrade().is_some());

    drop(event_loop);
    drop(state);

    assert!(event_loop_weak.upgrade().is_none());
    assert!(state_weak.upgrade().is_none());
    assert!(window_weak.upgrade().is_none());
}