Go to file
Francesca Frangipane d667a395b6 x11: Destroy dropped windows; handle WM_DELETE_WINDOW (#416)
Fixes #79 #414

This changes the implementation of Drop for Window to send a WM_DELETE_WINDOW ClientMessage,
offloading all the cleanup and window destruction to the event loop. Unsurprisingly, this
entails that the event loop now handles WM_DELETE_WINDOW using the behavior that was
previously contained in Window's Drop implementation, along with destroying the Window.
Not only does this mean that dropped windows are closed, but also that clicking the × button
on the window actually closes it now.

The previous implemention of Drop was also broken, as the event loop would be (seemingly
permenanently) frozen after its invocation. That was caused specifically by the mutex
locking, and is no longer an issue now that the locking is done in the event loop.

While I don't have full confidence that it makes sense for the Drop implementation to behave
this way, this is nonetheless a significant improvement. The previous behavior led to
inconsistent state, panics, and event loop breakage, along with not actually destroying the
window.

This additionally makes the assumption that users don't need Focused or CursorLeft events
for the destroyed window, as Closed is adequate to indicate unfocus, and users may not
expect to receive events for closed/dropped windows. In my testing, those specific events
were sent immediately after the window was destroyed, though this sort of behavior could be
WM-specific. I've opted to explicitly suppress those events in the case of the window no
longer existing.
2018-03-23 10:31:31 +01:00
.circleci Implement virtual key translation for emscripten (#289) 2017-09-16 15:46:53 +02:00
examples Mouse events (#344) 2017-11-12 21:56:57 +01:00
src x11: Destroy dropped windows; handle WM_DELETE_WINDOW (#416) 2018-03-23 10:31:31 +01:00
tests Formalize thread-safety guarantees (#322) 2017-10-18 20:40:21 +02:00
.gitattributes Initial commit 2014-07-27 11:41:26 +02:00
.gitignore win32: Bump user32-sys req for MapVirtualKeyA 2015-09-22 14:01:27 -04:00
.gitmodules Add basic support for Android 2014-09-11 18:28:07 +02:00
.travis.yml Use travis matrix for the ios/linux variants (#313) 2017-10-08 15:51:55 +02:00
appveyor.yml Fix the appveyor build 2015-09-24 08:37:52 +02:00
Cargo.toml Version bump (#418) 2018-03-06 18:07:18 +01:00
CHANGELOG.md x11: Destroy dropped windows; handle WM_DELETE_WINDOW (#416) 2018-03-23 10:31:31 +01:00
LICENSE Initial commit 2014-07-27 11:41:26 +02:00
README.md Fix readme for webassembly usage. (#425) 2018-03-22 17:56:21 +01:00

winit - Cross-platform window creation and management in Rust

Docs.rs

Build Status Build status

[dependencies]
winit = "0.7"

Documentation

Usage

Winit is a window creation and management library. It can create windows and lets you handle events (for example: the window being resized, a key being pressed, a mouse movement, etc.) produced by window.

Winit is designed to be a low-level brick in a hierarchy of libraries. Consequently, in order to show something on the window you need to use the platform-specific getters provided by winit, or another library.

extern crate winit;

fn main() {
    let mut events_loop = winit::EventsLoop::new();
    let window = winit::Window::new(&events_loop).unwrap();

    events_loop.run_forever(|event| {
        match event {
            winit::Event::WindowEvent { event: winit::WindowEvent::Closed, .. } => {
                winit::ControlFlow::Break
            },
            _ => winit::ControlFlow::Continue,
        }
    });
}

Platform-specific usage

Emscripten and WebAssembly

Building a binary will yield a .js file. In order to use it in an HTML file, you need to:

  • Put a <canvas id="my_id"></canvas> element somewhere. A canvas corresponds to a winit "window".
  • Write a Javascript code that creates a global variable named Module. Set Module.canvas to the element of the <canvas> element (in the example you would retrieve it via document.getElementById("my_id")). More information here.
  • Make sure that you insert the .js file generated by Rust after the Module variable is created.