├── rustfmt.toml ├── .gitignore ├── .cargo └── config.toml ├── rust-toolchain.toml ├── run-wasm ├── src │ └── main.rs └── Cargo.toml ├── src ├── lib.rs ├── current_input.rs └── winit_input_helper.rs ├── Cargo.toml ├── license.txt ├── .github └── workflows │ ├── testing.yml │ └── nightly_deps_check.yml ├── examples ├── simple.rs └── example.rs ├── changelog.md ├── readme.md └── Cargo.lock /rustfmt.toml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | **/*.rs.bk 3 | -------------------------------------------------------------------------------- /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [alias] 2 | run-wasm = ["run", "--release", "--package", "run-wasm", "--"] 3 | -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "1.82" 3 | components = [ "rustfmt", "clippy" ] 4 | -------------------------------------------------------------------------------- /run-wasm/src/main.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | cargo_run_wasm::run_wasm_cli_with_css("body { margin: 0px; }"); 3 | } 4 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | mod current_input; 2 | mod winit_input_helper; 3 | 4 | pub use crate::winit_input_helper::WinitInputHelper; 5 | -------------------------------------------------------------------------------- /run-wasm/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "run-wasm" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | cargo-run-wasm = "0.4.0" 10 | wasm-bindgen = "=0.2.100" # latest release is busted with cryptic linking error 11 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "winit_input_helper" 3 | repository = "https://github.com/rukai/winit_input_helper" 4 | version = "0.17.0" 5 | edition = "2021" 6 | authors = ["Rukai "] 7 | license = "MIT" 8 | description = "Processes winit events, allowing input state to be queried at any time." 9 | keywords = ["winit", "input", "helper", "state", "cache"] 10 | categories = ["game-engines", "os", "gui"] 11 | 12 | [dependencies] 13 | winit = { version = "0.30", default-features = false } 14 | web-time = "1.0" 15 | 16 | [dev-dependencies] 17 | winit = { version = "0.30" } 18 | log = "0.4" 19 | console_log = "1.0" 20 | console_error_panic_hook = "0.1" 21 | env_logger = "0.11" 22 | 23 | [package.metadata.docs.rs] 24 | features = ["winit/default"] 25 | 26 | [workspace] 27 | members = [ 28 | "run-wasm", 29 | ] 30 | -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 Lucas Kent 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | 11 | 12 | -------------------------------------------------------------------------------- /.github/workflows/testing.yml: -------------------------------------------------------------------------------- 1 | name: Testing 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | # Cancel already running jobs 10 | concurrency: 11 | group: testing_${{ github.head_ref }} 12 | cancel-in-progress: true 13 | 14 | env: 15 | CARGO_TERM_COLOR: always 16 | 17 | jobs: 18 | build: 19 | strategy: 20 | matrix: 21 | include: 22 | - name: Release 23 | cargo_profile: --release 24 | - name: Debug 25 | cargo_profile: 26 | name: ${{ matrix.name }} 27 | runs-on: ubuntu-latest 28 | steps: 29 | - uses: actions/checkout@v4 30 | - uses: Swatinem/rust-cache@v2 31 | with: 32 | # rust-cache already handles all the sane defaults for caching rust builds. 33 | # However because we are running seperate debug/release builds in parallel, 34 | # we also need to add Debug or Release to the key so that a seperate cache is used. 35 | # Otherwise only the last build to finish would get saved to the cache. 36 | key: ${{ matrix.name }} 37 | - name: Install cargo-hack 38 | uses: taiki-e/install-action@v2 39 | with: 40 | tool: cargo-hack@0.6.22 41 | - name: Check `cargo fmt` was run 42 | run: cargo fmt --all -- --check 43 | # If your library does not support running under every possible combination of features, 44 | # consider using cargo `hack --each-feature` or some other combination of arguments as described at https://github.com/taiki-e/cargo-hack 45 | - name: Ensure that the library and all examples compile and have no warnings under every possible combination of features 46 | # some things to explicitly point out: 47 | # * clippy also reports rustc warnings and errors 48 | # * clippy --all-targets causes clippy to run against tests and examples which it doesnt do by default. 49 | run: cargo hack --feature-powerset clippy --all-targets --locked ${{ matrix.cargo_profile }} -- -D warnings 50 | - name: Ensure that tests pass under every possible combination of features 51 | run: cargo hack --feature-powerset test ${{ matrix.cargo_profile }} 52 | - name: Ensure that tests did not create or modify any files that arent .gitignore'd 53 | # This is important because we are checking in the Cargo.lock file. 54 | # We want to fail CI if the Cargo.toml changed without including the corresponding Cargo.lock changes. 55 | # Its also just generally nice to ensure your tests dont leave around unexpected files. 56 | shell: bash 57 | run: | 58 | if [ -n "$(git status --porcelain)" ]; then 59 | git status 60 | exit 1 61 | fi 62 | -------------------------------------------------------------------------------- /.github/workflows/nightly_deps_check.yml: -------------------------------------------------------------------------------- 1 | # Runs `cargo update` and then reports build failures in a GitHub issue titled "Nightly deps check failed" 2 | # If an open issue with the same title already exists then another issue is not created. 3 | 4 | name: Nightly Deps Check 5 | 6 | on: 7 | # Allows the workflow to be manually triggered from the github UI. 8 | workflow_dispatch: {} 9 | # Run once per day at 00:00 UTC 10 | schedule: 11 | - cron: '0 0 * * *' 12 | 13 | env: 14 | CARGO_TERM_COLOR: always 15 | 16 | jobs: 17 | build: 18 | strategy: 19 | matrix: 20 | include: 21 | - name: Release 22 | cargo_profile: --release 23 | - name: Debug 24 | cargo_profile: 25 | name: ${{ matrix.name }} 26 | runs-on: ubuntu-latest 27 | steps: 28 | - uses: actions/checkout@v4 29 | - uses: Swatinem/rust-cache@v2 30 | with: 31 | # rust-cache already handles all the sane defaults for caching rust builds. 32 | # However because we are running seperate debug/release builds in parallel, 33 | # we also need to add Debug or Release to the key so that a seperate cache is used. 34 | # Otherwise only the last build to finish would get saved to the cache. 35 | key: ${{ matrix.name }} 36 | - name: Install cargo-hack 37 | run: cargo install cargo-hack --version 0.6.22 38 | - name: cargo update` 39 | run: cargo update 40 | - name: Check `cargo fmt` was run 41 | run: cargo fmt --all -- --check 42 | # If your library does not support running under every possible combination of features, 43 | # consider using cargo `hack --each-feature` or some other combination of arguments as described at https://github.com/taiki-e/cargo-hack 44 | - name: Ensure that the library and all examples compile and have no warnings under every possible combination of features in {{ matrix.cargo_profile }} profile 45 | # some things to explicitly point out: 46 | # * clippy also reports rustc warnings and errors 47 | # * clippy --all-targets causes clippy to run against tests and examples which it doesnt do by default. 48 | run: cargo hack --feature-powerset clippy --all-targets --locked ${{ matrix.cargo_profile }} -- -D warnings 49 | - name: Ensure that tests pass under every possible combination of features in ${{ matrix.cargo_profile }} profile 50 | run: cargo test ${{ matrix.cargo_profile }} 51 | - uses: JasonEtco/create-an-issue@v2 52 | if: ${{ failure() }} 53 | env: 54 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 55 | NIGHTLY_DEPS_WORKFLOW_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} 56 | with: 57 | update_existing: true 58 | filename: .github/NIGHTLY_DEPS_ISSUE_TEMPLATE.md 59 | -------------------------------------------------------------------------------- /examples/simple.rs: -------------------------------------------------------------------------------- 1 | //! The simplest example, supporting only desktop applications. 2 | 3 | use winit::application::ApplicationHandler; 4 | use winit::event::{DeviceEvent, DeviceId, StartCause, WindowEvent}; 5 | use winit::event_loop::{ActiveEventLoop, ControlFlow, EventLoop}; 6 | use winit::keyboard::KeyCode; 7 | use winit::window::{Window, WindowId}; 8 | use winit_input_helper::WinitInputHelper; 9 | 10 | struct App { 11 | window: Option, 12 | input: WinitInputHelper, 13 | } 14 | 15 | impl ApplicationHandler for App { 16 | fn window_event(&mut self, _: &ActiveEventLoop, _: WindowId, event: WindowEvent) { 17 | // Pass every event to the WinitInputHelper. 18 | // It will return true if it receives a RequestedRedraw event: you should then render. 19 | if self.input.process_window_event(&event) { 20 | // render(); 21 | 22 | // If you want to render every frame, remember to call window.request_redraw() in ApplicationHandler.about_to_wait(). 23 | } 24 | } 25 | 26 | fn device_event(&mut self, _: &ActiveEventLoop, _: DeviceId, event: DeviceEvent) { 27 | self.input.process_device_event(&event); 28 | } 29 | 30 | fn about_to_wait(&mut self, event_loop: &ActiveEventLoop) { 31 | self.input.end_step(); 32 | 33 | // We do not call window.request_redraw() here because we have nothing to render anyways 34 | 35 | if self.input.key_released(KeyCode::KeyQ) 36 | || self.input.close_requested() 37 | || self.input.destroyed() 38 | { 39 | println!("The application was requsted to close or the 'Q' key was pressed, quiting the application"); 40 | event_loop.exit(); 41 | return; 42 | } 43 | 44 | if self.input.key_pressed(KeyCode::KeyW) { 45 | println!("The 'W' key (US layout) was pressed on the keyboard"); 46 | } 47 | } 48 | 49 | fn new_events(&mut self, _: &ActiveEventLoop, _: StartCause) { 50 | self.input.step(); 51 | } 52 | 53 | fn resumed(&mut self, event_loop: &ActiveEventLoop) { 54 | if self.window.is_none() { 55 | self.window = Some( 56 | event_loop 57 | .create_window(Window::default_attributes()) 58 | .unwrap(), 59 | ); 60 | } 61 | } 62 | } 63 | 64 | fn main() { 65 | // Create an event loop, initialize the app, and run it 66 | // Immediately, .resume() will be called 67 | // Then, every window event will trigger a .window_event() call 68 | // We set the control flow to "Poll" so that a .window_event() call is triggered 69 | // periodically even if there is no input, so that our app can continue to update 70 | let event_loop = EventLoop::new().unwrap(); 71 | event_loop.set_control_flow(ControlFlow::Poll); 72 | event_loop 73 | .run_app(&mut App { 74 | input: WinitInputHelper::new(), 75 | window: None, 76 | }) 77 | .unwrap(); 78 | } 79 | -------------------------------------------------------------------------------- /changelog.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | This changelog is written with the goal of helping you through breaking changes rather than being a complete documentation of every change in the release. 4 | 5 | ## 0.17 6 | 7 | ### Upgraded to winit 0.30 8 | 9 | Winit 0.30 overhauled the event loop -- now everything occurs through the [ApplicationHandler](https://docs.rs/winit/latest/winit/application/trait.ApplicationHandler.html). 10 | Now rather than simply calling `WinitInputHandler.update()`, you have to call 4 different functions: `.process_window_event()`, `.process_device_event()`, `.step()`, and `.end_step()`, each in the corresponding function within ApplicationHandler. 11 | 12 | The recommendations this crate gives about where to render and run your application logic have also been updated to match new guidance. 13 | As `update()` has been removed, it no longer returns true when you should run application logic. Instead, run your application logic _after_ calling .`process_about_to_wait()` in `ApplicationHandler::about_to_wait()`. 14 | Run rendering code in `ApplicationHandler::window_event()` only when `.process_window_event()` returns true, indicating it received a `RequestedRedraw` event. It doesn't care about which window was requested to be redrawn, but if you do, you'll have to handle it yourself. If you want to render every frame, remember to call `Window::request_redraw()` in `ApplicationHandler::about_to_wait()` every time. 15 | 16 | ## `step_with_window_events` removed 17 | 18 | It seemed kind of broken since it doesnt process device events. 19 | And winit 0.30 makes this issue even worse. 20 | Something similar could be reintroduced in the future with more thought put into it. 21 | 22 | ## 0.16 23 | 24 | * `WinitInputHelper::quit` is removed, instead use `input.close_requested() || input.destroyed()` for an equivalent check 25 | * Mouse APIs now use instead of a usize 26 | * `WinitInputHeler::text` now returns instead of the now deleted `TextChar` type 27 | 28 | ## 0.15 29 | 30 | Upgraded to winit 0.29. 31 | Winit 0.29 completely overhauled its keyboard API, which meant that I had to also overhaul our keyboard API. 32 | 33 | Previously winit_input_helper favored logical keys over physical keys (previously called scancodes). 34 | But this was a mistake, driven by winit's poor support for physical keys and mistaken simplification of logical keys. 35 | Winit has now fixed these mistakes and as a result winit_input_helper is now swapping to favor physical keys. 36 | 37 | A direct translation of the previous API to the new API: 38 | 39 | ```rust 40 | 41 | // old 42 | input.key_pressed_scancode(17); // US scan code for W 43 | // new 44 | input.key_presed(winit::keyboard::KeyCode::KeyW); 45 | 46 | // old 47 | input.key_pressed(winit::event::VirtualKeyCode::KeyW); 48 | // new 49 | input.key_presed_logical(winit::keyboard::Key::Character("w")); // WARNING: this likely wont actually do what you want, this will never return true while shift is held since that is considered as `W` instead of `w` 50 | 51 | // ... other keyboard methods follow the same pattern 52 | ``` 53 | 54 | However, I actually suggest you move to physical keys: 55 | 56 | ```rust 57 | // old 58 | input.key_pressed_scancode(17); // US scan code for W 59 | // new 60 | input.key_presed(winit::keyboard::KeyCode::KeyW); 61 | 62 | // old 63 | input.key_pressed(winit::event::VirtualKeyCode::W); 64 | // new 65 | input.key_presed(winit::keyboard::KeyCode::KeyW); 66 | ``` 67 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Winit Input Helper 2 | 3 | [![Crates.io](https://img.shields.io/crates/v/winit_input_helper.svg)](https://crates.io/crates/winit_input_helper) 4 | [![Docs](https://docs.rs/winit_input_helper/badge.svg)](https://docs.rs/winit_input_helper) 5 | 6 | Processes and stores winit events, allowing input state to be queried at any time. 7 | 8 | ## How to use 9 | 10 | Each event is passed to the `WinitInputHelper` via the `update` method. 11 | 12 | The current input state can then be accessed via methods such as `key_pressed`, `key_released`, `key_held`, `mouse`, `mouse_diff` etc. 13 | 14 | To see all available methods look at [docs.rs](https://docs.rs/winit_input_helper) 15 | 16 | ```rust 17 | use winit::application::ApplicationHandler; 18 | use winit::event::{DeviceEvent, DeviceId, StartCause, WindowEvent}; 19 | use winit::event_loop::{ActiveEventLoop, ControlFlow, EventLoop}; 20 | use winit::keyboard::KeyCode; 21 | use winit::window::{Window, WindowId}; 22 | use winit_input_helper::WinitInputHelper; 23 | 24 | struct App { 25 | window: Option, 26 | input: WinitInputHelper, 27 | } 28 | 29 | impl ApplicationHandler for App { 30 | fn window_event(&mut self, _: &ActiveEventLoop, _: WindowId, event: WindowEvent) { 31 | // Pass every event to the WinitInputHelper. 32 | // It will return true if you should render. 33 | if self.input.process_window_event(&event) { 34 | // render(); 35 | 36 | // If you want to render every frame, remember to call window.request_redraw() in ApplicationHandler.about_to_wait(). 37 | } 38 | } 39 | 40 | fn device_event(&mut self, _: &ActiveEventLoop, _: DeviceId, event: DeviceEvent) { 41 | // pass in events 42 | self.input.process_device_event(&event); 43 | } 44 | 45 | fn about_to_wait(&mut self, event_loop: &ActiveEventLoop) { 46 | self.input.end_step(); 47 | 48 | if self.input.key_released(KeyCode::KeyQ) 49 | || self.input.close_requested() 50 | || self.input.destroyed() 51 | { 52 | println!("The application was requsted to close or the 'Q' key was pressed, quiting the application"); 53 | event_loop.exit(); 54 | return; 55 | } 56 | 57 | if self.input.key_pressed(KeyCode::KeyW) { 58 | println!("The 'W' key (US layout) was pressed on the keyboard"); 59 | } 60 | } 61 | 62 | fn new_events(&mut self, _: &ActiveEventLoop, _: StartCause) { 63 | self.input.step(); 64 | } 65 | 66 | fn resumed(&mut self, event_loop: &ActiveEventLoop) { 67 | if self.window.is_none() { 68 | self.window = Some( 69 | event_loop 70 | .create_window(Window::default_attributes()) 71 | .unwrap(), 72 | ); 73 | } 74 | } 75 | 76 | } 77 | 78 | fn main() { 79 | let event_loop = EventLoop::new().unwrap(); 80 | event_loop.set_control_flow(ControlFlow::Poll); 81 | event_loop 82 | .run_app(&mut App { 83 | input: WinitInputHelper::new(), 84 | window: None, 85 | }) 86 | .unwrap(); 87 | } 88 | 89 | ``` 90 | 91 | ## Examples 92 | 93 | * To run example natively, run `cargo run --example example` 94 | * To run example in wasm, run `cargo run-wasm --example example` 95 | 96 | ## Publishing a new version 97 | 98 | In order to avoid forcing the user to enable the default winit backends, winit_input_helper sets its winit dependency to `default-features = false`. 99 | This complicates the publishing procedure a little because winit cannot compile without any backends enabled. 100 | 101 | So to publish we run: `cargo publish --features winit/default` 102 | -------------------------------------------------------------------------------- /src/current_input.rs: -------------------------------------------------------------------------------- 1 | use winit::event::{DeviceEvent, ElementState, MouseButton, MouseScrollDelta, WindowEvent}; 2 | use winit::keyboard::{Key, PhysicalKey}; 3 | 4 | #[derive(Clone)] 5 | pub struct CurrentInput { 6 | pub mouse_actions: Vec, 7 | pub key_actions: Vec, 8 | pub scancode_actions: Vec, 9 | pub key_held: Vec, 10 | pub scancode_held: Vec, // some scan codes are higher than 255 so using an array may be dangerous 11 | pub mouse_held: [bool; 255], 12 | pub cursor_point: Option<(f32, f32)>, 13 | pub cursor_point_prev: Option<(f32, f32)>, 14 | pub mouse_diff: Option<(f32, f32)>, 15 | pub y_scroll_diff: f32, 16 | pub x_scroll_diff: f32, 17 | pub text: Vec, 18 | } 19 | 20 | impl CurrentInput { 21 | pub fn new() -> CurrentInput { 22 | CurrentInput { 23 | mouse_actions: vec![], 24 | key_actions: vec![], 25 | scancode_actions: vec![], 26 | key_held: vec![], 27 | scancode_held: vec![], 28 | mouse_held: [false; 255], 29 | cursor_point: None, 30 | cursor_point_prev: None, 31 | mouse_diff: None, 32 | y_scroll_diff: 0.0, 33 | x_scroll_diff: 0.0, 34 | text: vec![], 35 | } 36 | } 37 | 38 | pub fn step(&mut self) { 39 | self.mouse_actions.clear(); 40 | self.key_actions.clear(); 41 | self.scancode_actions.clear(); 42 | self.cursor_point_prev = self.cursor_point; 43 | self.mouse_diff = None; 44 | self.y_scroll_diff = 0.0; 45 | self.x_scroll_diff = 0.0; 46 | self.text.clear(); 47 | } 48 | 49 | pub fn handle_event(&mut self, event: &WindowEvent) { 50 | match event { 51 | WindowEvent::KeyboardInput { event, .. } => match event.state { 52 | ElementState::Pressed => { 53 | let logical_key = &event.logical_key; 54 | if !self.key_held.contains(logical_key) { 55 | self.key_actions 56 | .push(KeyAction::Pressed(logical_key.clone())); 57 | } 58 | 59 | self.key_held.push(logical_key.clone()); 60 | self.key_actions 61 | .push(KeyAction::PressedOs(logical_key.clone())); 62 | self.text.push(logical_key.clone()); 63 | 64 | let physical_key = &event.physical_key; 65 | if !self.scancode_held.contains(physical_key) { 66 | self.scancode_actions 67 | .push(ScanCodeAction::Pressed(*physical_key)); 68 | self.scancode_held.push(*physical_key); 69 | } 70 | 71 | self.scancode_actions 72 | .push(ScanCodeAction::PressedOs(*physical_key)); 73 | } 74 | ElementState::Released => { 75 | let logical_key = &event.logical_key; 76 | self.key_held.retain(|x| x != logical_key); 77 | self.key_actions 78 | .push(KeyAction::Released(logical_key.clone())); 79 | 80 | let physical_key = &event.physical_key; 81 | self.scancode_held.retain(|x| x != physical_key); 82 | self.scancode_actions 83 | .push(ScanCodeAction::Released(*physical_key)); 84 | } 85 | }, 86 | WindowEvent::CursorMoved { position, .. } => { 87 | self.cursor_point = Some((position.x as f32, position.y as f32)); 88 | } 89 | WindowEvent::MouseInput { 90 | state: ElementState::Pressed, 91 | button, 92 | .. 93 | } => { 94 | let button_usize = mouse_button_to_int(button); 95 | self.mouse_held[button_usize] = true; 96 | self.mouse_actions.push(MouseAction::Pressed(*button)); 97 | } 98 | WindowEvent::MouseInput { 99 | state: ElementState::Released, 100 | button, 101 | .. 102 | } => { 103 | let button_usize = mouse_button_to_int(button); 104 | self.mouse_held[button_usize] = false; 105 | self.mouse_actions.push(MouseAction::Released(*button)); 106 | } 107 | WindowEvent::MouseWheel { delta, .. } => { 108 | // I just took this from three-rs, no idea why this magic number was chosen ¯\_(ツ)_/¯ 109 | const PIXELS_PER_LINE: f64 = 38.0; 110 | 111 | match delta { 112 | MouseScrollDelta::LineDelta(x, y) => { 113 | self.x_scroll_diff += x; 114 | self.y_scroll_diff += y; 115 | } 116 | MouseScrollDelta::PixelDelta(delta) => { 117 | self.y_scroll_diff += (delta.y / PIXELS_PER_LINE) as f32; 118 | self.x_scroll_diff += (delta.x / PIXELS_PER_LINE) as f32; 119 | } 120 | } 121 | } 122 | _ => {} 123 | } 124 | } 125 | 126 | pub fn handle_device_event(&mut self, event: &DeviceEvent) { 127 | if let DeviceEvent::MouseMotion { delta, .. } = event { 128 | match self.mouse_diff { 129 | Some((x, y)) => self.mouse_diff = Some((x + delta.0 as f32, y + delta.1 as f32)), 130 | None => self.mouse_diff = Some((delta.0 as f32, delta.1 as f32)), 131 | } 132 | } 133 | } 134 | } 135 | 136 | #[derive(Clone)] 137 | pub enum KeyAction { 138 | Pressed(Key), 139 | PressedOs(Key), 140 | Released(Key), 141 | } 142 | 143 | #[derive(Clone, PartialEq)] 144 | pub enum ScanCodeAction { 145 | Pressed(PhysicalKey), 146 | PressedOs(PhysicalKey), 147 | Released(PhysicalKey), 148 | } 149 | 150 | #[derive(Clone)] 151 | pub enum MouseAction { 152 | Pressed(MouseButton), 153 | Released(MouseButton), 154 | } 155 | 156 | pub fn mouse_button_to_int(button: &MouseButton) -> usize { 157 | match button { 158 | MouseButton::Left => 0, 159 | MouseButton::Right => 1, 160 | MouseButton::Middle => 2, 161 | MouseButton::Back => 3, 162 | MouseButton::Forward => 4, 163 | MouseButton::Other(byte) => 5 + *byte as usize, 164 | } 165 | } 166 | -------------------------------------------------------------------------------- /examples/example.rs: -------------------------------------------------------------------------------- 1 | //! A complex example demonstrating use of every API feature, runs on both desktop and web. 2 | //! To run on desktop: `cargo run --example example` 3 | //! To run on web: `cargo run-wasm --example example` 4 | use winit::application::ApplicationHandler; 5 | use winit::event::{DeviceEvent, DeviceId, MouseButton, StartCause, WindowEvent}; 6 | use winit::event_loop::{ActiveEventLoop, ControlFlow, EventLoop}; 7 | use winit::keyboard::{Key, KeyCode}; 8 | use winit::window::{Window, WindowId}; 9 | use winit_input_helper::WinitInputHelper; 10 | 11 | struct App { 12 | input: WinitInputHelper, 13 | window: Option, 14 | } 15 | 16 | impl ApplicationHandler for App { 17 | fn resumed(&mut self, event_loop: &ActiveEventLoop) { 18 | // This method is called when the app is resumed, including when it 19 | // is first started. If we do not have a window, we have to create one. 20 | if self.window.is_none() { 21 | self.window = Some(platform::create_window(event_loop)); 22 | } 23 | } 24 | 25 | fn window_event(&mut self, _: &ActiveEventLoop, _: WindowId, event: WindowEvent) { 26 | // Pass every event to the WinitInputHelper. 27 | // It will return true if it receives a RequestedRedraw event: you should then render. 28 | if self.input.process_window_event(&event) { 29 | // render(); 30 | 31 | // If you want to render every frame, remember to call window.request_redraw() in ApplicationHandler.about_to_wait(). 32 | } 33 | } 34 | 35 | fn device_event(&mut self, _: &ActiveEventLoop, _: DeviceId, event: DeviceEvent) { 36 | self.input.process_device_event(&event); 37 | } 38 | 39 | fn about_to_wait(&mut self, event_loop: &ActiveEventLoop) { 40 | self.input.end_step(); 41 | 42 | // AFTER calling process_about_to_wait(), run your application logic here. 43 | // We do not call window.request_redraw() here because we have nothing to render anyways 44 | 45 | if self.input.key_released(KeyCode::KeyQ) 46 | || self.input.close_requested() 47 | || self.input.destroyed() 48 | { 49 | log::info!("The application was requsted to close or the 'Q' key was pressed, quiting the application"); 50 | event_loop.exit(); 51 | return; 52 | } 53 | 54 | // If you are taking input for a game or similar you should use physical keys. 55 | 56 | if self.input.key_pressed(KeyCode::KeyW) { 57 | log::info!("The 'W' key (US layout) was pressed on the keyboard"); 58 | } 59 | 60 | if self.input.key_pressed_os(KeyCode::KeyE) { 61 | log::info!("The 'E' key (US layout) was pressed on the keyboard (Os Repeating)"); 62 | } 63 | 64 | if self.input.key_held(KeyCode::KeyR) { 65 | log::info!("The 'R' key (US layout) is held"); 66 | } 67 | 68 | // Logical keys are usually used for text input and rarely make sense in the way they are presented in this API. 69 | 70 | if self.input.key_pressed_logical(Key::Character("a")) { 71 | log::info!("'a' was input by the keyboard"); 72 | } 73 | 74 | if self.input.key_pressed_logical(Key::Character("A")) { 75 | log::info!("'A' was input by the keyboard (detected seperately to 'a')"); 76 | } 77 | 78 | if self.input.key_pressed_os_logical(Key::Character("s")) { 79 | log::info!("'s' was input by the keyboard (OS repeating)"); 80 | } 81 | 82 | if self.input.key_held_logical(Key::Character("d")) { 83 | log::info!("`d` input is held on the keyboard"); 84 | } 85 | 86 | // query the change in cursor this update 87 | let cursor_diff = self.input.cursor_diff(); 88 | if cursor_diff != (0.0, 0.0) { 89 | log::info!("The cursor diff is: {:?}", cursor_diff); 90 | log::info!("The cursor position is: {:?}", self.input.cursor()); 91 | } 92 | 93 | // query the change in mouse this update (useful for first person camera controls) 94 | let mouse_diff = self.input.mouse_diff(); 95 | if mouse_diff != (0.0, 0.0) { 96 | log::info!("The mouse diff is: {:?}", mouse_diff); 97 | } 98 | 99 | let scroll_diff = self.input.scroll_diff(); 100 | if scroll_diff != (0.0, 0.0) { 101 | log::info!("The scroll diff is: {:?}", scroll_diff); 102 | } 103 | 104 | for button in [MouseButton::Left, MouseButton::Right, MouseButton::Middle] { 105 | if self.input.mouse_pressed(button) { 106 | log::info!("The {:?} mouse button was pressed", button); 107 | } 108 | 109 | if self.input.mouse_held(button) { 110 | log::info!("The {:?} mouse button is being held", button); 111 | } 112 | 113 | if self.input.mouse_released(button) { 114 | log::info!("The {:?} mouse button was released", button); 115 | } 116 | } 117 | } 118 | 119 | fn new_events(&mut self, _: &ActiveEventLoop, _: StartCause) { 120 | self.input.step(); 121 | } 122 | } 123 | 124 | fn main() { 125 | platform::init(); 126 | 127 | // Create the event loop; the window will be created inside App when ApplicationHandler.resumed() is called. 128 | // We set ControlFlow to Poll because we want to print continuously in some cases. 129 | let event_loop = EventLoop::new().unwrap(); 130 | event_loop.set_control_flow(ControlFlow::Poll); 131 | 132 | // Run the app 133 | event_loop 134 | .run_app(&mut App { 135 | input: WinitInputHelper::new(), 136 | window: None, 137 | }) 138 | .unwrap(); 139 | } 140 | 141 | #[cfg(target_arch = "wasm32")] 142 | mod platform { 143 | use winit::event_loop::ActiveEventLoop; 144 | use winit::platform::web::WindowAttributesExtWebSys; 145 | use winit::platform::web::WindowExtWebSys; 146 | use winit::window::Window; 147 | 148 | pub fn create_window(event_loop: &ActiveEventLoop) -> Window { 149 | let window_attrs = Window::default_attributes().with_append(true); 150 | let window = event_loop.create_window(window_attrs).unwrap(); 151 | 152 | // Set a background color for the canvas to make it easier to tell the where the canvas is for debugging purposes. 153 | let canvas = window.canvas().unwrap(); 154 | canvas.style().set_css_text( 155 | "display: block; background-color: crimson; margin: auto; width: 50%; aspect-ratio: 4 / 2;", 156 | ); 157 | window 158 | } 159 | 160 | pub fn init() { 161 | std::panic::set_hook(Box::new(console_error_panic_hook::hook)); 162 | console_log::init_with_level(log::Level::Info).expect("could not initialize logger"); 163 | } 164 | } 165 | 166 | #[cfg(not(target_arch = "wasm32"))] 167 | mod platform { 168 | use winit::event_loop::ActiveEventLoop; 169 | use winit::window::Window; 170 | 171 | pub fn create_window(event_loop: &ActiveEventLoop) -> Window { 172 | event_loop 173 | .create_window(Window::default_attributes()) 174 | .unwrap() 175 | } 176 | 177 | pub fn init() { 178 | env_logger::init_from_env(env_logger::Env::default().filter_or("RUST_LOG", "info")); 179 | } 180 | } 181 | -------------------------------------------------------------------------------- /src/winit_input_helper.rs: -------------------------------------------------------------------------------- 1 | use winit::dpi::PhysicalSize; 2 | use winit::event::{DeviceEvent, MouseButton, WindowEvent}; 3 | use winit::keyboard::{Key, KeyCode, PhysicalKey}; 4 | 5 | use crate::current_input::{ 6 | mouse_button_to_int, CurrentInput, KeyAction, MouseAction, ScanCodeAction, 7 | }; 8 | use std::{path::PathBuf, time::Duration}; 9 | use web_time::Instant; 10 | /// The main struct of the API. 11 | /// 12 | /// Create with `WinitInputHelper::new`. 13 | /// * Call `WinitInputHelper::process_window_event()` for every window event you recieve in ApplicationHandler.window_event() 14 | /// * Call `WinitInputHelper::process_device_event()` every time ApplicationHandler.device_event() is called. 15 | /// * Call `WinitInputHelper::step()` every time ApplicationHandler.new_events() is called. 16 | /// * Call `WinitInputHelper::end_step()` every time ApplicationHandler.about_to_wait() is called. 17 | /// 18 | /// It is crucial that you call all of these functions every time they are required to be called: 19 | /// 20 | /// * failing to call `new_events()` or `about_to_wait()` will break the separation between frames 21 | /// * failing to call device_event() will prevent mouse motion from being detected in some cases. 22 | /// 23 | /// `WinitInputHelper::process_window_event()` returning true indicates a RequestedRedraw event was received, and that you should render. 24 | /// 25 | /// You should be running your application logic only in `ApplicationHandler.about_to_wait()`, calling any of the accessor methods you need. 26 | /// All the window events should have been registered beforehand by calls of `WinitInputHelper::process_window_event()`. 27 | #[derive(Clone)] 28 | pub struct WinitInputHelper { 29 | current: Option, 30 | dropped_file: Option, 31 | window_resized: Option>, 32 | window_size: Option<(u32, u32)>, 33 | scale_factor_changed: Option, 34 | scale_factor: Option, 35 | destroyed: bool, 36 | close_requested: bool, 37 | step_start: Option, 38 | step_duration: Option, 39 | } 40 | 41 | impl Default for WinitInputHelper { 42 | fn default() -> Self { 43 | Self::new() 44 | } 45 | } 46 | 47 | impl WinitInputHelper { 48 | pub fn new() -> WinitInputHelper { 49 | WinitInputHelper { 50 | current: Some(CurrentInput::new()), 51 | dropped_file: None, 52 | window_resized: None, 53 | window_size: None, 54 | scale_factor_changed: None, 55 | scale_factor: None, 56 | destroyed: false, 57 | close_requested: false, 58 | step_start: None, 59 | step_duration: None, 60 | } 61 | } 62 | 63 | /// Call every time ApplicationHandler.new_events() is called. 64 | /// Clears all internal state. 65 | pub fn step(&mut self) { 66 | self.dropped_file = None; 67 | self.window_resized = None; 68 | self.scale_factor_changed = None; 69 | self.close_requested = false; 70 | // Set the start time on the first event to avoid the first step appearing too long 71 | self.step_start.get_or_insert(Instant::now()); 72 | self.step_duration = None; 73 | if let Some(current) = &mut self.current { 74 | current.step(); 75 | } 76 | } 77 | 78 | /// Call every time ApplicationHandler.window_event() is called. 79 | /// Updates internal state, this will affect the result of accessor methods immediately. 80 | /// You should render your application only when this function returns true, which is exactly and only when a RedrawRequested event is received. 81 | /// If you want to render every frame, call window.request_redraw() on the relevant window every time ApplicationHandler.about_to_wait() is called. 82 | /// For more information on when to render, see Window::request_redraw() in the winit docs. 83 | /// It is important to note that this method does not care which window the RedrawRequested event comes from (i.e. the WindowId). If you want to only redraw the window that was requested to be redrawn, you should check for RedrawRequested events yourself. 84 | pub fn process_window_event(&mut self, event: &WindowEvent) -> bool { 85 | let mut received_redraw_request = false; 86 | 87 | match event { 88 | WindowEvent::CloseRequested => self.close_requested = true, 89 | WindowEvent::Destroyed => self.destroyed = true, 90 | WindowEvent::Focused(false) => self.current = None, 91 | WindowEvent::Focused(true) => { 92 | if self.current.is_none() { 93 | self.current = Some(CurrentInput::new()) 94 | } 95 | } 96 | WindowEvent::DroppedFile(path) => self.dropped_file = Some(path.clone()), 97 | WindowEvent::Resized(size) => { 98 | self.window_resized = Some(*size); 99 | self.window_size = Some((*size).into()); 100 | } 101 | WindowEvent::ScaleFactorChanged { scale_factor, .. } => { 102 | self.scale_factor_changed = Some(*scale_factor); 103 | self.scale_factor = Some(*scale_factor); 104 | } 105 | WindowEvent::RedrawRequested => { 106 | received_redraw_request = true; 107 | } 108 | _ => {} 109 | } 110 | if let Some(current) = &mut self.current { 111 | current.handle_event(event); 112 | } 113 | received_redraw_request 114 | } 115 | 116 | /// Call every time ApplicationHandler.device_event() is called. 117 | /// Updates value of `mouse_diff()`. 118 | pub fn process_device_event(&mut self, event: &DeviceEvent) { 119 | if let Some(ref mut current) = self.current { 120 | current.handle_device_event(event); 121 | } 122 | } 123 | 124 | // Call every time ApplicationHandler.about_to_wait() is called. 125 | // Update your application logic _after_ you call this function. 126 | pub fn end_step(&mut self) { 127 | self.step_duration = self.step_start.map(|start| start.elapsed()); 128 | self.step_start = Some(Instant::now()); 129 | } 130 | 131 | /// Returns true when the key with the specified keycode goes from "not pressed" to "pressed". 132 | /// Otherwise returns false. 133 | /// 134 | /// Uses physical keys in the US layout, so for example the `W` key will be in the same physical key on both US and french keyboards. 135 | /// 136 | /// This is suitable for game controls. 137 | pub fn key_pressed(&self, keycode: KeyCode) -> bool { 138 | let key = PhysicalKey::Code(keycode); 139 | if let Some(current) = &self.current { 140 | let searched_action = ScanCodeAction::Pressed(key); 141 | if current.scancode_actions.contains(&searched_action) { 142 | return true; 143 | } 144 | } 145 | false 146 | } 147 | 148 | /// Returns true when the key with the specified keycode goes from "not pressed" to "pressed". 149 | /// Otherwise returns false. 150 | /// 151 | /// Uses physical keys in the US layout, so for example the `W` key will be in the same physical key on both US and french keyboards. 152 | /// 153 | /// Will repeat key presses while held down according to the OS's key repeat configuration 154 | /// This is suitable for UI. 155 | pub fn key_pressed_os(&self, keycode: KeyCode) -> bool { 156 | let key = PhysicalKey::Code(keycode); 157 | if let Some(current) = &self.current { 158 | let searched_action = ScanCodeAction::PressedOs(key); 159 | if current.scancode_actions.contains(&searched_action) { 160 | return true; 161 | } 162 | } 163 | false 164 | } 165 | 166 | /// Returns true when the key with the specified KeyCode goes from "pressed" to "not pressed". 167 | /// Otherwise returns false. 168 | /// 169 | /// Uses physical keys in the US layout, so for example the `W` key will be in the same physical key on both US and french keyboards. 170 | pub fn key_released(&self, keycode: KeyCode) -> bool { 171 | let key = PhysicalKey::Code(keycode); 172 | if let Some(current) = &self.current { 173 | let searched_action = ScanCodeAction::Released(key); 174 | if current.scancode_actions.contains(&searched_action) { 175 | return true; 176 | } 177 | } 178 | false 179 | } 180 | 181 | /// Returns true when the key with the specified keycode remains "pressed". 182 | /// Otherwise returns false. 183 | /// 184 | /// Uses physical keys in the US layout, so for example the `W` key will be in the same physical key on both US and french keyboards. 185 | pub fn key_held(&self, keycode: KeyCode) -> bool { 186 | let key = PhysicalKey::Code(keycode); 187 | if let Some(current) = &self.current { 188 | return current.scancode_held.contains(&key); 189 | } 190 | false 191 | } 192 | 193 | /// Returns true while any shift key is held on the keyboard. 194 | /// Otherwise returns false. 195 | /// 196 | /// Uses physical keys. 197 | pub fn held_shift(&self) -> bool { 198 | self.key_held(KeyCode::ShiftLeft) || self.key_held(KeyCode::ShiftRight) 199 | } 200 | 201 | /// Returns true while any control key is held on the keyboard. 202 | /// Otherwise returns false. 203 | /// 204 | /// Uses physical keys. 205 | pub fn held_control(&self) -> bool { 206 | self.key_held(KeyCode::ControlLeft) || self.key_held(KeyCode::ControlRight) 207 | } 208 | 209 | /// Returns true while any alt key is held on the keyboard. 210 | /// Otherwise returns false. 211 | /// 212 | /// Uses physical keys. 213 | pub fn held_alt(&self) -> bool { 214 | self.key_held(KeyCode::AltLeft) || self.key_held(KeyCode::AltRight) 215 | } 216 | 217 | /// Returns true when the specified keyboard key goes from "not pressed" to "pressed". 218 | /// Otherwise returns false. 219 | /// 220 | /// Uses logical keypresses, so for example `W` is changed between a US and french keyboard. 221 | /// Will never repeat keypresses while held. 222 | pub fn key_pressed_logical(&self, check_key: Key<&str>) -> bool { 223 | if let Some(current) = &self.current { 224 | for action in ¤t.key_actions { 225 | if let KeyAction::Pressed(key) = action { 226 | if key.as_ref() == check_key { 227 | return true; 228 | } 229 | } 230 | } 231 | } 232 | false 233 | } 234 | 235 | /// Returns true when the specified keyboard key goes from "not pressed" to "pressed". 236 | /// Otherwise returns false. 237 | /// 238 | /// Uses logical keypresses, so for example `W` is changed between a US and french keyboard. 239 | /// 240 | /// Will repeat key presses while held down according to the OS's key repeat configuration 241 | /// This is suitable for UI. 242 | pub fn key_pressed_os_logical(&self, check_key: Key<&str>) -> bool { 243 | if let Some(current) = &self.current { 244 | for action in ¤t.key_actions { 245 | if let KeyAction::PressedOs(key_code) = action { 246 | if key_code.as_ref() == check_key { 247 | return true; 248 | } 249 | } 250 | } 251 | } 252 | false 253 | } 254 | 255 | /// Returns true when the specified keyboard key goes from "pressed" to "not pressed". 256 | /// Otherwise returns false. 257 | /// 258 | /// Uses logical keypresses, so for example `W` is changed between a US and french keyboard. 259 | pub fn key_released_logical(&self, check_key: Key<&str>) -> bool { 260 | if let Some(current) = &self.current { 261 | for action in ¤t.key_actions { 262 | if let KeyAction::Released(key_code) = action { 263 | if key_code.as_ref() == check_key { 264 | return true; 265 | } 266 | } 267 | } 268 | } 269 | false 270 | } 271 | 272 | /// Returns true while the specified keyboard key remains "pressed". 273 | /// Otherwise returns false. 274 | /// 275 | /// Uses logical keypresses, so for example `W` is changed between a US and french keyboard. 276 | pub fn key_held_logical(&self, check_key: Key<&str>) -> bool { 277 | match &self.current { 278 | Some(current) => current.key_held.iter().any(|x| x.as_ref() == check_key), 279 | None => false, 280 | } 281 | } 282 | 283 | /// Returns true when the specified mouse button goes from "not pressed" to "pressed". 284 | /// Otherwise returns false. 285 | pub fn mouse_pressed(&self, mouse_button: MouseButton) -> bool { 286 | if let Some(current) = &self.current { 287 | for action in ¤t.mouse_actions { 288 | if let MouseAction::Pressed(key_code) = *action { 289 | if key_code == mouse_button { 290 | return true; 291 | } 292 | } 293 | } 294 | } 295 | false 296 | } 297 | 298 | /// Returns true when the specified mouse button goes from "pressed" to "not pressed". 299 | /// Otherwise returns false. 300 | pub fn mouse_released(&self, mouse_button: MouseButton) -> bool { 301 | if let Some(current) = &self.current { 302 | for action in ¤t.mouse_actions { 303 | if let MouseAction::Released(key_code) = *action { 304 | if key_code == mouse_button { 305 | return true; 306 | } 307 | } 308 | } 309 | } 310 | false 311 | } 312 | 313 | /// Returns true while the specified mouse button remains "pressed". 314 | /// Otherwise returns false. 315 | pub fn mouse_held(&self, mouse_button: MouseButton) -> bool { 316 | match &self.current { 317 | Some(current) => current.mouse_held[mouse_button_to_int(&mouse_button)], 318 | None => false, 319 | } 320 | } 321 | 322 | /// Returns `(0.0, 0.0)` when the window is not focused. 323 | /// Otherwise returns the amount scrolled by the mouse during the last step. 324 | /// Returns (horizontally, vertically) 325 | pub fn scroll_diff(&self) -> (f32, f32) { 326 | match &self.current { 327 | Some(current) => (current.x_scroll_diff, current.y_scroll_diff), 328 | None => (0.0, 0.0), 329 | } 330 | } 331 | 332 | /// Returns the cursor coordinates in pixels, when window is focused AND (cursor is on window OR any mouse button remains held while cursor moved off window) 333 | /// Otherwise returns `None` 334 | pub fn cursor(&self) -> Option<(f32, f32)> { 335 | match &self.current { 336 | Some(current) => current.cursor_point, 337 | None => None, 338 | } 339 | } 340 | 341 | /// Returns the change in cursor coordinates that occured during the last step, when window is focused AND (cursor is on window OR any mouse button remains held while cursor moved off window) 342 | /// Otherwise returns `(0.0, 0.0)`. 343 | pub fn cursor_diff(&self) -> (f32, f32) { 344 | if let Some(current_input) = &self.current { 345 | if let Some(cur) = current_input.cursor_point { 346 | if let Some(prev) = current_input.cursor_point_prev { 347 | return (cur.0 - prev.0, cur.1 - prev.1); 348 | } 349 | } 350 | } 351 | (0.0, 0.0) 352 | } 353 | 354 | /// Returns the change in mouse coordinates that occured during the last step. 355 | /// 356 | /// This is useful when implementing first person controls with a captured mouse. 357 | pub fn mouse_diff(&self) -> (f32, f32) { 358 | if let Some(current_input) = &self.current { 359 | if let Some(diff) = current_input.mouse_diff { 360 | return diff; 361 | } 362 | } 363 | (0.0, 0.0) 364 | } 365 | 366 | /// Returns the characters pressed during the last step. 367 | /// The characters are in the order they were pressed. 368 | pub fn text(&self) -> &[Key] { 369 | match &self.current { 370 | Some(current) => ¤t.text, 371 | None => &[], 372 | } 373 | } 374 | 375 | /// Returns the path to a file that has been drag-and-dropped onto the window. 376 | pub fn dropped_file(&self) -> Option { 377 | self.dropped_file.clone() 378 | } 379 | 380 | /// Returns the current window size if it was resized during the last step. 381 | /// Otherwise returns `None`. 382 | pub fn window_resized(&self) -> Option> { 383 | self.window_resized 384 | } 385 | 386 | /// Returns `None` when no `WindowEvent::Resized` have been received yet. 387 | /// After one has been received it returns the current resolution of the window. 388 | pub fn resolution(&self) -> Option<(u32, u32)> { 389 | self.window_size 390 | } 391 | 392 | /// Returns the current scale factor if it was changed during the last step. 393 | /// Otherwise returns `None`. 394 | pub fn scale_factor_changed(&self) -> Option { 395 | self.scale_factor_changed 396 | } 397 | 398 | /// Returns `None` when no `WindowEvent::ScaleFactorChanged` have been received yet. 399 | /// After one has been received it returns the current scale_factor of the window. 400 | pub fn scale_factor(&self) -> Option { 401 | self.scale_factor 402 | } 403 | 404 | /// Returns true if the window has been destroyed 405 | /// Otherwise returns false. 406 | /// Once this method has returned true once all following calls to this method will also return true. 407 | pub fn destroyed(&self) -> bool { 408 | self.destroyed 409 | } 410 | 411 | /// Returns true if the OS has requested the application to close during this step. 412 | /// Otherwise returns false. 413 | pub fn close_requested(&self) -> bool { 414 | self.close_requested 415 | } 416 | 417 | /// Returns the `std::time::Duration` elapsed since the last step. 418 | /// Returns `None` if the step is still in progress. 419 | pub fn delta_time(&self) -> Option { 420 | self.step_duration 421 | } 422 | } 423 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "ab_glyph" 7 | version = "0.2.31" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "e074464580a518d16a7126262fffaaa47af89d4099d4cb403f8ed938ba12ee7d" 10 | dependencies = [ 11 | "ab_glyph_rasterizer", 12 | "owned_ttf_parser", 13 | ] 14 | 15 | [[package]] 16 | name = "ab_glyph_rasterizer" 17 | version = "0.1.10" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" 20 | 21 | [[package]] 22 | name = "ahash" 23 | version = "0.8.12" 24 | source = "registry+https://github.com/rust-lang/crates.io-index" 25 | checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" 26 | dependencies = [ 27 | "cfg-if", 28 | "getrandom", 29 | "once_cell", 30 | "version_check", 31 | "zerocopy", 32 | ] 33 | 34 | [[package]] 35 | name = "aho-corasick" 36 | version = "1.1.3" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 39 | dependencies = [ 40 | "memchr", 41 | ] 42 | 43 | [[package]] 44 | name = "android-activity" 45 | version = "0.6.0" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" 48 | dependencies = [ 49 | "android-properties", 50 | "bitflags 2.9.4", 51 | "cc", 52 | "cesu8", 53 | "jni", 54 | "jni-sys", 55 | "libc", 56 | "log", 57 | "ndk", 58 | "ndk-context", 59 | "ndk-sys", 60 | "num_enum", 61 | "thiserror", 62 | ] 63 | 64 | [[package]] 65 | name = "android-properties" 66 | version = "0.2.2" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" 69 | 70 | [[package]] 71 | name = "anstream" 72 | version = "0.6.20" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" 75 | dependencies = [ 76 | "anstyle", 77 | "anstyle-parse", 78 | "anstyle-query", 79 | "anstyle-wincon", 80 | "colorchoice", 81 | "is_terminal_polyfill", 82 | "utf8parse", 83 | ] 84 | 85 | [[package]] 86 | name = "anstyle" 87 | version = "1.0.11" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" 90 | 91 | [[package]] 92 | name = "anstyle-parse" 93 | version = "0.2.7" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 96 | dependencies = [ 97 | "utf8parse", 98 | ] 99 | 100 | [[package]] 101 | name = "anstyle-query" 102 | version = "1.1.4" 103 | source = "registry+https://github.com/rust-lang/crates.io-index" 104 | checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" 105 | dependencies = [ 106 | "windows-sys 0.60.2", 107 | ] 108 | 109 | [[package]] 110 | name = "anstyle-wincon" 111 | version = "3.0.10" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" 114 | dependencies = [ 115 | "anstyle", 116 | "once_cell_polyfill", 117 | "windows-sys 0.60.2", 118 | ] 119 | 120 | [[package]] 121 | name = "anyhow" 122 | version = "1.0.99" 123 | source = "registry+https://github.com/rust-lang/crates.io-index" 124 | checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" 125 | 126 | [[package]] 127 | name = "arrayref" 128 | version = "0.3.9" 129 | source = "registry+https://github.com/rust-lang/crates.io-index" 130 | checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" 131 | 132 | [[package]] 133 | name = "arrayvec" 134 | version = "0.7.6" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 137 | 138 | [[package]] 139 | name = "as-raw-xcb-connection" 140 | version = "1.0.1" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" 143 | 144 | [[package]] 145 | name = "atomic-waker" 146 | version = "1.1.2" 147 | source = "registry+https://github.com/rust-lang/crates.io-index" 148 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 149 | 150 | [[package]] 151 | name = "autocfg" 152 | version = "1.5.0" 153 | source = "registry+https://github.com/rust-lang/crates.io-index" 154 | checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 155 | 156 | [[package]] 157 | name = "base64" 158 | version = "0.22.1" 159 | source = "registry+https://github.com/rust-lang/crates.io-index" 160 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 161 | 162 | [[package]] 163 | name = "bitflags" 164 | version = "1.3.2" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 167 | 168 | [[package]] 169 | name = "bitflags" 170 | version = "2.9.4" 171 | source = "registry+https://github.com/rust-lang/crates.io-index" 172 | checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" 173 | 174 | [[package]] 175 | name = "block2" 176 | version = "0.5.1" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" 179 | dependencies = [ 180 | "objc2", 181 | ] 182 | 183 | [[package]] 184 | name = "bumpalo" 185 | version = "3.19.0" 186 | source = "registry+https://github.com/rust-lang/crates.io-index" 187 | checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 188 | 189 | [[package]] 190 | name = "bytemuck" 191 | version = "1.23.2" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" 194 | 195 | [[package]] 196 | name = "bytes" 197 | version = "1.10.1" 198 | source = "registry+https://github.com/rust-lang/crates.io-index" 199 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 200 | 201 | [[package]] 202 | name = "calloop" 203 | version = "0.13.0" 204 | source = "registry+https://github.com/rust-lang/crates.io-index" 205 | checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" 206 | dependencies = [ 207 | "bitflags 2.9.4", 208 | "log", 209 | "polling", 210 | "rustix 0.38.44", 211 | "slab", 212 | "thiserror", 213 | ] 214 | 215 | [[package]] 216 | name = "calloop-wayland-source" 217 | version = "0.3.0" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" 220 | dependencies = [ 221 | "calloop", 222 | "rustix 0.38.44", 223 | "wayland-backend", 224 | "wayland-client", 225 | ] 226 | 227 | [[package]] 228 | name = "cargo-run-wasm" 229 | version = "0.4.0" 230 | source = "registry+https://github.com/rust-lang/crates.io-index" 231 | checksum = "fa9c33bbfab116bda01ec67729b988895b34167a1e9cf034343099092421ed43" 232 | dependencies = [ 233 | "devserver_lib", 234 | "pico-args", 235 | "serde_json", 236 | "wasm-bindgen-cli-support", 237 | ] 238 | 239 | [[package]] 240 | name = "cc" 241 | version = "1.2.37" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44" 244 | dependencies = [ 245 | "find-msvc-tools", 246 | "jobserver", 247 | "libc", 248 | "shlex", 249 | ] 250 | 251 | [[package]] 252 | name = "cesu8" 253 | version = "1.1.0" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 256 | 257 | [[package]] 258 | name = "cfg-if" 259 | version = "1.0.3" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" 262 | 263 | [[package]] 264 | name = "cfg_aliases" 265 | version = "0.2.1" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 268 | 269 | [[package]] 270 | name = "colorchoice" 271 | version = "1.0.4" 272 | source = "registry+https://github.com/rust-lang/crates.io-index" 273 | checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 274 | 275 | [[package]] 276 | name = "combine" 277 | version = "4.6.7" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 280 | dependencies = [ 281 | "bytes", 282 | "memchr", 283 | ] 284 | 285 | [[package]] 286 | name = "concurrent-queue" 287 | version = "2.5.0" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 290 | dependencies = [ 291 | "crossbeam-utils", 292 | ] 293 | 294 | [[package]] 295 | name = "console_error_panic_hook" 296 | version = "0.1.7" 297 | source = "registry+https://github.com/rust-lang/crates.io-index" 298 | checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" 299 | dependencies = [ 300 | "cfg-if", 301 | "wasm-bindgen", 302 | ] 303 | 304 | [[package]] 305 | name = "console_log" 306 | version = "1.0.0" 307 | source = "registry+https://github.com/rust-lang/crates.io-index" 308 | checksum = "be8aed40e4edbf4d3b4431ab260b63fdc40f5780a4766824329ea0f1eefe3c0f" 309 | dependencies = [ 310 | "log", 311 | "web-sys", 312 | ] 313 | 314 | [[package]] 315 | name = "core-foundation" 316 | version = "0.9.4" 317 | source = "registry+https://github.com/rust-lang/crates.io-index" 318 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 319 | dependencies = [ 320 | "core-foundation-sys", 321 | "libc", 322 | ] 323 | 324 | [[package]] 325 | name = "core-foundation-sys" 326 | version = "0.8.7" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 329 | 330 | [[package]] 331 | name = "core-graphics" 332 | version = "0.23.2" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" 335 | dependencies = [ 336 | "bitflags 1.3.2", 337 | "core-foundation", 338 | "core-graphics-types", 339 | "foreign-types", 340 | "libc", 341 | ] 342 | 343 | [[package]] 344 | name = "core-graphics-types" 345 | version = "0.1.3" 346 | source = "registry+https://github.com/rust-lang/crates.io-index" 347 | checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" 348 | dependencies = [ 349 | "bitflags 1.3.2", 350 | "core-foundation", 351 | "libc", 352 | ] 353 | 354 | [[package]] 355 | name = "crossbeam-deque" 356 | version = "0.8.6" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 359 | dependencies = [ 360 | "crossbeam-epoch", 361 | "crossbeam-utils", 362 | ] 363 | 364 | [[package]] 365 | name = "crossbeam-epoch" 366 | version = "0.9.18" 367 | source = "registry+https://github.com/rust-lang/crates.io-index" 368 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 369 | dependencies = [ 370 | "crossbeam-utils", 371 | ] 372 | 373 | [[package]] 374 | name = "crossbeam-utils" 375 | version = "0.8.21" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 378 | 379 | [[package]] 380 | name = "cursor-icon" 381 | version = "1.2.0" 382 | source = "registry+https://github.com/rust-lang/crates.io-index" 383 | checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" 384 | 385 | [[package]] 386 | name = "devserver_lib" 387 | version = "0.4.2" 388 | source = "registry+https://github.com/rust-lang/crates.io-index" 389 | checksum = "edf215dbb8cb1409cca7645aaed35f9e39fb0a21855bba1ac48bc0334903bf66" 390 | 391 | [[package]] 392 | name = "dispatch" 393 | version = "0.2.0" 394 | source = "registry+https://github.com/rust-lang/crates.io-index" 395 | checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" 396 | 397 | [[package]] 398 | name = "dlib" 399 | version = "0.5.2" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 402 | dependencies = [ 403 | "libloading", 404 | ] 405 | 406 | [[package]] 407 | name = "downcast-rs" 408 | version = "1.2.1" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" 411 | 412 | [[package]] 413 | name = "dpi" 414 | version = "0.1.2" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" 417 | 418 | [[package]] 419 | name = "either" 420 | version = "1.15.0" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 423 | 424 | [[package]] 425 | name = "env_filter" 426 | version = "0.1.3" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" 429 | dependencies = [ 430 | "log", 431 | "regex", 432 | ] 433 | 434 | [[package]] 435 | name = "env_logger" 436 | version = "0.11.8" 437 | source = "registry+https://github.com/rust-lang/crates.io-index" 438 | checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" 439 | dependencies = [ 440 | "anstream", 441 | "anstyle", 442 | "env_filter", 443 | "jiff", 444 | "log", 445 | ] 446 | 447 | [[package]] 448 | name = "equivalent" 449 | version = "1.0.2" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 452 | 453 | [[package]] 454 | name = "errno" 455 | version = "0.3.14" 456 | source = "registry+https://github.com/rust-lang/crates.io-index" 457 | checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 458 | dependencies = [ 459 | "libc", 460 | "windows-sys 0.61.0", 461 | ] 462 | 463 | [[package]] 464 | name = "fallible-iterator" 465 | version = "0.2.0" 466 | source = "registry+https://github.com/rust-lang/crates.io-index" 467 | checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" 468 | 469 | [[package]] 470 | name = "fastrand" 471 | version = "2.3.0" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 474 | 475 | [[package]] 476 | name = "find-msvc-tools" 477 | version = "0.1.1" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" 480 | 481 | [[package]] 482 | name = "foreign-types" 483 | version = "0.5.0" 484 | source = "registry+https://github.com/rust-lang/crates.io-index" 485 | checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" 486 | dependencies = [ 487 | "foreign-types-macros", 488 | "foreign-types-shared", 489 | ] 490 | 491 | [[package]] 492 | name = "foreign-types-macros" 493 | version = "0.2.3" 494 | source = "registry+https://github.com/rust-lang/crates.io-index" 495 | checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" 496 | dependencies = [ 497 | "proc-macro2", 498 | "quote", 499 | "syn", 500 | ] 501 | 502 | [[package]] 503 | name = "foreign-types-shared" 504 | version = "0.3.1" 505 | source = "registry+https://github.com/rust-lang/crates.io-index" 506 | checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" 507 | 508 | [[package]] 509 | name = "gethostname" 510 | version = "1.0.2" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | checksum = "fc257fdb4038301ce4b9cd1b3b51704509692bb3ff716a410cbd07925d9dae55" 513 | dependencies = [ 514 | "rustix 1.1.2", 515 | "windows-targets 0.52.6", 516 | ] 517 | 518 | [[package]] 519 | name = "getrandom" 520 | version = "0.3.3" 521 | source = "registry+https://github.com/rust-lang/crates.io-index" 522 | checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 523 | dependencies = [ 524 | "cfg-if", 525 | "libc", 526 | "r-efi", 527 | "wasi", 528 | ] 529 | 530 | [[package]] 531 | name = "gimli" 532 | version = "0.26.2" 533 | source = "registry+https://github.com/rust-lang/crates.io-index" 534 | checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" 535 | dependencies = [ 536 | "fallible-iterator", 537 | "indexmap 1.9.3", 538 | "stable_deref_trait", 539 | ] 540 | 541 | [[package]] 542 | name = "hashbrown" 543 | version = "0.12.3" 544 | source = "registry+https://github.com/rust-lang/crates.io-index" 545 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 546 | 547 | [[package]] 548 | name = "hashbrown" 549 | version = "0.14.5" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 552 | dependencies = [ 553 | "ahash", 554 | "serde", 555 | ] 556 | 557 | [[package]] 558 | name = "hashbrown" 559 | version = "0.15.5" 560 | source = "registry+https://github.com/rust-lang/crates.io-index" 561 | checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 562 | 563 | [[package]] 564 | name = "heck" 565 | version = "0.5.0" 566 | source = "registry+https://github.com/rust-lang/crates.io-index" 567 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 568 | 569 | [[package]] 570 | name = "hermit-abi" 571 | version = "0.5.2" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" 574 | 575 | [[package]] 576 | name = "id-arena" 577 | version = "2.2.1" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" 580 | dependencies = [ 581 | "rayon", 582 | ] 583 | 584 | [[package]] 585 | name = "indexmap" 586 | version = "1.9.3" 587 | source = "registry+https://github.com/rust-lang/crates.io-index" 588 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 589 | dependencies = [ 590 | "autocfg", 591 | "hashbrown 0.12.3", 592 | ] 593 | 594 | [[package]] 595 | name = "indexmap" 596 | version = "2.11.3" 597 | source = "registry+https://github.com/rust-lang/crates.io-index" 598 | checksum = "92119844f513ffa41556430369ab02c295a3578af21cf945caa3e9e0c2481ac3" 599 | dependencies = [ 600 | "equivalent", 601 | "hashbrown 0.15.5", 602 | "serde", 603 | "serde_core", 604 | ] 605 | 606 | [[package]] 607 | name = "is_terminal_polyfill" 608 | version = "1.70.1" 609 | source = "registry+https://github.com/rust-lang/crates.io-index" 610 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 611 | 612 | [[package]] 613 | name = "itoa" 614 | version = "1.0.15" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 617 | 618 | [[package]] 619 | name = "jiff" 620 | version = "0.2.15" 621 | source = "registry+https://github.com/rust-lang/crates.io-index" 622 | checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" 623 | dependencies = [ 624 | "jiff-static", 625 | "log", 626 | "portable-atomic", 627 | "portable-atomic-util", 628 | "serde", 629 | ] 630 | 631 | [[package]] 632 | name = "jiff-static" 633 | version = "0.2.15" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" 636 | dependencies = [ 637 | "proc-macro2", 638 | "quote", 639 | "syn", 640 | ] 641 | 642 | [[package]] 643 | name = "jni" 644 | version = "0.21.1" 645 | source = "registry+https://github.com/rust-lang/crates.io-index" 646 | checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" 647 | dependencies = [ 648 | "cesu8", 649 | "cfg-if", 650 | "combine", 651 | "jni-sys", 652 | "log", 653 | "thiserror", 654 | "walkdir", 655 | "windows-sys 0.45.0", 656 | ] 657 | 658 | [[package]] 659 | name = "jni-sys" 660 | version = "0.3.0" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 663 | 664 | [[package]] 665 | name = "jobserver" 666 | version = "0.1.34" 667 | source = "registry+https://github.com/rust-lang/crates.io-index" 668 | checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" 669 | dependencies = [ 670 | "getrandom", 671 | "libc", 672 | ] 673 | 674 | [[package]] 675 | name = "js-sys" 676 | version = "0.3.77" 677 | source = "registry+https://github.com/rust-lang/crates.io-index" 678 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 679 | dependencies = [ 680 | "once_cell", 681 | "wasm-bindgen", 682 | ] 683 | 684 | [[package]] 685 | name = "leb128" 686 | version = "0.2.5" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" 689 | 690 | [[package]] 691 | name = "libc" 692 | version = "0.2.175" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" 695 | 696 | [[package]] 697 | name = "libloading" 698 | version = "0.8.8" 699 | source = "registry+https://github.com/rust-lang/crates.io-index" 700 | checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" 701 | dependencies = [ 702 | "cfg-if", 703 | "windows-targets 0.53.3", 704 | ] 705 | 706 | [[package]] 707 | name = "libredox" 708 | version = "0.1.10" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" 711 | dependencies = [ 712 | "bitflags 2.9.4", 713 | "libc", 714 | "redox_syscall 0.5.17", 715 | ] 716 | 717 | [[package]] 718 | name = "linux-raw-sys" 719 | version = "0.4.15" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 722 | 723 | [[package]] 724 | name = "linux-raw-sys" 725 | version = "0.11.0" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 728 | 729 | [[package]] 730 | name = "log" 731 | version = "0.4.28" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 734 | 735 | [[package]] 736 | name = "memchr" 737 | version = "2.7.5" 738 | source = "registry+https://github.com/rust-lang/crates.io-index" 739 | checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 740 | 741 | [[package]] 742 | name = "memmap2" 743 | version = "0.9.8" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" 746 | dependencies = [ 747 | "libc", 748 | ] 749 | 750 | [[package]] 751 | name = "ndk" 752 | version = "0.9.0" 753 | source = "registry+https://github.com/rust-lang/crates.io-index" 754 | checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 755 | dependencies = [ 756 | "bitflags 2.9.4", 757 | "jni-sys", 758 | "log", 759 | "ndk-sys", 760 | "num_enum", 761 | "raw-window-handle", 762 | "thiserror", 763 | ] 764 | 765 | [[package]] 766 | name = "ndk-context" 767 | version = "0.1.1" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" 770 | 771 | [[package]] 772 | name = "ndk-sys" 773 | version = "0.6.0+11769913" 774 | source = "registry+https://github.com/rust-lang/crates.io-index" 775 | checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" 776 | dependencies = [ 777 | "jni-sys", 778 | ] 779 | 780 | [[package]] 781 | name = "num_enum" 782 | version = "0.7.4" 783 | source = "registry+https://github.com/rust-lang/crates.io-index" 784 | checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" 785 | dependencies = [ 786 | "num_enum_derive", 787 | "rustversion", 788 | ] 789 | 790 | [[package]] 791 | name = "num_enum_derive" 792 | version = "0.7.4" 793 | source = "registry+https://github.com/rust-lang/crates.io-index" 794 | checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" 795 | dependencies = [ 796 | "proc-macro-crate", 797 | "proc-macro2", 798 | "quote", 799 | "syn", 800 | ] 801 | 802 | [[package]] 803 | name = "objc-sys" 804 | version = "0.3.5" 805 | source = "registry+https://github.com/rust-lang/crates.io-index" 806 | checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" 807 | 808 | [[package]] 809 | name = "objc2" 810 | version = "0.5.2" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" 813 | dependencies = [ 814 | "objc-sys", 815 | "objc2-encode", 816 | ] 817 | 818 | [[package]] 819 | name = "objc2-app-kit" 820 | version = "0.2.2" 821 | source = "registry+https://github.com/rust-lang/crates.io-index" 822 | checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" 823 | dependencies = [ 824 | "bitflags 2.9.4", 825 | "block2", 826 | "libc", 827 | "objc2", 828 | "objc2-core-data", 829 | "objc2-core-image", 830 | "objc2-foundation", 831 | "objc2-quartz-core", 832 | ] 833 | 834 | [[package]] 835 | name = "objc2-cloud-kit" 836 | version = "0.2.2" 837 | source = "registry+https://github.com/rust-lang/crates.io-index" 838 | checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" 839 | dependencies = [ 840 | "bitflags 2.9.4", 841 | "block2", 842 | "objc2", 843 | "objc2-core-location", 844 | "objc2-foundation", 845 | ] 846 | 847 | [[package]] 848 | name = "objc2-contacts" 849 | version = "0.2.2" 850 | source = "registry+https://github.com/rust-lang/crates.io-index" 851 | checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" 852 | dependencies = [ 853 | "block2", 854 | "objc2", 855 | "objc2-foundation", 856 | ] 857 | 858 | [[package]] 859 | name = "objc2-core-data" 860 | version = "0.2.2" 861 | source = "registry+https://github.com/rust-lang/crates.io-index" 862 | checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" 863 | dependencies = [ 864 | "bitflags 2.9.4", 865 | "block2", 866 | "objc2", 867 | "objc2-foundation", 868 | ] 869 | 870 | [[package]] 871 | name = "objc2-core-image" 872 | version = "0.2.2" 873 | source = "registry+https://github.com/rust-lang/crates.io-index" 874 | checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" 875 | dependencies = [ 876 | "block2", 877 | "objc2", 878 | "objc2-foundation", 879 | "objc2-metal", 880 | ] 881 | 882 | [[package]] 883 | name = "objc2-core-location" 884 | version = "0.2.2" 885 | source = "registry+https://github.com/rust-lang/crates.io-index" 886 | checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" 887 | dependencies = [ 888 | "block2", 889 | "objc2", 890 | "objc2-contacts", 891 | "objc2-foundation", 892 | ] 893 | 894 | [[package]] 895 | name = "objc2-encode" 896 | version = "4.1.0" 897 | source = "registry+https://github.com/rust-lang/crates.io-index" 898 | checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" 899 | 900 | [[package]] 901 | name = "objc2-foundation" 902 | version = "0.2.2" 903 | source = "registry+https://github.com/rust-lang/crates.io-index" 904 | checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 905 | dependencies = [ 906 | "bitflags 2.9.4", 907 | "block2", 908 | "dispatch", 909 | "libc", 910 | "objc2", 911 | ] 912 | 913 | [[package]] 914 | name = "objc2-link-presentation" 915 | version = "0.2.2" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" 918 | dependencies = [ 919 | "block2", 920 | "objc2", 921 | "objc2-app-kit", 922 | "objc2-foundation", 923 | ] 924 | 925 | [[package]] 926 | name = "objc2-metal" 927 | version = "0.2.2" 928 | source = "registry+https://github.com/rust-lang/crates.io-index" 929 | checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 930 | dependencies = [ 931 | "bitflags 2.9.4", 932 | "block2", 933 | "objc2", 934 | "objc2-foundation", 935 | ] 936 | 937 | [[package]] 938 | name = "objc2-quartz-core" 939 | version = "0.2.2" 940 | source = "registry+https://github.com/rust-lang/crates.io-index" 941 | checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 942 | dependencies = [ 943 | "bitflags 2.9.4", 944 | "block2", 945 | "objc2", 946 | "objc2-foundation", 947 | "objc2-metal", 948 | ] 949 | 950 | [[package]] 951 | name = "objc2-symbols" 952 | version = "0.2.2" 953 | source = "registry+https://github.com/rust-lang/crates.io-index" 954 | checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" 955 | dependencies = [ 956 | "objc2", 957 | "objc2-foundation", 958 | ] 959 | 960 | [[package]] 961 | name = "objc2-ui-kit" 962 | version = "0.2.2" 963 | source = "registry+https://github.com/rust-lang/crates.io-index" 964 | checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" 965 | dependencies = [ 966 | "bitflags 2.9.4", 967 | "block2", 968 | "objc2", 969 | "objc2-cloud-kit", 970 | "objc2-core-data", 971 | "objc2-core-image", 972 | "objc2-core-location", 973 | "objc2-foundation", 974 | "objc2-link-presentation", 975 | "objc2-quartz-core", 976 | "objc2-symbols", 977 | "objc2-uniform-type-identifiers", 978 | "objc2-user-notifications", 979 | ] 980 | 981 | [[package]] 982 | name = "objc2-uniform-type-identifiers" 983 | version = "0.2.2" 984 | source = "registry+https://github.com/rust-lang/crates.io-index" 985 | checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" 986 | dependencies = [ 987 | "block2", 988 | "objc2", 989 | "objc2-foundation", 990 | ] 991 | 992 | [[package]] 993 | name = "objc2-user-notifications" 994 | version = "0.2.2" 995 | source = "registry+https://github.com/rust-lang/crates.io-index" 996 | checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" 997 | dependencies = [ 998 | "bitflags 2.9.4", 999 | "block2", 1000 | "objc2", 1001 | "objc2-core-location", 1002 | "objc2-foundation", 1003 | ] 1004 | 1005 | [[package]] 1006 | name = "once_cell" 1007 | version = "1.21.3" 1008 | source = "registry+https://github.com/rust-lang/crates.io-index" 1009 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 1010 | 1011 | [[package]] 1012 | name = "once_cell_polyfill" 1013 | version = "1.70.1" 1014 | source = "registry+https://github.com/rust-lang/crates.io-index" 1015 | checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" 1016 | 1017 | [[package]] 1018 | name = "orbclient" 1019 | version = "0.3.48" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" 1022 | dependencies = [ 1023 | "libredox", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "owned_ttf_parser" 1028 | version = "0.25.1" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" 1031 | dependencies = [ 1032 | "ttf-parser", 1033 | ] 1034 | 1035 | [[package]] 1036 | name = "percent-encoding" 1037 | version = "2.3.2" 1038 | source = "registry+https://github.com/rust-lang/crates.io-index" 1039 | checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 1040 | 1041 | [[package]] 1042 | name = "pico-args" 1043 | version = "0.5.0" 1044 | source = "registry+https://github.com/rust-lang/crates.io-index" 1045 | checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" 1046 | 1047 | [[package]] 1048 | name = "pin-project" 1049 | version = "1.1.10" 1050 | source = "registry+https://github.com/rust-lang/crates.io-index" 1051 | checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" 1052 | dependencies = [ 1053 | "pin-project-internal", 1054 | ] 1055 | 1056 | [[package]] 1057 | name = "pin-project-internal" 1058 | version = "1.1.10" 1059 | source = "registry+https://github.com/rust-lang/crates.io-index" 1060 | checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" 1061 | dependencies = [ 1062 | "proc-macro2", 1063 | "quote", 1064 | "syn", 1065 | ] 1066 | 1067 | [[package]] 1068 | name = "pin-project-lite" 1069 | version = "0.2.16" 1070 | source = "registry+https://github.com/rust-lang/crates.io-index" 1071 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1072 | 1073 | [[package]] 1074 | name = "pkg-config" 1075 | version = "0.3.32" 1076 | source = "registry+https://github.com/rust-lang/crates.io-index" 1077 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1078 | 1079 | [[package]] 1080 | name = "polling" 1081 | version = "3.11.0" 1082 | source = "registry+https://github.com/rust-lang/crates.io-index" 1083 | checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" 1084 | dependencies = [ 1085 | "cfg-if", 1086 | "concurrent-queue", 1087 | "hermit-abi", 1088 | "pin-project-lite", 1089 | "rustix 1.1.2", 1090 | "windows-sys 0.61.0", 1091 | ] 1092 | 1093 | [[package]] 1094 | name = "portable-atomic" 1095 | version = "1.11.1" 1096 | source = "registry+https://github.com/rust-lang/crates.io-index" 1097 | checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" 1098 | 1099 | [[package]] 1100 | name = "portable-atomic-util" 1101 | version = "0.2.4" 1102 | source = "registry+https://github.com/rust-lang/crates.io-index" 1103 | checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" 1104 | dependencies = [ 1105 | "portable-atomic", 1106 | ] 1107 | 1108 | [[package]] 1109 | name = "proc-macro-crate" 1110 | version = "3.4.0" 1111 | source = "registry+https://github.com/rust-lang/crates.io-index" 1112 | checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" 1113 | dependencies = [ 1114 | "toml_edit", 1115 | ] 1116 | 1117 | [[package]] 1118 | name = "proc-macro2" 1119 | version = "1.0.101" 1120 | source = "registry+https://github.com/rust-lang/crates.io-index" 1121 | checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" 1122 | dependencies = [ 1123 | "unicode-ident", 1124 | ] 1125 | 1126 | [[package]] 1127 | name = "quick-xml" 1128 | version = "0.37.5" 1129 | source = "registry+https://github.com/rust-lang/crates.io-index" 1130 | checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" 1131 | dependencies = [ 1132 | "memchr", 1133 | ] 1134 | 1135 | [[package]] 1136 | name = "quote" 1137 | version = "1.0.40" 1138 | source = "registry+https://github.com/rust-lang/crates.io-index" 1139 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1140 | dependencies = [ 1141 | "proc-macro2", 1142 | ] 1143 | 1144 | [[package]] 1145 | name = "r-efi" 1146 | version = "5.3.0" 1147 | source = "registry+https://github.com/rust-lang/crates.io-index" 1148 | checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 1149 | 1150 | [[package]] 1151 | name = "raw-window-handle" 1152 | version = "0.6.2" 1153 | source = "registry+https://github.com/rust-lang/crates.io-index" 1154 | checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" 1155 | 1156 | [[package]] 1157 | name = "rayon" 1158 | version = "1.11.0" 1159 | source = "registry+https://github.com/rust-lang/crates.io-index" 1160 | checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" 1161 | dependencies = [ 1162 | "either", 1163 | "rayon-core", 1164 | ] 1165 | 1166 | [[package]] 1167 | name = "rayon-core" 1168 | version = "1.13.0" 1169 | source = "registry+https://github.com/rust-lang/crates.io-index" 1170 | checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" 1171 | dependencies = [ 1172 | "crossbeam-deque", 1173 | "crossbeam-utils", 1174 | ] 1175 | 1176 | [[package]] 1177 | name = "redox_syscall" 1178 | version = "0.4.1" 1179 | source = "registry+https://github.com/rust-lang/crates.io-index" 1180 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 1181 | dependencies = [ 1182 | "bitflags 1.3.2", 1183 | ] 1184 | 1185 | [[package]] 1186 | name = "redox_syscall" 1187 | version = "0.5.17" 1188 | source = "registry+https://github.com/rust-lang/crates.io-index" 1189 | checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" 1190 | dependencies = [ 1191 | "bitflags 2.9.4", 1192 | ] 1193 | 1194 | [[package]] 1195 | name = "regex" 1196 | version = "1.11.2" 1197 | source = "registry+https://github.com/rust-lang/crates.io-index" 1198 | checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" 1199 | dependencies = [ 1200 | "aho-corasick", 1201 | "memchr", 1202 | "regex-automata", 1203 | "regex-syntax", 1204 | ] 1205 | 1206 | [[package]] 1207 | name = "regex-automata" 1208 | version = "0.4.10" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" 1211 | dependencies = [ 1212 | "aho-corasick", 1213 | "memchr", 1214 | "regex-syntax", 1215 | ] 1216 | 1217 | [[package]] 1218 | name = "regex-syntax" 1219 | version = "0.8.6" 1220 | source = "registry+https://github.com/rust-lang/crates.io-index" 1221 | checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" 1222 | 1223 | [[package]] 1224 | name = "run-wasm" 1225 | version = "0.1.0" 1226 | dependencies = [ 1227 | "cargo-run-wasm", 1228 | "wasm-bindgen", 1229 | ] 1230 | 1231 | [[package]] 1232 | name = "rustc-demangle" 1233 | version = "0.1.26" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 1236 | 1237 | [[package]] 1238 | name = "rustix" 1239 | version = "0.38.44" 1240 | source = "registry+https://github.com/rust-lang/crates.io-index" 1241 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 1242 | dependencies = [ 1243 | "bitflags 2.9.4", 1244 | "errno", 1245 | "libc", 1246 | "linux-raw-sys 0.4.15", 1247 | "windows-sys 0.59.0", 1248 | ] 1249 | 1250 | [[package]] 1251 | name = "rustix" 1252 | version = "1.1.2" 1253 | source = "registry+https://github.com/rust-lang/crates.io-index" 1254 | checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" 1255 | dependencies = [ 1256 | "bitflags 2.9.4", 1257 | "errno", 1258 | "libc", 1259 | "linux-raw-sys 0.11.0", 1260 | "windows-sys 0.61.0", 1261 | ] 1262 | 1263 | [[package]] 1264 | name = "rustversion" 1265 | version = "1.0.22" 1266 | source = "registry+https://github.com/rust-lang/crates.io-index" 1267 | checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 1268 | 1269 | [[package]] 1270 | name = "ryu" 1271 | version = "1.0.20" 1272 | source = "registry+https://github.com/rust-lang/crates.io-index" 1273 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1274 | 1275 | [[package]] 1276 | name = "same-file" 1277 | version = "1.0.6" 1278 | source = "registry+https://github.com/rust-lang/crates.io-index" 1279 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1280 | dependencies = [ 1281 | "winapi-util", 1282 | ] 1283 | 1284 | [[package]] 1285 | name = "scoped-tls" 1286 | version = "1.0.1" 1287 | source = "registry+https://github.com/rust-lang/crates.io-index" 1288 | checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 1289 | 1290 | [[package]] 1291 | name = "sctk-adwaita" 1292 | version = "0.10.1" 1293 | source = "registry+https://github.com/rust-lang/crates.io-index" 1294 | checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" 1295 | dependencies = [ 1296 | "ab_glyph", 1297 | "log", 1298 | "memmap2", 1299 | "smithay-client-toolkit", 1300 | "tiny-skia", 1301 | ] 1302 | 1303 | [[package]] 1304 | name = "semver" 1305 | version = "1.0.27" 1306 | source = "registry+https://github.com/rust-lang/crates.io-index" 1307 | checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 1308 | 1309 | [[package]] 1310 | name = "serde" 1311 | version = "1.0.225" 1312 | source = "registry+https://github.com/rust-lang/crates.io-index" 1313 | checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d" 1314 | dependencies = [ 1315 | "serde_core", 1316 | "serde_derive", 1317 | ] 1318 | 1319 | [[package]] 1320 | name = "serde_core" 1321 | version = "1.0.225" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383" 1324 | dependencies = [ 1325 | "serde_derive", 1326 | ] 1327 | 1328 | [[package]] 1329 | name = "serde_derive" 1330 | version = "1.0.225" 1331 | source = "registry+https://github.com/rust-lang/crates.io-index" 1332 | checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516" 1333 | dependencies = [ 1334 | "proc-macro2", 1335 | "quote", 1336 | "syn", 1337 | ] 1338 | 1339 | [[package]] 1340 | name = "serde_json" 1341 | version = "1.0.145" 1342 | source = "registry+https://github.com/rust-lang/crates.io-index" 1343 | checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 1344 | dependencies = [ 1345 | "itoa", 1346 | "memchr", 1347 | "ryu", 1348 | "serde", 1349 | "serde_core", 1350 | ] 1351 | 1352 | [[package]] 1353 | name = "shlex" 1354 | version = "1.3.0" 1355 | source = "registry+https://github.com/rust-lang/crates.io-index" 1356 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1357 | 1358 | [[package]] 1359 | name = "slab" 1360 | version = "0.4.11" 1361 | source = "registry+https://github.com/rust-lang/crates.io-index" 1362 | checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 1363 | 1364 | [[package]] 1365 | name = "smallvec" 1366 | version = "1.15.1" 1367 | source = "registry+https://github.com/rust-lang/crates.io-index" 1368 | checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 1369 | 1370 | [[package]] 1371 | name = "smithay-client-toolkit" 1372 | version = "0.19.2" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" 1375 | dependencies = [ 1376 | "bitflags 2.9.4", 1377 | "calloop", 1378 | "calloop-wayland-source", 1379 | "cursor-icon", 1380 | "libc", 1381 | "log", 1382 | "memmap2", 1383 | "rustix 0.38.44", 1384 | "thiserror", 1385 | "wayland-backend", 1386 | "wayland-client", 1387 | "wayland-csd-frame", 1388 | "wayland-cursor", 1389 | "wayland-protocols", 1390 | "wayland-protocols-wlr", 1391 | "wayland-scanner", 1392 | "xkeysym", 1393 | ] 1394 | 1395 | [[package]] 1396 | name = "smol_str" 1397 | version = "0.2.2" 1398 | source = "registry+https://github.com/rust-lang/crates.io-index" 1399 | checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" 1400 | dependencies = [ 1401 | "serde", 1402 | ] 1403 | 1404 | [[package]] 1405 | name = "stable_deref_trait" 1406 | version = "1.2.0" 1407 | source = "registry+https://github.com/rust-lang/crates.io-index" 1408 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1409 | 1410 | [[package]] 1411 | name = "strict-num" 1412 | version = "0.1.1" 1413 | source = "registry+https://github.com/rust-lang/crates.io-index" 1414 | checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" 1415 | 1416 | [[package]] 1417 | name = "syn" 1418 | version = "2.0.106" 1419 | source = "registry+https://github.com/rust-lang/crates.io-index" 1420 | checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" 1421 | dependencies = [ 1422 | "proc-macro2", 1423 | "quote", 1424 | "unicode-ident", 1425 | ] 1426 | 1427 | [[package]] 1428 | name = "tempfile" 1429 | version = "3.22.0" 1430 | source = "registry+https://github.com/rust-lang/crates.io-index" 1431 | checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" 1432 | dependencies = [ 1433 | "fastrand", 1434 | "getrandom", 1435 | "once_cell", 1436 | "rustix 1.1.2", 1437 | "windows-sys 0.61.0", 1438 | ] 1439 | 1440 | [[package]] 1441 | name = "thiserror" 1442 | version = "1.0.69" 1443 | source = "registry+https://github.com/rust-lang/crates.io-index" 1444 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1445 | dependencies = [ 1446 | "thiserror-impl", 1447 | ] 1448 | 1449 | [[package]] 1450 | name = "thiserror-impl" 1451 | version = "1.0.69" 1452 | source = "registry+https://github.com/rust-lang/crates.io-index" 1453 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1454 | dependencies = [ 1455 | "proc-macro2", 1456 | "quote", 1457 | "syn", 1458 | ] 1459 | 1460 | [[package]] 1461 | name = "tiny-skia" 1462 | version = "0.11.4" 1463 | source = "registry+https://github.com/rust-lang/crates.io-index" 1464 | checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" 1465 | dependencies = [ 1466 | "arrayref", 1467 | "arrayvec", 1468 | "bytemuck", 1469 | "cfg-if", 1470 | "log", 1471 | "tiny-skia-path", 1472 | ] 1473 | 1474 | [[package]] 1475 | name = "tiny-skia-path" 1476 | version = "0.11.4" 1477 | source = "registry+https://github.com/rust-lang/crates.io-index" 1478 | checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" 1479 | dependencies = [ 1480 | "arrayref", 1481 | "bytemuck", 1482 | "strict-num", 1483 | ] 1484 | 1485 | [[package]] 1486 | name = "toml_datetime" 1487 | version = "0.7.1" 1488 | source = "registry+https://github.com/rust-lang/crates.io-index" 1489 | checksum = "a197c0ec7d131bfc6f7e82c8442ba1595aeab35da7adbf05b6b73cd06a16b6be" 1490 | dependencies = [ 1491 | "serde_core", 1492 | ] 1493 | 1494 | [[package]] 1495 | name = "toml_edit" 1496 | version = "0.23.5" 1497 | source = "registry+https://github.com/rust-lang/crates.io-index" 1498 | checksum = "c2ad0b7ae9cfeef5605163839cb9221f453399f15cfb5c10be9885fcf56611f9" 1499 | dependencies = [ 1500 | "indexmap 2.11.3", 1501 | "toml_datetime", 1502 | "toml_parser", 1503 | "winnow", 1504 | ] 1505 | 1506 | [[package]] 1507 | name = "toml_parser" 1508 | version = "1.0.2" 1509 | source = "registry+https://github.com/rust-lang/crates.io-index" 1510 | checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10" 1511 | dependencies = [ 1512 | "winnow", 1513 | ] 1514 | 1515 | [[package]] 1516 | name = "tracing" 1517 | version = "0.1.41" 1518 | source = "registry+https://github.com/rust-lang/crates.io-index" 1519 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1520 | dependencies = [ 1521 | "pin-project-lite", 1522 | "tracing-core", 1523 | ] 1524 | 1525 | [[package]] 1526 | name = "tracing-core" 1527 | version = "0.1.34" 1528 | source = "registry+https://github.com/rust-lang/crates.io-index" 1529 | checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" 1530 | 1531 | [[package]] 1532 | name = "ttf-parser" 1533 | version = "0.25.1" 1534 | source = "registry+https://github.com/rust-lang/crates.io-index" 1535 | checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" 1536 | 1537 | [[package]] 1538 | name = "unicode-ident" 1539 | version = "1.0.19" 1540 | source = "registry+https://github.com/rust-lang/crates.io-index" 1541 | checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" 1542 | 1543 | [[package]] 1544 | name = "unicode-segmentation" 1545 | version = "1.12.0" 1546 | source = "registry+https://github.com/rust-lang/crates.io-index" 1547 | checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 1548 | 1549 | [[package]] 1550 | name = "utf8parse" 1551 | version = "0.2.2" 1552 | source = "registry+https://github.com/rust-lang/crates.io-index" 1553 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 1554 | 1555 | [[package]] 1556 | name = "version_check" 1557 | version = "0.9.5" 1558 | source = "registry+https://github.com/rust-lang/crates.io-index" 1559 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1560 | 1561 | [[package]] 1562 | name = "walkdir" 1563 | version = "2.5.0" 1564 | source = "registry+https://github.com/rust-lang/crates.io-index" 1565 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 1566 | dependencies = [ 1567 | "same-file", 1568 | "winapi-util", 1569 | ] 1570 | 1571 | [[package]] 1572 | name = "walrus" 1573 | version = "0.23.3" 1574 | source = "registry+https://github.com/rust-lang/crates.io-index" 1575 | checksum = "6481311b98508f4bc2d0abbfa5d42172e7a54b4b24d8f15e28b0dc650be0c59f" 1576 | dependencies = [ 1577 | "anyhow", 1578 | "gimli", 1579 | "id-arena", 1580 | "leb128", 1581 | "log", 1582 | "rayon", 1583 | "walrus-macro", 1584 | "wasm-encoder", 1585 | "wasmparser", 1586 | ] 1587 | 1588 | [[package]] 1589 | name = "walrus-macro" 1590 | version = "0.22.0" 1591 | source = "registry+https://github.com/rust-lang/crates.io-index" 1592 | checksum = "439ad39ff894c43c9649fa724cdde9a6fc50b855d517ef071a93e5df82fe51d3" 1593 | dependencies = [ 1594 | "heck", 1595 | "proc-macro2", 1596 | "quote", 1597 | "syn", 1598 | ] 1599 | 1600 | [[package]] 1601 | name = "wasi" 1602 | version = "0.14.7+wasi-0.2.4" 1603 | source = "registry+https://github.com/rust-lang/crates.io-index" 1604 | checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" 1605 | dependencies = [ 1606 | "wasip2", 1607 | ] 1608 | 1609 | [[package]] 1610 | name = "wasip2" 1611 | version = "1.0.1+wasi-0.2.4" 1612 | source = "registry+https://github.com/rust-lang/crates.io-index" 1613 | checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 1614 | dependencies = [ 1615 | "wit-bindgen", 1616 | ] 1617 | 1618 | [[package]] 1619 | name = "wasm-bindgen" 1620 | version = "0.2.100" 1621 | source = "registry+https://github.com/rust-lang/crates.io-index" 1622 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 1623 | dependencies = [ 1624 | "cfg-if", 1625 | "once_cell", 1626 | "rustversion", 1627 | "wasm-bindgen-macro", 1628 | ] 1629 | 1630 | [[package]] 1631 | name = "wasm-bindgen-backend" 1632 | version = "0.2.100" 1633 | source = "registry+https://github.com/rust-lang/crates.io-index" 1634 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 1635 | dependencies = [ 1636 | "bumpalo", 1637 | "log", 1638 | "proc-macro2", 1639 | "quote", 1640 | "syn", 1641 | "wasm-bindgen-shared", 1642 | ] 1643 | 1644 | [[package]] 1645 | name = "wasm-bindgen-cli-support" 1646 | version = "0.2.100" 1647 | source = "registry+https://github.com/rust-lang/crates.io-index" 1648 | checksum = "21e1a4a49abe9cd6f762fc65fac2ef5732afeeb66be369d2f71a85b165a533cf" 1649 | dependencies = [ 1650 | "anyhow", 1651 | "base64", 1652 | "log", 1653 | "rustc-demangle", 1654 | "serde", 1655 | "serde_json", 1656 | "tempfile", 1657 | "walrus", 1658 | "wasm-bindgen-externref-xform", 1659 | "wasm-bindgen-multi-value-xform", 1660 | "wasm-bindgen-shared", 1661 | "wasm-bindgen-threads-xform", 1662 | "wasm-bindgen-wasm-conventions", 1663 | "wasm-bindgen-wasm-interpreter", 1664 | ] 1665 | 1666 | [[package]] 1667 | name = "wasm-bindgen-externref-xform" 1668 | version = "0.2.100" 1669 | source = "registry+https://github.com/rust-lang/crates.io-index" 1670 | checksum = "940542c5cdbe96c35f98b5da5c65fb9d18df55a0cb1d81fc5ca4acc4fda4d61c" 1671 | dependencies = [ 1672 | "anyhow", 1673 | "walrus", 1674 | "wasm-bindgen-wasm-conventions", 1675 | ] 1676 | 1677 | [[package]] 1678 | name = "wasm-bindgen-futures" 1679 | version = "0.4.50" 1680 | source = "registry+https://github.com/rust-lang/crates.io-index" 1681 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 1682 | dependencies = [ 1683 | "cfg-if", 1684 | "js-sys", 1685 | "once_cell", 1686 | "wasm-bindgen", 1687 | "web-sys", 1688 | ] 1689 | 1690 | [[package]] 1691 | name = "wasm-bindgen-macro" 1692 | version = "0.2.100" 1693 | source = "registry+https://github.com/rust-lang/crates.io-index" 1694 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 1695 | dependencies = [ 1696 | "quote", 1697 | "wasm-bindgen-macro-support", 1698 | ] 1699 | 1700 | [[package]] 1701 | name = "wasm-bindgen-macro-support" 1702 | version = "0.2.100" 1703 | source = "registry+https://github.com/rust-lang/crates.io-index" 1704 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 1705 | dependencies = [ 1706 | "proc-macro2", 1707 | "quote", 1708 | "syn", 1709 | "wasm-bindgen-backend", 1710 | "wasm-bindgen-shared", 1711 | ] 1712 | 1713 | [[package]] 1714 | name = "wasm-bindgen-multi-value-xform" 1715 | version = "0.2.100" 1716 | source = "registry+https://github.com/rust-lang/crates.io-index" 1717 | checksum = "64b5ad2e97adde0c3e4369c38e0dbaee329ad8f6cc2ee8e01d1d0b13bd8b14cf" 1718 | dependencies = [ 1719 | "anyhow", 1720 | "walrus", 1721 | "wasm-bindgen-wasm-conventions", 1722 | ] 1723 | 1724 | [[package]] 1725 | name = "wasm-bindgen-shared" 1726 | version = "0.2.100" 1727 | source = "registry+https://github.com/rust-lang/crates.io-index" 1728 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 1729 | dependencies = [ 1730 | "unicode-ident", 1731 | ] 1732 | 1733 | [[package]] 1734 | name = "wasm-bindgen-threads-xform" 1735 | version = "0.2.100" 1736 | source = "registry+https://github.com/rust-lang/crates.io-index" 1737 | checksum = "1cbdf2d55a50f7edc9dd9aecae7a3a40e9736fda851bd8816f98a86167c8c277" 1738 | dependencies = [ 1739 | "anyhow", 1740 | "walrus", 1741 | "wasm-bindgen-wasm-conventions", 1742 | ] 1743 | 1744 | [[package]] 1745 | name = "wasm-bindgen-wasm-conventions" 1746 | version = "0.2.100" 1747 | source = "registry+https://github.com/rust-lang/crates.io-index" 1748 | checksum = "b1c24fcaa34d2d84407122cfb1d3f37c3586756cf462be18e049b49245a16c08" 1749 | dependencies = [ 1750 | "anyhow", 1751 | "leb128", 1752 | "log", 1753 | "walrus", 1754 | "wasmparser", 1755 | ] 1756 | 1757 | [[package]] 1758 | name = "wasm-bindgen-wasm-interpreter" 1759 | version = "0.2.100" 1760 | source = "registry+https://github.com/rust-lang/crates.io-index" 1761 | checksum = "33f24921401faadd6944206f9d6837d07bbb5ff766ed51ad34528089f66550e0" 1762 | dependencies = [ 1763 | "anyhow", 1764 | "log", 1765 | "walrus", 1766 | "wasm-bindgen-wasm-conventions", 1767 | ] 1768 | 1769 | [[package]] 1770 | name = "wasm-encoder" 1771 | version = "0.214.0" 1772 | source = "registry+https://github.com/rust-lang/crates.io-index" 1773 | checksum = "ff694f02a8d7a50b6922b197ae03883fbf18cdb2ae9fbee7b6148456f5f44041" 1774 | dependencies = [ 1775 | "leb128", 1776 | ] 1777 | 1778 | [[package]] 1779 | name = "wasmparser" 1780 | version = "0.214.0" 1781 | source = "registry+https://github.com/rust-lang/crates.io-index" 1782 | checksum = "5309c1090e3e84dad0d382f42064e9933fdaedb87e468cc239f0eabea73ddcb6" 1783 | dependencies = [ 1784 | "ahash", 1785 | "bitflags 2.9.4", 1786 | "hashbrown 0.14.5", 1787 | "indexmap 2.11.3", 1788 | "semver", 1789 | "serde", 1790 | ] 1791 | 1792 | [[package]] 1793 | name = "wayland-backend" 1794 | version = "0.3.11" 1795 | source = "registry+https://github.com/rust-lang/crates.io-index" 1796 | checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" 1797 | dependencies = [ 1798 | "cc", 1799 | "downcast-rs", 1800 | "rustix 1.1.2", 1801 | "scoped-tls", 1802 | "smallvec", 1803 | "wayland-sys", 1804 | ] 1805 | 1806 | [[package]] 1807 | name = "wayland-client" 1808 | version = "0.31.11" 1809 | source = "registry+https://github.com/rust-lang/crates.io-index" 1810 | checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" 1811 | dependencies = [ 1812 | "bitflags 2.9.4", 1813 | "rustix 1.1.2", 1814 | "wayland-backend", 1815 | "wayland-scanner", 1816 | ] 1817 | 1818 | [[package]] 1819 | name = "wayland-csd-frame" 1820 | version = "0.3.0" 1821 | source = "registry+https://github.com/rust-lang/crates.io-index" 1822 | checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" 1823 | dependencies = [ 1824 | "bitflags 2.9.4", 1825 | "cursor-icon", 1826 | "wayland-backend", 1827 | ] 1828 | 1829 | [[package]] 1830 | name = "wayland-cursor" 1831 | version = "0.31.11" 1832 | source = "registry+https://github.com/rust-lang/crates.io-index" 1833 | checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29" 1834 | dependencies = [ 1835 | "rustix 1.1.2", 1836 | "wayland-client", 1837 | "xcursor", 1838 | ] 1839 | 1840 | [[package]] 1841 | name = "wayland-protocols" 1842 | version = "0.32.9" 1843 | source = "registry+https://github.com/rust-lang/crates.io-index" 1844 | checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" 1845 | dependencies = [ 1846 | "bitflags 2.9.4", 1847 | "wayland-backend", 1848 | "wayland-client", 1849 | "wayland-scanner", 1850 | ] 1851 | 1852 | [[package]] 1853 | name = "wayland-protocols-plasma" 1854 | version = "0.3.9" 1855 | source = "registry+https://github.com/rust-lang/crates.io-index" 1856 | checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" 1857 | dependencies = [ 1858 | "bitflags 2.9.4", 1859 | "wayland-backend", 1860 | "wayland-client", 1861 | "wayland-protocols", 1862 | "wayland-scanner", 1863 | ] 1864 | 1865 | [[package]] 1866 | name = "wayland-protocols-wlr" 1867 | version = "0.3.9" 1868 | source = "registry+https://github.com/rust-lang/crates.io-index" 1869 | checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" 1870 | dependencies = [ 1871 | "bitflags 2.9.4", 1872 | "wayland-backend", 1873 | "wayland-client", 1874 | "wayland-protocols", 1875 | "wayland-scanner", 1876 | ] 1877 | 1878 | [[package]] 1879 | name = "wayland-scanner" 1880 | version = "0.31.7" 1881 | source = "registry+https://github.com/rust-lang/crates.io-index" 1882 | checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" 1883 | dependencies = [ 1884 | "proc-macro2", 1885 | "quick-xml", 1886 | "quote", 1887 | ] 1888 | 1889 | [[package]] 1890 | name = "wayland-sys" 1891 | version = "0.31.7" 1892 | source = "registry+https://github.com/rust-lang/crates.io-index" 1893 | checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" 1894 | dependencies = [ 1895 | "dlib", 1896 | "log", 1897 | "once_cell", 1898 | "pkg-config", 1899 | ] 1900 | 1901 | [[package]] 1902 | name = "web-sys" 1903 | version = "0.3.77" 1904 | source = "registry+https://github.com/rust-lang/crates.io-index" 1905 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 1906 | dependencies = [ 1907 | "js-sys", 1908 | "wasm-bindgen", 1909 | ] 1910 | 1911 | [[package]] 1912 | name = "web-time" 1913 | version = "1.1.0" 1914 | source = "registry+https://github.com/rust-lang/crates.io-index" 1915 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 1916 | dependencies = [ 1917 | "js-sys", 1918 | "wasm-bindgen", 1919 | ] 1920 | 1921 | [[package]] 1922 | name = "winapi-util" 1923 | version = "0.1.11" 1924 | source = "registry+https://github.com/rust-lang/crates.io-index" 1925 | checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 1926 | dependencies = [ 1927 | "windows-sys 0.61.0", 1928 | ] 1929 | 1930 | [[package]] 1931 | name = "windows-link" 1932 | version = "0.1.3" 1933 | source = "registry+https://github.com/rust-lang/crates.io-index" 1934 | checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 1935 | 1936 | [[package]] 1937 | name = "windows-link" 1938 | version = "0.2.0" 1939 | source = "registry+https://github.com/rust-lang/crates.io-index" 1940 | checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" 1941 | 1942 | [[package]] 1943 | name = "windows-sys" 1944 | version = "0.45.0" 1945 | source = "registry+https://github.com/rust-lang/crates.io-index" 1946 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 1947 | dependencies = [ 1948 | "windows-targets 0.42.2", 1949 | ] 1950 | 1951 | [[package]] 1952 | name = "windows-sys" 1953 | version = "0.52.0" 1954 | source = "registry+https://github.com/rust-lang/crates.io-index" 1955 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1956 | dependencies = [ 1957 | "windows-targets 0.52.6", 1958 | ] 1959 | 1960 | [[package]] 1961 | name = "windows-sys" 1962 | version = "0.59.0" 1963 | source = "registry+https://github.com/rust-lang/crates.io-index" 1964 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1965 | dependencies = [ 1966 | "windows-targets 0.52.6", 1967 | ] 1968 | 1969 | [[package]] 1970 | name = "windows-sys" 1971 | version = "0.60.2" 1972 | source = "registry+https://github.com/rust-lang/crates.io-index" 1973 | checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 1974 | dependencies = [ 1975 | "windows-targets 0.53.3", 1976 | ] 1977 | 1978 | [[package]] 1979 | name = "windows-sys" 1980 | version = "0.61.0" 1981 | source = "registry+https://github.com/rust-lang/crates.io-index" 1982 | checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" 1983 | dependencies = [ 1984 | "windows-link 0.2.0", 1985 | ] 1986 | 1987 | [[package]] 1988 | name = "windows-targets" 1989 | version = "0.42.2" 1990 | source = "registry+https://github.com/rust-lang/crates.io-index" 1991 | checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 1992 | dependencies = [ 1993 | "windows_aarch64_gnullvm 0.42.2", 1994 | "windows_aarch64_msvc 0.42.2", 1995 | "windows_i686_gnu 0.42.2", 1996 | "windows_i686_msvc 0.42.2", 1997 | "windows_x86_64_gnu 0.42.2", 1998 | "windows_x86_64_gnullvm 0.42.2", 1999 | "windows_x86_64_msvc 0.42.2", 2000 | ] 2001 | 2002 | [[package]] 2003 | name = "windows-targets" 2004 | version = "0.52.6" 2005 | source = "registry+https://github.com/rust-lang/crates.io-index" 2006 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2007 | dependencies = [ 2008 | "windows_aarch64_gnullvm 0.52.6", 2009 | "windows_aarch64_msvc 0.52.6", 2010 | "windows_i686_gnu 0.52.6", 2011 | "windows_i686_gnullvm 0.52.6", 2012 | "windows_i686_msvc 0.52.6", 2013 | "windows_x86_64_gnu 0.52.6", 2014 | "windows_x86_64_gnullvm 0.52.6", 2015 | "windows_x86_64_msvc 0.52.6", 2016 | ] 2017 | 2018 | [[package]] 2019 | name = "windows-targets" 2020 | version = "0.53.3" 2021 | source = "registry+https://github.com/rust-lang/crates.io-index" 2022 | checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 2023 | dependencies = [ 2024 | "windows-link 0.1.3", 2025 | "windows_aarch64_gnullvm 0.53.0", 2026 | "windows_aarch64_msvc 0.53.0", 2027 | "windows_i686_gnu 0.53.0", 2028 | "windows_i686_gnullvm 0.53.0", 2029 | "windows_i686_msvc 0.53.0", 2030 | "windows_x86_64_gnu 0.53.0", 2031 | "windows_x86_64_gnullvm 0.53.0", 2032 | "windows_x86_64_msvc 0.53.0", 2033 | ] 2034 | 2035 | [[package]] 2036 | name = "windows_aarch64_gnullvm" 2037 | version = "0.42.2" 2038 | source = "registry+https://github.com/rust-lang/crates.io-index" 2039 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 2040 | 2041 | [[package]] 2042 | name = "windows_aarch64_gnullvm" 2043 | version = "0.52.6" 2044 | source = "registry+https://github.com/rust-lang/crates.io-index" 2045 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2046 | 2047 | [[package]] 2048 | name = "windows_aarch64_gnullvm" 2049 | version = "0.53.0" 2050 | source = "registry+https://github.com/rust-lang/crates.io-index" 2051 | checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 2052 | 2053 | [[package]] 2054 | name = "windows_aarch64_msvc" 2055 | version = "0.42.2" 2056 | source = "registry+https://github.com/rust-lang/crates.io-index" 2057 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 2058 | 2059 | [[package]] 2060 | name = "windows_aarch64_msvc" 2061 | version = "0.52.6" 2062 | source = "registry+https://github.com/rust-lang/crates.io-index" 2063 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2064 | 2065 | [[package]] 2066 | name = "windows_aarch64_msvc" 2067 | version = "0.53.0" 2068 | source = "registry+https://github.com/rust-lang/crates.io-index" 2069 | checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 2070 | 2071 | [[package]] 2072 | name = "windows_i686_gnu" 2073 | version = "0.42.2" 2074 | source = "registry+https://github.com/rust-lang/crates.io-index" 2075 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 2076 | 2077 | [[package]] 2078 | name = "windows_i686_gnu" 2079 | version = "0.52.6" 2080 | source = "registry+https://github.com/rust-lang/crates.io-index" 2081 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2082 | 2083 | [[package]] 2084 | name = "windows_i686_gnu" 2085 | version = "0.53.0" 2086 | source = "registry+https://github.com/rust-lang/crates.io-index" 2087 | checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 2088 | 2089 | [[package]] 2090 | name = "windows_i686_gnullvm" 2091 | version = "0.52.6" 2092 | source = "registry+https://github.com/rust-lang/crates.io-index" 2093 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2094 | 2095 | [[package]] 2096 | name = "windows_i686_gnullvm" 2097 | version = "0.53.0" 2098 | source = "registry+https://github.com/rust-lang/crates.io-index" 2099 | checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 2100 | 2101 | [[package]] 2102 | name = "windows_i686_msvc" 2103 | version = "0.42.2" 2104 | source = "registry+https://github.com/rust-lang/crates.io-index" 2105 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 2106 | 2107 | [[package]] 2108 | name = "windows_i686_msvc" 2109 | version = "0.52.6" 2110 | source = "registry+https://github.com/rust-lang/crates.io-index" 2111 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2112 | 2113 | [[package]] 2114 | name = "windows_i686_msvc" 2115 | version = "0.53.0" 2116 | source = "registry+https://github.com/rust-lang/crates.io-index" 2117 | checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 2118 | 2119 | [[package]] 2120 | name = "windows_x86_64_gnu" 2121 | version = "0.42.2" 2122 | source = "registry+https://github.com/rust-lang/crates.io-index" 2123 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 2124 | 2125 | [[package]] 2126 | name = "windows_x86_64_gnu" 2127 | version = "0.52.6" 2128 | source = "registry+https://github.com/rust-lang/crates.io-index" 2129 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2130 | 2131 | [[package]] 2132 | name = "windows_x86_64_gnu" 2133 | version = "0.53.0" 2134 | source = "registry+https://github.com/rust-lang/crates.io-index" 2135 | checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 2136 | 2137 | [[package]] 2138 | name = "windows_x86_64_gnullvm" 2139 | version = "0.42.2" 2140 | source = "registry+https://github.com/rust-lang/crates.io-index" 2141 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 2142 | 2143 | [[package]] 2144 | name = "windows_x86_64_gnullvm" 2145 | version = "0.52.6" 2146 | source = "registry+https://github.com/rust-lang/crates.io-index" 2147 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2148 | 2149 | [[package]] 2150 | name = "windows_x86_64_gnullvm" 2151 | version = "0.53.0" 2152 | source = "registry+https://github.com/rust-lang/crates.io-index" 2153 | checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 2154 | 2155 | [[package]] 2156 | name = "windows_x86_64_msvc" 2157 | version = "0.42.2" 2158 | source = "registry+https://github.com/rust-lang/crates.io-index" 2159 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 2160 | 2161 | [[package]] 2162 | name = "windows_x86_64_msvc" 2163 | version = "0.52.6" 2164 | source = "registry+https://github.com/rust-lang/crates.io-index" 2165 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2166 | 2167 | [[package]] 2168 | name = "windows_x86_64_msvc" 2169 | version = "0.53.0" 2170 | source = "registry+https://github.com/rust-lang/crates.io-index" 2171 | checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 2172 | 2173 | [[package]] 2174 | name = "winit" 2175 | version = "0.30.12" 2176 | source = "registry+https://github.com/rust-lang/crates.io-index" 2177 | checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" 2178 | dependencies = [ 2179 | "ahash", 2180 | "android-activity", 2181 | "atomic-waker", 2182 | "bitflags 2.9.4", 2183 | "block2", 2184 | "bytemuck", 2185 | "calloop", 2186 | "cfg_aliases", 2187 | "concurrent-queue", 2188 | "core-foundation", 2189 | "core-graphics", 2190 | "cursor-icon", 2191 | "dpi", 2192 | "js-sys", 2193 | "libc", 2194 | "memmap2", 2195 | "ndk", 2196 | "objc2", 2197 | "objc2-app-kit", 2198 | "objc2-foundation", 2199 | "objc2-ui-kit", 2200 | "orbclient", 2201 | "percent-encoding", 2202 | "pin-project", 2203 | "raw-window-handle", 2204 | "redox_syscall 0.4.1", 2205 | "rustix 0.38.44", 2206 | "sctk-adwaita", 2207 | "smithay-client-toolkit", 2208 | "smol_str", 2209 | "tracing", 2210 | "unicode-segmentation", 2211 | "wasm-bindgen", 2212 | "wasm-bindgen-futures", 2213 | "wayland-backend", 2214 | "wayland-client", 2215 | "wayland-protocols", 2216 | "wayland-protocols-plasma", 2217 | "web-sys", 2218 | "web-time", 2219 | "windows-sys 0.52.0", 2220 | "x11-dl", 2221 | "x11rb", 2222 | "xkbcommon-dl", 2223 | ] 2224 | 2225 | [[package]] 2226 | name = "winit_input_helper" 2227 | version = "0.17.0" 2228 | dependencies = [ 2229 | "console_error_panic_hook", 2230 | "console_log", 2231 | "env_logger", 2232 | "log", 2233 | "web-time", 2234 | "winit", 2235 | ] 2236 | 2237 | [[package]] 2238 | name = "winnow" 2239 | version = "0.7.13" 2240 | source = "registry+https://github.com/rust-lang/crates.io-index" 2241 | checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" 2242 | dependencies = [ 2243 | "memchr", 2244 | ] 2245 | 2246 | [[package]] 2247 | name = "wit-bindgen" 2248 | version = "0.46.0" 2249 | source = "registry+https://github.com/rust-lang/crates.io-index" 2250 | checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" 2251 | 2252 | [[package]] 2253 | name = "x11-dl" 2254 | version = "2.21.0" 2255 | source = "registry+https://github.com/rust-lang/crates.io-index" 2256 | checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" 2257 | dependencies = [ 2258 | "libc", 2259 | "once_cell", 2260 | "pkg-config", 2261 | ] 2262 | 2263 | [[package]] 2264 | name = "x11rb" 2265 | version = "0.13.2" 2266 | source = "registry+https://github.com/rust-lang/crates.io-index" 2267 | checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" 2268 | dependencies = [ 2269 | "as-raw-xcb-connection", 2270 | "gethostname", 2271 | "libc", 2272 | "libloading", 2273 | "once_cell", 2274 | "rustix 1.1.2", 2275 | "x11rb-protocol", 2276 | ] 2277 | 2278 | [[package]] 2279 | name = "x11rb-protocol" 2280 | version = "0.13.2" 2281 | source = "registry+https://github.com/rust-lang/crates.io-index" 2282 | checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" 2283 | 2284 | [[package]] 2285 | name = "xcursor" 2286 | version = "0.3.10" 2287 | source = "registry+https://github.com/rust-lang/crates.io-index" 2288 | checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" 2289 | 2290 | [[package]] 2291 | name = "xkbcommon-dl" 2292 | version = "0.4.2" 2293 | source = "registry+https://github.com/rust-lang/crates.io-index" 2294 | checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" 2295 | dependencies = [ 2296 | "bitflags 2.9.4", 2297 | "dlib", 2298 | "log", 2299 | "once_cell", 2300 | "xkeysym", 2301 | ] 2302 | 2303 | [[package]] 2304 | name = "xkeysym" 2305 | version = "0.2.1" 2306 | source = "registry+https://github.com/rust-lang/crates.io-index" 2307 | checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" 2308 | 2309 | [[package]] 2310 | name = "zerocopy" 2311 | version = "0.8.27" 2312 | source = "registry+https://github.com/rust-lang/crates.io-index" 2313 | checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" 2314 | dependencies = [ 2315 | "zerocopy-derive", 2316 | ] 2317 | 2318 | [[package]] 2319 | name = "zerocopy-derive" 2320 | version = "0.8.27" 2321 | source = "registry+https://github.com/rust-lang/crates.io-index" 2322 | checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" 2323 | dependencies = [ 2324 | "proc-macro2", 2325 | "quote", 2326 | "syn", 2327 | ] 2328 | --------------------------------------------------------------------------------