mirror of
https://github.com/rust-windowing/winit.git
synced 2026-06-27 07:03:15 -04:00
Compare commits
6 Commits
split-exam
...
kchibisov/
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d235b91c40 | ||
|
|
944347696a | ||
|
|
96172693fe | ||
|
|
32004405ee | ||
|
|
22e932b5ab | ||
|
|
3d4c53459a |
@@ -46,6 +46,12 @@ Unreleased` header.
|
|||||||
- **Breaking:** Changed the signature of `EventLoop::with_user_event` to return a builder.
|
- **Breaking:** Changed the signature of `EventLoop::with_user_event` to return a builder.
|
||||||
- **Breaking:** Removed `EventLoopBuilder::with_user_event`, the functionality is now available in `EventLoop::with_user_event`.
|
- **Breaking:** Removed `EventLoopBuilder::with_user_event`, the functionality is now available in `EventLoop::with_user_event`.
|
||||||
- Add `Window::default_attributes` to get default `WindowAttributes`.
|
- Add `Window::default_attributes` to get default `WindowAttributes`.
|
||||||
|
- `log` has been replaced with `tracing`. The old behavior can be emulated by setting the `log` feature on the `tracing` crate.
|
||||||
|
|
||||||
|
# 0.29.12
|
||||||
|
|
||||||
|
- On X11, fix use after free during xinput2 handling.
|
||||||
|
- On X11, filter close to zero values in mouse device events
|
||||||
|
|
||||||
# 0.29.11
|
# 0.29.11
|
||||||
|
|
||||||
|
|||||||
184
CONTRIBUTING.md
184
CONTRIBUTING.md
@@ -1,57 +1,169 @@
|
|||||||
# Winit Contributing Guidelines
|
# Contribution Guidelines
|
||||||
|
|
||||||
## Scope
|
This document contains guidelines for contributing code to winit. It has to be
|
||||||
[See `FEATURES.md`](./FEATURES.md). When requesting or implementing a new Winit feature, you should
|
followed in order for your patch to be approved and applied.
|
||||||
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.
|
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
## Reporting an issue
|
Anyone can contribute to winit, however given that it's a cross platform
|
||||||
|
windowing toolkit getting certain changes incorporated upstream could be
|
||||||
|
challenging.
|
||||||
|
|
||||||
When reporting an issue, in order to help the maintainers understand what the problem is, please make
|
To save your time it's wise to check already opened [pull requests][prs] and
|
||||||
your description of the issue as detailed as possible:
|
[issues][issues]. In general, bug fixes and missing implementations are always
|
||||||
|
accepted, however new API proposals should go into the issue first. When in
|
||||||
|
doubt contact us on [matrix][matrix] or via opening an issue.
|
||||||
|
|
||||||
- if it is a bug, please provide a clear explanation of what happens, what should happen, and how to
|
### Submitting your work and handling review
|
||||||
reproduce the issue, ideally by providing a minimal program exhibiting the problem
|
|
||||||
- if it is a feature request, please provide a clear argumentation about why you believe this feature
|
|
||||||
should be supported by winit
|
|
||||||
|
|
||||||
## Making a pull request
|
All patches have to be sent on Github as [pull requests][prs]. To simplify your
|
||||||
|
life during review it's recommended to check the "give contributors write access
|
||||||
|
to the branch" checkbox.
|
||||||
|
|
||||||
When making a code contribution to winit, before opening your pull request, please make sure that:
|
#### Creating commits
|
||||||
|
|
||||||
- your patch builds with Winit's minimal supported rust version - Rust 1.70.
|
When creating a commit, follow these general rules:
|
||||||
- you tested your modifications on all the platforms impacted, or if not possible, detail which platforms
|
- Try to limit the first line (title) of the commit message to 50 characters,
|
||||||
were not tested, and what should be tested, so that a maintainer or another contributor can test them
|
but not more than 60 characters.
|
||||||
- you updated any relevant documentation in winit
|
- The commit starts with an uppercase latter and everything else must be
|
||||||
- you left comments in your code explaining any part that is not straightforward, so that the
|
lowercase, unless you quote a symbol, like `Window`.
|
||||||
maintainers and future contributors don't have to try to guess what your code is supposed to do
|
- Use the body of the commit message to actually explain what your patch does
|
||||||
- your PR adds an entry to the changelog file if the introduced change is relevant to winit users.
|
and why it is useful. Even if your patch is a one line fix, the description
|
||||||
|
is not limited in length and may span over multiple paragraphs. Use proper
|
||||||
|
English syntax, grammar and punctuation. The body is generally wrapped
|
||||||
|
at 72 characters.
|
||||||
|
- If you're a downstream user and your fixing your issue, consider to link it
|
||||||
|
like `Links: URL` in the end of the commit message.
|
||||||
|
- Try to address only one issue/topic per commit.
|
||||||
|
- Prefer describing your changes in imperative mood, e.g. *"make xyzzy do
|
||||||
|
frotz"* instead of *"[This patch] makes xyzzy do frotz"* or *"[I] changed
|
||||||
|
xyzzy to do frotz"*, as if you are giving orders to the codebase to change
|
||||||
|
its behaviour.
|
||||||
|
- When fixing an issue from https://github.com/rust-windowing/winit/issues,
|
||||||
|
ensure to have it include in the end of the commit. See other commits
|
||||||
|
on how it's done.
|
||||||
|
- When in doubt, follow the format and layout of the recent existing commits.
|
||||||
|
|
||||||
You needn't worry about the added entry causing conflicts, the maintainer that merges the PR will
|
The maintainers will fixup your commit message when applying the patch, but it's
|
||||||
handle those for you when merging (see below).
|
still recommended to follow the rules above to make the life of maintainers
|
||||||
- if your PR affects the platform compatibility of one or more features or adds another feature, the
|
easier.
|
||||||
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 a review by a maintainer of your platform. Winit's merging policy
|
If you want to communicate something to reviewers, but it doesn't belong to
|
||||||
is that a PR must be approved by at least two maintainers of winit before being merged, including
|
the commit message, write that under `--` on PR body. Your PR could look like:
|
||||||
at least a maintainer of the platform (a maintainer making a PR themselves counts as approving it).
|
|
||||||
|
|
||||||
Once your PR is deemed ready, the merging maintainer will take care of resolving conflicts in
|
```
|
||||||
`CHANGELOG.md` (but you must resolve other conflicts yourself). Doing this requires that you check the
|
TITLE (matches commit title)
|
||||||
"give contributors write access to the branch" checkbox when creating the PR.
|
|
||||||
|
Body (matches commit body)
|
||||||
|
|
||||||
|
--
|
||||||
|
|
||||||
|
Your arbitrary message goes here.
|
||||||
|
|
||||||
|
Various checkboxes PR template required you to fill.
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Handling review
|
||||||
|
|
||||||
|
During the review process certain events could require an action from your side,
|
||||||
|
to communication more efficient the common patterns and reactions are described
|
||||||
|
below.
|
||||||
|
|
||||||
|
_Event:_ The CI fails to build, but it looks like not your fault. Not
|
||||||
|
communicating so, could result into maintainers not looking into your patch,
|
||||||
|
unless they CI that CI pass.\
|
||||||
|
_Desired behavior:_ Write a message saying roughly the following "The CI failure
|
||||||
|
is unrelated", so maintainers will fix it for you.
|
||||||
|
|
||||||
|
_Event:_ Collaborator requested review on your PR.\
|
||||||
|
_Desired behavior:_ Once you address the request, you _should_ re-request review
|
||||||
|
with the github's UI. If you don't agree with what maintainer suggested, you
|
||||||
|
should object that and re-request the review. That will indicate that the
|
||||||
|
_ball_ is on maintainer's side.
|
||||||
|
|
||||||
|
_Event:_ You've opened a PR, but maintainer shortly after commented that they
|
||||||
|
want to work on that _themselves_.\
|
||||||
|
_Desired behavior:_ Discusses with maintainer their plans if they were not
|
||||||
|
outlined in the initial response, because such response means that they
|
||||||
|
are not interested in reviewing your code. Such thing could happen when
|
||||||
|
underestimating complexity of the task you're solving or when your patch
|
||||||
|
mandate certain downstream designs.
|
||||||
|
|
||||||
|
[prs]: https://github.com/rust-windowing/winit/pulls
|
||||||
|
[issues]: https://github.com/rust-windowing/winit/issues
|
||||||
|
[matrix]: https://matrix.to/#/#rust-windowing:matrix.org
|
||||||
|
|
||||||
## Maintainers
|
## Maintainers
|
||||||
|
|
||||||
The current maintainers for each platform are listed in the [CODEOWNERS](.github/CODEOWNERS) file.
|
Winit has plenty of maintainers with different backgrounds, experience level,
|
||||||
|
and reasons to be winit maintainer in the first place. To ensure that winit's
|
||||||
|
code quality is not decreasing over time and to make it easier to teach new
|
||||||
|
maintainers the _winit way of doing things_ the common policies and routines
|
||||||
|
are defined in this section.
|
||||||
|
|
||||||
## Release process
|
The current maintainers for each platform are listed in [this file][CODEOWNERS].
|
||||||
|
|
||||||
|
### Contributions handling
|
||||||
|
|
||||||
|
The maintainer must ensure that the external contributions meet the winit's
|
||||||
|
quality standards. If it's not, it **is maintainer's responsibility** to bring
|
||||||
|
it on par, which includes:
|
||||||
|
|
||||||
|
- Decline the patch if it tries to achieve short term goals instead of solving
|
||||||
|
the problem in general. In such case maintainer must communicate that **as
|
||||||
|
early as possible**, so contributors don't spend their time on something
|
||||||
|
that won't be accepted in the end.
|
||||||
|
- Ensure that formatting is consistent and `CHANGELOG` messages are clear
|
||||||
|
for the end users.
|
||||||
|
- Improve the commit message, so it'll be easier for other maintainers to
|
||||||
|
understand the motivation without going through all the discussions on the
|
||||||
|
particular patch/PR.
|
||||||
|
- Ensure that the proposed patch doesn't break platform parity. If the
|
||||||
|
breakage is desired by contributor, an issue should be opened to discuss
|
||||||
|
with other maintainers before merging.
|
||||||
|
- Always fix CI issues before merging if they don't originate from the
|
||||||
|
submitted work.
|
||||||
|
|
||||||
|
However, maintainer must always give a leeway for external contributors, so they
|
||||||
|
don't feel discouraged contributing, for example:
|
||||||
|
|
||||||
|
- Suggest a patch to resolve style issues, if it's the only issue with the
|
||||||
|
submitted work. Keep in mind that pushing the resolution yourself is not
|
||||||
|
desired, because contributor might not agree with what you did.
|
||||||
|
- Be more explicit on how things should be done if you doesn't like the
|
||||||
|
approach.
|
||||||
|
- Suggest to finish PR for them if they're absent for a while and you need the
|
||||||
|
proposed changes to move forward with something. In such case maintainer
|
||||||
|
must preserve attribution with `Co-authored-by`, `Suggested-by`, or keep
|
||||||
|
the original commiter.
|
||||||
|
- Rebase their work for them when massive changes to winit codebase were
|
||||||
|
introduced.
|
||||||
|
|
||||||
|
When reviewing code of other maintainers all of the above is on the maintainer
|
||||||
|
who submitted the patch. Interested maintainers could help push the work over
|
||||||
|
the finish line, but teaching other maintainers should be preferred.
|
||||||
|
|
||||||
|
When contributor is _regular_ in winit, the maintainer should slowly start
|
||||||
|
requiring contributor to match *maintainer* quality standards when writing
|
||||||
|
patches and commit messages.
|
||||||
|
|
||||||
|
### Contributing
|
||||||
|
|
||||||
|
When submitting a patch maintainer should follow the general contributing
|
||||||
|
guidelines, however all soft rules (e.g `Try to`), become strict.
|
||||||
|
|
||||||
|
To make life simpler for other maintainers it's suggested to create your branch
|
||||||
|
under the project repository instead of your own fork. The naming scheme is
|
||||||
|
`github_user_name/branch_name`. Doing so will make your work easier to rebase
|
||||||
|
for other maintainers when you're absent.
|
||||||
|
|
||||||
|
### Release process
|
||||||
|
|
||||||
Given that winit is a widely used library, we should be able to make a patch
|
Given that winit is a widely used library, we should be able to make a patch
|
||||||
releases at any time we want without blocking the development of new features.
|
releases at any time we want without blocking the development of new features.
|
||||||
|
|
||||||
To achieve these goals, a new branch is created for every new release. Releases and later patch releases are committed and tagged in this branch.
|
To achieve these goals, a new branch is created for every new release. Releases
|
||||||
|
and later patch releases are committed and tagged in this branch.
|
||||||
|
|
||||||
The exact steps for an exemplary `0.2.0` release might look like this:
|
The exact steps for an exemplary `0.2.0` release might look like this:
|
||||||
1. Initially, the version on the latest master is `0.1.0`
|
1. Initially, the version on the latest master is `0.1.0`
|
||||||
@@ -67,3 +179,5 @@ When doing a patch release, the process is similar:
|
|||||||
2. Checkout the `v0.2.x` branch
|
2. Checkout the `v0.2.x` branch
|
||||||
3. Cherry-pick the required non-breaking changes into the `v0.2.x`
|
3. Cherry-pick the required non-breaking changes into the `v0.2.x`
|
||||||
4. Follow steps 3-7 of the regular release example
|
4. Follow steps 3-7 of the regular release example
|
||||||
|
|
||||||
|
[CODEOWNERS]: .github/CODEOWNERS
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "winit"
|
name = "winit"
|
||||||
version = "0.29.11"
|
version = "0.29.12"
|
||||||
authors = ["The winit contributors", "Pierre Krieger <pierre.krieger1708@gmail.com>"]
|
authors = ["The winit contributors", "Pierre Krieger <pierre.krieger1708@gmail.com>"]
|
||||||
description = "Cross-platform window creation library."
|
description = "Cross-platform window creation library."
|
||||||
keywords = ["windowing"]
|
keywords = ["windowing"]
|
||||||
@@ -64,17 +64,18 @@ cfg_aliases = "0.2.0"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
bitflags = "2"
|
bitflags = "2"
|
||||||
cursor-icon = "1.1.0"
|
cursor-icon = "1.1.0"
|
||||||
log = "0.4"
|
|
||||||
rwh_04 = { package = "raw-window-handle", version = "0.4", optional = true }
|
rwh_04 = { package = "raw-window-handle", version = "0.4", optional = true }
|
||||||
rwh_05 = { package = "raw-window-handle", version = "0.5.2", features = ["std"], optional = true }
|
rwh_05 = { package = "raw-window-handle", version = "0.5.2", features = ["std"], optional = true }
|
||||||
rwh_06 = { package = "raw-window-handle", version = "0.6", features = ["std"], optional = true }
|
rwh_06 = { package = "raw-window-handle", version = "0.6", features = ["std"], optional = true }
|
||||||
serde = { workspace = true, optional = true }
|
serde = { workspace = true, optional = true }
|
||||||
smol_str = "0.2.0"
|
smol_str = "0.2.0"
|
||||||
dpi = { path = "dpi" }
|
dpi = { path = "dpi" }
|
||||||
|
tracing = { version = "0.1.40", default_features = false }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
image = { version = "0.24.0", default-features = false, features = ["png"] }
|
image = { version = "0.24.0", default-features = false, features = ["png"] }
|
||||||
simple_logger = { version = "4.2.0", default_features = false }
|
tracing = { version = "0.1.40", default_features = false, features = ["log"] }
|
||||||
|
tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }
|
||||||
winit = { path = ".", features = ["rwh_05"] }
|
winit = { path = ".", features = ["rwh_05"] }
|
||||||
|
|
||||||
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dev-dependencies]
|
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dev-dependencies]
|
||||||
@@ -257,7 +258,7 @@ web-sys = { version = "0.3.22", features = ['CanvasRenderingContext2d'] }
|
|||||||
|
|
||||||
[[example]]
|
[[example]]
|
||||||
doc-scrape-examples = true
|
doc-scrape-examples = true
|
||||||
name = "full"
|
name = "window"
|
||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
resolver = "2"
|
resolver = "2"
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
```toml
|
```toml
|
||||||
[dependencies]
|
[dependencies]
|
||||||
winit = "0.29.11"
|
winit = "0.29.12"
|
||||||
```
|
```
|
||||||
|
|
||||||
## [Documentation](https://docs.rs/winit)
|
## [Documentation](https://docs.rs/winit)
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ use std::time;
|
|||||||
#[cfg(web_platform)]
|
#[cfg(web_platform)]
|
||||||
use web_time as time;
|
use web_time as time;
|
||||||
|
|
||||||
use simple_logger::SimpleLogger;
|
|
||||||
use winit::{
|
use winit::{
|
||||||
event::{ElementState, Event, KeyEvent, WindowEvent},
|
event::{ElementState, Event, KeyEvent, WindowEvent},
|
||||||
event_loop::{ControlFlow, EventLoop},
|
event_loop::{ControlFlow, EventLoop},
|
||||||
@@ -28,7 +27,7 @@ const WAIT_TIME: time::Duration = time::Duration::from_millis(100);
|
|||||||
const POLL_SLEEP_TIME: time::Duration = time::Duration::from_millis(100);
|
const POLL_SLEEP_TIME: time::Duration = time::Duration::from_millis(100);
|
||||||
|
|
||||||
fn main() -> Result<(), impl std::error::Error> {
|
fn main() -> Result<(), impl std::error::Error> {
|
||||||
SimpleLogger::new().init().unwrap();
|
tracing_subscriber::fmt::init();
|
||||||
|
|
||||||
println!("Press '1' to switch to Wait mode.");
|
println!("Press '1' to switch to Wait mode.");
|
||||||
println!("Press '2' to switch to WaitUntil mode.");
|
println!("Press '2' to switch to WaitUntil mode.");
|
||||||
|
|||||||
@@ -1,62 +0,0 @@
|
|||||||
use std::error::Error;
|
|
||||||
use winit::{
|
|
||||||
event::{Event, StartCause},
|
|
||||||
event_loop::{ActiveEventLoop, EventLoop},
|
|
||||||
};
|
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
|
||||||
let event_loop = EventLoop::new()?;
|
|
||||||
|
|
||||||
Ok(event_loop.run(|event, event_loop| match event {
|
|
||||||
Event::NewEvents(StartCause::Init) => {
|
|
||||||
dump_monitors(event_loop);
|
|
||||||
event_loop.exit()
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
})?)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn dump_monitors(event_loop: &ActiveEventLoop) {
|
|
||||||
println!("Monitors information");
|
|
||||||
let primary_monitor = event_loop.primary_monitor();
|
|
||||||
for monitor in event_loop.available_monitors() {
|
|
||||||
let intro = if primary_monitor.as_ref() == Some(&monitor) {
|
|
||||||
"Primary monitor"
|
|
||||||
} else {
|
|
||||||
"Monitor"
|
|
||||||
};
|
|
||||||
|
|
||||||
if let Some(name) = monitor.name() {
|
|
||||||
println!("{intro}: {name}");
|
|
||||||
} else {
|
|
||||||
println!("{intro}: [no name]");
|
|
||||||
}
|
|
||||||
|
|
||||||
let size = monitor.size();
|
|
||||||
print!(" Current mode: {}x{}", size.width, size.height);
|
|
||||||
if let Some(m_hz) = monitor.refresh_rate_millihertz() {
|
|
||||||
println!(" @ {}.{} Hz", m_hz / 1000, m_hz % 1000);
|
|
||||||
} else {
|
|
||||||
println!();
|
|
||||||
}
|
|
||||||
|
|
||||||
let position = monitor.position();
|
|
||||||
println!(" Position: {}, {}", position.x, position.y);
|
|
||||||
|
|
||||||
println!(" Scale factor: {}", monitor.scale_factor());
|
|
||||||
|
|
||||||
println!(" Available modes (width x height x bit-depth):");
|
|
||||||
for mode in monitor.video_modes() {
|
|
||||||
let size = mode.size();
|
|
||||||
let m_hz = mode.refresh_rate_millihertz();
|
|
||||||
println!(
|
|
||||||
" {:04}x{:04}x{:02} @ {:>3}.{} Hz",
|
|
||||||
size.width,
|
|
||||||
size.height,
|
|
||||||
mode.bit_depth(),
|
|
||||||
m_hz / 1000,
|
|
||||||
m_hz % 1000
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -11,7 +11,6 @@
|
|||||||
fn main() -> std::process::ExitCode {
|
fn main() -> std::process::ExitCode {
|
||||||
use std::{process::ExitCode, thread::sleep, time::Duration};
|
use std::{process::ExitCode, thread::sleep, time::Duration};
|
||||||
|
|
||||||
use simple_logger::SimpleLogger;
|
|
||||||
use winit::{
|
use winit::{
|
||||||
event::{Event, WindowEvent},
|
event::{Event, WindowEvent},
|
||||||
event_loop::EventLoop,
|
event_loop::EventLoop,
|
||||||
@@ -24,7 +23,7 @@ fn main() -> std::process::ExitCode {
|
|||||||
|
|
||||||
let mut event_loop = EventLoop::new().unwrap();
|
let mut event_loop = EventLoop::new().unwrap();
|
||||||
|
|
||||||
SimpleLogger::new().init().unwrap();
|
tracing_subscriber::fmt::init();
|
||||||
|
|
||||||
let mut window = None;
|
let mut window = None;
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
fn main() -> Result<(), impl std::error::Error> {
|
fn main() -> Result<(), impl std::error::Error> {
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use simple_logger::SimpleLogger;
|
|
||||||
|
|
||||||
use winit::{
|
use winit::{
|
||||||
error::EventLoopError,
|
error::EventLoopError,
|
||||||
event::{Event, WindowEvent},
|
event::{Event, WindowEvent},
|
||||||
@@ -24,7 +22,7 @@ fn main() -> Result<(), impl std::error::Error> {
|
|||||||
window: Option<Window>,
|
window: Option<Window>,
|
||||||
}
|
}
|
||||||
|
|
||||||
SimpleLogger::new().init().unwrap();
|
tracing_subscriber::fmt::init();
|
||||||
let mut event_loop = EventLoop::new().unwrap();
|
let mut event_loop = EventLoop::new().unwrap();
|
||||||
|
|
||||||
fn run_app(event_loop: &mut EventLoop<()>, idx: usize) -> Result<(), EventLoopError> {
|
fn run_app(event_loop: &mut EventLoop<()>, idx: usize) -> Result<(), EventLoopError> {
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -3,8 +3,6 @@ use std::error::Error;
|
|||||||
|
|
||||||
#[cfg(x11_platform)]
|
#[cfg(x11_platform)]
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
use simple_logger::SimpleLogger;
|
|
||||||
|
|
||||||
use winit::{
|
use winit::{
|
||||||
event::{Event, WindowEvent},
|
event::{Event, WindowEvent},
|
||||||
event_loop::EventLoop,
|
event_loop::EventLoop,
|
||||||
@@ -21,7 +19,7 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
.ok_or("Expected a 32-bit X11 window ID as the first argument.")?
|
.ok_or("Expected a 32-bit X11 window ID as the first argument.")?
|
||||||
.parse::<u32>()?;
|
.parse::<u32>()?;
|
||||||
|
|
||||||
SimpleLogger::new().init().unwrap();
|
tracing_subscriber::fmt::init();
|
||||||
let event_loop = EventLoop::new()?;
|
let event_loop = EventLoop::new()?;
|
||||||
|
|
||||||
let mut window = None;
|
let mut window = None;
|
||||||
|
|||||||
@@ -88,6 +88,15 @@ impl CustomCursor {
|
|||||||
hotspot_x: u16,
|
hotspot_x: u16,
|
||||||
hotspot_y: u16,
|
hotspot_y: u16,
|
||||||
) -> Result<CustomCursorSource, BadImage> {
|
) -> Result<CustomCursorSource, BadImage> {
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Cursor::from_rgba",
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
hotspot_x,
|
||||||
|
hotspot_y
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
|
|
||||||
Ok(CustomCursorSource {
|
Ok(CustomCursorSource {
|
||||||
inner: PlatformCustomCursorSource::from_rgba(
|
inner: PlatformCustomCursorSource::from_rgba(
|
||||||
rgba.into(),
|
rgba.into(),
|
||||||
|
|||||||
25
src/event.rs
25
src/event.rs
@@ -781,6 +781,31 @@ pub struct KeyEvent {
|
|||||||
/// On some systems, holding down a key for some period of time causes that key to be repeated
|
/// On some systems, holding down a key for some period of time causes that key to be repeated
|
||||||
/// as though it were being pressed and released repeatedly. This field is `true` if and only if
|
/// as though it were being pressed and released repeatedly. This field is `true` if and only if
|
||||||
/// this event is the result of one of those repeats.
|
/// this event is the result of one of those repeats.
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
///
|
||||||
|
/// In games, you often want to ignore repated key events - this can be
|
||||||
|
/// done by ignoring events where this property is set.
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use winit::event::{WindowEvent, KeyEvent, ElementState};
|
||||||
|
/// use winit::keyboard::{KeyCode, PhysicalKey};
|
||||||
|
/// # let window_event = WindowEvent::RedrawRequested; // To make the example compile
|
||||||
|
/// match window_event {
|
||||||
|
/// WindowEvent::KeyboardInput {
|
||||||
|
/// event: KeyEvent {
|
||||||
|
/// physical_key: PhysicalKey::Code(KeyCode::KeyW),
|
||||||
|
/// state: ElementState::Pressed,
|
||||||
|
/// repeat: false,
|
||||||
|
/// ..
|
||||||
|
/// },
|
||||||
|
/// ..
|
||||||
|
/// } => {
|
||||||
|
/// // The physical key `W` was pressed, and it was not a repeat
|
||||||
|
/// }
|
||||||
|
/// _ => {} // Handle other events
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
pub repeat: bool,
|
pub repeat: bool,
|
||||||
|
|
||||||
/// Platform-specific key event information.
|
/// Platform-specific key event information.
|
||||||
|
|||||||
@@ -109,6 +109,8 @@ impl<T> EventLoopBuilder<T> {
|
|||||||
)]
|
)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn build(&mut self) -> Result<EventLoop<T>, EventLoopError> {
|
pub fn build(&mut self) -> Result<EventLoop<T>, EventLoopError> {
|
||||||
|
let _span = tracing::debug_span!("winit::EventLoopBuilder::build").entered();
|
||||||
|
|
||||||
if EVENT_LOOP_CREATED.swap(true, Ordering::Relaxed) {
|
if EVENT_LOOP_CREATED.swap(true, Ordering::Relaxed) {
|
||||||
return Err(EventLoopError::RecreationAttempt);
|
return Err(EventLoopError::RecreationAttempt);
|
||||||
}
|
}
|
||||||
@@ -248,6 +250,8 @@ impl<T> EventLoop<T> {
|
|||||||
where
|
where
|
||||||
F: FnMut(Event<T>, &ActiveEventLoop),
|
F: FnMut(Event<T>, &ActiveEventLoop),
|
||||||
{
|
{
|
||||||
|
let _span = tracing::debug_span!("winit::EventLoop::run").entered();
|
||||||
|
|
||||||
self.event_loop.run(event_handler)
|
self.event_loop.run(event_handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -274,6 +278,12 @@ impl<T> EventLoop<T> {
|
|||||||
///
|
///
|
||||||
/// [`DeviceEvent`]: crate::event::DeviceEvent
|
/// [`DeviceEvent`]: crate::event::DeviceEvent
|
||||||
pub fn listen_device_events(&self, allowed: DeviceEvents) {
|
pub fn listen_device_events(&self, allowed: DeviceEvents) {
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::EventLoop::listen_device_events",
|
||||||
|
allowed = ?allowed
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
|
|
||||||
self.event_loop
|
self.event_loop
|
||||||
.window_target()
|
.window_target()
|
||||||
.p
|
.p
|
||||||
@@ -295,6 +305,12 @@ impl<T> EventLoop<T> {
|
|||||||
#[deprecated = "use `ActiveEventLoop::create_window` instead"]
|
#[deprecated = "use `ActiveEventLoop::create_window` instead"]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn create_window(&self, window_attributes: WindowAttributes) -> Result<Window, OsError> {
|
pub fn create_window(&self, window_attributes: WindowAttributes) -> Result<Window, OsError> {
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::EventLoop::create_window",
|
||||||
|
window_attributes = ?window_attributes
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
|
|
||||||
let window =
|
let window =
|
||||||
platform_impl::Window::new(&self.event_loop.window_target().p, window_attributes)?;
|
platform_impl::Window::new(&self.event_loop.window_target().p, window_attributes)?;
|
||||||
Ok(Window { window })
|
Ok(Window { window })
|
||||||
@@ -363,18 +379,28 @@ impl ActiveEventLoop {
|
|||||||
/// see the web platform module for more information.
|
/// see the web platform module for more information.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn create_window(&self, window_attributes: WindowAttributes) -> Result<Window, OsError> {
|
pub fn create_window(&self, window_attributes: WindowAttributes) -> Result<Window, OsError> {
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::ActiveEventLoop::create_window",
|
||||||
|
window_attributes = ?window_attributes
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
|
|
||||||
let window = platform_impl::Window::new(&self.p, window_attributes)?;
|
let window = platform_impl::Window::new(&self.p, window_attributes)?;
|
||||||
Ok(Window { window })
|
Ok(Window { window })
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create custom cursor.
|
/// Create custom cursor.
|
||||||
pub fn create_custom_cursor(&self, custom_cursor: CustomCursorSource) -> CustomCursor {
|
pub fn create_custom_cursor(&self, custom_cursor: CustomCursorSource) -> CustomCursor {
|
||||||
|
let _span = tracing::debug_span!("winit::ActiveEventLoop::create_custom_cursor",).entered();
|
||||||
|
|
||||||
self.p.create_custom_cursor(custom_cursor)
|
self.p.create_custom_cursor(custom_cursor)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the list of all the monitors available on the system.
|
/// Returns the list of all the monitors available on the system.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn available_monitors(&self) -> impl Iterator<Item = MonitorHandle> {
|
pub fn available_monitors(&self) -> impl Iterator<Item = MonitorHandle> {
|
||||||
|
let _span = tracing::debug_span!("winit::ActiveEventLoop::available_monitors",).entered();
|
||||||
|
|
||||||
#[allow(clippy::useless_conversion)] // false positive on some platforms
|
#[allow(clippy::useless_conversion)] // false positive on some platforms
|
||||||
self.p
|
self.p
|
||||||
.available_monitors()
|
.available_monitors()
|
||||||
@@ -391,6 +417,8 @@ impl ActiveEventLoop {
|
|||||||
/// **Wayland / Web:** Always returns `None`.
|
/// **Wayland / Web:** Always returns `None`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn primary_monitor(&self) -> Option<MonitorHandle> {
|
pub fn primary_monitor(&self) -> Option<MonitorHandle> {
|
||||||
|
let _span = tracing::debug_span!("winit::ActiveEventLoop::primary_monitor",).entered();
|
||||||
|
|
||||||
self.p
|
self.p
|
||||||
.primary_monitor()
|
.primary_monitor()
|
||||||
.map(|inner| MonitorHandle { inner })
|
.map(|inner| MonitorHandle { inner })
|
||||||
@@ -408,6 +436,12 @@ impl ActiveEventLoop {
|
|||||||
///
|
///
|
||||||
/// [`DeviceEvent`]: crate::event::DeviceEvent
|
/// [`DeviceEvent`]: crate::event::DeviceEvent
|
||||||
pub fn listen_device_events(&self, allowed: DeviceEvents) {
|
pub fn listen_device_events(&self, allowed: DeviceEvents) {
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::ActiveEventLoop::listen_device_events",
|
||||||
|
allowed = ?allowed
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
|
|
||||||
self.p.listen_device_events(allowed);
|
self.p.listen_device_events(allowed);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -425,6 +459,8 @@ impl ActiveEventLoop {
|
|||||||
///
|
///
|
||||||
/// See [`LoopExiting`](Event::LoopExiting).
|
/// See [`LoopExiting`](Event::LoopExiting).
|
||||||
pub fn exit(&self) {
|
pub fn exit(&self) {
|
||||||
|
let _span = tracing::debug_span!("winit::ActiveEventLoop::exit",).entered();
|
||||||
|
|
||||||
self.p.exit()
|
self.p.exit()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -530,6 +566,8 @@ impl<T: 'static> EventLoopProxy<T> {
|
|||||||
///
|
///
|
||||||
/// [`UserEvent(event)`]: Event::UserEvent
|
/// [`UserEvent(event)`]: Event::UserEvent
|
||||||
pub fn send_event(&self, event: T) -> Result<(), EventLoopClosed<T>> {
|
pub fn send_event(&self, event: T) -> Result<(), EventLoopClosed<T>> {
|
||||||
|
let _span = tracing::debug_span!("winit::EventLoopProxy::send_event",).entered();
|
||||||
|
|
||||||
self.event_loop_proxy.send_event(event)
|
self.event_loop_proxy.send_event(event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,6 +118,8 @@ impl Icon {
|
|||||||
/// The length of `rgba` must be divisible by 4, and `width * height` must equal
|
/// The length of `rgba` must be divisible by 4, and `width * height` must equal
|
||||||
/// `rgba.len() / 4`. Otherwise, this will return a `BadIcon` error.
|
/// `rgba.len() / 4`. Otherwise, this will return a `BadIcon` error.
|
||||||
pub fn from_rgba(rgba: Vec<u8>, width: u32, height: u32) -> Result<Self, BadIcon> {
|
pub fn from_rgba(rgba: Vec<u8>, width: u32, height: u32) -> Result<Self, BadIcon> {
|
||||||
|
let _span = tracing::debug_span!("winit::Icon::from_rgba", width, height).entered();
|
||||||
|
|
||||||
Ok(Icon {
|
Ok(Icon {
|
||||||
inner: PlatformIcon::from_rgba(rgba, width, height)?,
|
inner: PlatformIcon::from_rgba(rgba, width, height)?,
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -60,7 +60,7 @@
|
|||||||
//!
|
//!
|
||||||
//! If your application is currently based on `NativeActivity` via the `ndk-glue` crate and building with `cargo apk`, then the minimal changes would be:
|
//! If your application is currently based on `NativeActivity` via the `ndk-glue` crate and building with `cargo apk`, then the minimal changes would be:
|
||||||
//! 1. Remove `ndk-glue` from your `Cargo.toml`
|
//! 1. Remove `ndk-glue` from your `Cargo.toml`
|
||||||
//! 2. Enable the `"android-native-activity"` feature for Winit: `winit = { version = "0.29.11", features = [ "android-native-activity" ] }`
|
//! 2. Enable the `"android-native-activity"` feature for Winit: `winit = { version = "0.29.12", features = [ "android-native-activity" ] }`
|
||||||
//! 3. Add an `android_main` entrypoint (as above), instead of using the '`[ndk_glue::main]` proc macro from `ndk-macros` (optionally add a dependency on `android_logger` and initialize logging as above).
|
//! 3. Add an `android_main` entrypoint (as above), instead of using the '`[ndk_glue::main]` proc macro from `ndk-macros` (optionally add a dependency on `android_logger` and initialize logging as above).
|
||||||
//! 4. Pass a clone of the `AndroidApp` that your application receives to Winit when building your event loop (as shown above).
|
//! 4. Pass a clone of the `AndroidApp` that your application receives to Winit when building your event loop (as shown above).
|
||||||
|
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ pub fn character_map_and_combine_key(
|
|||||||
let key_map = match app.device_key_character_map(device_id) {
|
let key_map = match app.device_key_character_map(device_id) {
|
||||||
Ok(key_map) => key_map,
|
Ok(key_map) => key_map,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::warn!("Failed to look up `KeyCharacterMap` for device {device_id}: {err:?}");
|
tracing::warn!("Failed to look up `KeyCharacterMap` for device {device_id}: {err:?}");
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -188,7 +188,7 @@ pub fn character_map_and_combine_key(
|
|||||||
Ok(Some(key)) => Some(key),
|
Ok(Some(key)) => Some(key),
|
||||||
Ok(None) => None,
|
Ok(None) => None,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::warn!("KeyEvent: Failed to combine 'dead key' accent '{accent}' with '{unicode}': {err:?}");
|
tracing::warn!("KeyEvent: Failed to combine 'dead key' accent '{accent}' with '{unicode}': {err:?}");
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -213,7 +213,7 @@ pub fn character_map_and_combine_key(
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::warn!("KeyEvent: Failed to get key map character: {err:?}");
|
tracing::warn!("KeyEvent: Failed to get key map character: {err:?}");
|
||||||
*combining_accent = None;
|
*combining_accent = None;
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ use android_activity::input::{InputEvent, KeyAction, Keycode, MotionAction};
|
|||||||
use android_activity::{
|
use android_activity::{
|
||||||
AndroidApp, AndroidAppWaker, ConfigurationRef, InputStatus, MainEvent, Rect,
|
AndroidApp, AndroidAppWaker, ConfigurationRef, InputStatus, MainEvent, Rect,
|
||||||
};
|
};
|
||||||
use log::{debug, trace, warn};
|
use tracing::{debug, trace, warn};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
cursor::Cursor,
|
cursor::Cursor,
|
||||||
@@ -330,7 +330,7 @@ impl<T: 'static> EventLoop<T> {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::warn!("Failed to get input events iterator: {err:?}");
|
tracing::warn!("Failed to get input events iterator: {err:?}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1014,7 +1014,7 @@ impl Window {
|
|||||||
if let Some(native_window) = self.app.native_window().as_ref() {
|
if let Some(native_window) = self.app.native_window().as_ref() {
|
||||||
native_window.raw_window_handle()
|
native_window.raw_window_handle()
|
||||||
} else {
|
} else {
|
||||||
log::error!("Cannot get the native window, it's null and will always be null before Event::Resumed and after Event::Suspended. Make sure you only call this function between those events.");
|
tracing::error!("Cannot get the native window, it's null and will always be null before Event::Resumed and after Event::Suspended. Make sure you only call this function between those events.");
|
||||||
Err(rwh_06::HandleError::Unavailable)
|
Err(rwh_06::HandleError::Unavailable)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -622,9 +622,9 @@ pub(crate) fn handle_nonuser_events<I: IntoIterator<Item = EventWrapper>>(
|
|||||||
match wrapper {
|
match wrapper {
|
||||||
EventWrapper::StaticEvent(event) => {
|
EventWrapper::StaticEvent(event) => {
|
||||||
if !processing_redraws && event.is_redraw() {
|
if !processing_redraws && event.is_redraw() {
|
||||||
log::info!("processing `RedrawRequested` during the main event loop");
|
tracing::info!("processing `RedrawRequested` during the main event loop");
|
||||||
} else if processing_redraws && !event.is_redraw() {
|
} else if processing_redraws && !event.is_redraw() {
|
||||||
log::warn!(
|
tracing::warn!(
|
||||||
"processing non `RedrawRequested` event after the main event loop: {:#?}",
|
"processing non `RedrawRequested` event after the main event loop: {:#?}",
|
||||||
event
|
event
|
||||||
);
|
);
|
||||||
@@ -676,9 +676,9 @@ pub(crate) fn handle_nonuser_events<I: IntoIterator<Item = EventWrapper>>(
|
|||||||
match wrapper {
|
match wrapper {
|
||||||
EventWrapper::StaticEvent(event) => {
|
EventWrapper::StaticEvent(event) => {
|
||||||
if !processing_redraws && event.is_redraw() {
|
if !processing_redraws && event.is_redraw() {
|
||||||
log::info!("processing `RedrawRequested` during the main event loop");
|
tracing::info!("processing `RedrawRequested` during the main event loop");
|
||||||
} else if processing_redraws && !event.is_redraw() {
|
} else if processing_redraws && !event.is_redraw() {
|
||||||
log::warn!(
|
tracing::warn!(
|
||||||
"processing non-`RedrawRequested` event after the main event loop: {:#?}",
|
"processing non-`RedrawRequested` event after the main event loop: {:#?}",
|
||||||
event
|
event
|
||||||
);
|
);
|
||||||
@@ -911,7 +911,7 @@ macro_rules! os_capabilities {
|
|||||||
impl OSCapabilities {$(
|
impl OSCapabilities {$(
|
||||||
$(#[$attr])*
|
$(#[$attr])*
|
||||||
pub fn $error_name(&self, extra_msg: &str) {
|
pub fn $error_name(&self, extra_msg: &str) {
|
||||||
log::warn!(
|
tracing::warn!(
|
||||||
concat!("`", $objc_call, "` requires iOS {}.{}+. This device is running iOS {}.{}.{}. {}"),
|
concat!("`", $objc_call, "` requires iOS {}.{}+. This device is running iOS {}.{}.{}. {}"),
|
||||||
$major, $minor, self.os_version.majorVersion, self.os_version.minorVersion, self.os_version.patchVersion,
|
$major, $minor, self.os_version.majorVersion, self.os_version.minorVersion, self.os_version.patchVersion,
|
||||||
extra_msg
|
extra_msg
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ impl ActiveEventLoop {
|
|||||||
pub(crate) fn exit(&self) {
|
pub(crate) fn exit(&self) {
|
||||||
// https://developer.apple.com/library/archive/qa/qa1561/_index.html
|
// https://developer.apple.com/library/archive/qa/qa1561/_index.html
|
||||||
// it is not possible to quit an iOS app gracefully and programmatically
|
// it is not possible to quit an iOS app gracefully and programmatically
|
||||||
log::warn!("`ControlFlow::Exit` ignored on iOS");
|
tracing::warn!("`ControlFlow::Exit` ignored on iOS");
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn exiting(&self) -> bool {
|
pub(crate) fn exiting(&self) -> bool {
|
||||||
|
|||||||
@@ -3,10 +3,10 @@
|
|||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
|
|
||||||
use icrate::Foundation::{CGFloat, CGPoint, CGRect, CGSize, MainThreadBound, MainThreadMarker};
|
use icrate::Foundation::{CGFloat, CGPoint, CGRect, CGSize, MainThreadBound, MainThreadMarker};
|
||||||
use log::{debug, warn};
|
|
||||||
use objc2::rc::Id;
|
use objc2::rc::Id;
|
||||||
use objc2::runtime::{AnyObject, NSObject};
|
use objc2::runtime::{AnyObject, NSObject};
|
||||||
use objc2::{class, declare_class, msg_send, msg_send_id, mutability, ClassType, DeclaredClass};
|
use objc2::{class, declare_class, msg_send, msg_send_id, mutability, ClassType, DeclaredClass};
|
||||||
|
use tracing::{debug, warn};
|
||||||
|
|
||||||
use super::app_state::EventWrapper;
|
use super::app_state::EventWrapper;
|
||||||
use super::uikit::{
|
use super::uikit::{
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ use std::ptr::{self, NonNull};
|
|||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
|
|
||||||
use crate::utils::Lazy;
|
use crate::utils::Lazy;
|
||||||
use log::warn;
|
|
||||||
use smol_str::SmolStr;
|
use smol_str::SmolStr;
|
||||||
#[cfg(wayland_platform)]
|
#[cfg(wayland_platform)]
|
||||||
use std::os::unix::io::OwnedFd;
|
use std::os::unix::io::OwnedFd;
|
||||||
|
use tracing::warn;
|
||||||
use xkbcommon_dl::{
|
use xkbcommon_dl::{
|
||||||
self as xkb, xkb_compose_status, xkb_context, xkb_context_flags, xkbcommon_compose_handle,
|
self as xkb, xkb_compose_status, xkb_context, xkb_context_flags, xkbcommon_compose_handle,
|
||||||
xkbcommon_handle, XkbCommon, XkbCommonCompose,
|
xkbcommon_handle, XkbCommon, XkbCommonCompose,
|
||||||
@@ -451,7 +451,7 @@ fn byte_slice_to_smol_str(bytes: &[u8]) -> Option<SmolStr> {
|
|||||||
std::str::from_utf8(bytes)
|
std::str::from_utf8(bytes)
|
||||||
.map(SmolStr::new)
|
.map(SmolStr::new)
|
||||||
.map_err(|e| {
|
.map_err(|e| {
|
||||||
log::warn!(
|
tracing::warn!(
|
||||||
"UTF-8 received from libxkbcommon ({:?}) was invalid: {e}",
|
"UTF-8 received from libxkbcommon ({:?}) was invalid: {e}",
|
||||||
bytes
|
bytes
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -687,7 +687,7 @@ unsafe extern "C" fn x_error_callback(
|
|||||||
|
|
||||||
// Don't log error.
|
// Don't log error.
|
||||||
if !error_handled {
|
if !error_handled {
|
||||||
log::error!("X11 error: {:#?}", error);
|
tracing::error!("X11 error: {:#?}", error);
|
||||||
// XXX only update the error, if it wasn't handled by any of the hooks.
|
// XXX only update the error, if it wasn't handled by any of the hooks.
|
||||||
*xconn.latest_error.lock().unwrap() = Some(error);
|
*xconn.latest_error.lock().unwrap() = Some(error);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -584,7 +584,7 @@ impl<T: 'static> EventLoop<T> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
self.event_loop.dispatch(timeout, state).map_err(|error| {
|
self.event_loop.dispatch(timeout, state).map_err(|error| {
|
||||||
log::error!("Error dispatching event loop: {}", error);
|
tracing::error!("Error dispatching event loop: {}", error);
|
||||||
error.into()
|
error.into()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ use std::time::Duration;
|
|||||||
|
|
||||||
use calloop::timer::{TimeoutAction, Timer};
|
use calloop::timer::{TimeoutAction, Timer};
|
||||||
use calloop::{LoopHandle, RegistrationToken};
|
use calloop::{LoopHandle, RegistrationToken};
|
||||||
use log::warn;
|
use tracing::warn;
|
||||||
|
|
||||||
use sctk::reexports::client::protocol::wl_keyboard::WlKeyboard;
|
use sctk::reexports::client::protocol::wl_keyboard::WlKeyboard;
|
||||||
use sctk::reexports::client::protocol::wl_keyboard::{
|
use sctk::reexports::client::protocol::wl_keyboard::{
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ impl WinitState {
|
|||||||
) {
|
) {
|
||||||
Ok(c) => Some(c),
|
Ok(c) => Some(c),
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
log::warn!("Subcompositor protocol not available, ignoring CSD: {e:?}");
|
tracing::warn!("Subcompositor protocol not available, ignoring CSD: {e:?}");
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ use sctk::shell::xdg::window::Window as SctkWindow;
|
|||||||
use sctk::shell::xdg::window::WindowDecorations;
|
use sctk::shell::xdg::window::WindowDecorations;
|
||||||
use sctk::shell::WaylandSurface;
|
use sctk::shell::WaylandSurface;
|
||||||
|
|
||||||
use log::warn;
|
use tracing::warn;
|
||||||
|
|
||||||
use crate::dpi::{LogicalSize, PhysicalPosition, PhysicalSize, Position, Size};
|
use crate::dpi::{LogicalSize, PhysicalPosition, PhysicalSize, Position, Size};
|
||||||
use crate::error::{ExternalError, NotSupportedError, OsError as RootOsError};
|
use crate::error::{ExternalError, NotSupportedError, OsError as RootOsError};
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ use std::sync::{Arc, Mutex, Weak};
|
|||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use ahash::HashSet;
|
use ahash::HashSet;
|
||||||
use log::{info, warn};
|
use tracing::{info, warn};
|
||||||
|
|
||||||
use sctk::reexports::client::backend::ObjectId;
|
use sctk::reexports::client::backend::ObjectId;
|
||||||
use sctk::reexports::client::protocol::wl_seat::WlSeat;
|
use sctk::reexports::client::protocol::wl_seat::WlSeat;
|
||||||
@@ -727,7 +727,7 @@ impl WindowState {
|
|||||||
RootCustomCursor {
|
RootCustomCursor {
|
||||||
inner: PlatformCustomCursor::X(_),
|
inner: PlatformCustomCursor::X(_),
|
||||||
} => {
|
} => {
|
||||||
log::error!("passed a X11 cursor to Wayland backend");
|
tracing::error!("passed a X11 cursor to Wayland backend");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -33,9 +33,10 @@ use crate::platform_impl::platform::common::xkb::Context;
|
|||||||
use crate::platform_impl::platform::x11::ime::{ImeEvent, ImeEventReceiver, ImeRequest};
|
use crate::platform_impl::platform::x11::ime::{ImeEvent, ImeEventReceiver, ImeRequest};
|
||||||
use crate::platform_impl::platform::x11::ActiveEventLoop;
|
use crate::platform_impl::platform::x11::ActiveEventLoop;
|
||||||
use crate::platform_impl::platform::ActiveEventLoop as PlatformActiveEventLoop;
|
use crate::platform_impl::platform::ActiveEventLoop as PlatformActiveEventLoop;
|
||||||
|
use crate::platform_impl::x11::util::cookie::GenericEventCookie;
|
||||||
use crate::platform_impl::x11::{
|
use crate::platform_impl::x11::{
|
||||||
atoms::*, mkdid, mkwid, util, CookieResultExt, Device, DeviceId, DeviceInfo, Dnd, DndState,
|
atoms::*, mkdid, mkwid, util, CookieResultExt, Device, DeviceId, DeviceInfo, Dnd, DndState,
|
||||||
GenericEventCookie, ImeReceiver, ScrollOrientation, UnownedWindow, WindowId,
|
ImeReceiver, ScrollOrientation, UnownedWindow, WindowId,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// The maximum amount of X modifiers to replay.
|
/// The maximum amount of X modifiers to replay.
|
||||||
@@ -184,14 +185,15 @@ impl EventProcessor {
|
|||||||
}
|
}
|
||||||
xlib::GenericEvent => {
|
xlib::GenericEvent => {
|
||||||
let wt = Self::window_target(&self.target);
|
let wt = Self::window_target(&self.target);
|
||||||
let xev = match GenericEventCookie::from_event(&wt.xconn, *xev) {
|
let xev: GenericEventCookie =
|
||||||
Some(xev) if xev.cookie.extension as u8 == self.xi2ext.major_opcode => {
|
match GenericEventCookie::from_event(wt.xconn.clone(), *xev) {
|
||||||
xev.cookie
|
Some(xev) if xev.extension() == self.xi2ext.major_opcode => xev,
|
||||||
}
|
_ => return,
|
||||||
_ => return,
|
};
|
||||||
};
|
|
||||||
|
|
||||||
match xev.evtype {
|
let evtype = xev.evtype();
|
||||||
|
|
||||||
|
match evtype {
|
||||||
ty @ xinput2::XI_ButtonPress | ty @ xinput2::XI_ButtonRelease => {
|
ty @ xinput2::XI_ButtonPress | ty @ xinput2::XI_ButtonRelease => {
|
||||||
let state = if ty == xinput2::XI_ButtonPress {
|
let state = if ty == xinput2::XI_ButtonPress {
|
||||||
ElementState::Pressed
|
ElementState::Pressed
|
||||||
@@ -199,7 +201,7 @@ impl EventProcessor {
|
|||||||
ElementState::Released
|
ElementState::Released
|
||||||
};
|
};
|
||||||
|
|
||||||
let xev: &XIDeviceEvent = unsafe { &*(xev.data as *const _) };
|
let xev: &XIDeviceEvent = unsafe { xev.as_event() };
|
||||||
self.update_mods_from_xinput2_event(
|
self.update_mods_from_xinput2_event(
|
||||||
&xev.mods,
|
&xev.mods,
|
||||||
&xev.group,
|
&xev.group,
|
||||||
@@ -209,7 +211,7 @@ impl EventProcessor {
|
|||||||
self.xinput2_button_input(xev, state, &mut callback);
|
self.xinput2_button_input(xev, state, &mut callback);
|
||||||
}
|
}
|
||||||
xinput2::XI_Motion => {
|
xinput2::XI_Motion => {
|
||||||
let xev: &XIDeviceEvent = unsafe { &*(xev.data as *const _) };
|
let xev: &XIDeviceEvent = unsafe { xev.as_event() };
|
||||||
self.update_mods_from_xinput2_event(
|
self.update_mods_from_xinput2_event(
|
||||||
&xev.mods,
|
&xev.mods,
|
||||||
&xev.group,
|
&xev.group,
|
||||||
@@ -219,11 +221,11 @@ impl EventProcessor {
|
|||||||
self.xinput2_mouse_motion(xev, &mut callback);
|
self.xinput2_mouse_motion(xev, &mut callback);
|
||||||
}
|
}
|
||||||
xinput2::XI_Enter => {
|
xinput2::XI_Enter => {
|
||||||
let xev: &XIEnterEvent = unsafe { &*(xev.data as *const _) };
|
let xev: &XIEnterEvent = unsafe { xev.as_event() };
|
||||||
self.xinput2_mouse_enter(xev, &mut callback);
|
self.xinput2_mouse_enter(xev, &mut callback);
|
||||||
}
|
}
|
||||||
xinput2::XI_Leave => {
|
xinput2::XI_Leave => {
|
||||||
let xev: &XILeaveEvent = unsafe { &*(xev.data as *const _) };
|
let xev: &XILeaveEvent = unsafe { xev.as_event() };
|
||||||
self.update_mods_from_xinput2_event(
|
self.update_mods_from_xinput2_event(
|
||||||
&xev.mods,
|
&xev.mods,
|
||||||
&xev.group,
|
&xev.group,
|
||||||
@@ -233,51 +235,51 @@ impl EventProcessor {
|
|||||||
self.xinput2_mouse_left(xev, &mut callback);
|
self.xinput2_mouse_left(xev, &mut callback);
|
||||||
}
|
}
|
||||||
xinput2::XI_FocusIn => {
|
xinput2::XI_FocusIn => {
|
||||||
let xev: &XIFocusInEvent = unsafe { &*(xev.data as *const _) };
|
let xev: &XIFocusInEvent = unsafe { xev.as_event() };
|
||||||
self.xinput2_focused(xev, &mut callback);
|
self.xinput2_focused(xev, &mut callback);
|
||||||
}
|
}
|
||||||
xinput2::XI_FocusOut => {
|
xinput2::XI_FocusOut => {
|
||||||
let xev: &XIFocusOutEvent = unsafe { &*(xev.data as *const _) };
|
let xev: &XIFocusOutEvent = unsafe { xev.as_event() };
|
||||||
self.xinput2_unfocused(xev, &mut callback);
|
self.xinput2_unfocused(xev, &mut callback);
|
||||||
}
|
}
|
||||||
xinput2::XI_TouchBegin | xinput2::XI_TouchUpdate | xinput2::XI_TouchEnd => {
|
xinput2::XI_TouchBegin | xinput2::XI_TouchUpdate | xinput2::XI_TouchEnd => {
|
||||||
let phase = match xev.evtype {
|
let phase = match evtype {
|
||||||
xinput2::XI_TouchBegin => TouchPhase::Started,
|
xinput2::XI_TouchBegin => TouchPhase::Started,
|
||||||
xinput2::XI_TouchUpdate => TouchPhase::Moved,
|
xinput2::XI_TouchUpdate => TouchPhase::Moved,
|
||||||
xinput2::XI_TouchEnd => TouchPhase::Ended,
|
xinput2::XI_TouchEnd => TouchPhase::Ended,
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let xev: &XIDeviceEvent = unsafe { &*(xev.data as *const _) };
|
let xev: &XIDeviceEvent = unsafe { xev.as_event() };
|
||||||
self.xinput2_touch(xev, phase, &mut callback);
|
self.xinput2_touch(xev, phase, &mut callback);
|
||||||
}
|
}
|
||||||
xinput2::XI_RawButtonPress | xinput2::XI_RawButtonRelease => {
|
xinput2::XI_RawButtonPress | xinput2::XI_RawButtonRelease => {
|
||||||
let state = match xev.evtype {
|
let state = match evtype {
|
||||||
xinput2::XI_RawButtonPress => ElementState::Pressed,
|
xinput2::XI_RawButtonPress => ElementState::Pressed,
|
||||||
xinput2::XI_RawButtonRelease => ElementState::Released,
|
xinput2::XI_RawButtonRelease => ElementState::Released,
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let xev: &XIRawEvent = unsafe { &*(xev.data as *const _) };
|
let xev: &XIRawEvent = unsafe { xev.as_event() };
|
||||||
self.xinput2_raw_button_input(xev, state, &mut callback);
|
self.xinput2_raw_button_input(xev, state, &mut callback);
|
||||||
}
|
}
|
||||||
xinput2::XI_RawMotion => {
|
xinput2::XI_RawMotion => {
|
||||||
let xev: &XIRawEvent = unsafe { &*(xev.data as *const _) };
|
let xev: &XIRawEvent = unsafe { xev.as_event() };
|
||||||
self.xinput2_raw_mouse_motion(xev, &mut callback);
|
self.xinput2_raw_mouse_motion(xev, &mut callback);
|
||||||
}
|
}
|
||||||
xinput2::XI_RawKeyPress | xinput2::XI_RawKeyRelease => {
|
xinput2::XI_RawKeyPress | xinput2::XI_RawKeyRelease => {
|
||||||
let state = match xev.evtype {
|
let state = match evtype {
|
||||||
xinput2::XI_RawKeyPress => ElementState::Pressed,
|
xinput2::XI_RawKeyPress => ElementState::Pressed,
|
||||||
xinput2::XI_RawKeyRelease => ElementState::Released,
|
xinput2::XI_RawKeyRelease => ElementState::Released,
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let xev: &xinput2::XIRawEvent = unsafe { &*(xev.data as *const _) };
|
let xev: &xinput2::XIRawEvent = unsafe { xev.as_event() };
|
||||||
self.xinput2_raw_key_input(xev, state, &mut callback);
|
self.xinput2_raw_key_input(xev, state, &mut callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
xinput2::XI_HierarchyChanged => {
|
xinput2::XI_HierarchyChanged => {
|
||||||
let xev: &XIHierarchyEvent = unsafe { &*(xev.data as *const _) };
|
let xev: &XIHierarchyEvent = unsafe { xev.as_event() };
|
||||||
self.xinput2_hierarchy_changed(xev, &mut callback);
|
self.xinput2_hierarchy_changed(xev, &mut callback);
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
@@ -1518,8 +1520,8 @@ impl EventProcessor {
|
|||||||
let mask =
|
let mask =
|
||||||
unsafe { slice::from_raw_parts(xev.valuators.mask, xev.valuators.mask_len as usize) };
|
unsafe { slice::from_raw_parts(xev.valuators.mask, xev.valuators.mask_len as usize) };
|
||||||
let mut value = xev.raw_values;
|
let mut value = xev.raw_values;
|
||||||
let mut mouse_delta = (0.0, 0.0);
|
let mut mouse_delta = util::Delta::default();
|
||||||
let mut scroll_delta = (0.0, 0.0);
|
let mut scroll_delta = util::Delta::default();
|
||||||
for i in 0..xev.valuators.mask_len * 8 {
|
for i in 0..xev.valuators.mask_len * 8 {
|
||||||
if !xinput2::XIMaskIsSet(mask, i) {
|
if !xinput2::XIMaskIsSet(mask, i) {
|
||||||
continue;
|
continue;
|
||||||
@@ -1529,10 +1531,10 @@ impl EventProcessor {
|
|||||||
// We assume that every XInput2 device with analog axes is a pointing device emitting
|
// We assume that every XInput2 device with analog axes is a pointing device emitting
|
||||||
// relative coordinates.
|
// relative coordinates.
|
||||||
match i {
|
match i {
|
||||||
0 => mouse_delta.0 = x,
|
0 => mouse_delta.set_x(x),
|
||||||
1 => mouse_delta.1 = x,
|
1 => mouse_delta.set_y(x),
|
||||||
2 => scroll_delta.0 = x as f32,
|
2 => scroll_delta.set_x(x as f32),
|
||||||
3 => scroll_delta.1 = x as f32,
|
3 => scroll_delta.set_y(x as f32),
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1548,7 +1550,7 @@ impl EventProcessor {
|
|||||||
value = unsafe { value.offset(1) };
|
value = unsafe { value.offset(1) };
|
||||||
}
|
}
|
||||||
|
|
||||||
if mouse_delta != (0.0, 0.0) {
|
if let Some(mouse_delta) = mouse_delta.consume() {
|
||||||
let event = Event::DeviceEvent {
|
let event = Event::DeviceEvent {
|
||||||
device_id: did,
|
device_id: did,
|
||||||
event: DeviceEvent::MouseMotion { delta: mouse_delta },
|
event: DeviceEvent::MouseMotion { delta: mouse_delta },
|
||||||
@@ -1556,7 +1558,7 @@ impl EventProcessor {
|
|||||||
callback(&self.target, event);
|
callback(&self.target, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
if scroll_delta != (0.0, 0.0) {
|
if let Some(scroll_delta) = scroll_delta.consume() {
|
||||||
let event = Event::DeviceEvent {
|
let event = Event::DeviceEvent {
|
||||||
device_id: did,
|
device_id: did,
|
||||||
event: DeviceEvent::MouseWheel {
|
event: DeviceEvent::MouseWheel {
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ extern "C" fn preedit_draw_callback(
|
|||||||
let chg_range =
|
let chg_range =
|
||||||
call_data.chg_first as usize..(call_data.chg_first + call_data.chg_length) as usize;
|
call_data.chg_first as usize..(call_data.chg_first + call_data.chg_length) as usize;
|
||||||
if chg_range.start > client_data.text.len() || chg_range.end > client_data.text.len() {
|
if chg_range.start > client_data.text.len() || chg_range.end > client_data.text.len() {
|
||||||
log::warn!(
|
tracing::warn!(
|
||||||
"invalid chg range: buffer length={}, but chg_first={} chg_lengthg={}",
|
"invalid chg range: buffer length={}, but chg_first={} chg_lengthg={}",
|
||||||
client_data.text.len(),
|
client_data.text.len(),
|
||||||
call_data.chg_first,
|
call_data.chg_first,
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ use std::sync::{
|
|||||||
Arc,
|
Arc,
|
||||||
};
|
};
|
||||||
|
|
||||||
use log::debug;
|
|
||||||
#[cfg(feature = "serde")]
|
#[cfg(feature = "serde")]
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
use tracing::debug;
|
||||||
|
|
||||||
use super::{ffi, util, XConnection, XError};
|
use super::{ffi, util, XConnection, XError};
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ use calloop::generic::Generic;
|
|||||||
use calloop::EventLoop as Loop;
|
use calloop::EventLoop as Loop;
|
||||||
use calloop::{ping::Ping, Readiness};
|
use calloop::{ping::Ping, Readiness};
|
||||||
use libc::{setlocale, LC_CTYPE};
|
use libc::{setlocale, LC_CTYPE};
|
||||||
use log::warn;
|
use tracing::warn;
|
||||||
|
|
||||||
use x11rb::connection::RequestConnection;
|
use x11rb::connection::RequestConnection;
|
||||||
use x11rb::errors::{ConnectError, ConnectionError, IdsExhausted, ReplyError};
|
use x11rb::errors::{ConnectError, ConnectionError, IdsExhausted, ReplyError};
|
||||||
@@ -66,6 +66,9 @@ const ALL_DEVICES: u16 = 0;
|
|||||||
const ALL_MASTER_DEVICES: u16 = 1;
|
const ALL_MASTER_DEVICES: u16 = 1;
|
||||||
const ICONIC_STATE: u32 = 3;
|
const ICONIC_STATE: u32 = 3;
|
||||||
|
|
||||||
|
/// The underlying x11rb connection that we are using.
|
||||||
|
type X11rbConnection = x11rb::xcb_ffi::XCBConnection;
|
||||||
|
|
||||||
type X11Source = Generic<BorrowedFd<'static>>;
|
type X11Source = Generic<BorrowedFd<'static>>;
|
||||||
|
|
||||||
struct WakeSender<T> {
|
struct WakeSender<T> {
|
||||||
@@ -480,7 +483,7 @@ impl<T: 'static> EventLoop<T> {
|
|||||||
.dispatch(timeout, &mut self.state)
|
.dispatch(timeout, &mut self.state)
|
||||||
.map_err(std::io::Error::from)
|
.map_err(std::io::Error::from)
|
||||||
{
|
{
|
||||||
log::error!("Failed to poll for events: {error:?}");
|
tracing::error!("Failed to poll for events: {error:?}");
|
||||||
let exit_code = error.raw_os_error().unwrap_or(1);
|
let exit_code = error.raw_os_error().unwrap_or(1);
|
||||||
self.set_exit_code(exit_code);
|
self.set_exit_code(exit_code);
|
||||||
return;
|
return;
|
||||||
@@ -564,7 +567,7 @@ impl<T: 'static> EventLoop<T> {
|
|||||||
callback(event, &self.event_processor.target)
|
callback(event, &self.event_processor.target)
|
||||||
}
|
}
|
||||||
Some(Err(e)) => {
|
Some(Err(e)) => {
|
||||||
log::error!("Failed to get activation token: {}", e);
|
tracing::error!("Failed to get activation token: {}", e);
|
||||||
}
|
}
|
||||||
None => {}
|
None => {}
|
||||||
}
|
}
|
||||||
@@ -985,9 +988,6 @@ impl From<xsettings::ParserError> for X11Error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The underlying x11rb connection that we are using.
|
|
||||||
type X11rbConnection = x11rb::xcb_ffi::XCBConnection;
|
|
||||||
|
|
||||||
/// Type alias for a void cookie.
|
/// Type alias for a void cookie.
|
||||||
type VoidCookie<'a> = x11rb::cookie::VoidCookie<'a, X11rbConnection>;
|
type VoidCookie<'a> = x11rb::cookie::VoidCookie<'a, X11rbConnection>;
|
||||||
|
|
||||||
@@ -1003,34 +1003,6 @@ impl<'a, E: fmt::Debug> CookieResultExt for Result<VoidCookie<'a>, E> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// XEvents of type GenericEvent store their actual data in an XGenericEventCookie data structure. This is a wrapper to
|
|
||||||
/// extract the cookie from a GenericEvent XEvent and release the cookie data once it has been processed
|
|
||||||
struct GenericEventCookie<'a> {
|
|
||||||
xconn: &'a XConnection,
|
|
||||||
cookie: ffi::XGenericEventCookie,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> GenericEventCookie<'a> {
|
|
||||||
fn from_event(xconn: &XConnection, event: ffi::XEvent) -> Option<GenericEventCookie<'_>> {
|
|
||||||
unsafe {
|
|
||||||
let mut cookie: ffi::XGenericEventCookie = From::from(event);
|
|
||||||
if (xconn.xlib.XGetEventData)(xconn.display, &mut cookie) == ffi::True {
|
|
||||||
Some(GenericEventCookie { xconn, cookie })
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> Drop for GenericEventCookie<'a> {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
unsafe {
|
|
||||||
(self.xconn.xlib.XFreeEventData)(self.xconn.display, &mut self.cookie);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn mkwid(w: xproto::Window) -> crate::window::WindowId {
|
fn mkwid(w: xproto::Window) -> crate::window::WindowId {
|
||||||
crate::window::WindowId(crate::platform_impl::platform::WindowId(w as _))
|
crate::window::WindowId(crate::platform_impl::platform::WindowId(w as _))
|
||||||
}
|
}
|
||||||
|
|||||||
55
src/platform_impl/linux/x11/util/cookie.rs
Normal file
55
src/platform_impl/linux/x11/util/cookie.rs
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
use std::ffi::c_int;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use x11_dl::xlib::{self, XEvent, XGenericEventCookie};
|
||||||
|
|
||||||
|
use crate::platform_impl::x11::XConnection;
|
||||||
|
|
||||||
|
/// XEvents of type GenericEvent store their actual data in an XGenericEventCookie data structure.
|
||||||
|
/// This is a wrapper to extract the cookie from a GenericEvent XEvent and release the cookie data
|
||||||
|
/// once it has been processed
|
||||||
|
pub struct GenericEventCookie {
|
||||||
|
cookie: XGenericEventCookie,
|
||||||
|
xconn: Arc<XConnection>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl GenericEventCookie {
|
||||||
|
pub fn from_event(xconn: Arc<XConnection>, event: XEvent) -> Option<GenericEventCookie> {
|
||||||
|
unsafe {
|
||||||
|
let mut cookie: XGenericEventCookie = From::from(event);
|
||||||
|
if (xconn.xlib.XGetEventData)(xconn.display, &mut cookie) == xlib::True {
|
||||||
|
Some(GenericEventCookie { cookie, xconn })
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn extension(&self) -> u8 {
|
||||||
|
self.cookie.extension as u8
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn evtype(&self) -> c_int {
|
||||||
|
self.cookie.evtype
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Borrow inner event data as `&T`.
|
||||||
|
///
|
||||||
|
/// ## SAFETY
|
||||||
|
///
|
||||||
|
/// The caller must ensure that the event has the `T` inside of it.
|
||||||
|
#[inline]
|
||||||
|
pub unsafe fn as_event<T>(&self) -> &T {
|
||||||
|
unsafe { &*(self.cookie.data as *const _) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for GenericEventCookie {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
unsafe {
|
||||||
|
(self.xconn.xlib.XFreeEventData)(self.xconn.display, &mut self.cookie);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -45,7 +45,7 @@ impl XConnection {
|
|||||||
self.flush_requests()?;
|
self.flush_requests()?;
|
||||||
Ok(true)
|
Ok(true)
|
||||||
} else {
|
} else {
|
||||||
log::error!("Could not select XKB events: The XKB extension is not initialized!");
|
tracing::error!("Could not select XKB events: The XKB extension is not initialized!");
|
||||||
Ok(false)
|
Ok(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ use std::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
mod client_msg;
|
mod client_msg;
|
||||||
|
pub mod cookie;
|
||||||
mod cursor;
|
mod cursor;
|
||||||
mod geometry;
|
mod geometry;
|
||||||
mod hint;
|
mod hint;
|
||||||
@@ -15,13 +16,15 @@ mod icon;
|
|||||||
mod input;
|
mod input;
|
||||||
pub mod keys;
|
pub mod keys;
|
||||||
pub(crate) mod memory;
|
pub(crate) mod memory;
|
||||||
|
mod mouse;
|
||||||
mod randr;
|
mod randr;
|
||||||
mod window_property;
|
mod window_property;
|
||||||
mod wm;
|
mod wm;
|
||||||
mod xmodmap;
|
mod xmodmap;
|
||||||
|
|
||||||
pub use self::{
|
pub use self::{
|
||||||
cursor::*, geometry::*, hint::*, input::*, window_property::*, wm::*, xmodmap::ModifierKeymap,
|
cursor::*, geometry::*, hint::*, input::*, mouse::*, window_property::*, wm::*,
|
||||||
|
xmodmap::ModifierKeymap,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{atoms::*, ffi, VoidCookie, X11Error, XConnection, XError};
|
use super::{atoms::*, ffi, VoidCookie, X11Error, XConnection, XError};
|
||||||
|
|||||||
52
src/platform_impl/linux/x11/util/mouse.rs
Normal file
52
src/platform_impl/linux/x11/util/mouse.rs
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
//! Utilities for handling mouse events.
|
||||||
|
|
||||||
|
/// Recorded mouse delta designed to filter out noise.
|
||||||
|
pub struct Delta<T> {
|
||||||
|
x: T,
|
||||||
|
y: T,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Default> Default for Delta<T> {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
x: Default::default(),
|
||||||
|
y: Default::default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Default> Delta<T> {
|
||||||
|
pub(crate) fn set_x(&mut self, x: T) {
|
||||||
|
self.x = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn set_y(&mut self, y: T) {
|
||||||
|
self.y = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! consume {
|
||||||
|
($this:expr, $ty:ty) => {{
|
||||||
|
let this = $this;
|
||||||
|
let (x, y) = match (this.x.abs() < <$ty>::EPSILON, this.y.abs() < <$ty>::EPSILON) {
|
||||||
|
(true, true) => return None,
|
||||||
|
(true, false) => (this.x, 0.0),
|
||||||
|
(false, true) => (0.0, this.y),
|
||||||
|
(false, false) => (this.x, this.y),
|
||||||
|
};
|
||||||
|
|
||||||
|
Some((x, y))
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Delta<f32> {
|
||||||
|
pub(crate) fn consume(self) -> Option<(f32, f32)> {
|
||||||
|
consume!(self, f32)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Delta<f64> {
|
||||||
|
pub(crate) fn consume(self) -> Option<(f64, f64)> {
|
||||||
|
consume!(self, f64)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,7 +4,7 @@ use super::*;
|
|||||||
use crate::platform_impl::platform::x11::monitor;
|
use crate::platform_impl::platform::x11::monitor;
|
||||||
use crate::{dpi::validate_scale_factor, platform_impl::platform::x11::VideoModeHandle};
|
use crate::{dpi::validate_scale_factor, platform_impl::platform::x11::VideoModeHandle};
|
||||||
|
|
||||||
use log::warn;
|
use tracing::warn;
|
||||||
use x11rb::protocol::randr::{self, ConnectionExt as _};
|
use x11rb::protocol::randr::{self, ConnectionExt as _};
|
||||||
|
|
||||||
/// Represents values of `WINIT_HIDPI_FACTOR`.
|
/// Represents values of `WINIT_HIDPI_FACTOR`.
|
||||||
@@ -44,7 +44,7 @@ impl XConnection {
|
|||||||
Ok(Some(dpi)) => return Some(dpi),
|
Ok(Some(dpi)) => return Some(dpi),
|
||||||
Ok(None) => {}
|
Ok(None) => {}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::warn!("failed to fetch XSettings: {err}");
|
tracing::warn!("failed to fetch XSettings: {err}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use std::{
|
|||||||
sync::{Arc, Mutex, MutexGuard},
|
sync::{Arc, Mutex, MutexGuard},
|
||||||
};
|
};
|
||||||
|
|
||||||
use log::{debug, info, warn};
|
use tracing::{debug, info, warn};
|
||||||
use x11rb::{
|
use x11rb::{
|
||||||
connection::Connection,
|
connection::Connection,
|
||||||
properties::{WmHints, WmSizeHints, WmSizeHintsSpecification},
|
properties::{WmHints, WmSizeHints, WmSizeHintsSpecification},
|
||||||
@@ -1573,7 +1573,7 @@ impl UnownedWindow {
|
|||||||
#[cfg(wayland_platform)]
|
#[cfg(wayland_platform)]
|
||||||
Cursor::Custom(RootCustomCursor {
|
Cursor::Custom(RootCustomCursor {
|
||||||
inner: PlatformCustomCursor::Wayland(_),
|
inner: PlatformCustomCursor::Wayland(_),
|
||||||
}) => log::error!("passed a Wayland cursor to X11 backend"),
|
}) => tracing::error!("passed a Wayland cursor to X11 backend"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1857,7 +1857,7 @@ impl UnownedWindow {
|
|||||||
)
|
)
|
||||||
.expect_then_ignore_error("Failed to send client message");
|
.expect_then_ignore_error("Failed to send client message");
|
||||||
if let Err(e) = self.xconn.flush_requests() {
|
if let Err(e) = self.xconn.flush_requests() {
|
||||||
log::error!(
|
tracing::error!(
|
||||||
"`flush` returned an error when focusing the window. Error was: {}",
|
"`flush` returned an error when focusing the window. Error was: {}",
|
||||||
e
|
e
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ impl XConnection {
|
|||||||
|
|
||||||
let xsettings_screen = Self::new_xsettings_screen(&xcb, default_screen);
|
let xsettings_screen = Self::new_xsettings_screen(&xcb, default_screen);
|
||||||
if xsettings_screen.is_none() {
|
if xsettings_screen.is_none() {
|
||||||
log::warn!("error setting XSETTINGS; Xft options won't reload automatically")
|
tracing::warn!("error setting XSETTINGS; Xft options won't reload automatically")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetch atoms.
|
// Fetch atoms.
|
||||||
|
|||||||
@@ -471,10 +471,10 @@ fn window_activation_hack(app: &NSApplication) {
|
|||||||
// This way we preserve the user's desired initial visibility status
|
// This way we preserve the user's desired initial visibility status
|
||||||
// TODO: Also filter on the type/"level" of the window, and maybe other things?
|
// TODO: Also filter on the type/"level" of the window, and maybe other things?
|
||||||
if window.isVisible() {
|
if window.isVisible() {
|
||||||
log::trace!("Activating visible window");
|
tracing::trace!("Activating visible window");
|
||||||
window.makeKeyAndOrderFront(None);
|
window.makeKeyAndOrderFront(None);
|
||||||
} else {
|
} else {
|
||||||
log::trace!("Skipping activating invisible window");
|
tracing::trace!("Skipping activating invisible window");
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ unsafe fn try_cursor_from_selector(sel: Sel) -> Option<Id<NSCursor>> {
|
|||||||
let cursor: Id<NSCursor> = unsafe { msg_send_id![cls, performSelector: sel] };
|
let cursor: Id<NSCursor> = unsafe { msg_send_id![cls, performSelector: sel] };
|
||||||
Some(cursor)
|
Some(cursor)
|
||||||
} else {
|
} else {
|
||||||
log::warn!("cursor `{sel}` appears to be invalid");
|
tracing::warn!("cursor `{sel}` appears to be invalid");
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,14 +36,14 @@ pub fn get_modifierless_char(scancode: u16) -> Key {
|
|||||||
unsafe {
|
unsafe {
|
||||||
input_source = ffi::TISCopyCurrentKeyboardLayoutInputSource();
|
input_source = ffi::TISCopyCurrentKeyboardLayoutInputSource();
|
||||||
if input_source.is_null() {
|
if input_source.is_null() {
|
||||||
log::error!("`TISCopyCurrentKeyboardLayoutInputSource` returned null ptr");
|
tracing::error!("`TISCopyCurrentKeyboardLayoutInputSource` returned null ptr");
|
||||||
return Key::Unidentified(NativeKey::MacOS(scancode));
|
return Key::Unidentified(NativeKey::MacOS(scancode));
|
||||||
}
|
}
|
||||||
let layout_data =
|
let layout_data =
|
||||||
ffi::TISGetInputSourceProperty(input_source, ffi::kTISPropertyUnicodeKeyLayoutData);
|
ffi::TISGetInputSourceProperty(input_source, ffi::kTISPropertyUnicodeKeyLayoutData);
|
||||||
if layout_data.is_null() {
|
if layout_data.is_null() {
|
||||||
CFRelease(input_source as *mut c_void);
|
CFRelease(input_source as *mut c_void);
|
||||||
log::error!("`TISGetInputSourceProperty` returned null ptr");
|
tracing::error!("`TISGetInputSourceProperty` returned null ptr");
|
||||||
return Key::Unidentified(NativeKey::MacOS(scancode));
|
return Key::Unidentified(NativeKey::MacOS(scancode));
|
||||||
}
|
}
|
||||||
layout = CFDataGetBytePtr(layout_data as CFDataRef) as *const ffi::UCKeyboardLayout;
|
layout = CFDataGetBytePtr(layout_data as CFDataRef) as *const ffi::UCKeyboardLayout;
|
||||||
@@ -71,7 +71,7 @@ pub fn get_modifierless_char(scancode: u16) -> Key {
|
|||||||
CFRelease(input_source as *mut c_void);
|
CFRelease(input_source as *mut c_void);
|
||||||
}
|
}
|
||||||
if translate_result != 0 {
|
if translate_result != 0 {
|
||||||
log::error!(
|
tracing::error!(
|
||||||
"`UCKeyTranslate` returned with the non-zero value: {}",
|
"`UCKeyTranslate` returned with the non-zero value: {}",
|
||||||
translate_result
|
translate_result
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ impl EventHandler {
|
|||||||
*data = None;
|
*data = None;
|
||||||
}
|
}
|
||||||
Ok(None) => {
|
Ok(None) => {
|
||||||
log::error!("tried to clear handler, but no handler was set");
|
tracing::error!("tried to clear handler, but no handler was set");
|
||||||
}
|
}
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
// Note: This is not expected to ever happen, this
|
// Note: This is not expected to ever happen, this
|
||||||
@@ -125,7 +125,7 @@ impl EventHandler {
|
|||||||
// `NSApplication`, our app delegate and this handler are all
|
// `NSApplication`, our app delegate and this handler are all
|
||||||
// global state and so it's not impossible that we could get
|
// global state and so it's not impossible that we could get
|
||||||
// an event after the application has exited the `EventLoop`.
|
// an event after the application has exited the `EventLoop`.
|
||||||
log::error!("tried to run event handler, but no handler was set");
|
tracing::error!("tried to run event handler, but no handler was set");
|
||||||
}
|
}
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
// Prevent re-entrancy.
|
// Prevent re-entrancy.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
use icrate::Foundation::{NSNotFound, NSRange, NSUInteger};
|
use icrate::Foundation::{NSNotFound, NSRange, NSUInteger};
|
||||||
use log::trace;
|
use tracing::trace;
|
||||||
|
|
||||||
pub const EMPTY_RANGE: NSRange = NSRange {
|
pub const EMPTY_RANGE: NSRange = NSRange {
|
||||||
location: NSNotFound as NSUInteger,
|
location: NSNotFound as NSUInteger,
|
||||||
@@ -20,7 +20,7 @@ pub(crate) struct TraceGuard {
|
|||||||
impl TraceGuard {
|
impl TraceGuard {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub(crate) fn new(module_path: &'static str, called_from_fn: &'static str) -> Self {
|
pub(crate) fn new(module_path: &'static str, called_from_fn: &'static str) -> Self {
|
||||||
trace!(target: module_path, "Triggered `{}`", called_from_fn);
|
trace!(target = module_path, "Triggered `{}`", called_from_fn);
|
||||||
Self {
|
Self {
|
||||||
module_path,
|
module_path,
|
||||||
called_from_fn,
|
called_from_fn,
|
||||||
@@ -31,6 +31,10 @@ impl TraceGuard {
|
|||||||
impl Drop for TraceGuard {
|
impl Drop for TraceGuard {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
trace!(target: self.module_path, "Completed `{}`", self.called_from_fn);
|
trace!(
|
||||||
|
target = self.module_path,
|
||||||
|
"Completed `{}`",
|
||||||
|
self.called_from_fn
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -338,7 +338,7 @@ declare_class!(
|
|||||||
// Leave the Preedit self.ivars()
|
// Leave the Preedit self.ivars()
|
||||||
self.ivars().ime_state.set(ImeState::Ground);
|
self.ivars().ime_state.set(ImeState::Ground);
|
||||||
} else {
|
} else {
|
||||||
log::warn!("Expected to have IME enabled when receiving unmarkText");
|
tracing::warn!("Expected to have IME enabled when receiving unmarkText");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -537,7 +537,7 @@ impl<T: 'static> EventLoop<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
other => {
|
other => {
|
||||||
log::warn!("unhandled event: {:?}", other);
|
tracing::warn!("unhandled event: {:?}", other);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -301,7 +301,9 @@ impl CursorHandler {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
ImageState::Failed(error) => {
|
ImageState::Failed(error) => {
|
||||||
log::error!("trying to load custom cursor that has failed to load: {error}")
|
tracing::error!(
|
||||||
|
"trying to load custom cursor that has failed to load: {error}"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
ImageState::Image(_) => {
|
ImageState::Image(_) => {
|
||||||
drop(state);
|
drop(state);
|
||||||
@@ -413,7 +415,7 @@ impl Inner {
|
|||||||
self.set_style();
|
self.set_style();
|
||||||
}
|
}
|
||||||
ImageState::Failed(error) => {
|
ImageState::Failed(error) => {
|
||||||
log::error!("custom cursor failed to load: {error}");
|
tracing::error!("custom cursor failed to load: {error}");
|
||||||
self.cursor = previous.into()
|
self.cursor = previous.into()
|
||||||
}
|
}
|
||||||
ImageState::Loading { .. } => unreachable!("notified without being ready"),
|
ImageState::Loading { .. } => unreachable!("notified without being ready"),
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ pub fn key_location(event: &KeyboardEvent) -> KeyLocation {
|
|||||||
KeyboardEvent::DOM_KEY_LOCATION_NUMPAD => KeyLocation::Numpad,
|
KeyboardEvent::DOM_KEY_LOCATION_NUMPAD => KeyLocation::Numpad,
|
||||||
KeyboardEvent::DOM_KEY_LOCATION_STANDARD => KeyLocation::Standard,
|
KeyboardEvent::DOM_KEY_LOCATION_STANDARD => KeyLocation::Standard,
|
||||||
location => {
|
location => {
|
||||||
log::warn!("Unexpected key location: {location}");
|
tracing::warn!("Unexpected key location: {location}");
|
||||||
KeyLocation::Standard
|
KeyLocation::Standard
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
use js_sys::{Array, Object};
|
use js_sys::{Array, Object};
|
||||||
use log::warn;
|
use tracing::warn;
|
||||||
use wasm_bindgen::prelude::{wasm_bindgen, Closure};
|
use wasm_bindgen::prelude::{wasm_bindgen, Closure};
|
||||||
use wasm_bindgen::{JsCast, JsValue};
|
use wasm_bindgen::{JsCast, JsValue};
|
||||||
use web_sys::{
|
use web_sys::{
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ use windows_sys::{
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
use log::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
use crate::platform_impl::platform::{
|
use crate::platform_impl::platform::{
|
||||||
definitions::{IDataObjectVtbl, IDropTarget, IDropTargetVtbl, IUnknownVtbl},
|
definitions::{IDataObjectVtbl, IDropTarget, IDropTargetVtbl, IUnknownVtbl},
|
||||||
|
|||||||
@@ -536,7 +536,7 @@ impl ActiveEventLoop {
|
|||||||
let inner = match WinCursor::new(&source.inner.0) {
|
let inner = match WinCursor::new(&source.inner.0) {
|
||||||
Ok(cursor) => cursor,
|
Ok(cursor) => cursor,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::warn!("Failed to create custom cursor: {err}");
|
tracing::warn!("Failed to create custom cursor: {err}");
|
||||||
WinCursor::Failed
|
WinCursor::Failed
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -32,8 +32,8 @@ use windows_sys::Win32::{
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
use log::{trace, warn};
|
|
||||||
use smol_str::SmolStr;
|
use smol_str::SmolStr;
|
||||||
|
use tracing::{trace, warn};
|
||||||
use unicode_segmentation::UnicodeSegmentation;
|
use unicode_segmentation::UnicodeSegmentation;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
|||||||
@@ -236,7 +236,7 @@ impl MonitorHandle {
|
|||||||
let monitor_info = match get_monitor_info(self.0) {
|
let monitor_info = match get_monitor_info(self.0) {
|
||||||
Ok(monitor_info) => monitor_info,
|
Ok(monitor_info) => monitor_info,
|
||||||
Err(error) => {
|
Err(error) => {
|
||||||
log::warn!("Error from get_monitor_info: {error}");
|
tracing::warn!("Error from get_monitor_info: {error}");
|
||||||
return modes.into_iter().map(mod_map);
|
return modes.into_iter().map(mod_map);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ use windows_sys::Win32::{
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
use log::warn;
|
use tracing::warn;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
cursor::Cursor,
|
cursor::Cursor,
|
||||||
|
|||||||
130
src/window.rs
130
src/window.rs
@@ -528,6 +528,8 @@ impl Window {
|
|||||||
/// Returns an identifier unique to the window.
|
/// Returns an identifier unique to the window.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn id(&self) -> WindowId {
|
pub fn id(&self) -> WindowId {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::id",).entered();
|
||||||
|
|
||||||
self.window.maybe_wait_on_main(|w| WindowId(w.id()))
|
self.window.maybe_wait_on_main(|w| WindowId(w.id()))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -591,6 +593,8 @@ impl Window {
|
|||||||
/// [`contentScaleFactor`]: https://developer.apple.com/documentation/uikit/uiview/1622657-contentscalefactor?language=objc
|
/// [`contentScaleFactor`]: https://developer.apple.com/documentation/uikit/uiview/1622657-contentscalefactor?language=objc
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn scale_factor(&self) -> f64 {
|
pub fn scale_factor(&self) -> f64 {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::scale_factor",).entered();
|
||||||
|
|
||||||
self.window.maybe_wait_on_main(|w| w.scale_factor())
|
self.window.maybe_wait_on_main(|w| w.scale_factor())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -622,6 +626,8 @@ impl Window {
|
|||||||
/// [`WindowEvent::RedrawRequested`]: crate::event::WindowEvent::RedrawRequested
|
/// [`WindowEvent::RedrawRequested`]: crate::event::WindowEvent::RedrawRequested
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn request_redraw(&self) {
|
pub fn request_redraw(&self) {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::request_redraw",).entered();
|
||||||
|
|
||||||
self.window.maybe_queue_on_main(|w| w.request_redraw())
|
self.window.maybe_queue_on_main(|w| w.request_redraw())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -658,6 +664,8 @@ impl Window {
|
|||||||
/// [`WindowEvent::RedrawRequested`]: crate::event::WindowEvent::RedrawRequested
|
/// [`WindowEvent::RedrawRequested`]: crate::event::WindowEvent::RedrawRequested
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn pre_present_notify(&self) {
|
pub fn pre_present_notify(&self) {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::pre_present_notify",).entered();
|
||||||
|
|
||||||
self.window.maybe_queue_on_main(|w| w.pre_present_notify());
|
self.window.maybe_queue_on_main(|w| w.pre_present_notify());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -674,6 +682,8 @@ impl Window {
|
|||||||
// at least, then this function should be provided through a platform specific
|
// at least, then this function should be provided through a platform specific
|
||||||
// extension trait
|
// extension trait
|
||||||
pub fn reset_dead_keys(&self) {
|
pub fn reset_dead_keys(&self) {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::reset_dead_keys",).entered();
|
||||||
|
|
||||||
self.window.maybe_queue_on_main(|w| w.reset_dead_keys())
|
self.window.maybe_queue_on_main(|w| w.reset_dead_keys())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -696,6 +706,8 @@ impl Window {
|
|||||||
/// [safe area]: https://developer.apple.com/documentation/uikit/uiview/2891103-safeareainsets?language=objc
|
/// [safe area]: https://developer.apple.com/documentation/uikit/uiview/2891103-safeareainsets?language=objc
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn inner_position(&self) -> Result<PhysicalPosition<i32>, NotSupportedError> {
|
pub fn inner_position(&self) -> Result<PhysicalPosition<i32>, NotSupportedError> {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::inner_position",).entered();
|
||||||
|
|
||||||
self.window.maybe_wait_on_main(|w| w.inner_position())
|
self.window.maybe_wait_on_main(|w| w.inner_position())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -717,6 +729,8 @@ impl Window {
|
|||||||
/// - **Android / Wayland:** Always returns [`NotSupportedError`].
|
/// - **Android / Wayland:** Always returns [`NotSupportedError`].
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn outer_position(&self) -> Result<PhysicalPosition<i32>, NotSupportedError> {
|
pub fn outer_position(&self) -> Result<PhysicalPosition<i32>, NotSupportedError> {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::outer_position",).entered();
|
||||||
|
|
||||||
self.window.maybe_wait_on_main(|w| w.outer_position())
|
self.window.maybe_wait_on_main(|w| w.outer_position())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -749,6 +763,12 @@ impl Window {
|
|||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_outer_position<P: Into<Position>>(&self, position: P) {
|
pub fn set_outer_position<P: Into<Position>>(&self, position: P) {
|
||||||
let position = position.into();
|
let position = position.into();
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Window::set_outer_position",
|
||||||
|
position = ?position
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
|
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_outer_position(position))
|
.maybe_queue_on_main(move |w| w.set_outer_position(position))
|
||||||
}
|
}
|
||||||
@@ -767,6 +787,8 @@ impl Window {
|
|||||||
/// [`transform`]: https://developer.mozilla.org/en-US/docs/Web/CSS/transform
|
/// [`transform`]: https://developer.mozilla.org/en-US/docs/Web/CSS/transform
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn inner_size(&self) -> PhysicalSize<u32> {
|
pub fn inner_size(&self) -> PhysicalSize<u32> {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::inner_size",).entered();
|
||||||
|
|
||||||
self.window.maybe_wait_on_main(|w| w.inner_size())
|
self.window.maybe_wait_on_main(|w| w.inner_size())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -808,6 +830,11 @@ impl Window {
|
|||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn request_inner_size<S: Into<Size>>(&self, size: S) -> Option<PhysicalSize<u32>> {
|
pub fn request_inner_size<S: Into<Size>>(&self, size: S) -> Option<PhysicalSize<u32>> {
|
||||||
let size = size.into();
|
let size = size.into();
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Window::request_inner_size",
|
||||||
|
size = ?size
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_wait_on_main(|w| w.request_inner_size(size))
|
.maybe_wait_on_main(|w| w.request_inner_size(size))
|
||||||
}
|
}
|
||||||
@@ -825,6 +852,7 @@ impl Window {
|
|||||||
/// [`Window::inner_size`]._
|
/// [`Window::inner_size`]._
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn outer_size(&self) -> PhysicalSize<u32> {
|
pub fn outer_size(&self) -> PhysicalSize<u32> {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::outer_size",).entered();
|
||||||
self.window.maybe_wait_on_main(|w| w.outer_size())
|
self.window.maybe_wait_on_main(|w| w.outer_size())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -848,6 +876,11 @@ impl Window {
|
|||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_min_inner_size<S: Into<Size>>(&self, min_size: Option<S>) {
|
pub fn set_min_inner_size<S: Into<Size>>(&self, min_size: Option<S>) {
|
||||||
let min_size = min_size.map(|s| s.into());
|
let min_size = min_size.map(|s| s.into());
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Window::set_min_inner_size",
|
||||||
|
min_size = ?min_size
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_min_inner_size(min_size))
|
.maybe_queue_on_main(move |w| w.set_min_inner_size(min_size))
|
||||||
}
|
}
|
||||||
@@ -872,6 +905,11 @@ impl Window {
|
|||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_max_inner_size<S: Into<Size>>(&self, max_size: Option<S>) {
|
pub fn set_max_inner_size<S: Into<Size>>(&self, max_size: Option<S>) {
|
||||||
let max_size = max_size.map(|s| s.into());
|
let max_size = max_size.map(|s| s.into());
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Window::max_size",
|
||||||
|
max_size = ?max_size
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_max_inner_size(max_size))
|
.maybe_queue_on_main(move |w| w.set_max_inner_size(max_size))
|
||||||
}
|
}
|
||||||
@@ -883,6 +921,7 @@ impl Window {
|
|||||||
/// - **iOS / Android / Web / Wayland / Windows / Orbital:** Always returns [`None`].
|
/// - **iOS / Android / Web / Wayland / Windows / Orbital:** Always returns [`None`].
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn resize_increments(&self) -> Option<PhysicalSize<u32>> {
|
pub fn resize_increments(&self) -> Option<PhysicalSize<u32>> {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::resize_increments",).entered();
|
||||||
self.window.maybe_wait_on_main(|w| w.resize_increments())
|
self.window.maybe_wait_on_main(|w| w.resize_increments())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -899,6 +938,11 @@ impl Window {
|
|||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_resize_increments<S: Into<Size>>(&self, increments: Option<S>) {
|
pub fn set_resize_increments<S: Into<Size>>(&self, increments: Option<S>) {
|
||||||
let increments = increments.map(Into::into);
|
let increments = increments.map(Into::into);
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Window::set_resize_increments",
|
||||||
|
increments = ?increments
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_resize_increments(increments))
|
.maybe_queue_on_main(move |w| w.set_resize_increments(increments))
|
||||||
}
|
}
|
||||||
@@ -913,6 +957,7 @@ impl Window {
|
|||||||
/// - **iOS / Android:** Unsupported.
|
/// - **iOS / Android:** Unsupported.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_title(&self, title: &str) {
|
pub fn set_title(&self, title: &str) {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::set_title", title).entered();
|
||||||
self.window.maybe_wait_on_main(|w| w.set_title(title))
|
self.window.maybe_wait_on_main(|w| w.set_title(title))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -931,6 +976,7 @@ impl Window {
|
|||||||
/// - **X11:** Can only be set while building the window, with [`WindowAttributes::with_transparent`].
|
/// - **X11:** Can only be set while building the window, with [`WindowAttributes::with_transparent`].
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_transparent(&self, transparent: bool) {
|
pub fn set_transparent(&self, transparent: bool) {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::set_transparent", transparent).entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_transparent(transparent))
|
.maybe_queue_on_main(move |w| w.set_transparent(transparent))
|
||||||
}
|
}
|
||||||
@@ -945,6 +991,7 @@ impl Window {
|
|||||||
/// - **Wayland:** Only works with org_kde_kwin_blur_manager protocol.
|
/// - **Wayland:** Only works with org_kde_kwin_blur_manager protocol.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_blur(&self, blur: bool) {
|
pub fn set_blur(&self, blur: bool) {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::set_blur", blur).entered();
|
||||||
self.window.maybe_queue_on_main(move |w| w.set_blur(blur))
|
self.window.maybe_queue_on_main(move |w| w.set_blur(blur))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -958,6 +1005,7 @@ impl Window {
|
|||||||
/// - **iOS:** Can only be called on the main thread.
|
/// - **iOS:** Can only be called on the main thread.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_visible(&self, visible: bool) {
|
pub fn set_visible(&self, visible: bool) {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::set_visible", visible).entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_visible(visible))
|
.maybe_queue_on_main(move |w| w.set_visible(visible))
|
||||||
}
|
}
|
||||||
@@ -972,6 +1020,7 @@ impl Window {
|
|||||||
/// - **Wayland / iOS / Android / Web:** Unsupported.
|
/// - **Wayland / iOS / Android / Web:** Unsupported.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn is_visible(&self) -> Option<bool> {
|
pub fn is_visible(&self) -> Option<bool> {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::is_visible",).entered();
|
||||||
self.window.maybe_wait_on_main(|w| w.is_visible())
|
self.window.maybe_wait_on_main(|w| w.is_visible())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -991,6 +1040,7 @@ impl Window {
|
|||||||
/// [`WindowEvent::Resized`]: crate::event::WindowEvent::Resized
|
/// [`WindowEvent::Resized`]: crate::event::WindowEvent::Resized
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_resizable(&self, resizable: bool) {
|
pub fn set_resizable(&self, resizable: bool) {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::set_resizable", resizable).entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_resizable(resizable))
|
.maybe_queue_on_main(move |w| w.set_resizable(resizable))
|
||||||
}
|
}
|
||||||
@@ -1003,6 +1053,7 @@ impl Window {
|
|||||||
/// - **iOS / Android / Web:** Unsupported.
|
/// - **iOS / Android / Web:** Unsupported.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn is_resizable(&self) -> bool {
|
pub fn is_resizable(&self) -> bool {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::is_resizable",).entered();
|
||||||
self.window.maybe_wait_on_main(|w| w.is_resizable())
|
self.window.maybe_wait_on_main(|w| w.is_resizable())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1013,6 +1064,11 @@ impl Window {
|
|||||||
/// - **Wayland / X11 / Orbital:** Not implemented.
|
/// - **Wayland / X11 / Orbital:** Not implemented.
|
||||||
/// - **Web / iOS / Android:** Unsupported.
|
/// - **Web / iOS / Android:** Unsupported.
|
||||||
pub fn set_enabled_buttons(&self, buttons: WindowButtons) {
|
pub fn set_enabled_buttons(&self, buttons: WindowButtons) {
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Window::set_enabled_buttons",
|
||||||
|
buttons = ?buttons
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_enabled_buttons(buttons))
|
.maybe_queue_on_main(move |w| w.set_enabled_buttons(buttons))
|
||||||
}
|
}
|
||||||
@@ -1024,6 +1080,7 @@ impl Window {
|
|||||||
/// - **Wayland / X11 / Orbital:** Not implemented. Always returns [`WindowButtons::all`].
|
/// - **Wayland / X11 / Orbital:** Not implemented. Always returns [`WindowButtons::all`].
|
||||||
/// - **Web / iOS / Android:** Unsupported. Always returns [`WindowButtons::all`].
|
/// - **Web / iOS / Android:** Unsupported. Always returns [`WindowButtons::all`].
|
||||||
pub fn enabled_buttons(&self) -> WindowButtons {
|
pub fn enabled_buttons(&self) -> WindowButtons {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::enabled_buttons",).entered();
|
||||||
self.window.maybe_wait_on_main(|w| w.enabled_buttons())
|
self.window.maybe_wait_on_main(|w| w.enabled_buttons())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1035,6 +1092,7 @@ impl Window {
|
|||||||
/// - **Wayland:** Un-minimize is unsupported.
|
/// - **Wayland:** Un-minimize is unsupported.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_minimized(&self, minimized: bool) {
|
pub fn set_minimized(&self, minimized: bool) {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::set_minimized", minimized).entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_minimized(minimized))
|
.maybe_queue_on_main(move |w| w.set_minimized(minimized))
|
||||||
}
|
}
|
||||||
@@ -1053,6 +1111,7 @@ impl Window {
|
|||||||
/// - **iOS / Android / Web / Orbital:** Unsupported.
|
/// - **iOS / Android / Web / Orbital:** Unsupported.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn is_minimized(&self) -> Option<bool> {
|
pub fn is_minimized(&self) -> Option<bool> {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::is_minimized",).entered();
|
||||||
self.window.maybe_wait_on_main(|w| w.is_minimized())
|
self.window.maybe_wait_on_main(|w| w.is_minimized())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1063,6 +1122,7 @@ impl Window {
|
|||||||
/// - **iOS / Android / Web:** Unsupported.
|
/// - **iOS / Android / Web:** Unsupported.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_maximized(&self, maximized: bool) {
|
pub fn set_maximized(&self, maximized: bool) {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::set_maximized", maximized).entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_maximized(maximized))
|
.maybe_queue_on_main(move |w| w.set_maximized(maximized))
|
||||||
}
|
}
|
||||||
@@ -1074,6 +1134,7 @@ impl Window {
|
|||||||
/// - **iOS / Android / Web:** Unsupported.
|
/// - **iOS / Android / Web:** Unsupported.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn is_maximized(&self) -> bool {
|
pub fn is_maximized(&self) -> bool {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::is_maximized",).entered();
|
||||||
self.window.maybe_wait_on_main(|w| w.is_maximized())
|
self.window.maybe_wait_on_main(|w| w.is_maximized())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1102,6 +1163,11 @@ impl Window {
|
|||||||
/// [transient activation]: https://developer.mozilla.org/en-US/docs/Glossary/Transient_activation
|
/// [transient activation]: https://developer.mozilla.org/en-US/docs/Glossary/Transient_activation
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_fullscreen(&self, fullscreen: Option<Fullscreen>) {
|
pub fn set_fullscreen(&self, fullscreen: Option<Fullscreen>) {
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Window::set_fullscreen",
|
||||||
|
fullscreen = ?fullscreen
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_fullscreen(fullscreen.map(|f| f.into())))
|
.maybe_queue_on_main(move |w| w.set_fullscreen(fullscreen.map(|f| f.into())))
|
||||||
}
|
}
|
||||||
@@ -1116,6 +1182,7 @@ impl Window {
|
|||||||
/// - **Web:** Can only return `None` or `Borderless(None)`.
|
/// - **Web:** Can only return `None` or `Borderless(None)`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn fullscreen(&self) -> Option<Fullscreen> {
|
pub fn fullscreen(&self) -> Option<Fullscreen> {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::fullscreen",).entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_wait_on_main(|w| w.fullscreen().map(|f| f.into()))
|
.maybe_wait_on_main(|w| w.fullscreen().map(|f| f.into()))
|
||||||
}
|
}
|
||||||
@@ -1131,6 +1198,7 @@ impl Window {
|
|||||||
/// - **iOS / Android / Web:** No effect.
|
/// - **iOS / Android / Web:** No effect.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_decorations(&self, decorations: bool) {
|
pub fn set_decorations(&self, decorations: bool) {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::set_decorations", decorations).entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_decorations(decorations))
|
.maybe_queue_on_main(move |w| w.set_decorations(decorations))
|
||||||
}
|
}
|
||||||
@@ -1145,6 +1213,7 @@ impl Window {
|
|||||||
/// - **iOS / Android / Web:** Always returns `true`.
|
/// - **iOS / Android / Web:** Always returns `true`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn is_decorated(&self) -> bool {
|
pub fn is_decorated(&self) -> bool {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::is_decorated",).entered();
|
||||||
self.window.maybe_wait_on_main(|w| w.is_decorated())
|
self.window.maybe_wait_on_main(|w| w.is_decorated())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1154,6 +1223,11 @@ impl Window {
|
|||||||
///
|
///
|
||||||
/// See [`WindowLevel`] for details.
|
/// See [`WindowLevel`] for details.
|
||||||
pub fn set_window_level(&self, level: WindowLevel) {
|
pub fn set_window_level(&self, level: WindowLevel) {
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Window::set_window_level",
|
||||||
|
level = ?level
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_window_level(level))
|
.maybe_queue_on_main(move |w| w.set_window_level(level))
|
||||||
}
|
}
|
||||||
@@ -1174,6 +1248,7 @@ impl Window {
|
|||||||
/// said, it's usually in the same ballpark as on Windows.
|
/// said, it's usually in the same ballpark as on Windows.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_window_icon(&self, window_icon: Option<Icon>) {
|
pub fn set_window_icon(&self, window_icon: Option<Icon>) {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::set_window_icon",).entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_window_icon(window_icon))
|
.maybe_queue_on_main(move |w| w.set_window_icon(window_icon))
|
||||||
}
|
}
|
||||||
@@ -1216,6 +1291,12 @@ impl Window {
|
|||||||
pub fn set_ime_cursor_area<P: Into<Position>, S: Into<Size>>(&self, position: P, size: S) {
|
pub fn set_ime_cursor_area<P: Into<Position>, S: Into<Size>>(&self, position: P, size: S) {
|
||||||
let position = position.into();
|
let position = position.into();
|
||||||
let size = size.into();
|
let size = size.into();
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Window::set_ime_cursor_area",
|
||||||
|
position = ?position,
|
||||||
|
size = ?size,
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_ime_cursor_area(position, size))
|
.maybe_queue_on_main(move |w| w.set_ime_cursor_area(position, size))
|
||||||
}
|
}
|
||||||
@@ -1242,6 +1323,7 @@ impl Window {
|
|||||||
/// [`KeyboardInput`]: crate::event::WindowEvent::KeyboardInput
|
/// [`KeyboardInput`]: crate::event::WindowEvent::KeyboardInput
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_ime_allowed(&self, allowed: bool) {
|
pub fn set_ime_allowed(&self, allowed: bool) {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::set_ime_allowed", allowed).entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_ime_allowed(allowed))
|
.maybe_queue_on_main(move |w| w.set_ime_allowed(allowed))
|
||||||
}
|
}
|
||||||
@@ -1253,6 +1335,11 @@ impl Window {
|
|||||||
/// - **iOS / Android / Web / Windows / X11 / macOS / Orbital:** Unsupported.
|
/// - **iOS / Android / Web / Windows / X11 / macOS / Orbital:** Unsupported.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_ime_purpose(&self, purpose: ImePurpose) {
|
pub fn set_ime_purpose(&self, purpose: ImePurpose) {
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Window::set_ime_purpose",
|
||||||
|
purpose = ?purpose
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_ime_purpose(purpose))
|
.maybe_queue_on_main(move |w| w.set_ime_purpose(purpose))
|
||||||
}
|
}
|
||||||
@@ -1269,6 +1356,7 @@ impl Window {
|
|||||||
/// - **iOS / Android / Wayland / Orbital:** Unsupported.
|
/// - **iOS / Android / Wayland / Orbital:** Unsupported.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn focus_window(&self) {
|
pub fn focus_window(&self) {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::focus_window",).entered();
|
||||||
self.window.maybe_queue_on_main(|w| w.focus_window())
|
self.window.maybe_queue_on_main(|w| w.focus_window())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1279,6 +1367,7 @@ impl Window {
|
|||||||
/// [`WindowEvent::Focused`]: crate::event::WindowEvent::Focused
|
/// [`WindowEvent::Focused`]: crate::event::WindowEvent::Focused
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn has_focus(&self) -> bool {
|
pub fn has_focus(&self) -> bool {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::has_focus",).entered();
|
||||||
self.window.maybe_wait_on_main(|w| w.has_focus())
|
self.window.maybe_wait_on_main(|w| w.has_focus())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1297,6 +1386,11 @@ impl Window {
|
|||||||
/// - **Wayland:** Requires `xdg_activation_v1` protocol, `None` has no effect.
|
/// - **Wayland:** Requires `xdg_activation_v1` protocol, `None` has no effect.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn request_user_attention(&self, request_type: Option<UserAttentionType>) {
|
pub fn request_user_attention(&self, request_type: Option<UserAttentionType>) {
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Window::request_user_attention",
|
||||||
|
request_type = ?request_type
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.request_user_attention(request_type))
|
.maybe_queue_on_main(move |w| w.request_user_attention(request_type))
|
||||||
}
|
}
|
||||||
@@ -1312,6 +1406,11 @@ impl Window {
|
|||||||
/// - **iOS / Android / Web / Orbital:** Unsupported.
|
/// - **iOS / Android / Web / Orbital:** Unsupported.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_theme(&self, theme: Option<Theme>) {
|
pub fn set_theme(&self, theme: Option<Theme>) {
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Window::set_theme",
|
||||||
|
theme = ?theme
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
self.window.maybe_queue_on_main(move |w| w.set_theme(theme))
|
self.window.maybe_queue_on_main(move |w| w.set_theme(theme))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1323,6 +1422,7 @@ impl Window {
|
|||||||
/// - **iOS / Android / Wayland / x11 / Orbital:** Unsupported.
|
/// - **iOS / Android / Wayland / x11 / Orbital:** Unsupported.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn theme(&self) -> Option<Theme> {
|
pub fn theme(&self) -> Option<Theme> {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::theme",).entered();
|
||||||
self.window.maybe_wait_on_main(|w| w.theme())
|
self.window.maybe_wait_on_main(|w| w.theme())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1336,6 +1436,8 @@ impl Window {
|
|||||||
///
|
///
|
||||||
/// [`NSWindowSharingNone`]: https://developer.apple.com/documentation/appkit/nswindowsharingtype/nswindowsharingnone
|
/// [`NSWindowSharingNone`]: https://developer.apple.com/documentation/appkit/nswindowsharingtype/nswindowsharingnone
|
||||||
pub fn set_content_protected(&self, protected: bool) {
|
pub fn set_content_protected(&self, protected: bool) {
|
||||||
|
let _span =
|
||||||
|
tracing::debug_span!("winit::Window::set_content_protected", protected).entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_content_protected(protected))
|
.maybe_queue_on_main(move |w| w.set_content_protected(protected))
|
||||||
}
|
}
|
||||||
@@ -1347,6 +1449,7 @@ impl Window {
|
|||||||
/// - **iOS / Android / x11 / Wayland / Web:** Unsupported. Always returns an empty string.
|
/// - **iOS / Android / x11 / Wayland / Web:** Unsupported. Always returns an empty string.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn title(&self) -> String {
|
pub fn title(&self) -> String {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::title",).entered();
|
||||||
self.window.maybe_wait_on_main(|w| w.title())
|
self.window.maybe_wait_on_main(|w| w.title())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1363,6 +1466,7 @@ impl Window {
|
|||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor(&self, cursor: impl Into<Cursor>) {
|
pub fn set_cursor(&self, cursor: impl Into<Cursor>) {
|
||||||
let cursor = cursor.into();
|
let cursor = cursor.into();
|
||||||
|
let _span = tracing::debug_span!("winit::Window::set_cursor",).entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_cursor(cursor))
|
.maybe_queue_on_main(move |w| w.set_cursor(cursor))
|
||||||
}
|
}
|
||||||
@@ -1395,6 +1499,11 @@ impl Window {
|
|||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_position<P: Into<Position>>(&self, position: P) -> Result<(), ExternalError> {
|
pub fn set_cursor_position<P: Into<Position>>(&self, position: P) -> Result<(), ExternalError> {
|
||||||
let position = position.into();
|
let position = position.into();
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Window::set_cursor_position",
|
||||||
|
position = ?position
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_wait_on_main(|w| w.set_cursor_position(position))
|
.maybe_wait_on_main(|w| w.set_cursor_position(position))
|
||||||
}
|
}
|
||||||
@@ -1415,6 +1524,11 @@ impl Window {
|
|||||||
/// ```
|
/// ```
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_grab(&self, mode: CursorGrabMode) -> Result<(), ExternalError> {
|
pub fn set_cursor_grab(&self, mode: CursorGrabMode) -> Result<(), ExternalError> {
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Window::set_cursor_grab",
|
||||||
|
mode = ?mode
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
self.window.maybe_wait_on_main(|w| w.set_cursor_grab(mode))
|
self.window.maybe_wait_on_main(|w| w.set_cursor_grab(mode))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1432,6 +1546,7 @@ impl Window {
|
|||||||
/// - **iOS / Android:** Unsupported.
|
/// - **iOS / Android:** Unsupported.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_visible(&self, visible: bool) {
|
pub fn set_cursor_visible(&self, visible: bool) {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::set_cursor_visible", visible).entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.set_cursor_visible(visible))
|
.maybe_queue_on_main(move |w| w.set_cursor_visible(visible))
|
||||||
}
|
}
|
||||||
@@ -1449,6 +1564,7 @@ impl Window {
|
|||||||
/// - **iOS / Android / Web:** Always returns an [`ExternalError::NotSupported`].
|
/// - **iOS / Android / Web:** Always returns an [`ExternalError::NotSupported`].
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn drag_window(&self) -> Result<(), ExternalError> {
|
pub fn drag_window(&self) -> Result<(), ExternalError> {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::drag_window",).entered();
|
||||||
self.window.maybe_wait_on_main(|w| w.drag_window())
|
self.window.maybe_wait_on_main(|w| w.drag_window())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1463,6 +1579,11 @@ impl Window {
|
|||||||
/// - **iOS / Android / Web:** Always returns an [`ExternalError::NotSupported`].
|
/// - **iOS / Android / Web:** Always returns an [`ExternalError::NotSupported`].
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn drag_resize_window(&self, direction: ResizeDirection) -> Result<(), ExternalError> {
|
pub fn drag_resize_window(&self, direction: ResizeDirection) -> Result<(), ExternalError> {
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Window::drag_resize_window",
|
||||||
|
direction = ?direction
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_wait_on_main(|w| w.drag_resize_window(direction))
|
.maybe_wait_on_main(|w| w.drag_resize_window(direction))
|
||||||
}
|
}
|
||||||
@@ -1478,6 +1599,11 @@ impl Window {
|
|||||||
/// [window menu]: https://en.wikipedia.org/wiki/Common_menus_in_Microsoft_Windows#System_menu
|
/// [window menu]: https://en.wikipedia.org/wiki/Common_menus_in_Microsoft_Windows#System_menu
|
||||||
pub fn show_window_menu(&self, position: impl Into<Position>) {
|
pub fn show_window_menu(&self, position: impl Into<Position>) {
|
||||||
let position = position.into();
|
let position = position.into();
|
||||||
|
let _span = tracing::debug_span!(
|
||||||
|
"winit::Window::show_window_menu",
|
||||||
|
position = ?position
|
||||||
|
)
|
||||||
|
.entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_queue_on_main(move |w| w.show_window_menu(position))
|
.maybe_queue_on_main(move |w| w.show_window_menu(position))
|
||||||
}
|
}
|
||||||
@@ -1492,6 +1618,7 @@ impl Window {
|
|||||||
/// - **iOS / Android / Web / Orbital:** Always returns an [`ExternalError::NotSupported`].
|
/// - **iOS / Android / Web / Orbital:** Always returns an [`ExternalError::NotSupported`].
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_hittest(&self, hittest: bool) -> Result<(), ExternalError> {
|
pub fn set_cursor_hittest(&self, hittest: bool) -> Result<(), ExternalError> {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::set_cursor_hittest", hittest).entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_wait_on_main(|w| w.set_cursor_hittest(hittest))
|
.maybe_wait_on_main(|w| w.set_cursor_hittest(hittest))
|
||||||
}
|
}
|
||||||
@@ -1504,6 +1631,7 @@ impl Window {
|
|||||||
/// Returns `None` if current monitor can't be detected.
|
/// Returns `None` if current monitor can't be detected.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn current_monitor(&self) -> Option<MonitorHandle> {
|
pub fn current_monitor(&self) -> Option<MonitorHandle> {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::current_monitor",).entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_wait_on_main(|w| w.current_monitor().map(|inner| MonitorHandle { inner }))
|
.maybe_wait_on_main(|w| w.current_monitor().map(|inner| MonitorHandle { inner }))
|
||||||
}
|
}
|
||||||
@@ -1515,6 +1643,7 @@ impl Window {
|
|||||||
/// [`ActiveEventLoop::available_monitors`]: crate::event_loop::ActiveEventLoop::available_monitors
|
/// [`ActiveEventLoop::available_monitors`]: crate::event_loop::ActiveEventLoop::available_monitors
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn available_monitors(&self) -> impl Iterator<Item = MonitorHandle> {
|
pub fn available_monitors(&self) -> impl Iterator<Item = MonitorHandle> {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::available_monitors",).entered();
|
||||||
self.window.maybe_wait_on_main(|w| {
|
self.window.maybe_wait_on_main(|w| {
|
||||||
w.available_monitors()
|
w.available_monitors()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
@@ -1535,6 +1664,7 @@ impl Window {
|
|||||||
/// [`ActiveEventLoop::primary_monitor`]: crate::event_loop::ActiveEventLoop::primary_monitor
|
/// [`ActiveEventLoop::primary_monitor`]: crate::event_loop::ActiveEventLoop::primary_monitor
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn primary_monitor(&self) -> Option<MonitorHandle> {
|
pub fn primary_monitor(&self) -> Option<MonitorHandle> {
|
||||||
|
let _span = tracing::debug_span!("winit::Window::primary_monitor",).entered();
|
||||||
self.window
|
self.window
|
||||||
.maybe_wait_on_main(|w| w.primary_monitor().map(|inner| MonitorHandle { inner }))
|
.maybe_wait_on_main(|w| w.primary_monitor().map(|inner| MonitorHandle { inner }))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user