mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2024-12-23 22:01:31 +11:00
Merge branch 'evl2' into eventloop-2.0
This commit is contained in:
commit
8d6a857ba5
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
@ -2,3 +2,4 @@
|
||||||
- [ ] Added an entry to `CHANGELOG.md` if knowledge of this change could be valuable to users
|
- [ ] Added an entry to `CHANGELOG.md` if knowledge of this change could be valuable to users
|
||||||
- [ ] Updated documentation to reflect any user-facing changes, including notes of platform-specific behavior
|
- [ ] Updated documentation to reflect any user-facing changes, including notes of platform-specific behavior
|
||||||
- [ ] Created an example program if it would help users understand this functionality
|
- [ ] Created an example program if it would help users understand this functionality
|
||||||
|
- [ ] Updated [feature matrix](https://github.com/tomaka/winit/blob/master/FEATURES.md), if new features were added or implemented
|
||||||
|
|
|
@ -1,28 +1,10 @@
|
||||||
# Winit Contributing Guidelines
|
# Winit Contributing Guidelines
|
||||||
|
|
||||||
## Scope
|
## Scope
|
||||||
|
[See `FEATURES.md`](./FEATURES.md). When requesting or implementing a new Winit feature, you should
|
||||||
|
consider whether or not it's directly related to window creation or input handling. If it isn't, it
|
||||||
|
may be worth creating a separate crate that extends Winit's API to add that functionality.
|
||||||
|
|
||||||
Winit aims to provide a generic platform abstracting the main graphic platforms (Windows, macOS, X11,
|
|
||||||
Wayland, Android, iOS and the web platform via Emscripten).
|
|
||||||
|
|
||||||
Most platforms expose capabilities that cannot be meaningfully transposed to the others. Winit does not
|
|
||||||
aim to support every single functionality of every platform, but rather to abstract the set of
|
|
||||||
capabilities that is common to all platforms. In this context, APIs exposed in winit can be split into
|
|
||||||
different "support levels":
|
|
||||||
|
|
||||||
- Tier 1: features which are in the main scope of winit. They are part of the common API of winit, and
|
|
||||||
are taken care of by the maintainers. Any part of these features that is not working correctly is
|
|
||||||
considered a bug in winit.
|
|
||||||
- Tier 2: some platform-specific features can be sufficiently fundamental to the platform that winit can
|
|
||||||
integrate support for them in the platform-specific part of the API. These features are not considered
|
|
||||||
directly handled by the maintainers of winit. If you have a strong incentive to have such a feature
|
|
||||||
integrated in winit, consider implementing it and proposing yourself to maintain it in the future.
|
|
||||||
- Tier 3: these features are not directly exposed by winit, but rather can be implemented using the
|
|
||||||
raw handles to the underlying platform that winit exposes. If your feature of interest is rather
|
|
||||||
niche, this is probably where it belongs.
|
|
||||||
|
|
||||||
The exact list of supported Tier 1 features is tracked in this issue:
|
|
||||||
[#252](https://github.com/tomaka/winit/issues/252).
|
|
||||||
|
|
||||||
## Reporting an issue
|
## Reporting an issue
|
||||||
|
|
||||||
|
@ -44,6 +26,9 @@ When making a code contribution to winit, before opening your pull request, plea
|
||||||
- you left comments in your code explaining any part that is not straightforward, so that the
|
- you left comments in your code explaining any part that is not straightforward, so that the
|
||||||
maintainers and future contributors don't have to try to guess what your code is supposed to do
|
maintainers and future contributors don't have to try to guess what your code is supposed to do
|
||||||
- your PR adds an entry to the changelog file if the introduced change is relevant to winit users
|
- your PR adds an entry to the changelog file if the introduced change is relevant to winit users
|
||||||
|
- if your PR affects the platform compatibility of one or more features or adds another feature, the
|
||||||
|
relevant sections in [`FEATURES.md`](https://github.com/rust-windowing/winit/blob/master/FEATURES.md#features)
|
||||||
|
should be updated.
|
||||||
|
|
||||||
Once your PR is open, you can ask for review by a maintainer of your platform. Winit's merging policy
|
Once your PR is open, you can ask for review by a maintainer of your platform. Winit's merging policy
|
||||||
is that a PR must be approved by at least two maintainers of winit before being merged, including
|
is that a PR must be approved by at least two maintainers of winit before being merged, including
|
||||||
|
@ -56,14 +41,13 @@ backends of winit. As such, depending on your platform of interest, your contact
|
||||||
|
|
||||||
This table summarizes who can be contacted in which case, with the following legend:
|
This table summarizes who can be contacted in which case, with the following legend:
|
||||||
|
|
||||||
- `M`: is a main maintainer for this platform
|
- `M` - Maintainer: is a main maintainer for this platform
|
||||||
- `R`: can review code for this platform
|
- `C` - Collaborator: can review code and address issues on this platform
|
||||||
- `T`: has the ability of testing the platform
|
- `T` - Tester: has the ability of testing the platform
|
||||||
- ` `: knows nothing of this platform
|
- ` `: knows nothing of this platform
|
||||||
|
|
||||||
| Platform | Windows | macOS | X11 | Wayland | Android | iOS | Emscripten |
|
| Platform | Windows | macOS | X11 | Wayland | Android | iOS | Emscripten |
|
||||||
| :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
|
| :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
|
||||||
| @francesca64 | R | M | M | | M | R | |
|
|
||||||
| @mitchmindtree | T | | T | T | | | |
|
| @mitchmindtree | T | | T | T | | | |
|
||||||
| @Osspial | M | | T | T | T | | T |
|
| @Osspial | M | | T | T | T | | T |
|
||||||
| @vberger | | | T | M | | | |
|
| @vberger | | | T | M | | | |
|
||||||
|
|
209
FEATURES.md
Normal file
209
FEATURES.md
Normal file
|
@ -0,0 +1,209 @@
|
||||||
|
# Winit Scope
|
||||||
|
|
||||||
|
Winit aims to expose an interface that abstracts over window creation and input handling, and can
|
||||||
|
be used to create both games and applications. It supports the main graphical platforms:
|
||||||
|
- Desktop
|
||||||
|
- Windows
|
||||||
|
- macOS
|
||||||
|
- Unix
|
||||||
|
- via X11
|
||||||
|
- via Wayland
|
||||||
|
- Mobile
|
||||||
|
- iOS
|
||||||
|
- Android
|
||||||
|
- Web
|
||||||
|
- via Emscripten
|
||||||
|
- via WASM
|
||||||
|
|
||||||
|
Most platforms expose capabilities that cannot be meaningfully transposed onto others. Winit does not
|
||||||
|
aim to support every single feature of every platform, but rather to abstract over the common features
|
||||||
|
available everywhere. In this context, APIs exposed in winit can be split into different "support tiers":
|
||||||
|
|
||||||
|
- **Core:** Features that are essential to providing a well-formed abstraction over each platform's
|
||||||
|
windowing and input APIs.
|
||||||
|
- **Platform:** Platform-specific features that can't be meaningfully exposed through a common API and
|
||||||
|
cannot be implemented outside of Winit without exposing a significant amount of Winit's internals
|
||||||
|
or interfering with Winit's abstractions.
|
||||||
|
- **Usability:** Features that are not strictly essential to Winit's functionality, but provide meaningful
|
||||||
|
usability improvements and cannot be reasonably implemented in an external crate. These are
|
||||||
|
generally optional and exposed through Cargo features.
|
||||||
|
|
||||||
|
Core features are taken care of by the core Winit maintainers. Platform features are not.
|
||||||
|
When a platform feature is submitted, the submitter is considered the expert in the
|
||||||
|
feature and may be asked to support the feature should it break in the future.
|
||||||
|
|
||||||
|
Winit ***does not*** directly expose functionality for drawing inside windows or creating native
|
||||||
|
menus, but ***does*** commit to providing APIs that higher-level crates can use to implement that
|
||||||
|
functionality.
|
||||||
|
|
||||||
|
## `1.0` and stability
|
||||||
|
|
||||||
|
When all core features are implemented to the satisfaction of the Winit maintainers, Winit 1.0 will
|
||||||
|
be released and the library will enter maintenance mode. For the most part, new core features will not
|
||||||
|
be added past this point. New platform features may be accepted and exposed through point releases.
|
||||||
|
|
||||||
|
### Tier upgrades
|
||||||
|
Some platform features could in theory be exposed across multiple platforms, but have not gone
|
||||||
|
through the implementation work necessary to function on all platforms. When one of these features
|
||||||
|
gets implemented across all platforms, a PR can be opened to upgrade the feature to a core feature.
|
||||||
|
If that gets accepted, the platform-specific functions gets deprecated and become permanently
|
||||||
|
exposed through the core, cross-platform API.
|
||||||
|
|
||||||
|
# Features
|
||||||
|
|
||||||
|
## Extending this section
|
||||||
|
|
||||||
|
If your PR makes notable changes to Winit's features, please update this section as follows:
|
||||||
|
|
||||||
|
- If your PR adds a new feature, add a brief description to the relevant section. If the feature is a core
|
||||||
|
feature, add a row to the feature matrix and describe what platforms the feature has been implemented on.
|
||||||
|
|
||||||
|
- If your PR begins a new API rework, add a row to the `Pending API Reworks` table. If the PR implements the
|
||||||
|
API rework on all relevant platforms, please move it to the `Completed API Reworks` table.
|
||||||
|
|
||||||
|
- If your PR implements an already-existing feature on a new platform, either mark the feature as *completed*,
|
||||||
|
or mark it as *mostly completed* and link to an issue describing the problems with the implementation.
|
||||||
|
|
||||||
|
## Core
|
||||||
|
|
||||||
|
### Windowing
|
||||||
|
- **Window initialization**: Winit allows the creation of a window
|
||||||
|
- **Providing pointer to init OpenGL**: Winit provides the necessary pointers to initialize a working opengl context
|
||||||
|
- **Providing pointer to init Vulkan**: Same as OpenGL but for Vulkan
|
||||||
|
- **Window decorations**: The windows created by winit are properly decorated, and the decorations can
|
||||||
|
be deactivated
|
||||||
|
- **Window decorations toggle**: Decorations can be turned on or off after window creation
|
||||||
|
- **Window resizing**: The windows created by winit can be resized and generate the appropriate events
|
||||||
|
when they are. The application can precisely control its window size if desired.
|
||||||
|
- **Window resize increments**: When the window gets resized, the application can choose to snap the window's
|
||||||
|
size to specific values.
|
||||||
|
- **Window transparency**: Winit allows the creation of windows with a transparent background.
|
||||||
|
- **Window maximization**: The windows created by winit can be maximized upon creation.
|
||||||
|
- **Window maximization toggle**: The windows created by winit can be maximized and unmaximized after
|
||||||
|
creation.
|
||||||
|
- **Fullscreen**: The windows created by winit can be put into fullscreen mode.
|
||||||
|
- **Fullscreen toggle**: The windows created by winit can be switched to and from fullscreen after
|
||||||
|
creation.
|
||||||
|
- **HiDPI support**: Winit assists developers in appropriately scaling HiDPI content.
|
||||||
|
- **Popup / modal windows**: Windows can be created relative to the client area of other windows, and parent
|
||||||
|
windows can be disabled in favor of popup windows. This feature also guarantees that popup windows
|
||||||
|
get drawn above their owner.
|
||||||
|
|
||||||
|
|
||||||
|
### System Information
|
||||||
|
- **Monitor list**: Retrieve the list of monitors and their metadata, including which one is primary.
|
||||||
|
|
||||||
|
### Input Handling
|
||||||
|
- **Mouse events**: Generating mouse events associated with pointer motion, click, and scrolling events.
|
||||||
|
- **Mouse set location**: Forcibly changing the location of the pointer.
|
||||||
|
- **Cursor grab**: Locking the cursor so it cannot exit the client area of a window.
|
||||||
|
- **Cursor icon**: Changing the cursor icon, or hiding the cursor.
|
||||||
|
- **Touch events**: Single-touch events.
|
||||||
|
- **Multitouch**: Multi-touch events, including cancellation of a gesture.
|
||||||
|
- **Keyboard events**: Properly processing keyboard events using the user-specified keymap and
|
||||||
|
translating keypresses into UTF-8 characters, handling dead keys and IMEs.
|
||||||
|
- **Drag & Drop**: Dragging content into winit, detecting when content enters, drops, or if the drop is cancelled.
|
||||||
|
- **Raw Device Events**: Capturing input from input devices without any OS filtering.
|
||||||
|
- **Gamepad/Joystick events**: Capturing input from gampads and joysticks.
|
||||||
|
- **Device movement events:**: Capturing input from the device gyroscope and accelerometer.
|
||||||
|
|
||||||
|
## Platform
|
||||||
|
### Windows
|
||||||
|
* Setting the taskbar icon
|
||||||
|
* Setting the parent window
|
||||||
|
* `WS_EX_NOREDIRECTIONBITMAP` support
|
||||||
|
|
||||||
|
### macOS
|
||||||
|
* Window activation policy
|
||||||
|
* Window movable by background
|
||||||
|
* Transparent titlebar
|
||||||
|
* Hidden titlebar
|
||||||
|
* Hidden titlebar buttons
|
||||||
|
* Full-size content view
|
||||||
|
|
||||||
|
### Unix
|
||||||
|
* Window urgency
|
||||||
|
* X11 Window Class
|
||||||
|
* X11 Override Redirect Flag
|
||||||
|
* GTK Theme Variant
|
||||||
|
* Base window size
|
||||||
|
|
||||||
|
## Usability
|
||||||
|
* `serde`: Enables serialization/deserialization of certain types with Serde. (Maintainer: @Osspial)
|
||||||
|
|
||||||
|
## Compatibility Matrix
|
||||||
|
|
||||||
|
Legend:
|
||||||
|
|
||||||
|
- ✔️: Works as intended
|
||||||
|
- ▢: Mostly works but some bugs are known
|
||||||
|
- ❌: Missing feature or large bugs making it unusable
|
||||||
|
- **N/A**: Not applicable for this platform
|
||||||
|
- ❓: Unknown status
|
||||||
|
|
||||||
|
### Windowing
|
||||||
|
|Feature |Windows|MacOS |Linux x11 |Linux Wayland |Android|iOS |Emscripten|
|
||||||
|
|-------------------------------- | ----- | ---- | ------- | ----------- | ----- | ----- | -------- |
|
||||||
|
|Window initialization |✔️ |✔️ |▢[#5] |✔️ |▢[#33]|▢[#33] |❓ |
|
||||||
|
|Providing pointer to init OpenGL |✔️ |✔️ |✔️ |✔️ |✔️ |✔️ |❓ |
|
||||||
|
|Providing pointer to init Vulkan |✔️ |✔️ |✔️ |✔️ |✔️ |❓ |**N/A** |
|
||||||
|
|Window decorations |✔️ |✔️ |✔️ |▢[#306] |**N/A**|**N/A**|**N/A** |
|
||||||
|
|Window decorations toggle |✔️ |✔️ |✔️ |✔️ |**N/A**|**N/A**|**N/A** |
|
||||||
|
|Window resizing |✔️ |▢[#219]|✔️ |▢[#306] |**N/A**|**N/A**|❓ |
|
||||||
|
|Window resize increments |❌ |❌ |❌ |❌ |❌ |❌ |❌ |
|
||||||
|
|Window transparency |✔️ |✔️ |✔️ |✔️ |**N/A**|**N/A**|**N/A** |
|
||||||
|
|Window maximization |✔️ |✔️ |✔️ |✔️ |**N/A**|**N/A**|**N/A** |
|
||||||
|
|Window maximization toggle |✔️ |✔️ |✔️ |✔️ |**N/A**|**N/A**|**N/A** |
|
||||||
|
|Fullscreen |✔️ |✔️ |✔️ |✔️ |**N/A**|**N/A**|❌ |
|
||||||
|
|Fullscreen toggle |✔️ |✔️ |✔️ |✔️ |**N/A**|**N/A**|❌ |
|
||||||
|
|HiDPI support |✔️ |✔️ |✔️ |✔️ |▢[#721]|✔️ |✔️ |
|
||||||
|
|Popup windows |❌ |❌ |❌ |❌ |❌ |❌ |❌ |
|
||||||
|
|
||||||
|
### System information
|
||||||
|
|Feature |Windows|MacOS |Linux x11|Linux Wayland|Android|iOS |Emscripten|
|
||||||
|
|------------ | ----- | ---- | ------- | ----------- | ----- | ----- | -------- |
|
||||||
|
|Monitor list |✔️ |✔️ |✔️ |✔️ |**N/A**|**N/A**|**N/A** |
|
||||||
|
|
||||||
|
### Input handling
|
||||||
|
|Feature |Windows |MacOS |Linux x11|Linux Wayland|Android|iOS |Emscripten|
|
||||||
|
|----------------------- | ----- | ---- | ------- | ----------- | ----- | ----- | -------- |
|
||||||
|
|Mouse events |✔️ |▢[#63] |✔️ |✔️ |**N/A**|**N/A**|✔️ |
|
||||||
|
|Mouse set location |✔️ |✔️ |✔️ |❓ |**N/A**|**N/A**|**N/A** |
|
||||||
|
|Cursor grab |✔️ |▢[#165] |▢[#242] |❌[#306] |**N/A**|**N/A**|✔️ |
|
||||||
|
|Cursor icon |✔️ |✔️ |✔️ |❌[#306] |**N/A**|**N/A**|❌ |
|
||||||
|
|Touch events |✔️ |❌ |✔️ |✔️ |✔️ |✔️ |✔️ |
|
||||||
|
|Multitouch |❓ |❌ |✔️ |✔️ |❓ |❌ |❌ |
|
||||||
|
|Keyboard events |✔️ |✔️ |✔️ |✔️ |❓ |❌ |✔️ |
|
||||||
|
|Drag & Drop |▢[#720] |▢[#720] |▢[#720] |❌[#306] |**N/A**|**N/A**|❓ |
|
||||||
|
|Raw Device Events |▢[#750] |▢[#750] |▢[#750] |❌ |❌ |❌ |❌ |
|
||||||
|
|Gamepad/Joystick events |❌[#804] |❌ |❌ |❌ |❌ |❌ |❌ |
|
||||||
|
|Device movement events |❓ |❓ |❓ |❓ |❌ |❌ |❌ |
|
||||||
|
|
||||||
|
### Pending API Reworks
|
||||||
|
Changes in the API that have been agreed upon but aren't implemented across all platforms.
|
||||||
|
|
||||||
|
|Feature |Windows|MacOS |Linux x11|Linux Wayland|Android|iOS |Emscripten|
|
||||||
|
|------------------------------ | ----- | ---- | ------- | ----------- | ----- | ----- | -------- |
|
||||||
|
|New API for HiDPI ([#315] [#319]) |✔️ |✔️ |✔️ |✔️ |▢[#721]|✔️ |✔️ |
|
||||||
|
|Event Loop 2.0 ([#459]) |✔️ |❌ |❌ |✔️ |❌ |❌ |❌ |
|
||||||
|
|Keyboard Input ([#812]) |❌ |❌ |❌ |❌ |❌ |❌ |❌ |
|
||||||
|
|
||||||
|
### Completed API Reworks
|
||||||
|
|Feature |Windows|MacOS |Linux x11|Linux Wayland|Android|iOS |Emscripten|
|
||||||
|
|------------------------------ | ----- | ---- | ------- | ----------- | ----- | ----- | -------- |
|
||||||
|
|
||||||
|
[#165]: https://github.com/tomaka/winit/issues/165
|
||||||
|
[#219]: https://github.com/tomaka/winit/issues/219
|
||||||
|
[#242]: https://github.com/tomaka/winit/issues/242
|
||||||
|
[#306]: https://github.com/tomaka/winit/issues/306
|
||||||
|
[#315]: https://github.com/tomaka/winit/issues/315
|
||||||
|
[#319]: https://github.com/tomaka/winit/issues/319
|
||||||
|
[#33]: https://github.com/tomaka/winit/issues/33
|
||||||
|
[#459]: https://github.com/tomaka/winit/issues/459
|
||||||
|
[#5]: https://github.com/tomaka/winit/issues/5
|
||||||
|
[#63]: https://github.com/tomaka/winit/issues/63
|
||||||
|
[#720]: https://github.com/tomaka/winit/issues/720
|
||||||
|
[#721]: https://github.com/tomaka/winit/issues/721
|
||||||
|
[#750]: https://github.com/tomaka/winit/issues/750
|
||||||
|
[#804]: https://github.com/tomaka/winit/issues/804
|
||||||
|
[#812]: https://github.com/tomaka/winit/issues/812
|
11
HALL_OF_CHAMPIONS.md
Normal file
11
HALL_OF_CHAMPIONS.md
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
# Hall of Champions
|
||||||
|
|
||||||
|
The Winit maintainers would like to recognize the following former Winit
|
||||||
|
contributors, without whom Winit would not exist in its current form. We thank
|
||||||
|
them deeply for their time and efforts, and wish them best of luck in their
|
||||||
|
future endeavors:
|
||||||
|
|
||||||
|
* @tomaka: For creating the Winit project and guiding it through its early
|
||||||
|
years of existence.
|
||||||
|
* @francesca64: For taking over the responsibility of maintaining almost every
|
||||||
|
Winit backend, and standardizing HiDPI support across all of them
|
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
[![](http://meritbadge.herokuapp.com/winit)](https://crates.io/crates/winit)
|
[![](http://meritbadge.herokuapp.com/winit)](https://crates.io/crates/winit)
|
||||||
[![Docs.rs](https://docs.rs/winit/badge.svg)](https://docs.rs/winit)
|
[![Docs.rs](https://docs.rs/winit/badge.svg)](https://docs.rs/winit)
|
||||||
[![Build Status](https://travis-ci.org/tomaka/winit.svg?branch=master)](https://travis-ci.org/tomaka/winit)
|
[![Build Status](https://travis-ci.org/rust-windowing/winit.svg?branch=master)](https://travis-ci.org/rust-windowing/winit)
|
||||||
[![Build status](https://ci.appveyor.com/api/projects/status/5h87hj0g4q2xe3j9/branch/master?svg=true)](https://ci.appveyor.com/project/tomaka/winit/branch/master)
|
[![Build status](https://ci.appveyor.com/api/projects/status/hr89but4x1n3dphq/branch/master?svg=true)](https://ci.appveyor.com/project/Osspial/winit/branch/master)
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|
|
@ -85,6 +85,15 @@ fn main() {
|
||||||
window.set_fullscreen(Some(window.get_current_monitor()));
|
window.set_fullscreen(Some(window.get_current_monitor()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
(VirtualKeyCode::S, ElementState::Pressed) => {
|
||||||
|
println!("window.get_fullscreen {:?}", window.get_fullscreen());
|
||||||
|
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
{
|
||||||
|
use winit::os::macos::WindowExt;
|
||||||
|
println!("window.get_simple_fullscreen {:?}", WindowExt::get_simple_fullscreen(&window));
|
||||||
|
}
|
||||||
|
}
|
||||||
(VirtualKeyCode::M, ElementState::Pressed) => {
|
(VirtualKeyCode::M, ElementState::Pressed) => {
|
||||||
is_maximized = !is_maximized;
|
is_maximized = !is_maximized;
|
||||||
window.set_maximized(is_maximized);
|
window.set_maximized(is_maximized);
|
||||||
|
|
|
@ -26,6 +26,9 @@ pub trait WindowExtMacOS {
|
||||||
/// - `true`: the dock icon will bounce until the application is focused.
|
/// - `true`: the dock icon will bounce until the application is focused.
|
||||||
fn request_user_attention(&self, is_critical: bool);
|
fn request_user_attention(&self, is_critical: bool);
|
||||||
|
|
||||||
|
/// Returns whether or not the window is in simple fullscreen mode.
|
||||||
|
fn get_simple_fullscreen(&self) -> bool;
|
||||||
|
|
||||||
/// Toggles a fullscreen mode that doesn't require a new macOS space.
|
/// Toggles a fullscreen mode that doesn't require a new macOS space.
|
||||||
/// Returns a boolean indicating whether the transition was successful (this
|
/// Returns a boolean indicating whether the transition was successful (this
|
||||||
/// won't work if the window was already in the native fullscreen).
|
/// won't work if the window was already in the native fullscreen).
|
||||||
|
@ -52,6 +55,11 @@ impl WindowExtMacOS for Window {
|
||||||
self.window.request_user_attention(is_critical)
|
self.window.request_user_attention(is_critical)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn get_simple_fullscreen(&self) -> bool {
|
||||||
|
self.window.get_simple_fullscreen()
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn set_simple_fullscreen(&self, fullscreen: bool) -> bool {
|
fn set_simple_fullscreen(&self, fullscreen: bool) -> bool {
|
||||||
self.window.set_simple_fullscreen(fullscreen)
|
self.window.set_simple_fullscreen(fullscreen)
|
||||||
|
|
|
@ -368,6 +368,13 @@ impl Window {
|
||||||
// Android has single screen maximized apps so nothing to do
|
// Android has single screen maximized apps so nothing to do
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn get_fullscreen(&self) -> Option<RootMonitorHandle> {
|
||||||
|
// N/A
|
||||||
|
// Android has single screen maximized apps so nothing to do
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_fullscreen(&self, _monitor: Option<RootMonitorHandle>) {
|
pub fn set_fullscreen(&self, _monitor: Option<RootMonitorHandle>) {
|
||||||
// N/A
|
// N/A
|
||||||
|
|
|
@ -580,6 +580,11 @@ impl Window {
|
||||||
// iOS has single screen maximized apps so nothing to do
|
// iOS has single screen maximized apps so nothing to do
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn get_fullscreen(&self) -> Option<::MonitorHandle> {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_fullscreen(&self, _monitor: Option<::MonitorHandle>) {
|
pub fn set_fullscreen(&self, _monitor: Option<::MonitorHandle>) {
|
||||||
// iOS has single screen maximized apps so nothing to do
|
// iOS has single screen maximized apps so nothing to do
|
||||||
|
|
|
@ -473,6 +473,13 @@ impl Window {
|
||||||
// iOS has single screen maximized apps so nothing to do
|
// iOS has single screen maximized apps so nothing to do
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn get_fullscreen(&self) -> Option<RootMonitorHandle> {
|
||||||
|
// N/A
|
||||||
|
// iOS has single screen maximized apps so nothing to do
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_fullscreen(&self, _monitor: Option<RootMonitorHandle>) {
|
pub fn set_fullscreen(&self, _monitor: Option<RootMonitorHandle>) {
|
||||||
// N/A
|
// N/A
|
||||||
|
|
|
@ -297,6 +297,15 @@ impl Window {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn get_fullscreen(&self) -> Option<RootMonitorHandle> {
|
||||||
|
match self {
|
||||||
|
&Window::X(ref w) => w.get_fullscreen(),
|
||||||
|
&Window::Wayland(ref w) => w.get_fullscreen()
|
||||||
|
.map(|monitor_id| RootMonitorHandle { inner: MonitorHandle::Wayland(monitor_id) })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_fullscreen(&self, monitor: Option<RootMonitorHandle>) {
|
pub fn set_fullscreen(&self, monitor: Option<RootMonitorHandle>) {
|
||||||
match self {
|
match self {
|
||||||
|
|
|
@ -7,7 +7,7 @@ use monitor::MonitorHandle as RootMonitorHandle;
|
||||||
use window::{CreationError, WindowAttributes, MouseCursor};
|
use window::{CreationError, WindowAttributes, MouseCursor};
|
||||||
|
|
||||||
use sctk::surface::{get_dpi_factor, get_outputs};
|
use sctk::surface::{get_dpi_factor, get_outputs};
|
||||||
use sctk::window::{ConceptFrame, Event as WEvent, Window as SWindow, Theme};
|
use sctk::window::{ConceptFrame, Event as WEvent, State as WState, Window as SWindow, Theme};
|
||||||
use sctk::reexports::client::Display;
|
use sctk::reexports::client::Display;
|
||||||
use sctk::reexports::client::protocol::{wl_seat, wl_surface};
|
use sctk::reexports::client::protocol::{wl_seat, wl_surface};
|
||||||
use sctk::output::OutputMgr;
|
use sctk::output::OutputMgr;
|
||||||
|
@ -23,7 +23,8 @@ pub struct Window {
|
||||||
kill_switch: (Arc<Mutex<bool>>, Arc<Mutex<bool>>),
|
kill_switch: (Arc<Mutex<bool>>, Arc<Mutex<bool>>),
|
||||||
display: Arc<Display>,
|
display: Arc<Display>,
|
||||||
need_frame_refresh: Arc<Mutex<bool>>,
|
need_frame_refresh: Arc<Mutex<bool>>,
|
||||||
need_refresh: Arc<Mutex<bool>>
|
need_refresh: Arc<Mutex<bool>>,
|
||||||
|
fullscreen: Arc<Mutex<bool>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Window {
|
impl Window {
|
||||||
|
@ -31,6 +32,7 @@ impl Window {
|
||||||
let (width, height) = attributes.dimensions.map(Into::into).unwrap_or((800, 600));
|
let (width, height) = attributes.dimensions.map(Into::into).unwrap_or((800, 600));
|
||||||
// Create the window
|
// Create the window
|
||||||
let size = Arc::new(Mutex::new((width, height)));
|
let size = Arc::new(Mutex::new((width, height)));
|
||||||
|
let fullscreen = Arc::new(Mutex::new(false));
|
||||||
|
|
||||||
let window_store = evlp.store.clone();
|
let window_store = evlp.store.clone();
|
||||||
let surface = evlp.env.create_surface(move |dpi, surface| {
|
let surface = evlp.env.create_surface(move |dpi, surface| {
|
||||||
|
@ -45,12 +47,15 @@ impl Window {
|
||||||
surface.clone(),
|
surface.clone(),
|
||||||
(width, height),
|
(width, height),
|
||||||
move |event| match event {
|
move |event| match event {
|
||||||
WEvent::Configure { new_size, .. } => {
|
WEvent::Configure { new_size, states } => {
|
||||||
let mut store = window_store.lock().unwrap();
|
let mut store = window_store.lock().unwrap();
|
||||||
|
let is_fullscreen = states.contains(&WState::Fullscreen);
|
||||||
|
|
||||||
for window in &mut store.windows {
|
for window in &mut store.windows {
|
||||||
if window.surface.as_ref().equals(&my_surface.as_ref()) {
|
if window.surface.as_ref().equals(&my_surface.as_ref()) {
|
||||||
window.newsize = new_size;
|
window.newsize = new_size;
|
||||||
*(window.need_refresh.lock().unwrap()) = true;
|
*(window.need_refresh.lock().unwrap()) = true;
|
||||||
|
*(window.fullscreen.lock().unwrap()) = is_fullscreen;
|
||||||
*(window.need_frame_refresh.lock().unwrap()) = true;
|
*(window.need_frame_refresh.lock().unwrap()) = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -117,6 +122,7 @@ impl Window {
|
||||||
newsize: None,
|
newsize: None,
|
||||||
size: size.clone(),
|
size: size.clone(),
|
||||||
need_refresh: need_refresh.clone(),
|
need_refresh: need_refresh.clone(),
|
||||||
|
fullscreen: fullscreen.clone(),
|
||||||
need_frame_refresh: need_frame_refresh.clone(),
|
need_frame_refresh: need_frame_refresh.clone(),
|
||||||
surface: surface.clone(),
|
surface: surface.clone(),
|
||||||
kill_switch: kill_switch.clone(),
|
kill_switch: kill_switch.clone(),
|
||||||
|
@ -135,6 +141,7 @@ impl Window {
|
||||||
kill_switch: (kill_switch, evlp.cleanup_needed.clone()),
|
kill_switch: (kill_switch, evlp.cleanup_needed.clone()),
|
||||||
need_frame_refresh,
|
need_frame_refresh,
|
||||||
need_refresh,
|
need_refresh,
|
||||||
|
fullscreen,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,6 +237,14 @@ impl Window {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_fullscreen(&self) -> Option<MonitorHandle> {
|
||||||
|
if *(self.fullscreen.lock().unwrap()) {
|
||||||
|
Some(self.get_current_monitor())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn set_fullscreen(&self, monitor: Option<RootMonitorHandle>) {
|
pub fn set_fullscreen(&self, monitor: Option<RootMonitorHandle>) {
|
||||||
if let Some(RootMonitorHandle {
|
if let Some(RootMonitorHandle {
|
||||||
inner: PlatformMonitorHandle::Wayland(ref monitor_id),
|
inner: PlatformMonitorHandle::Wayland(ref monitor_id),
|
||||||
|
@ -310,6 +325,7 @@ struct InternalWindow {
|
||||||
newsize: Option<(u32, u32)>,
|
newsize: Option<(u32, u32)>,
|
||||||
size: Arc<Mutex<(u32, u32)>>,
|
size: Arc<Mutex<(u32, u32)>>,
|
||||||
need_refresh: Arc<Mutex<bool>>,
|
need_refresh: Arc<Mutex<bool>>,
|
||||||
|
fullscreen: Arc<Mutex<bool>>,
|
||||||
need_frame_refresh: Arc<Mutex<bool>>,
|
need_frame_refresh: Arc<Mutex<bool>>,
|
||||||
closed: bool,
|
closed: bool,
|
||||||
kill_switch: Arc<Mutex<bool>>,
|
kill_switch: Arc<Mutex<bool>>,
|
||||||
|
|
|
@ -38,6 +38,7 @@ pub struct SharedState {
|
||||||
pub guessed_dpi: Option<f64>,
|
pub guessed_dpi: Option<f64>,
|
||||||
pub last_monitor: Option<X11MonitorHandle>,
|
pub last_monitor: Option<X11MonitorHandle>,
|
||||||
pub dpi_adjusted: Option<(f64, f64)>,
|
pub dpi_adjusted: Option<(f64, f64)>,
|
||||||
|
pub fullscreen: Option<RootMonitorHandle>,
|
||||||
// Used to restore position after exiting fullscreen.
|
// Used to restore position after exiting fullscreen.
|
||||||
pub restore_position: Option<(i32, i32)>,
|
pub restore_position: Option<(i32, i32)>,
|
||||||
pub frame_extents: Option<util::FrameExtentsHeuristic>,
|
pub frame_extents: Option<util::FrameExtentsHeuristic>,
|
||||||
|
@ -544,8 +545,14 @@ impl UnownedWindow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn get_fullscreen(&self) -> Option<RootMonitorHandle> {
|
||||||
|
self.shared_state.lock().fullscreen.clone()
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_fullscreen(&self, monitor: Option<RootMonitorHandle>) {
|
pub fn set_fullscreen(&self, monitor: Option<RootMonitorHandle>) {
|
||||||
|
self.shared_state.lock().fullscreen = monitor.clone();
|
||||||
self.set_fullscreen_inner(monitor)
|
self.set_fullscreen_inner(monitor)
|
||||||
.flush()
|
.flush()
|
||||||
.expect("Failed to change window fullscreen state");
|
.expect("Failed to change window fullscreen state");
|
||||||
|
|
|
@ -636,9 +636,15 @@ impl UnownedWindow {
|
||||||
trace!("Unlocked shared state in `set_maximized`");
|
trace!("Unlocked shared state in `set_maximized`");
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: `set_fullscreen` is only usable if you fullscreen on the same
|
|
||||||
// monitor the window's currently on.
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
pub fn get_fullscreen(&self) -> Option<RootMonitorHandle> {
|
||||||
|
let shared_state_lock = self.shared_state.lock().unwrap();
|
||||||
|
shared_state_lock.fullscreen.clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
/// TODO: Right now set_fullscreen do not work on switching monitors
|
||||||
|
/// in fullscreen mode
|
||||||
pub fn set_fullscreen(&self, monitor: Option<RootMonitorHandle>) {
|
pub fn set_fullscreen(&self, monitor: Option<RootMonitorHandle>) {
|
||||||
let shared_state_lock = self.shared_state.lock().unwrap();
|
let shared_state_lock = self.shared_state.lock().unwrap();
|
||||||
if shared_state_lock.is_simple_fullscreen {
|
if shared_state_lock.is_simple_fullscreen {
|
||||||
|
@ -785,6 +791,12 @@ impl WindowExtMacOS for UnownedWindow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn get_simple_fullscreen(&self) -> bool {
|
||||||
|
let shared_state_lock = self.shared_state.lock().unwrap();
|
||||||
|
shared_state_lock.is_simple_fullscreen
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn set_simple_fullscreen(&self, fullscreen: bool) -> bool {
|
fn set_simple_fullscreen(&self, fullscreen: bool) -> bool {
|
||||||
let mut shared_state_lock = self.shared_state.lock().unwrap();
|
let mut shared_state_lock = self.shared_state.lock().unwrap();
|
||||||
|
|
|
@ -399,6 +399,12 @@ impl Window {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn get_fullscreen(&self) -> Option<RootMonitorHandle> {
|
||||||
|
let window_state = self.window_state.lock();
|
||||||
|
window_state.fullscreen.clone()
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_fullscreen(&self, monitor: Option<RootMonitorHandle>) {
|
pub fn set_fullscreen(&self, monitor: Option<RootMonitorHandle>) {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
|
|
@ -536,6 +536,12 @@ impl Window {
|
||||||
self.window.set_fullscreen(monitor)
|
self.window.set_fullscreen(monitor)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Gets the window's current fullscreen state.
|
||||||
|
#[inline]
|
||||||
|
pub fn get_fullscreen(&self) -> Option<MonitorHandle> {
|
||||||
|
self.window.get_fullscreen()
|
||||||
|
}
|
||||||
|
|
||||||
/// Turn window decorations on or off.
|
/// Turn window decorations on or off.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_decorations(&self, decorations: bool) {
|
pub fn set_decorations(&self, decorations: bool) {
|
||||||
|
|
Loading…
Reference in a new issue