mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2024-12-25 14:51:30 +11:00
9602716ed2
* Rename EventsLoop and associated types to EventLoop * Rename WindowEvent::Refresh to WindowEvent::Redraw * Remove second thread from win32 backend * Update run_forever to hijack thread * Replace windows Mutex with parking_lot Mutex * Implement new ControlFlow and associated events * Add StartCause::Init support, timer example * Add ability to send custom user events * Fully invert windows control flow so win32 calls into winit's callback * Add request_redraw * Rename platform to platform_impl * Rename os to platform, add Ext trait postfixes * Add platform::desktop module with EventLoopExt::run_return * Re-organize into module structure * Improve documentation * Small changes to examples * Improve docs for run and run_return * Change instances of "events_loop" to "event_loop" * Rename MonitorId to MonitorHandle * Add CHANGELOG entry * Improve WaitUntil timer precision * When SendEvent is called during event closure, buffer events * Fix resize lag when waiting in some situations * Update send test and errors that broke some examples/APIs * Improve clarity/fix typos in docs * Fix unreachable panic after setting ControlFlow to Poll during some RedrawRequested events. * Fix crash when running in release mode * Remove crossbeam dependency and make drop events work again * Remove serde implementations from ControlFlow * Fix 1.24.1 build * Fix freeze when setting decorations * Replace &EventLoop in callback with &EventLoopWindowTarget * Document and implement Debug for EventLoopWindowTarget * Fix some deadlocks that could occur when changing window state * Fix thread executor not executing closure when called from non-loop thread * Fix buffered events not getting dispatched * Fix crash with runner refcell not getting dropped * Address review feedback * Fix CHANGELOG typo * Catch panics in user callback
92 lines
3 KiB
Rust
92 lines
3 KiB
Rust
//! Types useful for interacting with a user's monitors.
|
|
//!
|
|
//! If you want to get basic information about a monitor, you can use the [`MonitorHandle`][monitor_id]
|
|
//! type. This is retreived from an [`AvailableMonitorsIter`][monitor_iter], which can be acquired
|
|
//! with:
|
|
//! - [`EventLoop::get_available_monitors`][loop_get]
|
|
//! - [`Window::get_available_monitors`][window_get].
|
|
//!
|
|
//! [monitor_id]: ./struct.MonitorHandle.html
|
|
//! [monitor_iter]: ./struct.AvailableMonitorsIter.html
|
|
//! [loop_get]: ../event_loop/struct.EventLoop.html#method.get_available_monitors
|
|
//! [window_get]: ../window/struct.Window.html#method.get_available_monitors
|
|
use std::collections::vec_deque::IntoIter as VecDequeIter;
|
|
|
|
use platform_impl;
|
|
use dpi::{PhysicalPosition, PhysicalSize};
|
|
|
|
/// An iterator over all available monitors.
|
|
///
|
|
/// Can be acquired with:
|
|
/// - [`EventLoop::get_available_monitors`][loop_get]
|
|
/// - [`Window::get_available_monitors`][window_get].
|
|
///
|
|
/// [loop_get]: ../event_loop/struct.EventLoop.html#method.get_available_monitors
|
|
/// [window_get]: ../window/struct.Window.html#method.get_available_monitors
|
|
// Implementation note: we retrieve the list once, then serve each element by one by one.
|
|
// This may change in the future.
|
|
#[derive(Debug)]
|
|
pub struct AvailableMonitorsIter {
|
|
pub(crate) data: VecDequeIter<platform_impl::MonitorHandle>,
|
|
}
|
|
|
|
impl Iterator for AvailableMonitorsIter {
|
|
type Item = MonitorHandle;
|
|
|
|
#[inline]
|
|
fn next(&mut self) -> Option<MonitorHandle> {
|
|
self.data.next().map(|id| MonitorHandle { inner: id })
|
|
}
|
|
|
|
#[inline]
|
|
fn size_hint(&self) -> (usize, Option<usize>) {
|
|
self.data.size_hint()
|
|
}
|
|
}
|
|
|
|
/// Handle to a monitor.
|
|
///
|
|
/// Allows you to retrieve information about a given monitor and can be used in [`Window`] creation.
|
|
///
|
|
/// [`Window`]: ../window/struct.Window.html
|
|
#[derive(Debug, Clone)]
|
|
pub struct MonitorHandle {
|
|
pub(crate) inner: platform_impl::MonitorHandle
|
|
}
|
|
|
|
impl MonitorHandle {
|
|
/// Returns a human-readable name of the monitor.
|
|
///
|
|
/// Returns `None` if the monitor doesn't exist anymore.
|
|
#[inline]
|
|
pub fn get_name(&self) -> Option<String> {
|
|
self.inner.get_name()
|
|
}
|
|
|
|
/// Returns the monitor's resolution.
|
|
#[inline]
|
|
pub fn get_dimensions(&self) -> PhysicalSize {
|
|
self.inner.get_dimensions()
|
|
}
|
|
|
|
/// Returns the top-left corner position of the monitor relative to the larger full
|
|
/// screen area.
|
|
#[inline]
|
|
pub fn get_position(&self) -> PhysicalPosition {
|
|
self.inner.get_position()
|
|
}
|
|
|
|
/// Returns the DPI factor that can be used to map logical pixels to physical pixels, and vice versa.
|
|
///
|
|
/// See the [`dpi`](dpi/index.html) module for more information.
|
|
///
|
|
/// ## Platform-specific
|
|
///
|
|
/// - **X11:** Can be overridden using the `WINIT_HIDPI_FACTOR` environment variable.
|
|
/// - **Android:** Always returns 1.0.
|
|
#[inline]
|
|
pub fn get_hidpi_factor(&self) -> f64 {
|
|
self.inner.get_hidpi_factor()
|
|
}
|
|
}
|