* X11: General cleanup This is almost entirely internal changes, and as usual, doesn't actually fix any problems people have complained about. - `XSetInputFocus` can't be called before the window is visible. This was previously handled by looping (with a sleep) and querying for the window's state until it was visible. Now we use `XIfEvent`, which blocks until we receive `VisibilityNotify`. Note that this can't be replaced with an `XSync` (I tried). - We now call `XSync` at the end of window creation and check for errors, assuring that broken windows are never returned. When creating invisible windows, this is the only time the output buffer is flushed during the entire window creation process (AFAIK). For visible windows, `XIfEvent` will generally flush, but window creation has overall been reduced to the minimum number of flushes. - `check_errors().expect()` has been a common pattern throughout the backend, but it seems that people (myself included) didn't make a distinction between using it after synchronous requests and asynchronous requests. Now we only use it after async requests if we flush first, though this still isn't correct (since the request likely hasn't been processed yet). The only real solution (besides forcing a sync *every time*) is to handle asynchronous errors *asynchronously*. For future work, I plan on adding logging, though I don't plan on actually *handling* those errors; that's more of something to hope for in the hypothetical async/await XCB paradise. - We now flush whenever it makes sense to. `util::Flusher` was added to force contributors to be aware of the output buffer. - `Window::get_position`, `Window::get_inner_position`, `Window::get_inner_size`, and `Window::get_outer_size` previously all required *several* round-trips. On my machine, it took an average of around 80µs. They've now been reduced to one round-trip each, which reduces my measurement to 16µs. This was accomplished simply by caching the frame extents, which are expensive to calculate (due to various queries and heuristics), but change infrequently and predictably. I still recommend that application developers use these methods sparingly and generally prefer storing the values from `Resized`/`Moved`, as that's zero overhead. - The above change enabled me to change the `Moved` event to supply window positions, rather than client area positions. Additionally, we no longer generate `Moved` for real (as in, not synthetic) `ConfigureNotify` events. Real `ConfigureNotify` events contain positions relative to the parent window, which are typically constant and useless. Since that position would be completely different from the root-relative positions supplied by synthetic `ConfigureNotify` events (which are the vast majority of them), that meant real `ConfigureNotify` events would *always* be detected as the position having changed, so the resultant `Moved` was multiple levels of misleading. In practice, this meant a garbage `Moved` would be sent every time the window was resized; now a resize has to actually change the window's position to be accompanied by `Moved`. - Every time we processed an `XI_Enter` event, we would leak 4 bytes via `util::query_pointer` (`XIQueryPointer`). `XIButtonState` contains a dynamically-allocated mask field which we weren't freeing. As this event occurs with fairly high frequency, long-running applications could easily accumulate substantial leaks. `util::PointerState::drop` now takes care of this. - The `util` module has been split up into several sub-modules, as it was getting rather lengthy. This accounts for a significant part of this diff, unfortunately. - Atoms are now cached. Xlib caches them too, so `XInternAtom` wouldn't typically be a round-trip anyway, but the added complexity is negligible. - Switched from `std::sync::Mutex` to `parking_lot::Mutex` (within this backend). There appears to be no downside to this, but if anyone finds one, this would be easy to revert. - The WM name and supported hints are now global to the application, and are updated upon `ReparentNotify`, which should detect when the WM was replaced (assuming a reparenting WM was involved, that is). Previously, these values were per-window and would never update, meaning replacing the WM could potentially lead to (admittedly very minor) problems. - The result of `Window2::create_empty_cursor` will now only be used if it actually succeeds. - `Window2::load_cursor` no longer re-allocates the cursor name. - `util::lookup_utf8` previously allocated a 16-byte buffer on the heap. Now it allocates a 1024-byte buffer on the stack, and falls back to dynamic allocation if the buffer is too small. This base buffer size is admittedly gratuitous, but less so if you're using IME. - `with_c_str` was finally removed. - Added `util::Format` enum to help prevent goofs when dealing with format arguments. - `util::get_property`, something I added way back in my first winit PR, only calculated offsets correctly for `util::Format::Char`. This was concealed by the accomodating buffer size, as it would be very rare for the offset to be needed; however, testing with a buffer size of 1, `util::Format::Long` would read from the same offset multiple times, and `util::Format::Short` would miss data. This function now works correctly for all formats, relying on the simple fact that the offset increases by the buffer size on each iteration. We also account for the extra byte that `XGetWindowProperty` allocates at the end of the buffer, and copy data from the buffer instead of moving it and taking ownership of the pointer. - Drag and drop now reliably works in release mode. This is presumably related to the `util::get_property` changes. - `util::change_property` now exists, which should make it easier to add features in the future. - The `EventsLoop` device map is no longer in a mutex. - `XConnection` now implements `Debug`. - Valgrind no longer complains about anything related to winit (with either the system allocator or jemalloc, though "not having valgrind complain about jemalloc" isn't something to strive for). * X11: Add better diagnostics when initialization fails * X11: Handle XIQueryDevice failure * X11: Use correct types in error handler
10 KiB
10 KiB
Unreleased
- Created the
Copy,PasteandCutVirtualKeyCodes and added support for them on X11 and Wayland - Fix
.with_decorations(false)in macOS - On Mac,
NSWindowand supporting objects might be alive long after they wereclosedwhich resulted in apps consuming more heap then needed. Mainly it was affecting multi window applications. Not expecting any user visible change of behaviour after the fix. - Fix regression of Window platform extensions for macOS where
NSFullSizeContentViewWindowMaskwas not being correctly applied to.fullsize_content_view. - Corrected
get_positionon Windows to be relative to the screen rather than to the taskbar. - Corrected
Movedevent on Windows to use position values equivalent to those returned byget_position. It previously supplied client area positions instead of window positions, and would additionally interpret negative values as being very large (aroundu16::MAX). - Implemented
Movedevent on macOS. - On X11, the
Movedevent correctly use window positions rather than client area positions. Additionally, a strayMovedthat unconditionally accompaniedResizedwith the client area position relative to the parent has been eliminated;Movedis still received alongsideResized, but now only once and always correctly. - On Windows, implemented all variants of
DeviceEventother thanText. MouseDeviceEvents are now received even if the window isn't in the foreground. DeviceIdon Windows is no longer a unit struct, and now contains au32. ForWindowEvents, this will always be 0, but onDeviceEvents it will be the handle to that device.DeviceIdExt::get_persistent_identifiercan be used to acquire a unique identifier for that device that persists across replugs/reboots/etc.- Corrected
run_foreveron X11 to stop discardingAwakenedevents. - Various safety and correctness improvements to the X11 backend internals.
- Fixed memory leak on X11 every time the mouse entered the window.
- On X11, drag and drop now works reliably in release mode.
Version 0.13.1 (2018-04-26)
- Ensure necessary
x11-dlversion is used.
Version 0.13.0 (2018-04-25)
- Implement
WindowBuilder::with_maximized,Window::set_fullscreen,Window::set_maximizedandWindow::set_decorationsfor MacOS. - Implement
WindowBuilder::with_maximized,Window::set_fullscreen,Window::set_maximizedandWindow::set_decorationsfor Windows. - On Windows,
WindowBuilder::with_fullscreenno longer changing monitor display resolution. - Overhauled X11 window geometry calculations.
get_positionandset_positionare more universally accurate across different window managers, andget_outer_sizeactually works now. - Fixed SIGSEGV/SIGILL crashes on macOS caused by stabilization of the
!(never) type. - Implement
WindowEvent::HiDPIFactorChangedfor macOS - On X11, input methods now work completely out of the box, no longer requiring application developers to manually call
setlocale. Additionally, when input methods are started, stopped, or restarted on the server end, it's correctly handled. - Implemented
Refreshevent on Windows. - Properly calculate the minimum and maximum window size on Windows, including window decorations.
- Map more
MouseCursorvariants to cursor icons on Windows. - Corrected
get_positionon macOS to return outer frame position, not content area position. - Corrected
set_positionon macOS to set outer frame position, not content area position. - Added
get_inner_positionmethod toWindow, which gets the position of the window's client area. This is implemented on all applicable platforms (all desktop platforms other than Wayland, where this isn't possible). - Breaking: the
Closedevent has been replaced byCloseRequestedandDestroyed. To migrate, you typically just need to replace all usages ofClosedwithCloseRequested; see example programs for more info. The exception is iOS, whereClosedmust be replaced byDestroyed.
Version 0.12.0 (2018-04-06)
- Added subclass to macos windows so they can be made resizable even with no decorations.
- Dead keys now work properly on X11, no longer resulting in a panic.
- On X11, input method creation first tries to use the value from the user's
XMODIFIERSenvironment variable, so application developers should no longer need to manually callXSetLocaleModifiers. If that fails, fallbacks are tried, which should prevent input method initialization from ever outright failing. - Fixed thread safety issues with input methods on X11.
- Add support for
Touchfor win32 backend. - Fixed
Window::get_inner_sizeand friends to return the size in pixels instead of points when using HIDPI displays on OSX.
Version 0.11.3 (2018-03-28)
- Added
set_min_dimensionsandset_max_dimensionsmethods toWindow, and implemented on Windows, X11, Wayland, and OSX. - On X11, dropping a
Windowactually closes it now, and clicking the window's × button (or otherwise having the WM signal to close it) will result in the window closing. - Added
WindowBuilderExtmethods for macos:with_titlebar_transparent,with_title_hidden,with_titlebar_buttons_hidden,with_fullsize_content_view. - Mapped X11 numpad keycodes (arrows, Home, End, PageUp, PageDown, Insert and Delete) to corresponding virtual keycodes
Version 0.11.2 (2018-03-06)
- Impl
Hash,PartialEq, andEqforevents::ModifiersState. - Implement
MonitorId::get_hidpi_factorfor MacOS. - Added method
os::macos::MonitorIdExt::get_nsscreen() -> *mut c_voidthat gets aNSScreenobject matching the monitor ID. - Send
Awakenedevent on Android when event loop is woken up.
Version 0.11.1 (2018-02-19)
- Fixed windows not receiving mouse events when click-dragging the mouse outside the client area of a window, on Windows platforms.
- Added method
os::android::EventsLoopExt:set_suspend_callback(Option<Box<Fn(bool) -> ()>>)that allows glutin to register a callback when a suspend event happens
Version 0.11.0 (2018-02-09)
- Implement
MonitorId::get_dimensionsfor Android. - Added method
os::macos::WindowBuilderExt::with_movable_by_window_background(bool)that allows to move a window without a titlebar -with_decorations(false) - Implement
Window::set_fullscreen,Window::set_maximizedandWindow::set_decorationsfor Wayland. - Added
Caretas VirtualKeyCode and support OSX ^-Key with german input.
Version 0.10.1 (2018-02-05)
Yanked
Version 0.10.0 (2017-12-27)
- Add support for
Touchfor emscripten backend. - Added support for
DroppedFile,HoveredFile, andHoveredFileCancelledto X11 backend. - Breaking:
unix::WindowExtno longer returns pointers for things that aren't actually pointers;get_xlib_windownow returnsOption<std::os::raw::c_ulong>andget_xlib_screen_idreturnsOption<std::os::raw::c_int>. Additionally, methods that previously returnedlibc::c_voidhave been changed to returnstd::os::raw::c_void, which are not interchangeable types, so users wanting the former will need to explicitly cast. - Added
set_decorationsmethod toWindowto allow decorations to be toggled after the window is built. Presently only implemented on X11. - Raised the minimum supported version of Rust to 1.20 on MacOS due to usage of associated constants in new versions of cocoa and core-graphics.
- Added
modifiersfield toMouseInput,MouseWheel, andCursorMovedevents to track the modifiers state (ModifiersState). - Fixed the emscripten backend to return the size of the canvas instead of the size of the window.
Version 0.9.0 (2017-12-01)
- Added event
WindowEvent::HiDPIFactorChanged. - Added method
MonitorId::get_hidpi_factor. - Deprecated
get_inner_size_pixelsandget_inner_size_pointsmethods ofWindowin favor ofget_inner_size. - Breaking:
EventsLoopis!Sendand!Syncbecause of platform-dependant constraints, butWindow,WindowId,DeviceIdandMonitorIdguaranteed to beSend. MonitorId::get_positionnow returns(i32, i32)instead of(u32, u32).- Rewrite of the wayland backend to use wayland-client-0.11
- Support for dead keys on wayland for keyboard utf8 input
- Monitor enumeration on Windows is now implemented using
EnumDisplayMonitorsinstead ofEnumDisplayDevices. This changes the value returned byMonitorId::get_name(). - On Windows added
MonitorIdExt::hmonitormethod - Impl
CloneforEventsLoopProxy EventsLoop::get_primary_monitor()on X11 will fallback to any available monitor if no primary is found- Support for touch event on wayland
WindowEventsMouseMoved,MouseEntered, andMouseLefthave been renamed toCursorMoved,CursorEntered, andCursorLeft.- New
DeviceEvents added,MouseMotionandMouseWheel. - Send
CursorMovedevent afterCursorEnteredandFocusedevents. - Add support for
ModifiersState,MouseMove,MouseInput,MouseMotionfor emscripten backend.
Version 0.8.3 (2017-10-11)
- Fixed issue of calls to
set_inner_sizeblocking on Windows. - Mapped
ISO_Left_TabtoVirtualKeyCode::Tabto make the key work with modifiers - Fixed the X11 backed on 32bit targets
Version 0.8.2 (2017-09-28)
- Uniformize keyboard scancode values accross Wayland and X11 (#297).
- Internal rework of the wayland event loop
- Added method
os::linux::WindowExt::is_ready
Version 0.8.1 (2017-09-22)
- Added various methods to
os::linux::EventsLoopExt, plus some hidden items necessary to make glutin work.
Version 0.8.0 (2017-09-21)
- Added
Window::set_maximized,WindowAttributes::maximizedandWindowBuilder::with_maximized. - Added
Window::set_fullscreen. - Changed
with_fullscreento take aOption<MonitorId>instead of aMonitorId. - Removed
MonitorId::get_native_identifer()in favor of platform-specific traits in theosmodule. - Changed
get_available_monitors()andget_primary_monitor()to be methods ofEventsLoopinstead of stand-alone methods. - Changed
EventsLoopto be tied to a specific X11 or Wayland connection. - Added a
os::linux::EventsLoopExttrait that makes it possible to configure the connection. - Fixed the emscripten code, which now compiles.
- Changed the X11 fullscreen code to use
xrandrinstead ofxxf86vm. - Fixed the Wayland backend to produce
Refreshevent after window creation. - Changed the
Suspendedevent to be outside ofWindowEvent. - Fixed the X11 backend sometimes reporting the wrong virtual key (#273).