glutin 0.8.1

Cross-platform OpenGL context provider.
Documentation
extern crate glutin;

mod support;

fn main() {
    let events_loop = glutin::EventsLoop::new();

    let window1 = glutin::WindowBuilder::new().build(&events_loop).unwrap();
    let window2 = glutin::WindowBuilder::new().build(&events_loop).unwrap();
    let window3 = glutin::WindowBuilder::new().build(&events_loop).unwrap();

    let mut num_windows = 3;

    let _ = unsafe { window1.make_current() };
    let context1 = support::load(&window1);
    let _ = unsafe { window2.make_current() };
    let context2 = support::load(&window2);
    let _ = unsafe { window3.make_current() };
    let context3 = support::load(&window3);

    fn draw_to_window(window: &glutin::Window, context: &support::Context, color: (f32, f32, f32, f32)) {
        let _ = unsafe { window.make_current() };
        context.draw_frame(color);
        let _ = window.swap_buffers();
    }

    events_loop.run_forever(|event| {
        println!("{:?}", event);

        match event {
            glutin::Event::WindowEvent { event: glutin::WindowEvent::Closed, window_id } => {
                if window_id == window1.id() {
                    println!("Window 1 has been closed")
                } else if window_id == window2.id() {
                    println!("Window 2 has been closed")
                } else if window_id == window3.id() {
                    println!("Window 3 has been closed");
                } else {
                    unreachable!()
                }

                num_windows -= 1;
                if num_windows == 0 {
                    events_loop.interrupt();
                }
            },
            _ => (),
        }

        draw_to_window(&window1, &context1, (0.0, 1.0, 0.0, 1.0));
        draw_to_window(&window2, &context2, (0.0, 0.0, 1.0, 1.0));
        draw_to_window(&window3, &context3, (1.0, 0.0, 0.0, 1.0));
    });
}