├── .github ├── FUNDING.yml └── workflows │ ├── build_linux.yml │ ├── build_macos.yml │ └── build_windows.yml ├── .gitignore ├── BUILDING.md ├── CHANGELOG.md ├── Cargo.lock ├── Cargo.toml ├── LICENSE.txt ├── README.md ├── build-linux-appimage.sh ├── build-mac-bundle.sh ├── build.rs ├── icons ├── 128x128 │ └── sysex-drop.png ├── 16x16 │ └── sysex-drop.png ├── 256x256 │ └── sysex-drop.png ├── 32x32 │ └── sysex-drop.png ├── 64x64 │ ├── sysex-drop.ico │ └── sysex-drop.png └── sysex-drop.svg ├── screenshot.png ├── src ├── main.rs ├── midi.rs └── theme.rs ├── tools ├── mac_bundle_post_build.py └── sysex-drop.desktop └── wix ├── License.rtf └── main.wxs /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: https://www.buymeacoffee.com/sourcebox 2 | -------------------------------------------------------------------------------- /.github/workflows/build_linux.yml: -------------------------------------------------------------------------------- 1 | name: Build Linux 2 | 3 | on: 4 | workflow_dispatch 5 | 6 | env: 7 | CARGO_TERM_COLOR: always 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-20.04 13 | 14 | env: 15 | PROJECT_NAME: ${{ github.event.repository.name }} 16 | 17 | steps: 18 | - uses: actions/checkout@v2 19 | 20 | - name: Install Requirements 21 | run: | 22 | export DEBIAN_FRONTED=noninteractive 23 | sudo apt-get -qq update 24 | sudo apt-get install libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev 25 | sudo apt-get install libasound2-dev 26 | 27 | - name: Install LinuxDeploy 28 | uses: miurahr/install-linuxdeploy-action@v1 29 | with: 30 | plugins: appimage 31 | 32 | - name: Install cargo-deb 33 | run: cargo install cargo-deb 34 | 35 | - name: Build AppImage 36 | run: ./build-linux-appimage.sh 37 | 38 | - name: Archive AppImage 39 | uses: actions/upload-artifact@v2 40 | with: 41 | name: ${{ env.PROJECT_NAME }}-x86_64.AppImage 42 | path: target/release/appimage/*.AppImage 43 | 44 | - name: Pack .deb package 45 | run: cargo deb --no-build 46 | 47 | - name: Archive .deb package 48 | uses: actions/upload-artifact@v2 49 | with: 50 | name: ${{ env.PROJECT_NAME }}-x86_64.deb 51 | path: target/debian/*.deb 52 | -------------------------------------------------------------------------------- /.github/workflows/build_macos.yml: -------------------------------------------------------------------------------- 1 | name: Build macOS 2 | 3 | on: 4 | workflow_dispatch 5 | 6 | env: 7 | CARGO_TERM_COLOR: always 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: macos-11 13 | 14 | env: 15 | PROJECT_NAME: ${{ github.event.repository.name }} 16 | 17 | steps: 18 | - uses: actions/checkout@v2 19 | 20 | - name: Install cargo-bundle 21 | run: cargo install cargo-bundle 22 | 23 | - name: Build DMG 24 | run: ./build-mac-bundle.sh 25 | 26 | - name: Archive DMG 27 | uses: actions/upload-artifact@v2 28 | with: 29 | name: ${{ env.PROJECT_NAME }}-x86_64.dmg 30 | path: target/release/bundle/osx/*.dmg 31 | -------------------------------------------------------------------------------- /.github/workflows/build_windows.yml: -------------------------------------------------------------------------------- 1 | name: Build Windows 2 | 3 | on: 4 | workflow_dispatch 5 | 6 | env: 7 | CARGO_TERM_COLOR: always 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: windows-latest 13 | 14 | env: 15 | PROJECT_NAME: ${{ github.event.repository.name }} 16 | 17 | steps: 18 | - uses: actions/checkout@v2 19 | 20 | - name: Install cargo-wix 21 | run: cargo install cargo-wix 22 | 23 | - name: Build 24 | run: cargo build --release 25 | 26 | - name: Archive .exe 27 | uses: actions/upload-artifact@v2 28 | with: 29 | name: ${{ env.PROJECT_NAME }}-x86_64-pc-windows-msvc.exe 30 | path: target/release/*.exe 31 | 32 | - name: Build installer 33 | run: cargo wix 34 | 35 | - name: Archive .msi 36 | uses: actions/upload-artifact@v2 37 | with: 38 | name: ${{ env.PROJECT_NAME }}-x86_64-pc-windows-msvc.msi 39 | path: target/wix/*.msi 40 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /.vscode 3 | -------------------------------------------------------------------------------- /BUILDING.md: -------------------------------------------------------------------------------- 1 | # Building 2 | 3 | ## Requirements 4 | 5 | - [Rust toolchain](https://www.rust-lang.org/) 6 | 7 | On Linux, a couple of additional dependencies must be installed: 8 | 9 | - libxcb-render0-dev 10 | - libxcb-shape0-dev 11 | - libxcb-xfixes0-dev 12 | - libxkbcommon-dev 13 | 14 | ### Mac Application Bundle (optional) 15 | 16 | To build a macOS application bundle, additional dependencies must be installed: 17 | 18 | - [cargo-bundle](https://github.com/burtonageo/cargo-bundle) 19 | - [Python3](https://python.org) (any recent version should work) 20 | 21 | Run `./build-mac-bundle.sh` from the project directory. Make sure the script has executable permissions. 22 | The bundle will be created in the `./target/release/bundle/osx` directory. 23 | 24 | ### Linux AppImage (optional) 25 | 26 | To build an AppImage for Linux, additional dependencies must be installed: 27 | 28 | - [linuxdeploy](https://github.com/linuxdeploy/linuxdeploy) 29 | - [linuxdeploy-plugin-appimage](https://github.com/linuxdeploy/linuxdeploy-plugin-appimage) 30 | 31 | Run `./build-linux-appimage.sh` from the project directory. Make sure the script has executable permissions. 32 | The AppImage will be created in the `./target/release/appimage` directory. 33 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [1.4.0] - 2023-12-03 9 | 10 | ### Added 11 | 12 | - Always on top feature for application window. 13 | - Global zoom via `Cmd-Plus`, `Cmd-Minus` and `Cmd-0`. 14 | 15 | ### Changed 16 | 17 | - Custom styling. 18 | - Updated `eframe` dependency to `0.24` 19 | 20 | ### Fixed 21 | 22 | - Restore window position between launches correctly on macOS. 23 | 24 | ## [1.3.0] - 2023-02-24 25 | 26 | ### Changed 27 | 28 | - Increased upper limit for packet delay to 5 seconds. 29 | - Updated `eframe` dependency to `0.21` 30 | 31 | ### Fixed 32 | 33 | - Show error message instead of panic when MIDI port is unavailable. 34 | - Restore window position between launches correctly on Linux and Windows. 35 | - Save persistent settings on macOS when Cmd-Q is pressed. 36 | 37 | ## [1.2.0] - 2022-04-25 38 | 39 | ### Added 40 | 41 | - Auto-Start feature. 42 | - Frame rate limit to reduce CPU load. 43 | - Strip symbols from release builds to reduce binary size. 44 | 45 | ### Changed 46 | 47 | - Set window size on startup using an alternative method. 48 | 49 | ## [1.1.0] - 2022-01-26 50 | 51 | ### Added 52 | 53 | - Support for Standard MIDI Files (SMF). 54 | - Automatic device rescan on MIDI output ports change. 55 | 56 | ### Changed 57 | 58 | - Updated `eframe` dependency to `0.16` 59 | - Updated `simple_logger` dependency to `2.1`. Now using UTC timestamps. 60 | 61 | ### Removed 62 | 63 | - Rescan button. Device changes are now detected automatically. 64 | 65 | ## [1.0.0] - 2021-10-31 66 | 67 | First stable release. 68 | 69 | ## [0.1.0] - No date specified 70 | 71 | Development release for initial testing. 72 | -------------------------------------------------------------------------------- /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.23" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "80179d7dd5d7e8c285d67c4a1e652972a92de7475beddfb92028c76463b13225" 10 | dependencies = [ 11 | "ab_glyph_rasterizer", 12 | "owned_ttf_parser", 13 | ] 14 | 15 | [[package]] 16 | name = "ab_glyph_rasterizer" 17 | version = "0.1.8" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" 20 | 21 | [[package]] 22 | name = "accesskit" 23 | version = "0.12.1" 24 | source = "registry+https://github.com/rust-lang/crates.io-index" 25 | checksum = "ca8410747ed85a17c4a1e9ed3f5a74d3e7bdcc876cf9a18ff40ae21d645997b2" 26 | dependencies = [ 27 | "enumn", 28 | "serde", 29 | ] 30 | 31 | [[package]] 32 | name = "accesskit_consumer" 33 | version = "0.16.1" 34 | source = "registry+https://github.com/rust-lang/crates.io-index" 35 | checksum = "8c17cca53c09fbd7288667b22a201274b9becaa27f0b91bf52a526db95de45e6" 36 | dependencies = [ 37 | "accesskit", 38 | ] 39 | 40 | [[package]] 41 | name = "accesskit_macos" 42 | version = "0.10.1" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | checksum = "cd3b6ae1eabbfbced10e840fd3fce8a93ae84f174b3e4ba892ab7bcb42e477a7" 45 | dependencies = [ 46 | "accesskit", 47 | "accesskit_consumer", 48 | "objc2", 49 | "once_cell", 50 | ] 51 | 52 | [[package]] 53 | name = "accesskit_unix" 54 | version = "0.6.1" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "6c8c9b4467d77cacfbc93cee9aa8e7822f6d527c774efdca5f8b3a5280c34847" 57 | dependencies = [ 58 | "accesskit", 59 | "accesskit_consumer", 60 | "async-channel 1.9.0", 61 | "async-once-cell", 62 | "atspi", 63 | "futures-lite 1.13.0", 64 | "once_cell", 65 | "serde", 66 | "zbus", 67 | ] 68 | 69 | [[package]] 70 | name = "accesskit_windows" 71 | version = "0.15.1" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | checksum = "afcae27ec0974fc7c3b0b318783be89fd1b2e66dd702179fe600166a38ff4a0b" 74 | dependencies = [ 75 | "accesskit", 76 | "accesskit_consumer", 77 | "once_cell", 78 | "paste", 79 | "static_assertions", 80 | "windows 0.48.0", 81 | ] 82 | 83 | [[package]] 84 | name = "accesskit_winit" 85 | version = "0.15.0" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "88e39fcec2e10971e188730b7a76bab60647dacc973d4591855ebebcadfaa738" 88 | dependencies = [ 89 | "accesskit", 90 | "accesskit_macos", 91 | "accesskit_unix", 92 | "accesskit_windows", 93 | "winit", 94 | ] 95 | 96 | [[package]] 97 | name = "adler" 98 | version = "1.0.2" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 101 | 102 | [[package]] 103 | name = "ahash" 104 | version = "0.8.6" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" 107 | dependencies = [ 108 | "cfg-if", 109 | "once_cell", 110 | "serde", 111 | "version_check", 112 | "zerocopy", 113 | ] 114 | 115 | [[package]] 116 | name = "aho-corasick" 117 | version = "1.1.2" 118 | source = "registry+https://github.com/rust-lang/crates.io-index" 119 | checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" 120 | dependencies = [ 121 | "memchr", 122 | ] 123 | 124 | [[package]] 125 | name = "alsa" 126 | version = "0.7.1" 127 | source = "registry+https://github.com/rust-lang/crates.io-index" 128 | checksum = "e2562ad8dcf0f789f65c6fdaad8a8a9708ed6b488e649da28c01656ad66b8b47" 129 | dependencies = [ 130 | "alsa-sys", 131 | "bitflags 1.3.2", 132 | "libc", 133 | "nix 0.24.3", 134 | ] 135 | 136 | [[package]] 137 | name = "alsa-sys" 138 | version = "0.3.1" 139 | source = "registry+https://github.com/rust-lang/crates.io-index" 140 | checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" 141 | dependencies = [ 142 | "libc", 143 | "pkg-config", 144 | ] 145 | 146 | [[package]] 147 | name = "android-activity" 148 | version = "0.4.3" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | checksum = "64529721f27c2314ced0890ce45e469574a73e5e6fdd6e9da1860eb29285f5e0" 151 | dependencies = [ 152 | "android-properties", 153 | "bitflags 1.3.2", 154 | "cc", 155 | "jni-sys", 156 | "libc", 157 | "log", 158 | "ndk", 159 | "ndk-context", 160 | "ndk-sys", 161 | "num_enum 0.6.1", 162 | ] 163 | 164 | [[package]] 165 | name = "android-properties" 166 | version = "0.2.2" 167 | source = "registry+https://github.com/rust-lang/crates.io-index" 168 | checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" 169 | 170 | [[package]] 171 | name = "anyhow" 172 | version = "1.0.75" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" 175 | 176 | [[package]] 177 | name = "arboard" 178 | version = "3.3.0" 179 | source = "registry+https://github.com/rust-lang/crates.io-index" 180 | checksum = "aafb29b107435aa276664c1db8954ac27a6e105cdad3c88287a199eb0e313c08" 181 | dependencies = [ 182 | "clipboard-win", 183 | "log", 184 | "objc", 185 | "objc-foundation", 186 | "objc_id", 187 | "parking_lot", 188 | "thiserror", 189 | "winapi", 190 | "x11rb", 191 | ] 192 | 193 | [[package]] 194 | name = "arrayref" 195 | version = "0.3.7" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" 198 | 199 | [[package]] 200 | name = "arrayvec" 201 | version = "0.7.4" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" 204 | 205 | [[package]] 206 | name = "async-broadcast" 207 | version = "0.5.1" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" 210 | dependencies = [ 211 | "event-listener 2.5.3", 212 | "futures-core", 213 | ] 214 | 215 | [[package]] 216 | name = "async-channel" 217 | version = "1.9.0" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" 220 | dependencies = [ 221 | "concurrent-queue", 222 | "event-listener 2.5.3", 223 | "futures-core", 224 | ] 225 | 226 | [[package]] 227 | name = "async-channel" 228 | version = "2.1.1" 229 | source = "registry+https://github.com/rust-lang/crates.io-index" 230 | checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" 231 | dependencies = [ 232 | "concurrent-queue", 233 | "event-listener 4.0.0", 234 | "event-listener-strategy", 235 | "futures-core", 236 | "pin-project-lite", 237 | ] 238 | 239 | [[package]] 240 | name = "async-executor" 241 | version = "1.8.0" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" 244 | dependencies = [ 245 | "async-lock 3.1.2", 246 | "async-task", 247 | "concurrent-queue", 248 | "fastrand 2.0.1", 249 | "futures-lite 2.0.1", 250 | "slab", 251 | ] 252 | 253 | [[package]] 254 | name = "async-fs" 255 | version = "1.6.0" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" 258 | dependencies = [ 259 | "async-lock 2.8.0", 260 | "autocfg", 261 | "blocking", 262 | "futures-lite 1.13.0", 263 | ] 264 | 265 | [[package]] 266 | name = "async-io" 267 | version = "1.13.0" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" 270 | dependencies = [ 271 | "async-lock 2.8.0", 272 | "autocfg", 273 | "cfg-if", 274 | "concurrent-queue", 275 | "futures-lite 1.13.0", 276 | "log", 277 | "parking", 278 | "polling 2.8.0", 279 | "rustix 0.37.27", 280 | "slab", 281 | "socket2", 282 | "waker-fn", 283 | ] 284 | 285 | [[package]] 286 | name = "async-io" 287 | version = "2.2.1" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "d6d3b15875ba253d1110c740755e246537483f152fa334f91abd7fe84c88b3ff" 290 | dependencies = [ 291 | "async-lock 3.1.2", 292 | "cfg-if", 293 | "concurrent-queue", 294 | "futures-io", 295 | "futures-lite 2.0.1", 296 | "parking", 297 | "polling 3.3.1", 298 | "rustix 0.38.25", 299 | "slab", 300 | "tracing", 301 | "windows-sys 0.52.0", 302 | ] 303 | 304 | [[package]] 305 | name = "async-lock" 306 | version = "2.8.0" 307 | source = "registry+https://github.com/rust-lang/crates.io-index" 308 | checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" 309 | dependencies = [ 310 | "event-listener 2.5.3", 311 | ] 312 | 313 | [[package]] 314 | name = "async-lock" 315 | version = "3.1.2" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | checksum = "dea8b3453dd7cc96711834b75400d671b73e3656975fa68d9f277163b7f7e316" 318 | dependencies = [ 319 | "event-listener 4.0.0", 320 | "event-listener-strategy", 321 | "pin-project-lite", 322 | ] 323 | 324 | [[package]] 325 | name = "async-once-cell" 326 | version = "0.5.3" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | checksum = "9338790e78aa95a416786ec8389546c4b6a1dfc3dc36071ed9518a9413a542eb" 329 | 330 | [[package]] 331 | name = "async-process" 332 | version = "1.8.1" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" 335 | dependencies = [ 336 | "async-io 1.13.0", 337 | "async-lock 2.8.0", 338 | "async-signal", 339 | "blocking", 340 | "cfg-if", 341 | "event-listener 3.1.0", 342 | "futures-lite 1.13.0", 343 | "rustix 0.38.25", 344 | "windows-sys 0.48.0", 345 | ] 346 | 347 | [[package]] 348 | name = "async-recursion" 349 | version = "1.0.5" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" 352 | dependencies = [ 353 | "proc-macro2", 354 | "quote", 355 | "syn 2.0.39", 356 | ] 357 | 358 | [[package]] 359 | name = "async-signal" 360 | version = "0.2.5" 361 | source = "registry+https://github.com/rust-lang/crates.io-index" 362 | checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" 363 | dependencies = [ 364 | "async-io 2.2.1", 365 | "async-lock 2.8.0", 366 | "atomic-waker", 367 | "cfg-if", 368 | "futures-core", 369 | "futures-io", 370 | "rustix 0.38.25", 371 | "signal-hook-registry", 372 | "slab", 373 | "windows-sys 0.48.0", 374 | ] 375 | 376 | [[package]] 377 | name = "async-task" 378 | version = "4.5.0" 379 | source = "registry+https://github.com/rust-lang/crates.io-index" 380 | checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" 381 | 382 | [[package]] 383 | name = "async-trait" 384 | version = "0.1.74" 385 | source = "registry+https://github.com/rust-lang/crates.io-index" 386 | checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" 387 | dependencies = [ 388 | "proc-macro2", 389 | "quote", 390 | "syn 2.0.39", 391 | ] 392 | 393 | [[package]] 394 | name = "atomic-waker" 395 | version = "1.1.2" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 398 | 399 | [[package]] 400 | name = "atspi" 401 | version = "0.19.0" 402 | source = "registry+https://github.com/rust-lang/crates.io-index" 403 | checksum = "6059f350ab6f593ea00727b334265c4dfc7fd442ee32d264794bd9bdc68e87ca" 404 | dependencies = [ 405 | "atspi-common", 406 | "atspi-connection", 407 | "atspi-proxies", 408 | ] 409 | 410 | [[package]] 411 | name = "atspi-common" 412 | version = "0.3.0" 413 | source = "registry+https://github.com/rust-lang/crates.io-index" 414 | checksum = "92af95f966d2431f962bc632c2e68eda7777330158bf640c4af4249349b2cdf5" 415 | dependencies = [ 416 | "enumflags2", 417 | "serde", 418 | "static_assertions", 419 | "zbus", 420 | "zbus_names", 421 | "zvariant", 422 | ] 423 | 424 | [[package]] 425 | name = "atspi-connection" 426 | version = "0.3.0" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | checksum = "a0c65e7d70f86d4c0e3b2d585d9bf3f979f0b19d635a336725a88d279f76b939" 429 | dependencies = [ 430 | "atspi-common", 431 | "atspi-proxies", 432 | "futures-lite 1.13.0", 433 | "zbus", 434 | ] 435 | 436 | [[package]] 437 | name = "atspi-proxies" 438 | version = "0.3.0" 439 | source = "registry+https://github.com/rust-lang/crates.io-index" 440 | checksum = "6495661273703e7a229356dcbe8c8f38223d697aacfaf0e13590a9ac9977bb52" 441 | dependencies = [ 442 | "atspi-common", 443 | "serde", 444 | "zbus", 445 | ] 446 | 447 | [[package]] 448 | name = "autocfg" 449 | version = "1.1.0" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 452 | 453 | [[package]] 454 | name = "base64" 455 | version = "0.21.5" 456 | source = "registry+https://github.com/rust-lang/crates.io-index" 457 | checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" 458 | 459 | [[package]] 460 | name = "bitflags" 461 | version = "1.3.2" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 464 | 465 | [[package]] 466 | name = "bitflags" 467 | version = "2.4.1" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" 470 | dependencies = [ 471 | "serde", 472 | ] 473 | 474 | [[package]] 475 | name = "block" 476 | version = "0.1.6" 477 | source = "registry+https://github.com/rust-lang/crates.io-index" 478 | checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 479 | 480 | [[package]] 481 | name = "block-buffer" 482 | version = "0.10.4" 483 | source = "registry+https://github.com/rust-lang/crates.io-index" 484 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 485 | dependencies = [ 486 | "generic-array", 487 | ] 488 | 489 | [[package]] 490 | name = "block-sys" 491 | version = "0.1.0-beta.1" 492 | source = "registry+https://github.com/rust-lang/crates.io-index" 493 | checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" 494 | dependencies = [ 495 | "objc-sys", 496 | ] 497 | 498 | [[package]] 499 | name = "block2" 500 | version = "0.2.0-alpha.6" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" 503 | dependencies = [ 504 | "block-sys", 505 | "objc2-encode", 506 | ] 507 | 508 | [[package]] 509 | name = "blocking" 510 | version = "1.5.1" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" 513 | dependencies = [ 514 | "async-channel 2.1.1", 515 | "async-lock 3.1.2", 516 | "async-task", 517 | "fastrand 2.0.1", 518 | "futures-io", 519 | "futures-lite 2.0.1", 520 | "piper", 521 | "tracing", 522 | ] 523 | 524 | [[package]] 525 | name = "bumpalo" 526 | version = "3.14.0" 527 | source = "registry+https://github.com/rust-lang/crates.io-index" 528 | checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" 529 | 530 | [[package]] 531 | name = "bytemuck" 532 | version = "1.14.0" 533 | source = "registry+https://github.com/rust-lang/crates.io-index" 534 | checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" 535 | dependencies = [ 536 | "bytemuck_derive", 537 | ] 538 | 539 | [[package]] 540 | name = "bytemuck_derive" 541 | version = "1.5.0" 542 | source = "registry+https://github.com/rust-lang/crates.io-index" 543 | checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" 544 | dependencies = [ 545 | "proc-macro2", 546 | "quote", 547 | "syn 2.0.39", 548 | ] 549 | 550 | [[package]] 551 | name = "byteorder" 552 | version = "1.5.0" 553 | source = "registry+https://github.com/rust-lang/crates.io-index" 554 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 555 | 556 | [[package]] 557 | name = "bytes" 558 | version = "1.5.0" 559 | source = "registry+https://github.com/rust-lang/crates.io-index" 560 | checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" 561 | 562 | [[package]] 563 | name = "calloop" 564 | version = "0.10.6" 565 | source = "registry+https://github.com/rust-lang/crates.io-index" 566 | checksum = "52e0d00eb1ea24371a97d2da6201c6747a633dc6dc1988ef503403b4c59504a8" 567 | dependencies = [ 568 | "bitflags 1.3.2", 569 | "log", 570 | "nix 0.25.1", 571 | "slotmap", 572 | "thiserror", 573 | "vec_map", 574 | ] 575 | 576 | [[package]] 577 | name = "cc" 578 | version = "1.0.83" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" 581 | dependencies = [ 582 | "jobserver", 583 | "libc", 584 | ] 585 | 586 | [[package]] 587 | name = "cesu8" 588 | version = "1.1.0" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 591 | 592 | [[package]] 593 | name = "cfg-if" 594 | version = "1.0.0" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 597 | 598 | [[package]] 599 | name = "cfg_aliases" 600 | version = "0.1.1" 601 | source = "registry+https://github.com/rust-lang/crates.io-index" 602 | checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" 603 | 604 | [[package]] 605 | name = "cgl" 606 | version = "0.3.2" 607 | source = "registry+https://github.com/rust-lang/crates.io-index" 608 | checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" 609 | dependencies = [ 610 | "libc", 611 | ] 612 | 613 | [[package]] 614 | name = "clipboard-win" 615 | version = "4.5.0" 616 | source = "registry+https://github.com/rust-lang/crates.io-index" 617 | checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362" 618 | dependencies = [ 619 | "error-code", 620 | "str-buf", 621 | "winapi", 622 | ] 623 | 624 | [[package]] 625 | name = "cocoa" 626 | version = "0.24.1" 627 | source = "registry+https://github.com/rust-lang/crates.io-index" 628 | checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" 629 | dependencies = [ 630 | "bitflags 1.3.2", 631 | "block", 632 | "cocoa-foundation", 633 | "core-foundation", 634 | "core-graphics", 635 | "foreign-types", 636 | "libc", 637 | "objc", 638 | ] 639 | 640 | [[package]] 641 | name = "cocoa-foundation" 642 | version = "0.1.2" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" 645 | dependencies = [ 646 | "bitflags 1.3.2", 647 | "block", 648 | "core-foundation", 649 | "core-graphics-types", 650 | "libc", 651 | "objc", 652 | ] 653 | 654 | [[package]] 655 | name = "color_quant" 656 | version = "1.1.0" 657 | source = "registry+https://github.com/rust-lang/crates.io-index" 658 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 659 | 660 | [[package]] 661 | name = "colored" 662 | version = "2.0.4" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" 665 | dependencies = [ 666 | "is-terminal", 667 | "lazy_static", 668 | "windows-sys 0.48.0", 669 | ] 670 | 671 | [[package]] 672 | name = "combine" 673 | version = "4.6.6" 674 | source = "registry+https://github.com/rust-lang/crates.io-index" 675 | checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" 676 | dependencies = [ 677 | "bytes", 678 | "memchr", 679 | ] 680 | 681 | [[package]] 682 | name = "concurrent-queue" 683 | version = "2.3.0" 684 | source = "registry+https://github.com/rust-lang/crates.io-index" 685 | checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" 686 | dependencies = [ 687 | "crossbeam-utils", 688 | ] 689 | 690 | [[package]] 691 | name = "core-foundation" 692 | version = "0.9.4" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 695 | dependencies = [ 696 | "core-foundation-sys", 697 | "libc", 698 | ] 699 | 700 | [[package]] 701 | name = "core-foundation-sys" 702 | version = "0.8.6" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 705 | 706 | [[package]] 707 | name = "core-graphics" 708 | version = "0.22.3" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" 711 | dependencies = [ 712 | "bitflags 1.3.2", 713 | "core-foundation", 714 | "core-graphics-types", 715 | "foreign-types", 716 | "libc", 717 | ] 718 | 719 | [[package]] 720 | name = "core-graphics-types" 721 | version = "0.1.2" 722 | source = "registry+https://github.com/rust-lang/crates.io-index" 723 | checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" 724 | dependencies = [ 725 | "bitflags 1.3.2", 726 | "core-foundation", 727 | "libc", 728 | ] 729 | 730 | [[package]] 731 | name = "coremidi" 732 | version = "0.6.0" 733 | source = "registry+https://github.com/rust-lang/crates.io-index" 734 | checksum = "1a7847ca018a67204508b77cb9e6de670125075f7464fff5f673023378fa34f5" 735 | dependencies = [ 736 | "core-foundation", 737 | "core-foundation-sys", 738 | "coremidi-sys", 739 | ] 740 | 741 | [[package]] 742 | name = "coremidi-sys" 743 | version = "3.1.0" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | checksum = "79a6deed0c97b2d40abbab77e4c97f81d71e162600423382c277dd640019116c" 746 | dependencies = [ 747 | "core-foundation-sys", 748 | ] 749 | 750 | [[package]] 751 | name = "cpufeatures" 752 | version = "0.2.11" 753 | source = "registry+https://github.com/rust-lang/crates.io-index" 754 | checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" 755 | dependencies = [ 756 | "libc", 757 | ] 758 | 759 | [[package]] 760 | name = "crc32fast" 761 | version = "1.3.2" 762 | source = "registry+https://github.com/rust-lang/crates.io-index" 763 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 764 | dependencies = [ 765 | "cfg-if", 766 | ] 767 | 768 | [[package]] 769 | name = "crossbeam-deque" 770 | version = "0.8.3" 771 | source = "registry+https://github.com/rust-lang/crates.io-index" 772 | checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" 773 | dependencies = [ 774 | "cfg-if", 775 | "crossbeam-epoch", 776 | "crossbeam-utils", 777 | ] 778 | 779 | [[package]] 780 | name = "crossbeam-epoch" 781 | version = "0.9.15" 782 | source = "registry+https://github.com/rust-lang/crates.io-index" 783 | checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" 784 | dependencies = [ 785 | "autocfg", 786 | "cfg-if", 787 | "crossbeam-utils", 788 | "memoffset 0.9.0", 789 | "scopeguard", 790 | ] 791 | 792 | [[package]] 793 | name = "crossbeam-utils" 794 | version = "0.8.16" 795 | source = "registry+https://github.com/rust-lang/crates.io-index" 796 | checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" 797 | dependencies = [ 798 | "cfg-if", 799 | ] 800 | 801 | [[package]] 802 | name = "crypto-common" 803 | version = "0.1.6" 804 | source = "registry+https://github.com/rust-lang/crates.io-index" 805 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 806 | dependencies = [ 807 | "generic-array", 808 | "typenum", 809 | ] 810 | 811 | [[package]] 812 | name = "deranged" 813 | version = "0.3.9" 814 | source = "registry+https://github.com/rust-lang/crates.io-index" 815 | checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" 816 | dependencies = [ 817 | "powerfmt", 818 | ] 819 | 820 | [[package]] 821 | name = "derivative" 822 | version = "2.2.0" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" 825 | dependencies = [ 826 | "proc-macro2", 827 | "quote", 828 | "syn 1.0.109", 829 | ] 830 | 831 | [[package]] 832 | name = "digest" 833 | version = "0.10.7" 834 | source = "registry+https://github.com/rust-lang/crates.io-index" 835 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 836 | dependencies = [ 837 | "block-buffer", 838 | "crypto-common", 839 | ] 840 | 841 | [[package]] 842 | name = "directories-next" 843 | version = "2.0.0" 844 | source = "registry+https://github.com/rust-lang/crates.io-index" 845 | checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" 846 | dependencies = [ 847 | "cfg-if", 848 | "dirs-sys-next", 849 | ] 850 | 851 | [[package]] 852 | name = "dirs-sys-next" 853 | version = "0.1.2" 854 | source = "registry+https://github.com/rust-lang/crates.io-index" 855 | checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" 856 | dependencies = [ 857 | "libc", 858 | "redox_users", 859 | "winapi", 860 | ] 861 | 862 | [[package]] 863 | name = "dispatch" 864 | version = "0.2.0" 865 | source = "registry+https://github.com/rust-lang/crates.io-index" 866 | checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" 867 | 868 | [[package]] 869 | name = "dlib" 870 | version = "0.5.2" 871 | source = "registry+https://github.com/rust-lang/crates.io-index" 872 | checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 873 | dependencies = [ 874 | "libloading 0.8.1", 875 | ] 876 | 877 | [[package]] 878 | name = "downcast-rs" 879 | version = "1.2.0" 880 | source = "registry+https://github.com/rust-lang/crates.io-index" 881 | checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" 882 | 883 | [[package]] 884 | name = "ecolor" 885 | version = "0.24.1" 886 | source = "registry+https://github.com/rust-lang/crates.io-index" 887 | checksum = "4b7637fc2e74d17e52931bac90ff4fc061ac776ada9c7fa272f24cdca5991972" 888 | dependencies = [ 889 | "bytemuck", 890 | "serde", 891 | ] 892 | 893 | [[package]] 894 | name = "eframe" 895 | version = "0.24.1" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | checksum = "cdd73918a828c35a7efb4d7188ea973df4bffc589178ed95f521c917b03ddcfa" 898 | dependencies = [ 899 | "bytemuck", 900 | "cocoa", 901 | "directories-next", 902 | "egui", 903 | "egui-winit", 904 | "egui_glow", 905 | "glow", 906 | "glutin", 907 | "glutin-winit", 908 | "image", 909 | "js-sys", 910 | "log", 911 | "objc", 912 | "parking_lot", 913 | "percent-encoding", 914 | "raw-window-handle", 915 | "ron", 916 | "serde", 917 | "static_assertions", 918 | "thiserror", 919 | "wasm-bindgen", 920 | "wasm-bindgen-futures", 921 | "web-sys", 922 | "winapi", 923 | "winit", 924 | ] 925 | 926 | [[package]] 927 | name = "egui" 928 | version = "0.24.1" 929 | source = "registry+https://github.com/rust-lang/crates.io-index" 930 | checksum = "c55bcb864b764eb889515a38b8924757657a250738ad15126637ee2df291ee6b" 931 | dependencies = [ 932 | "accesskit", 933 | "ahash", 934 | "epaint", 935 | "log", 936 | "nohash-hasher", 937 | "ron", 938 | "serde", 939 | ] 940 | 941 | [[package]] 942 | name = "egui-winit" 943 | version = "0.24.1" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | checksum = "3b673606b6606b12b95e3a3194d7882bf5cff302db36a520b8144c7c342e4e84" 946 | dependencies = [ 947 | "accesskit_winit", 948 | "arboard", 949 | "egui", 950 | "log", 951 | "raw-window-handle", 952 | "serde", 953 | "smithay-clipboard", 954 | "web-time", 955 | "webbrowser", 956 | "winit", 957 | ] 958 | 959 | [[package]] 960 | name = "egui_glow" 961 | version = "0.24.1" 962 | source = "registry+https://github.com/rust-lang/crates.io-index" 963 | checksum = "262151f9d57c557c02a40a46f27b9e050a6eb0b006b94dced9c6f4519a04d489" 964 | dependencies = [ 965 | "bytemuck", 966 | "egui", 967 | "glow", 968 | "log", 969 | "memoffset 0.7.1", 970 | "wasm-bindgen", 971 | "web-sys", 972 | ] 973 | 974 | [[package]] 975 | name = "either" 976 | version = "1.9.0" 977 | source = "registry+https://github.com/rust-lang/crates.io-index" 978 | checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" 979 | 980 | [[package]] 981 | name = "emath" 982 | version = "0.24.1" 983 | source = "registry+https://github.com/rust-lang/crates.io-index" 984 | checksum = "a045c6c0b44b35e98513fc1e9d183ab42881ac27caccb9fa345465601f56cce4" 985 | dependencies = [ 986 | "bytemuck", 987 | "serde", 988 | ] 989 | 990 | [[package]] 991 | name = "enumflags2" 992 | version = "0.7.8" 993 | source = "registry+https://github.com/rust-lang/crates.io-index" 994 | checksum = "5998b4f30320c9d93aed72f63af821bfdac50465b75428fce77b48ec482c3939" 995 | dependencies = [ 996 | "enumflags2_derive", 997 | "serde", 998 | ] 999 | 1000 | [[package]] 1001 | name = "enumflags2_derive" 1002 | version = "0.7.8" 1003 | source = "registry+https://github.com/rust-lang/crates.io-index" 1004 | checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246" 1005 | dependencies = [ 1006 | "proc-macro2", 1007 | "quote", 1008 | "syn 2.0.39", 1009 | ] 1010 | 1011 | [[package]] 1012 | name = "enumn" 1013 | version = "0.1.12" 1014 | source = "registry+https://github.com/rust-lang/crates.io-index" 1015 | checksum = "c2ad8cef1d801a4686bfd8919f0b30eac4c8e48968c437a6405ded4fb5272d2b" 1016 | dependencies = [ 1017 | "proc-macro2", 1018 | "quote", 1019 | "syn 2.0.39", 1020 | ] 1021 | 1022 | [[package]] 1023 | name = "epaint" 1024 | version = "0.24.1" 1025 | source = "registry+https://github.com/rust-lang/crates.io-index" 1026 | checksum = "7d1b9e000d21bab9b535ce78f9f7745be28b3f777f6c7223936561c5c7fefab8" 1027 | dependencies = [ 1028 | "ab_glyph", 1029 | "ahash", 1030 | "bytemuck", 1031 | "ecolor", 1032 | "emath", 1033 | "log", 1034 | "nohash-hasher", 1035 | "parking_lot", 1036 | "serde", 1037 | ] 1038 | 1039 | [[package]] 1040 | name = "equivalent" 1041 | version = "1.0.1" 1042 | source = "registry+https://github.com/rust-lang/crates.io-index" 1043 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 1044 | 1045 | [[package]] 1046 | name = "errno" 1047 | version = "0.3.8" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" 1050 | dependencies = [ 1051 | "libc", 1052 | "windows-sys 0.52.0", 1053 | ] 1054 | 1055 | [[package]] 1056 | name = "error-code" 1057 | version = "2.3.1" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" 1060 | dependencies = [ 1061 | "libc", 1062 | "str-buf", 1063 | ] 1064 | 1065 | [[package]] 1066 | name = "event-listener" 1067 | version = "2.5.3" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" 1070 | 1071 | [[package]] 1072 | name = "event-listener" 1073 | version = "3.1.0" 1074 | source = "registry+https://github.com/rust-lang/crates.io-index" 1075 | checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" 1076 | dependencies = [ 1077 | "concurrent-queue", 1078 | "parking", 1079 | "pin-project-lite", 1080 | ] 1081 | 1082 | [[package]] 1083 | name = "event-listener" 1084 | version = "4.0.0" 1085 | source = "registry+https://github.com/rust-lang/crates.io-index" 1086 | checksum = "770d968249b5d99410d61f5bf89057f3199a077a04d087092f58e7d10692baae" 1087 | dependencies = [ 1088 | "concurrent-queue", 1089 | "parking", 1090 | "pin-project-lite", 1091 | ] 1092 | 1093 | [[package]] 1094 | name = "event-listener-strategy" 1095 | version = "0.4.0" 1096 | source = "registry+https://github.com/rust-lang/crates.io-index" 1097 | checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" 1098 | dependencies = [ 1099 | "event-listener 4.0.0", 1100 | "pin-project-lite", 1101 | ] 1102 | 1103 | [[package]] 1104 | name = "fastrand" 1105 | version = "1.9.0" 1106 | source = "registry+https://github.com/rust-lang/crates.io-index" 1107 | checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" 1108 | dependencies = [ 1109 | "instant", 1110 | ] 1111 | 1112 | [[package]] 1113 | name = "fastrand" 1114 | version = "2.0.1" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" 1117 | 1118 | [[package]] 1119 | name = "fdeflate" 1120 | version = "0.3.1" 1121 | source = "registry+https://github.com/rust-lang/crates.io-index" 1122 | checksum = "64d6dafc854908ff5da46ff3f8f473c6984119a2876a383a860246dd7841a868" 1123 | dependencies = [ 1124 | "simd-adler32", 1125 | ] 1126 | 1127 | [[package]] 1128 | name = "flate2" 1129 | version = "1.0.28" 1130 | source = "registry+https://github.com/rust-lang/crates.io-index" 1131 | checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" 1132 | dependencies = [ 1133 | "crc32fast", 1134 | "miniz_oxide", 1135 | ] 1136 | 1137 | [[package]] 1138 | name = "foreign-types" 1139 | version = "0.3.2" 1140 | source = "registry+https://github.com/rust-lang/crates.io-index" 1141 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 1142 | dependencies = [ 1143 | "foreign-types-shared", 1144 | ] 1145 | 1146 | [[package]] 1147 | name = "foreign-types-shared" 1148 | version = "0.1.1" 1149 | source = "registry+https://github.com/rust-lang/crates.io-index" 1150 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 1151 | 1152 | [[package]] 1153 | name = "form_urlencoded" 1154 | version = "1.2.1" 1155 | source = "registry+https://github.com/rust-lang/crates.io-index" 1156 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1157 | dependencies = [ 1158 | "percent-encoding", 1159 | ] 1160 | 1161 | [[package]] 1162 | name = "futures-core" 1163 | version = "0.3.29" 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" 1165 | checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" 1166 | 1167 | [[package]] 1168 | name = "futures-io" 1169 | version = "0.3.29" 1170 | source = "registry+https://github.com/rust-lang/crates.io-index" 1171 | checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" 1172 | 1173 | [[package]] 1174 | name = "futures-lite" 1175 | version = "1.13.0" 1176 | source = "registry+https://github.com/rust-lang/crates.io-index" 1177 | checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" 1178 | dependencies = [ 1179 | "fastrand 1.9.0", 1180 | "futures-core", 1181 | "futures-io", 1182 | "memchr", 1183 | "parking", 1184 | "pin-project-lite", 1185 | "waker-fn", 1186 | ] 1187 | 1188 | [[package]] 1189 | name = "futures-lite" 1190 | version = "2.0.1" 1191 | source = "registry+https://github.com/rust-lang/crates.io-index" 1192 | checksum = "d3831c2651acb5177cbd83943f3d9c8912c5ad03c76afcc0e9511ba568ec5ebb" 1193 | dependencies = [ 1194 | "fastrand 2.0.1", 1195 | "futures-core", 1196 | "futures-io", 1197 | "memchr", 1198 | "parking", 1199 | "pin-project-lite", 1200 | ] 1201 | 1202 | [[package]] 1203 | name = "futures-sink" 1204 | version = "0.3.29" 1205 | source = "registry+https://github.com/rust-lang/crates.io-index" 1206 | checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" 1207 | 1208 | [[package]] 1209 | name = "futures-task" 1210 | version = "0.3.29" 1211 | source = "registry+https://github.com/rust-lang/crates.io-index" 1212 | checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" 1213 | 1214 | [[package]] 1215 | name = "futures-util" 1216 | version = "0.3.29" 1217 | source = "registry+https://github.com/rust-lang/crates.io-index" 1218 | checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" 1219 | dependencies = [ 1220 | "futures-core", 1221 | "futures-io", 1222 | "futures-sink", 1223 | "futures-task", 1224 | "memchr", 1225 | "pin-project-lite", 1226 | "pin-utils", 1227 | "slab", 1228 | ] 1229 | 1230 | [[package]] 1231 | name = "generic-array" 1232 | version = "0.14.7" 1233 | source = "registry+https://github.com/rust-lang/crates.io-index" 1234 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1235 | dependencies = [ 1236 | "typenum", 1237 | "version_check", 1238 | ] 1239 | 1240 | [[package]] 1241 | name = "gethostname" 1242 | version = "0.3.0" 1243 | source = "registry+https://github.com/rust-lang/crates.io-index" 1244 | checksum = "bb65d4ba3173c56a500b555b532f72c42e8d1fe64962b518897f8959fae2c177" 1245 | dependencies = [ 1246 | "libc", 1247 | "winapi", 1248 | ] 1249 | 1250 | [[package]] 1251 | name = "getrandom" 1252 | version = "0.2.11" 1253 | source = "registry+https://github.com/rust-lang/crates.io-index" 1254 | checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" 1255 | dependencies = [ 1256 | "cfg-if", 1257 | "libc", 1258 | "wasi", 1259 | ] 1260 | 1261 | [[package]] 1262 | name = "gl_generator" 1263 | version = "0.14.0" 1264 | source = "registry+https://github.com/rust-lang/crates.io-index" 1265 | checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" 1266 | dependencies = [ 1267 | "khronos_api", 1268 | "log", 1269 | "xml-rs", 1270 | ] 1271 | 1272 | [[package]] 1273 | name = "glow" 1274 | version = "0.12.3" 1275 | source = "registry+https://github.com/rust-lang/crates.io-index" 1276 | checksum = "ca0fe580e4b60a8ab24a868bc08e2f03cbcb20d3d676601fa909386713333728" 1277 | dependencies = [ 1278 | "js-sys", 1279 | "slotmap", 1280 | "wasm-bindgen", 1281 | "web-sys", 1282 | ] 1283 | 1284 | [[package]] 1285 | name = "glutin" 1286 | version = "0.30.10" 1287 | source = "registry+https://github.com/rust-lang/crates.io-index" 1288 | checksum = "8fc93b03242719b8ad39fb26ed2b01737144ce7bd4bfc7adadcef806596760fe" 1289 | dependencies = [ 1290 | "bitflags 1.3.2", 1291 | "cfg_aliases", 1292 | "cgl", 1293 | "core-foundation", 1294 | "dispatch", 1295 | "glutin_egl_sys", 1296 | "glutin_glx_sys", 1297 | "glutin_wgl_sys", 1298 | "libloading 0.7.4", 1299 | "objc2", 1300 | "once_cell", 1301 | "raw-window-handle", 1302 | "wayland-sys 0.30.1", 1303 | "windows-sys 0.45.0", 1304 | "x11-dl", 1305 | ] 1306 | 1307 | [[package]] 1308 | name = "glutin-winit" 1309 | version = "0.3.0" 1310 | source = "registry+https://github.com/rust-lang/crates.io-index" 1311 | checksum = "629a873fc04062830bfe8f97c03773bcd7b371e23bcc465d0a61448cd1588fa4" 1312 | dependencies = [ 1313 | "cfg_aliases", 1314 | "glutin", 1315 | "raw-window-handle", 1316 | "winit", 1317 | ] 1318 | 1319 | [[package]] 1320 | name = "glutin_egl_sys" 1321 | version = "0.5.1" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "af784eb26c5a68ec85391268e074f0aa618c096eadb5d6330b0911cf34fe57c5" 1324 | dependencies = [ 1325 | "gl_generator", 1326 | "windows-sys 0.45.0", 1327 | ] 1328 | 1329 | [[package]] 1330 | name = "glutin_glx_sys" 1331 | version = "0.4.0" 1332 | source = "registry+https://github.com/rust-lang/crates.io-index" 1333 | checksum = "1b53cb5fe568964aa066a3ba91eac5ecbac869fb0842cd0dc9e412434f1a1494" 1334 | dependencies = [ 1335 | "gl_generator", 1336 | "x11-dl", 1337 | ] 1338 | 1339 | [[package]] 1340 | name = "glutin_wgl_sys" 1341 | version = "0.4.0" 1342 | source = "registry+https://github.com/rust-lang/crates.io-index" 1343 | checksum = "ef89398e90033fc6bc65e9bd42fd29bbbfd483bda5b56dc5562f455550618165" 1344 | dependencies = [ 1345 | "gl_generator", 1346 | ] 1347 | 1348 | [[package]] 1349 | name = "hashbrown" 1350 | version = "0.14.3" 1351 | source = "registry+https://github.com/rust-lang/crates.io-index" 1352 | checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" 1353 | 1354 | [[package]] 1355 | name = "hermit-abi" 1356 | version = "0.3.3" 1357 | source = "registry+https://github.com/rust-lang/crates.io-index" 1358 | checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" 1359 | 1360 | [[package]] 1361 | name = "hex" 1362 | version = "0.4.3" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1365 | 1366 | [[package]] 1367 | name = "home" 1368 | version = "0.5.5" 1369 | source = "registry+https://github.com/rust-lang/crates.io-index" 1370 | checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" 1371 | dependencies = [ 1372 | "windows-sys 0.48.0", 1373 | ] 1374 | 1375 | [[package]] 1376 | name = "idna" 1377 | version = "0.5.0" 1378 | source = "registry+https://github.com/rust-lang/crates.io-index" 1379 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 1380 | dependencies = [ 1381 | "unicode-bidi", 1382 | "unicode-normalization", 1383 | ] 1384 | 1385 | [[package]] 1386 | name = "image" 1387 | version = "0.24.7" 1388 | source = "registry+https://github.com/rust-lang/crates.io-index" 1389 | checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" 1390 | dependencies = [ 1391 | "bytemuck", 1392 | "byteorder", 1393 | "color_quant", 1394 | "num-rational", 1395 | "num-traits", 1396 | "png", 1397 | ] 1398 | 1399 | [[package]] 1400 | name = "indexmap" 1401 | version = "2.1.0" 1402 | source = "registry+https://github.com/rust-lang/crates.io-index" 1403 | checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" 1404 | dependencies = [ 1405 | "equivalent", 1406 | "hashbrown", 1407 | ] 1408 | 1409 | [[package]] 1410 | name = "instant" 1411 | version = "0.1.12" 1412 | source = "registry+https://github.com/rust-lang/crates.io-index" 1413 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 1414 | dependencies = [ 1415 | "cfg-if", 1416 | "js-sys", 1417 | "wasm-bindgen", 1418 | "web-sys", 1419 | ] 1420 | 1421 | [[package]] 1422 | name = "io-lifetimes" 1423 | version = "1.0.11" 1424 | source = "registry+https://github.com/rust-lang/crates.io-index" 1425 | checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" 1426 | dependencies = [ 1427 | "hermit-abi", 1428 | "libc", 1429 | "windows-sys 0.48.0", 1430 | ] 1431 | 1432 | [[package]] 1433 | name = "is-terminal" 1434 | version = "0.4.9" 1435 | source = "registry+https://github.com/rust-lang/crates.io-index" 1436 | checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" 1437 | dependencies = [ 1438 | "hermit-abi", 1439 | "rustix 0.38.25", 1440 | "windows-sys 0.48.0", 1441 | ] 1442 | 1443 | [[package]] 1444 | name = "itoa" 1445 | version = "1.0.9" 1446 | source = "registry+https://github.com/rust-lang/crates.io-index" 1447 | checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" 1448 | 1449 | [[package]] 1450 | name = "jni" 1451 | version = "0.21.1" 1452 | source = "registry+https://github.com/rust-lang/crates.io-index" 1453 | checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" 1454 | dependencies = [ 1455 | "cesu8", 1456 | "cfg-if", 1457 | "combine", 1458 | "jni-sys", 1459 | "log", 1460 | "thiserror", 1461 | "walkdir", 1462 | "windows-sys 0.45.0", 1463 | ] 1464 | 1465 | [[package]] 1466 | name = "jni-sys" 1467 | version = "0.3.0" 1468 | source = "registry+https://github.com/rust-lang/crates.io-index" 1469 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 1470 | 1471 | [[package]] 1472 | name = "jobserver" 1473 | version = "0.1.27" 1474 | source = "registry+https://github.com/rust-lang/crates.io-index" 1475 | checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" 1476 | dependencies = [ 1477 | "libc", 1478 | ] 1479 | 1480 | [[package]] 1481 | name = "js-sys" 1482 | version = "0.3.66" 1483 | source = "registry+https://github.com/rust-lang/crates.io-index" 1484 | checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" 1485 | dependencies = [ 1486 | "wasm-bindgen", 1487 | ] 1488 | 1489 | [[package]] 1490 | name = "khronos_api" 1491 | version = "3.1.0" 1492 | source = "registry+https://github.com/rust-lang/crates.io-index" 1493 | checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" 1494 | 1495 | [[package]] 1496 | name = "lazy_static" 1497 | version = "1.4.0" 1498 | source = "registry+https://github.com/rust-lang/crates.io-index" 1499 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1500 | 1501 | [[package]] 1502 | name = "libc" 1503 | version = "0.2.150" 1504 | source = "registry+https://github.com/rust-lang/crates.io-index" 1505 | checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" 1506 | 1507 | [[package]] 1508 | name = "libloading" 1509 | version = "0.7.4" 1510 | source = "registry+https://github.com/rust-lang/crates.io-index" 1511 | checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" 1512 | dependencies = [ 1513 | "cfg-if", 1514 | "winapi", 1515 | ] 1516 | 1517 | [[package]] 1518 | name = "libloading" 1519 | version = "0.8.1" 1520 | source = "registry+https://github.com/rust-lang/crates.io-index" 1521 | checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" 1522 | dependencies = [ 1523 | "cfg-if", 1524 | "windows-sys 0.48.0", 1525 | ] 1526 | 1527 | [[package]] 1528 | name = "libredox" 1529 | version = "0.0.1" 1530 | source = "registry+https://github.com/rust-lang/crates.io-index" 1531 | checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" 1532 | dependencies = [ 1533 | "bitflags 2.4.1", 1534 | "libc", 1535 | "redox_syscall 0.4.1", 1536 | ] 1537 | 1538 | [[package]] 1539 | name = "libredox" 1540 | version = "0.0.2" 1541 | source = "registry+https://github.com/rust-lang/crates.io-index" 1542 | checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" 1543 | dependencies = [ 1544 | "bitflags 2.4.1", 1545 | "libc", 1546 | "redox_syscall 0.4.1", 1547 | ] 1548 | 1549 | [[package]] 1550 | name = "linux-raw-sys" 1551 | version = "0.3.8" 1552 | source = "registry+https://github.com/rust-lang/crates.io-index" 1553 | checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" 1554 | 1555 | [[package]] 1556 | name = "linux-raw-sys" 1557 | version = "0.4.12" 1558 | source = "registry+https://github.com/rust-lang/crates.io-index" 1559 | checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" 1560 | 1561 | [[package]] 1562 | name = "lock_api" 1563 | version = "0.4.11" 1564 | source = "registry+https://github.com/rust-lang/crates.io-index" 1565 | checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" 1566 | dependencies = [ 1567 | "autocfg", 1568 | "scopeguard", 1569 | ] 1570 | 1571 | [[package]] 1572 | name = "log" 1573 | version = "0.4.20" 1574 | source = "registry+https://github.com/rust-lang/crates.io-index" 1575 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 1576 | 1577 | [[package]] 1578 | name = "malloc_buf" 1579 | version = "0.0.6" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 1582 | dependencies = [ 1583 | "libc", 1584 | ] 1585 | 1586 | [[package]] 1587 | name = "memchr" 1588 | version = "2.6.4" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" 1591 | 1592 | [[package]] 1593 | name = "memmap2" 1594 | version = "0.5.10" 1595 | source = "registry+https://github.com/rust-lang/crates.io-index" 1596 | checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" 1597 | dependencies = [ 1598 | "libc", 1599 | ] 1600 | 1601 | [[package]] 1602 | name = "memoffset" 1603 | version = "0.6.5" 1604 | source = "registry+https://github.com/rust-lang/crates.io-index" 1605 | checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" 1606 | dependencies = [ 1607 | "autocfg", 1608 | ] 1609 | 1610 | [[package]] 1611 | name = "memoffset" 1612 | version = "0.7.1" 1613 | source = "registry+https://github.com/rust-lang/crates.io-index" 1614 | checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" 1615 | dependencies = [ 1616 | "autocfg", 1617 | ] 1618 | 1619 | [[package]] 1620 | name = "memoffset" 1621 | version = "0.9.0" 1622 | source = "registry+https://github.com/rust-lang/crates.io-index" 1623 | checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" 1624 | dependencies = [ 1625 | "autocfg", 1626 | ] 1627 | 1628 | [[package]] 1629 | name = "midir" 1630 | version = "0.9.1" 1631 | source = "registry+https://github.com/rust-lang/crates.io-index" 1632 | checksum = "a456444d83e7ead06ae6a5c0a215ed70282947ff3897fb45fcb052b757284731" 1633 | dependencies = [ 1634 | "alsa", 1635 | "bitflags 1.3.2", 1636 | "coremidi", 1637 | "js-sys", 1638 | "libc", 1639 | "wasm-bindgen", 1640 | "web-sys", 1641 | "windows 0.43.0", 1642 | ] 1643 | 1644 | [[package]] 1645 | name = "midly" 1646 | version = "0.5.3" 1647 | source = "registry+https://github.com/rust-lang/crates.io-index" 1648 | checksum = "207d755f4cb882d20c4da58d707ca9130a0c9bc5061f657a4f299b8e36362b7a" 1649 | dependencies = [ 1650 | "rayon", 1651 | ] 1652 | 1653 | [[package]] 1654 | name = "minimal-lexical" 1655 | version = "0.2.1" 1656 | source = "registry+https://github.com/rust-lang/crates.io-index" 1657 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1658 | 1659 | [[package]] 1660 | name = "miniz_oxide" 1661 | version = "0.7.1" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" 1664 | dependencies = [ 1665 | "adler", 1666 | "simd-adler32", 1667 | ] 1668 | 1669 | [[package]] 1670 | name = "mio" 1671 | version = "0.8.9" 1672 | source = "registry+https://github.com/rust-lang/crates.io-index" 1673 | checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" 1674 | dependencies = [ 1675 | "libc", 1676 | "log", 1677 | "wasi", 1678 | "windows-sys 0.48.0", 1679 | ] 1680 | 1681 | [[package]] 1682 | name = "ndk" 1683 | version = "0.7.0" 1684 | source = "registry+https://github.com/rust-lang/crates.io-index" 1685 | checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" 1686 | dependencies = [ 1687 | "bitflags 1.3.2", 1688 | "jni-sys", 1689 | "ndk-sys", 1690 | "num_enum 0.5.11", 1691 | "raw-window-handle", 1692 | "thiserror", 1693 | ] 1694 | 1695 | [[package]] 1696 | name = "ndk-context" 1697 | version = "0.1.1" 1698 | source = "registry+https://github.com/rust-lang/crates.io-index" 1699 | checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" 1700 | 1701 | [[package]] 1702 | name = "ndk-sys" 1703 | version = "0.4.1+23.1.7779620" 1704 | source = "registry+https://github.com/rust-lang/crates.io-index" 1705 | checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" 1706 | dependencies = [ 1707 | "jni-sys", 1708 | ] 1709 | 1710 | [[package]] 1711 | name = "nix" 1712 | version = "0.24.3" 1713 | source = "registry+https://github.com/rust-lang/crates.io-index" 1714 | checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" 1715 | dependencies = [ 1716 | "bitflags 1.3.2", 1717 | "cfg-if", 1718 | "libc", 1719 | "memoffset 0.6.5", 1720 | ] 1721 | 1722 | [[package]] 1723 | name = "nix" 1724 | version = "0.25.1" 1725 | source = "registry+https://github.com/rust-lang/crates.io-index" 1726 | checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" 1727 | dependencies = [ 1728 | "autocfg", 1729 | "bitflags 1.3.2", 1730 | "cfg-if", 1731 | "libc", 1732 | "memoffset 0.6.5", 1733 | ] 1734 | 1735 | [[package]] 1736 | name = "nix" 1737 | version = "0.26.4" 1738 | source = "registry+https://github.com/rust-lang/crates.io-index" 1739 | checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" 1740 | dependencies = [ 1741 | "bitflags 1.3.2", 1742 | "cfg-if", 1743 | "libc", 1744 | "memoffset 0.7.1", 1745 | ] 1746 | 1747 | [[package]] 1748 | name = "nohash-hasher" 1749 | version = "0.2.0" 1750 | source = "registry+https://github.com/rust-lang/crates.io-index" 1751 | checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" 1752 | 1753 | [[package]] 1754 | name = "nom" 1755 | version = "7.1.3" 1756 | source = "registry+https://github.com/rust-lang/crates.io-index" 1757 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1758 | dependencies = [ 1759 | "memchr", 1760 | "minimal-lexical", 1761 | ] 1762 | 1763 | [[package]] 1764 | name = "num-conv" 1765 | version = "0.1.0" 1766 | source = "registry+https://github.com/rust-lang/crates.io-index" 1767 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1768 | 1769 | [[package]] 1770 | name = "num-integer" 1771 | version = "0.1.45" 1772 | source = "registry+https://github.com/rust-lang/crates.io-index" 1773 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 1774 | dependencies = [ 1775 | "autocfg", 1776 | "num-traits", 1777 | ] 1778 | 1779 | [[package]] 1780 | name = "num-rational" 1781 | version = "0.4.1" 1782 | source = "registry+https://github.com/rust-lang/crates.io-index" 1783 | checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" 1784 | dependencies = [ 1785 | "autocfg", 1786 | "num-integer", 1787 | "num-traits", 1788 | ] 1789 | 1790 | [[package]] 1791 | name = "num-traits" 1792 | version = "0.2.17" 1793 | source = "registry+https://github.com/rust-lang/crates.io-index" 1794 | checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" 1795 | dependencies = [ 1796 | "autocfg", 1797 | ] 1798 | 1799 | [[package]] 1800 | name = "num_enum" 1801 | version = "0.5.11" 1802 | source = "registry+https://github.com/rust-lang/crates.io-index" 1803 | checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" 1804 | dependencies = [ 1805 | "num_enum_derive 0.5.11", 1806 | ] 1807 | 1808 | [[package]] 1809 | name = "num_enum" 1810 | version = "0.6.1" 1811 | source = "registry+https://github.com/rust-lang/crates.io-index" 1812 | checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" 1813 | dependencies = [ 1814 | "num_enum_derive 0.6.1", 1815 | ] 1816 | 1817 | [[package]] 1818 | name = "num_enum_derive" 1819 | version = "0.5.11" 1820 | source = "registry+https://github.com/rust-lang/crates.io-index" 1821 | checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" 1822 | dependencies = [ 1823 | "proc-macro-crate", 1824 | "proc-macro2", 1825 | "quote", 1826 | "syn 1.0.109", 1827 | ] 1828 | 1829 | [[package]] 1830 | name = "num_enum_derive" 1831 | version = "0.6.1" 1832 | source = "registry+https://github.com/rust-lang/crates.io-index" 1833 | checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" 1834 | dependencies = [ 1835 | "proc-macro-crate", 1836 | "proc-macro2", 1837 | "quote", 1838 | "syn 2.0.39", 1839 | ] 1840 | 1841 | [[package]] 1842 | name = "num_threads" 1843 | version = "0.1.6" 1844 | source = "registry+https://github.com/rust-lang/crates.io-index" 1845 | checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" 1846 | dependencies = [ 1847 | "libc", 1848 | ] 1849 | 1850 | [[package]] 1851 | name = "objc" 1852 | version = "0.2.7" 1853 | source = "registry+https://github.com/rust-lang/crates.io-index" 1854 | checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 1855 | dependencies = [ 1856 | "malloc_buf", 1857 | ] 1858 | 1859 | [[package]] 1860 | name = "objc-foundation" 1861 | version = "0.1.1" 1862 | source = "registry+https://github.com/rust-lang/crates.io-index" 1863 | checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" 1864 | dependencies = [ 1865 | "block", 1866 | "objc", 1867 | "objc_id", 1868 | ] 1869 | 1870 | [[package]] 1871 | name = "objc-sys" 1872 | version = "0.2.0-beta.2" 1873 | source = "registry+https://github.com/rust-lang/crates.io-index" 1874 | checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" 1875 | 1876 | [[package]] 1877 | name = "objc2" 1878 | version = "0.3.0-beta.3.patch-leaks.3" 1879 | source = "registry+https://github.com/rust-lang/crates.io-index" 1880 | checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468" 1881 | dependencies = [ 1882 | "block2", 1883 | "objc-sys", 1884 | "objc2-encode", 1885 | ] 1886 | 1887 | [[package]] 1888 | name = "objc2-encode" 1889 | version = "2.0.0-pre.2" 1890 | source = "registry+https://github.com/rust-lang/crates.io-index" 1891 | checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" 1892 | dependencies = [ 1893 | "objc-sys", 1894 | ] 1895 | 1896 | [[package]] 1897 | name = "objc_id" 1898 | version = "0.1.1" 1899 | source = "registry+https://github.com/rust-lang/crates.io-index" 1900 | checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" 1901 | dependencies = [ 1902 | "objc", 1903 | ] 1904 | 1905 | [[package]] 1906 | name = "once_cell" 1907 | version = "1.18.0" 1908 | source = "registry+https://github.com/rust-lang/crates.io-index" 1909 | checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" 1910 | 1911 | [[package]] 1912 | name = "orbclient" 1913 | version = "0.3.47" 1914 | source = "registry+https://github.com/rust-lang/crates.io-index" 1915 | checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" 1916 | dependencies = [ 1917 | "libredox 0.0.2", 1918 | ] 1919 | 1920 | [[package]] 1921 | name = "ordered-stream" 1922 | version = "0.2.0" 1923 | source = "registry+https://github.com/rust-lang/crates.io-index" 1924 | checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" 1925 | dependencies = [ 1926 | "futures-core", 1927 | "pin-project-lite", 1928 | ] 1929 | 1930 | [[package]] 1931 | name = "owned_ttf_parser" 1932 | version = "0.20.0" 1933 | source = "registry+https://github.com/rust-lang/crates.io-index" 1934 | checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7" 1935 | dependencies = [ 1936 | "ttf-parser", 1937 | ] 1938 | 1939 | [[package]] 1940 | name = "parking" 1941 | version = "2.2.0" 1942 | source = "registry+https://github.com/rust-lang/crates.io-index" 1943 | checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" 1944 | 1945 | [[package]] 1946 | name = "parking_lot" 1947 | version = "0.12.1" 1948 | source = "registry+https://github.com/rust-lang/crates.io-index" 1949 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1950 | dependencies = [ 1951 | "lock_api", 1952 | "parking_lot_core", 1953 | ] 1954 | 1955 | [[package]] 1956 | name = "parking_lot_core" 1957 | version = "0.9.9" 1958 | source = "registry+https://github.com/rust-lang/crates.io-index" 1959 | checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" 1960 | dependencies = [ 1961 | "cfg-if", 1962 | "libc", 1963 | "redox_syscall 0.4.1", 1964 | "smallvec", 1965 | "windows-targets 0.48.5", 1966 | ] 1967 | 1968 | [[package]] 1969 | name = "paste" 1970 | version = "1.0.14" 1971 | source = "registry+https://github.com/rust-lang/crates.io-index" 1972 | checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" 1973 | 1974 | [[package]] 1975 | name = "percent-encoding" 1976 | version = "2.3.1" 1977 | source = "registry+https://github.com/rust-lang/crates.io-index" 1978 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1979 | 1980 | [[package]] 1981 | name = "pin-project-lite" 1982 | version = "0.2.13" 1983 | source = "registry+https://github.com/rust-lang/crates.io-index" 1984 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 1985 | 1986 | [[package]] 1987 | name = "pin-utils" 1988 | version = "0.1.0" 1989 | source = "registry+https://github.com/rust-lang/crates.io-index" 1990 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1991 | 1992 | [[package]] 1993 | name = "piper" 1994 | version = "0.2.1" 1995 | source = "registry+https://github.com/rust-lang/crates.io-index" 1996 | checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" 1997 | dependencies = [ 1998 | "atomic-waker", 1999 | "fastrand 2.0.1", 2000 | "futures-io", 2001 | ] 2002 | 2003 | [[package]] 2004 | name = "pkg-config" 2005 | version = "0.3.27" 2006 | source = "registry+https://github.com/rust-lang/crates.io-index" 2007 | checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" 2008 | 2009 | [[package]] 2010 | name = "png" 2011 | version = "0.17.10" 2012 | source = "registry+https://github.com/rust-lang/crates.io-index" 2013 | checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" 2014 | dependencies = [ 2015 | "bitflags 1.3.2", 2016 | "crc32fast", 2017 | "fdeflate", 2018 | "flate2", 2019 | "miniz_oxide", 2020 | ] 2021 | 2022 | [[package]] 2023 | name = "polling" 2024 | version = "2.8.0" 2025 | source = "registry+https://github.com/rust-lang/crates.io-index" 2026 | checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" 2027 | dependencies = [ 2028 | "autocfg", 2029 | "bitflags 1.3.2", 2030 | "cfg-if", 2031 | "concurrent-queue", 2032 | "libc", 2033 | "log", 2034 | "pin-project-lite", 2035 | "windows-sys 0.48.0", 2036 | ] 2037 | 2038 | [[package]] 2039 | name = "polling" 2040 | version = "3.3.1" 2041 | source = "registry+https://github.com/rust-lang/crates.io-index" 2042 | checksum = "cf63fa624ab313c11656b4cda960bfc46c410187ad493c41f6ba2d8c1e991c9e" 2043 | dependencies = [ 2044 | "cfg-if", 2045 | "concurrent-queue", 2046 | "pin-project-lite", 2047 | "rustix 0.38.25", 2048 | "tracing", 2049 | "windows-sys 0.52.0", 2050 | ] 2051 | 2052 | [[package]] 2053 | name = "powerfmt" 2054 | version = "0.2.0" 2055 | source = "registry+https://github.com/rust-lang/crates.io-index" 2056 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 2057 | 2058 | [[package]] 2059 | name = "ppv-lite86" 2060 | version = "0.2.17" 2061 | source = "registry+https://github.com/rust-lang/crates.io-index" 2062 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 2063 | 2064 | [[package]] 2065 | name = "proc-macro-crate" 2066 | version = "1.3.1" 2067 | source = "registry+https://github.com/rust-lang/crates.io-index" 2068 | checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" 2069 | dependencies = [ 2070 | "once_cell", 2071 | "toml_edit", 2072 | ] 2073 | 2074 | [[package]] 2075 | name = "proc-macro2" 2076 | version = "1.0.70" 2077 | source = "registry+https://github.com/rust-lang/crates.io-index" 2078 | checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" 2079 | dependencies = [ 2080 | "unicode-ident", 2081 | ] 2082 | 2083 | [[package]] 2084 | name = "quote" 2085 | version = "1.0.33" 2086 | source = "registry+https://github.com/rust-lang/crates.io-index" 2087 | checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" 2088 | dependencies = [ 2089 | "proc-macro2", 2090 | ] 2091 | 2092 | [[package]] 2093 | name = "rand" 2094 | version = "0.8.5" 2095 | source = "registry+https://github.com/rust-lang/crates.io-index" 2096 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 2097 | dependencies = [ 2098 | "libc", 2099 | "rand_chacha", 2100 | "rand_core", 2101 | ] 2102 | 2103 | [[package]] 2104 | name = "rand_chacha" 2105 | version = "0.3.1" 2106 | source = "registry+https://github.com/rust-lang/crates.io-index" 2107 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 2108 | dependencies = [ 2109 | "ppv-lite86", 2110 | "rand_core", 2111 | ] 2112 | 2113 | [[package]] 2114 | name = "rand_core" 2115 | version = "0.6.4" 2116 | source = "registry+https://github.com/rust-lang/crates.io-index" 2117 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2118 | dependencies = [ 2119 | "getrandom", 2120 | ] 2121 | 2122 | [[package]] 2123 | name = "raw-window-handle" 2124 | version = "0.5.2" 2125 | source = "registry+https://github.com/rust-lang/crates.io-index" 2126 | checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" 2127 | 2128 | [[package]] 2129 | name = "rayon" 2130 | version = "1.8.0" 2131 | source = "registry+https://github.com/rust-lang/crates.io-index" 2132 | checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" 2133 | dependencies = [ 2134 | "either", 2135 | "rayon-core", 2136 | ] 2137 | 2138 | [[package]] 2139 | name = "rayon-core" 2140 | version = "1.12.0" 2141 | source = "registry+https://github.com/rust-lang/crates.io-index" 2142 | checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" 2143 | dependencies = [ 2144 | "crossbeam-deque", 2145 | "crossbeam-utils", 2146 | ] 2147 | 2148 | [[package]] 2149 | name = "redox_syscall" 2150 | version = "0.3.5" 2151 | source = "registry+https://github.com/rust-lang/crates.io-index" 2152 | checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" 2153 | dependencies = [ 2154 | "bitflags 1.3.2", 2155 | ] 2156 | 2157 | [[package]] 2158 | name = "redox_syscall" 2159 | version = "0.4.1" 2160 | source = "registry+https://github.com/rust-lang/crates.io-index" 2161 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 2162 | dependencies = [ 2163 | "bitflags 1.3.2", 2164 | ] 2165 | 2166 | [[package]] 2167 | name = "redox_users" 2168 | version = "0.4.4" 2169 | source = "registry+https://github.com/rust-lang/crates.io-index" 2170 | checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" 2171 | dependencies = [ 2172 | "getrandom", 2173 | "libredox 0.0.1", 2174 | "thiserror", 2175 | ] 2176 | 2177 | [[package]] 2178 | name = "regex" 2179 | version = "1.10.2" 2180 | source = "registry+https://github.com/rust-lang/crates.io-index" 2181 | checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" 2182 | dependencies = [ 2183 | "aho-corasick", 2184 | "memchr", 2185 | "regex-automata", 2186 | "regex-syntax", 2187 | ] 2188 | 2189 | [[package]] 2190 | name = "regex-automata" 2191 | version = "0.4.3" 2192 | source = "registry+https://github.com/rust-lang/crates.io-index" 2193 | checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" 2194 | dependencies = [ 2195 | "aho-corasick", 2196 | "memchr", 2197 | "regex-syntax", 2198 | ] 2199 | 2200 | [[package]] 2201 | name = "regex-syntax" 2202 | version = "0.8.2" 2203 | source = "registry+https://github.com/rust-lang/crates.io-index" 2204 | checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" 2205 | 2206 | [[package]] 2207 | name = "ron" 2208 | version = "0.8.1" 2209 | source = "registry+https://github.com/rust-lang/crates.io-index" 2210 | checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" 2211 | dependencies = [ 2212 | "base64", 2213 | "bitflags 2.4.1", 2214 | "serde", 2215 | "serde_derive", 2216 | ] 2217 | 2218 | [[package]] 2219 | name = "rustix" 2220 | version = "0.37.27" 2221 | source = "registry+https://github.com/rust-lang/crates.io-index" 2222 | checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" 2223 | dependencies = [ 2224 | "bitflags 1.3.2", 2225 | "errno", 2226 | "io-lifetimes", 2227 | "libc", 2228 | "linux-raw-sys 0.3.8", 2229 | "windows-sys 0.48.0", 2230 | ] 2231 | 2232 | [[package]] 2233 | name = "rustix" 2234 | version = "0.38.25" 2235 | source = "registry+https://github.com/rust-lang/crates.io-index" 2236 | checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" 2237 | dependencies = [ 2238 | "bitflags 2.4.1", 2239 | "errno", 2240 | "libc", 2241 | "linux-raw-sys 0.4.12", 2242 | "windows-sys 0.48.0", 2243 | ] 2244 | 2245 | [[package]] 2246 | name = "same-file" 2247 | version = "1.0.6" 2248 | source = "registry+https://github.com/rust-lang/crates.io-index" 2249 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 2250 | dependencies = [ 2251 | "winapi-util", 2252 | ] 2253 | 2254 | [[package]] 2255 | name = "scoped-tls" 2256 | version = "1.0.1" 2257 | source = "registry+https://github.com/rust-lang/crates.io-index" 2258 | checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 2259 | 2260 | [[package]] 2261 | name = "scopeguard" 2262 | version = "1.2.0" 2263 | source = "registry+https://github.com/rust-lang/crates.io-index" 2264 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 2265 | 2266 | [[package]] 2267 | name = "sctk-adwaita" 2268 | version = "0.5.4" 2269 | source = "registry+https://github.com/rust-lang/crates.io-index" 2270 | checksum = "cda4e97be1fd174ccc2aae81c8b694e803fa99b34e8fd0f057a9d70698e3ed09" 2271 | dependencies = [ 2272 | "ab_glyph", 2273 | "log", 2274 | "memmap2", 2275 | "smithay-client-toolkit", 2276 | "tiny-skia", 2277 | ] 2278 | 2279 | [[package]] 2280 | name = "serde" 2281 | version = "1.0.193" 2282 | source = "registry+https://github.com/rust-lang/crates.io-index" 2283 | checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" 2284 | dependencies = [ 2285 | "serde_derive", 2286 | ] 2287 | 2288 | [[package]] 2289 | name = "serde_derive" 2290 | version = "1.0.193" 2291 | source = "registry+https://github.com/rust-lang/crates.io-index" 2292 | checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" 2293 | dependencies = [ 2294 | "proc-macro2", 2295 | "quote", 2296 | "syn 2.0.39", 2297 | ] 2298 | 2299 | [[package]] 2300 | name = "serde_repr" 2301 | version = "0.1.17" 2302 | source = "registry+https://github.com/rust-lang/crates.io-index" 2303 | checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" 2304 | dependencies = [ 2305 | "proc-macro2", 2306 | "quote", 2307 | "syn 2.0.39", 2308 | ] 2309 | 2310 | [[package]] 2311 | name = "sha1" 2312 | version = "0.10.6" 2313 | source = "registry+https://github.com/rust-lang/crates.io-index" 2314 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 2315 | dependencies = [ 2316 | "cfg-if", 2317 | "cpufeatures", 2318 | "digest", 2319 | ] 2320 | 2321 | [[package]] 2322 | name = "signal-hook-registry" 2323 | version = "1.4.1" 2324 | source = "registry+https://github.com/rust-lang/crates.io-index" 2325 | checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" 2326 | dependencies = [ 2327 | "libc", 2328 | ] 2329 | 2330 | [[package]] 2331 | name = "simd-adler32" 2332 | version = "0.3.7" 2333 | source = "registry+https://github.com/rust-lang/crates.io-index" 2334 | checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 2335 | 2336 | [[package]] 2337 | name = "simple_logger" 2338 | version = "4.3.0" 2339 | source = "registry+https://github.com/rust-lang/crates.io-index" 2340 | checksum = "da0ca6504625ee1aa5fda33913d2005eab98c7a42dd85f116ecce3ff54c9d3ef" 2341 | dependencies = [ 2342 | "colored", 2343 | "log", 2344 | "time", 2345 | "windows-sys 0.48.0", 2346 | ] 2347 | 2348 | [[package]] 2349 | name = "slab" 2350 | version = "0.4.9" 2351 | source = "registry+https://github.com/rust-lang/crates.io-index" 2352 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2353 | dependencies = [ 2354 | "autocfg", 2355 | ] 2356 | 2357 | [[package]] 2358 | name = "slotmap" 2359 | version = "1.0.6" 2360 | source = "registry+https://github.com/rust-lang/crates.io-index" 2361 | checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" 2362 | dependencies = [ 2363 | "version_check", 2364 | ] 2365 | 2366 | [[package]] 2367 | name = "smallvec" 2368 | version = "1.11.2" 2369 | source = "registry+https://github.com/rust-lang/crates.io-index" 2370 | checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" 2371 | 2372 | [[package]] 2373 | name = "smithay-client-toolkit" 2374 | version = "0.16.1" 2375 | source = "registry+https://github.com/rust-lang/crates.io-index" 2376 | checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9" 2377 | dependencies = [ 2378 | "bitflags 1.3.2", 2379 | "calloop", 2380 | "dlib", 2381 | "lazy_static", 2382 | "log", 2383 | "memmap2", 2384 | "nix 0.24.3", 2385 | "pkg-config", 2386 | "wayland-client", 2387 | "wayland-cursor", 2388 | "wayland-protocols", 2389 | ] 2390 | 2391 | [[package]] 2392 | name = "smithay-clipboard" 2393 | version = "0.6.6" 2394 | source = "registry+https://github.com/rust-lang/crates.io-index" 2395 | checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" 2396 | dependencies = [ 2397 | "smithay-client-toolkit", 2398 | "wayland-client", 2399 | ] 2400 | 2401 | [[package]] 2402 | name = "socket2" 2403 | version = "0.4.10" 2404 | source = "registry+https://github.com/rust-lang/crates.io-index" 2405 | checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" 2406 | dependencies = [ 2407 | "libc", 2408 | "winapi", 2409 | ] 2410 | 2411 | [[package]] 2412 | name = "static_assertions" 2413 | version = "1.1.0" 2414 | source = "registry+https://github.com/rust-lang/crates.io-index" 2415 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 2416 | 2417 | [[package]] 2418 | name = "str-buf" 2419 | version = "1.0.6" 2420 | source = "registry+https://github.com/rust-lang/crates.io-index" 2421 | checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" 2422 | 2423 | [[package]] 2424 | name = "strict-num" 2425 | version = "0.1.1" 2426 | source = "registry+https://github.com/rust-lang/crates.io-index" 2427 | checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" 2428 | 2429 | [[package]] 2430 | name = "syn" 2431 | version = "1.0.109" 2432 | source = "registry+https://github.com/rust-lang/crates.io-index" 2433 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 2434 | dependencies = [ 2435 | "proc-macro2", 2436 | "quote", 2437 | "unicode-ident", 2438 | ] 2439 | 2440 | [[package]] 2441 | name = "syn" 2442 | version = "2.0.39" 2443 | source = "registry+https://github.com/rust-lang/crates.io-index" 2444 | checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" 2445 | dependencies = [ 2446 | "proc-macro2", 2447 | "quote", 2448 | "unicode-ident", 2449 | ] 2450 | 2451 | [[package]] 2452 | name = "sysex-drop" 2453 | version = "1.4.0" 2454 | dependencies = [ 2455 | "anyhow", 2456 | "eframe", 2457 | "log", 2458 | "midir", 2459 | "midly", 2460 | "serde", 2461 | "simple_logger", 2462 | ] 2463 | 2464 | [[package]] 2465 | name = "tempfile" 2466 | version = "3.8.1" 2467 | source = "registry+https://github.com/rust-lang/crates.io-index" 2468 | checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" 2469 | dependencies = [ 2470 | "cfg-if", 2471 | "fastrand 2.0.1", 2472 | "redox_syscall 0.4.1", 2473 | "rustix 0.38.25", 2474 | "windows-sys 0.48.0", 2475 | ] 2476 | 2477 | [[package]] 2478 | name = "thiserror" 2479 | version = "1.0.50" 2480 | source = "registry+https://github.com/rust-lang/crates.io-index" 2481 | checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" 2482 | dependencies = [ 2483 | "thiserror-impl", 2484 | ] 2485 | 2486 | [[package]] 2487 | name = "thiserror-impl" 2488 | version = "1.0.50" 2489 | source = "registry+https://github.com/rust-lang/crates.io-index" 2490 | checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" 2491 | dependencies = [ 2492 | "proc-macro2", 2493 | "quote", 2494 | "syn 2.0.39", 2495 | ] 2496 | 2497 | [[package]] 2498 | name = "time" 2499 | version = "0.3.36" 2500 | source = "registry+https://github.com/rust-lang/crates.io-index" 2501 | checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" 2502 | dependencies = [ 2503 | "deranged", 2504 | "itoa", 2505 | "libc", 2506 | "num-conv", 2507 | "num_threads", 2508 | "powerfmt", 2509 | "serde", 2510 | "time-core", 2511 | "time-macros", 2512 | ] 2513 | 2514 | [[package]] 2515 | name = "time-core" 2516 | version = "0.1.2" 2517 | source = "registry+https://github.com/rust-lang/crates.io-index" 2518 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 2519 | 2520 | [[package]] 2521 | name = "time-macros" 2522 | version = "0.2.18" 2523 | source = "registry+https://github.com/rust-lang/crates.io-index" 2524 | checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" 2525 | dependencies = [ 2526 | "num-conv", 2527 | "time-core", 2528 | ] 2529 | 2530 | [[package]] 2531 | name = "tiny-skia" 2532 | version = "0.8.4" 2533 | source = "registry+https://github.com/rust-lang/crates.io-index" 2534 | checksum = "df8493a203431061e901613751931f047d1971337153f96d0e5e363d6dbf6a67" 2535 | dependencies = [ 2536 | "arrayref", 2537 | "arrayvec", 2538 | "bytemuck", 2539 | "cfg-if", 2540 | "png", 2541 | "tiny-skia-path", 2542 | ] 2543 | 2544 | [[package]] 2545 | name = "tiny-skia-path" 2546 | version = "0.8.4" 2547 | source = "registry+https://github.com/rust-lang/crates.io-index" 2548 | checksum = "adbfb5d3f3dd57a0e11d12f4f13d4ebbbc1b5c15b7ab0a156d030b21da5f677c" 2549 | dependencies = [ 2550 | "arrayref", 2551 | "bytemuck", 2552 | "strict-num", 2553 | ] 2554 | 2555 | [[package]] 2556 | name = "tinyvec" 2557 | version = "1.6.0" 2558 | source = "registry+https://github.com/rust-lang/crates.io-index" 2559 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2560 | dependencies = [ 2561 | "tinyvec_macros", 2562 | ] 2563 | 2564 | [[package]] 2565 | name = "tinyvec_macros" 2566 | version = "0.1.1" 2567 | source = "registry+https://github.com/rust-lang/crates.io-index" 2568 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2569 | 2570 | [[package]] 2571 | name = "toml_datetime" 2572 | version = "0.6.5" 2573 | source = "registry+https://github.com/rust-lang/crates.io-index" 2574 | checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" 2575 | 2576 | [[package]] 2577 | name = "toml_edit" 2578 | version = "0.19.15" 2579 | source = "registry+https://github.com/rust-lang/crates.io-index" 2580 | checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 2581 | dependencies = [ 2582 | "indexmap", 2583 | "toml_datetime", 2584 | "winnow", 2585 | ] 2586 | 2587 | [[package]] 2588 | name = "tracing" 2589 | version = "0.1.40" 2590 | source = "registry+https://github.com/rust-lang/crates.io-index" 2591 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 2592 | dependencies = [ 2593 | "pin-project-lite", 2594 | "tracing-attributes", 2595 | "tracing-core", 2596 | ] 2597 | 2598 | [[package]] 2599 | name = "tracing-attributes" 2600 | version = "0.1.27" 2601 | source = "registry+https://github.com/rust-lang/crates.io-index" 2602 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 2603 | dependencies = [ 2604 | "proc-macro2", 2605 | "quote", 2606 | "syn 2.0.39", 2607 | ] 2608 | 2609 | [[package]] 2610 | name = "tracing-core" 2611 | version = "0.1.32" 2612 | source = "registry+https://github.com/rust-lang/crates.io-index" 2613 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 2614 | dependencies = [ 2615 | "once_cell", 2616 | ] 2617 | 2618 | [[package]] 2619 | name = "ttf-parser" 2620 | version = "0.20.0" 2621 | source = "registry+https://github.com/rust-lang/crates.io-index" 2622 | checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" 2623 | 2624 | [[package]] 2625 | name = "typenum" 2626 | version = "1.17.0" 2627 | source = "registry+https://github.com/rust-lang/crates.io-index" 2628 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 2629 | 2630 | [[package]] 2631 | name = "uds_windows" 2632 | version = "1.0.2" 2633 | source = "registry+https://github.com/rust-lang/crates.io-index" 2634 | checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d" 2635 | dependencies = [ 2636 | "tempfile", 2637 | "winapi", 2638 | ] 2639 | 2640 | [[package]] 2641 | name = "unicode-bidi" 2642 | version = "0.3.13" 2643 | source = "registry+https://github.com/rust-lang/crates.io-index" 2644 | checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" 2645 | 2646 | [[package]] 2647 | name = "unicode-ident" 2648 | version = "1.0.12" 2649 | source = "registry+https://github.com/rust-lang/crates.io-index" 2650 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 2651 | 2652 | [[package]] 2653 | name = "unicode-normalization" 2654 | version = "0.1.22" 2655 | source = "registry+https://github.com/rust-lang/crates.io-index" 2656 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 2657 | dependencies = [ 2658 | "tinyvec", 2659 | ] 2660 | 2661 | [[package]] 2662 | name = "url" 2663 | version = "2.5.0" 2664 | source = "registry+https://github.com/rust-lang/crates.io-index" 2665 | checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 2666 | dependencies = [ 2667 | "form_urlencoded", 2668 | "idna", 2669 | "percent-encoding", 2670 | ] 2671 | 2672 | [[package]] 2673 | name = "vec_map" 2674 | version = "0.8.2" 2675 | source = "registry+https://github.com/rust-lang/crates.io-index" 2676 | checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" 2677 | 2678 | [[package]] 2679 | name = "version_check" 2680 | version = "0.9.4" 2681 | source = "registry+https://github.com/rust-lang/crates.io-index" 2682 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2683 | 2684 | [[package]] 2685 | name = "waker-fn" 2686 | version = "1.1.1" 2687 | source = "registry+https://github.com/rust-lang/crates.io-index" 2688 | checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" 2689 | 2690 | [[package]] 2691 | name = "walkdir" 2692 | version = "2.4.0" 2693 | source = "registry+https://github.com/rust-lang/crates.io-index" 2694 | checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" 2695 | dependencies = [ 2696 | "same-file", 2697 | "winapi-util", 2698 | ] 2699 | 2700 | [[package]] 2701 | name = "wasi" 2702 | version = "0.11.0+wasi-snapshot-preview1" 2703 | source = "registry+https://github.com/rust-lang/crates.io-index" 2704 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2705 | 2706 | [[package]] 2707 | name = "wasm-bindgen" 2708 | version = "0.2.89" 2709 | source = "registry+https://github.com/rust-lang/crates.io-index" 2710 | checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" 2711 | dependencies = [ 2712 | "cfg-if", 2713 | "wasm-bindgen-macro", 2714 | ] 2715 | 2716 | [[package]] 2717 | name = "wasm-bindgen-backend" 2718 | version = "0.2.89" 2719 | source = "registry+https://github.com/rust-lang/crates.io-index" 2720 | checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" 2721 | dependencies = [ 2722 | "bumpalo", 2723 | "log", 2724 | "once_cell", 2725 | "proc-macro2", 2726 | "quote", 2727 | "syn 2.0.39", 2728 | "wasm-bindgen-shared", 2729 | ] 2730 | 2731 | [[package]] 2732 | name = "wasm-bindgen-futures" 2733 | version = "0.4.39" 2734 | source = "registry+https://github.com/rust-lang/crates.io-index" 2735 | checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" 2736 | dependencies = [ 2737 | "cfg-if", 2738 | "js-sys", 2739 | "wasm-bindgen", 2740 | "web-sys", 2741 | ] 2742 | 2743 | [[package]] 2744 | name = "wasm-bindgen-macro" 2745 | version = "0.2.89" 2746 | source = "registry+https://github.com/rust-lang/crates.io-index" 2747 | checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" 2748 | dependencies = [ 2749 | "quote", 2750 | "wasm-bindgen-macro-support", 2751 | ] 2752 | 2753 | [[package]] 2754 | name = "wasm-bindgen-macro-support" 2755 | version = "0.2.89" 2756 | source = "registry+https://github.com/rust-lang/crates.io-index" 2757 | checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" 2758 | dependencies = [ 2759 | "proc-macro2", 2760 | "quote", 2761 | "syn 2.0.39", 2762 | "wasm-bindgen-backend", 2763 | "wasm-bindgen-shared", 2764 | ] 2765 | 2766 | [[package]] 2767 | name = "wasm-bindgen-shared" 2768 | version = "0.2.89" 2769 | source = "registry+https://github.com/rust-lang/crates.io-index" 2770 | checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" 2771 | 2772 | [[package]] 2773 | name = "wayland-client" 2774 | version = "0.29.5" 2775 | source = "registry+https://github.com/rust-lang/crates.io-index" 2776 | checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" 2777 | dependencies = [ 2778 | "bitflags 1.3.2", 2779 | "downcast-rs", 2780 | "libc", 2781 | "nix 0.24.3", 2782 | "scoped-tls", 2783 | "wayland-commons", 2784 | "wayland-scanner", 2785 | "wayland-sys 0.29.5", 2786 | ] 2787 | 2788 | [[package]] 2789 | name = "wayland-commons" 2790 | version = "0.29.5" 2791 | source = "registry+https://github.com/rust-lang/crates.io-index" 2792 | checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" 2793 | dependencies = [ 2794 | "nix 0.24.3", 2795 | "once_cell", 2796 | "smallvec", 2797 | "wayland-sys 0.29.5", 2798 | ] 2799 | 2800 | [[package]] 2801 | name = "wayland-cursor" 2802 | version = "0.29.5" 2803 | source = "registry+https://github.com/rust-lang/crates.io-index" 2804 | checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" 2805 | dependencies = [ 2806 | "nix 0.24.3", 2807 | "wayland-client", 2808 | "xcursor", 2809 | ] 2810 | 2811 | [[package]] 2812 | name = "wayland-protocols" 2813 | version = "0.29.5" 2814 | source = "registry+https://github.com/rust-lang/crates.io-index" 2815 | checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" 2816 | dependencies = [ 2817 | "bitflags 1.3.2", 2818 | "wayland-client", 2819 | "wayland-commons", 2820 | "wayland-scanner", 2821 | ] 2822 | 2823 | [[package]] 2824 | name = "wayland-scanner" 2825 | version = "0.29.5" 2826 | source = "registry+https://github.com/rust-lang/crates.io-index" 2827 | checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" 2828 | dependencies = [ 2829 | "proc-macro2", 2830 | "quote", 2831 | "xml-rs", 2832 | ] 2833 | 2834 | [[package]] 2835 | name = "wayland-sys" 2836 | version = "0.29.5" 2837 | source = "registry+https://github.com/rust-lang/crates.io-index" 2838 | checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" 2839 | dependencies = [ 2840 | "dlib", 2841 | "lazy_static", 2842 | "pkg-config", 2843 | ] 2844 | 2845 | [[package]] 2846 | name = "wayland-sys" 2847 | version = "0.30.1" 2848 | source = "registry+https://github.com/rust-lang/crates.io-index" 2849 | checksum = "96b2a02ac608e07132978689a6f9bf4214949c85998c247abadd4f4129b1aa06" 2850 | dependencies = [ 2851 | "dlib", 2852 | "lazy_static", 2853 | "log", 2854 | "pkg-config", 2855 | ] 2856 | 2857 | [[package]] 2858 | name = "web-sys" 2859 | version = "0.3.66" 2860 | source = "registry+https://github.com/rust-lang/crates.io-index" 2861 | checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" 2862 | dependencies = [ 2863 | "js-sys", 2864 | "wasm-bindgen", 2865 | ] 2866 | 2867 | [[package]] 2868 | name = "web-time" 2869 | version = "0.2.3" 2870 | source = "registry+https://github.com/rust-lang/crates.io-index" 2871 | checksum = "57099a701fb3a8043f993e8228dc24229c7b942e2b009a1b962e54489ba1d3bf" 2872 | dependencies = [ 2873 | "js-sys", 2874 | "wasm-bindgen", 2875 | ] 2876 | 2877 | [[package]] 2878 | name = "webbrowser" 2879 | version = "0.8.12" 2880 | source = "registry+https://github.com/rust-lang/crates.io-index" 2881 | checksum = "82b2391658b02c27719fc5a0a73d6e696285138e8b12fba9d4baa70451023c71" 2882 | dependencies = [ 2883 | "core-foundation", 2884 | "home", 2885 | "jni", 2886 | "log", 2887 | "ndk-context", 2888 | "objc", 2889 | "raw-window-handle", 2890 | "url", 2891 | "web-sys", 2892 | ] 2893 | 2894 | [[package]] 2895 | name = "winapi" 2896 | version = "0.3.9" 2897 | source = "registry+https://github.com/rust-lang/crates.io-index" 2898 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2899 | dependencies = [ 2900 | "winapi-i686-pc-windows-gnu", 2901 | "winapi-x86_64-pc-windows-gnu", 2902 | ] 2903 | 2904 | [[package]] 2905 | name = "winapi-i686-pc-windows-gnu" 2906 | version = "0.4.0" 2907 | source = "registry+https://github.com/rust-lang/crates.io-index" 2908 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2909 | 2910 | [[package]] 2911 | name = "winapi-util" 2912 | version = "0.1.6" 2913 | source = "registry+https://github.com/rust-lang/crates.io-index" 2914 | checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" 2915 | dependencies = [ 2916 | "winapi", 2917 | ] 2918 | 2919 | [[package]] 2920 | name = "winapi-wsapoll" 2921 | version = "0.1.1" 2922 | source = "registry+https://github.com/rust-lang/crates.io-index" 2923 | checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e" 2924 | dependencies = [ 2925 | "winapi", 2926 | ] 2927 | 2928 | [[package]] 2929 | name = "winapi-x86_64-pc-windows-gnu" 2930 | version = "0.4.0" 2931 | source = "registry+https://github.com/rust-lang/crates.io-index" 2932 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2933 | 2934 | [[package]] 2935 | name = "windows" 2936 | version = "0.43.0" 2937 | source = "registry+https://github.com/rust-lang/crates.io-index" 2938 | checksum = "04662ed0e3e5630dfa9b26e4cb823b817f1a9addda855d973a9458c236556244" 2939 | dependencies = [ 2940 | "windows_aarch64_gnullvm 0.42.2", 2941 | "windows_aarch64_msvc 0.42.2", 2942 | "windows_i686_gnu 0.42.2", 2943 | "windows_i686_msvc 0.42.2", 2944 | "windows_x86_64_gnu 0.42.2", 2945 | "windows_x86_64_gnullvm 0.42.2", 2946 | "windows_x86_64_msvc 0.42.2", 2947 | ] 2948 | 2949 | [[package]] 2950 | name = "windows" 2951 | version = "0.48.0" 2952 | source = "registry+https://github.com/rust-lang/crates.io-index" 2953 | checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" 2954 | dependencies = [ 2955 | "windows-implement", 2956 | "windows-interface", 2957 | "windows-targets 0.48.5", 2958 | ] 2959 | 2960 | [[package]] 2961 | name = "windows-implement" 2962 | version = "0.48.0" 2963 | source = "registry+https://github.com/rust-lang/crates.io-index" 2964 | checksum = "5e2ee588991b9e7e6c8338edf3333fbe4da35dc72092643958ebb43f0ab2c49c" 2965 | dependencies = [ 2966 | "proc-macro2", 2967 | "quote", 2968 | "syn 1.0.109", 2969 | ] 2970 | 2971 | [[package]] 2972 | name = "windows-interface" 2973 | version = "0.48.0" 2974 | source = "registry+https://github.com/rust-lang/crates.io-index" 2975 | checksum = "e6fb8df20c9bcaa8ad6ab513f7b40104840c8867d5751126e4df3b08388d0cc7" 2976 | dependencies = [ 2977 | "proc-macro2", 2978 | "quote", 2979 | "syn 1.0.109", 2980 | ] 2981 | 2982 | [[package]] 2983 | name = "windows-sys" 2984 | version = "0.45.0" 2985 | source = "registry+https://github.com/rust-lang/crates.io-index" 2986 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 2987 | dependencies = [ 2988 | "windows-targets 0.42.2", 2989 | ] 2990 | 2991 | [[package]] 2992 | name = "windows-sys" 2993 | version = "0.48.0" 2994 | source = "registry+https://github.com/rust-lang/crates.io-index" 2995 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2996 | dependencies = [ 2997 | "windows-targets 0.48.5", 2998 | ] 2999 | 3000 | [[package]] 3001 | name = "windows-sys" 3002 | version = "0.52.0" 3003 | source = "registry+https://github.com/rust-lang/crates.io-index" 3004 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 3005 | dependencies = [ 3006 | "windows-targets 0.52.0", 3007 | ] 3008 | 3009 | [[package]] 3010 | name = "windows-targets" 3011 | version = "0.42.2" 3012 | source = "registry+https://github.com/rust-lang/crates.io-index" 3013 | checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 3014 | dependencies = [ 3015 | "windows_aarch64_gnullvm 0.42.2", 3016 | "windows_aarch64_msvc 0.42.2", 3017 | "windows_i686_gnu 0.42.2", 3018 | "windows_i686_msvc 0.42.2", 3019 | "windows_x86_64_gnu 0.42.2", 3020 | "windows_x86_64_gnullvm 0.42.2", 3021 | "windows_x86_64_msvc 0.42.2", 3022 | ] 3023 | 3024 | [[package]] 3025 | name = "windows-targets" 3026 | version = "0.48.5" 3027 | source = "registry+https://github.com/rust-lang/crates.io-index" 3028 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 3029 | dependencies = [ 3030 | "windows_aarch64_gnullvm 0.48.5", 3031 | "windows_aarch64_msvc 0.48.5", 3032 | "windows_i686_gnu 0.48.5", 3033 | "windows_i686_msvc 0.48.5", 3034 | "windows_x86_64_gnu 0.48.5", 3035 | "windows_x86_64_gnullvm 0.48.5", 3036 | "windows_x86_64_msvc 0.48.5", 3037 | ] 3038 | 3039 | [[package]] 3040 | name = "windows-targets" 3041 | version = "0.52.0" 3042 | source = "registry+https://github.com/rust-lang/crates.io-index" 3043 | checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" 3044 | dependencies = [ 3045 | "windows_aarch64_gnullvm 0.52.0", 3046 | "windows_aarch64_msvc 0.52.0", 3047 | "windows_i686_gnu 0.52.0", 3048 | "windows_i686_msvc 0.52.0", 3049 | "windows_x86_64_gnu 0.52.0", 3050 | "windows_x86_64_gnullvm 0.52.0", 3051 | "windows_x86_64_msvc 0.52.0", 3052 | ] 3053 | 3054 | [[package]] 3055 | name = "windows_aarch64_gnullvm" 3056 | version = "0.42.2" 3057 | source = "registry+https://github.com/rust-lang/crates.io-index" 3058 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 3059 | 3060 | [[package]] 3061 | name = "windows_aarch64_gnullvm" 3062 | version = "0.48.5" 3063 | source = "registry+https://github.com/rust-lang/crates.io-index" 3064 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 3065 | 3066 | [[package]] 3067 | name = "windows_aarch64_gnullvm" 3068 | version = "0.52.0" 3069 | source = "registry+https://github.com/rust-lang/crates.io-index" 3070 | checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" 3071 | 3072 | [[package]] 3073 | name = "windows_aarch64_msvc" 3074 | version = "0.42.2" 3075 | source = "registry+https://github.com/rust-lang/crates.io-index" 3076 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 3077 | 3078 | [[package]] 3079 | name = "windows_aarch64_msvc" 3080 | version = "0.48.5" 3081 | source = "registry+https://github.com/rust-lang/crates.io-index" 3082 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 3083 | 3084 | [[package]] 3085 | name = "windows_aarch64_msvc" 3086 | version = "0.52.0" 3087 | source = "registry+https://github.com/rust-lang/crates.io-index" 3088 | checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" 3089 | 3090 | [[package]] 3091 | name = "windows_i686_gnu" 3092 | version = "0.42.2" 3093 | source = "registry+https://github.com/rust-lang/crates.io-index" 3094 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 3095 | 3096 | [[package]] 3097 | name = "windows_i686_gnu" 3098 | version = "0.48.5" 3099 | source = "registry+https://github.com/rust-lang/crates.io-index" 3100 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 3101 | 3102 | [[package]] 3103 | name = "windows_i686_gnu" 3104 | version = "0.52.0" 3105 | source = "registry+https://github.com/rust-lang/crates.io-index" 3106 | checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" 3107 | 3108 | [[package]] 3109 | name = "windows_i686_msvc" 3110 | version = "0.42.2" 3111 | source = "registry+https://github.com/rust-lang/crates.io-index" 3112 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 3113 | 3114 | [[package]] 3115 | name = "windows_i686_msvc" 3116 | version = "0.48.5" 3117 | source = "registry+https://github.com/rust-lang/crates.io-index" 3118 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 3119 | 3120 | [[package]] 3121 | name = "windows_i686_msvc" 3122 | version = "0.52.0" 3123 | source = "registry+https://github.com/rust-lang/crates.io-index" 3124 | checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" 3125 | 3126 | [[package]] 3127 | name = "windows_x86_64_gnu" 3128 | version = "0.42.2" 3129 | source = "registry+https://github.com/rust-lang/crates.io-index" 3130 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 3131 | 3132 | [[package]] 3133 | name = "windows_x86_64_gnu" 3134 | version = "0.48.5" 3135 | source = "registry+https://github.com/rust-lang/crates.io-index" 3136 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 3137 | 3138 | [[package]] 3139 | name = "windows_x86_64_gnu" 3140 | version = "0.52.0" 3141 | source = "registry+https://github.com/rust-lang/crates.io-index" 3142 | checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" 3143 | 3144 | [[package]] 3145 | name = "windows_x86_64_gnullvm" 3146 | version = "0.42.2" 3147 | source = "registry+https://github.com/rust-lang/crates.io-index" 3148 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 3149 | 3150 | [[package]] 3151 | name = "windows_x86_64_gnullvm" 3152 | version = "0.48.5" 3153 | source = "registry+https://github.com/rust-lang/crates.io-index" 3154 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 3155 | 3156 | [[package]] 3157 | name = "windows_x86_64_gnullvm" 3158 | version = "0.52.0" 3159 | source = "registry+https://github.com/rust-lang/crates.io-index" 3160 | checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" 3161 | 3162 | [[package]] 3163 | name = "windows_x86_64_msvc" 3164 | version = "0.42.2" 3165 | source = "registry+https://github.com/rust-lang/crates.io-index" 3166 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 3167 | 3168 | [[package]] 3169 | name = "windows_x86_64_msvc" 3170 | version = "0.48.5" 3171 | source = "registry+https://github.com/rust-lang/crates.io-index" 3172 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 3173 | 3174 | [[package]] 3175 | name = "windows_x86_64_msvc" 3176 | version = "0.52.0" 3177 | source = "registry+https://github.com/rust-lang/crates.io-index" 3178 | checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" 3179 | 3180 | [[package]] 3181 | name = "winit" 3182 | version = "0.28.7" 3183 | source = "registry+https://github.com/rust-lang/crates.io-index" 3184 | checksum = "9596d90b45384f5281384ab204224876e8e8bf7d58366d9b795ad99aa9894b94" 3185 | dependencies = [ 3186 | "android-activity", 3187 | "bitflags 1.3.2", 3188 | "cfg_aliases", 3189 | "core-foundation", 3190 | "core-graphics", 3191 | "dispatch", 3192 | "instant", 3193 | "libc", 3194 | "log", 3195 | "mio", 3196 | "ndk", 3197 | "objc2", 3198 | "once_cell", 3199 | "orbclient", 3200 | "percent-encoding", 3201 | "raw-window-handle", 3202 | "redox_syscall 0.3.5", 3203 | "sctk-adwaita", 3204 | "smithay-client-toolkit", 3205 | "wasm-bindgen", 3206 | "wayland-client", 3207 | "wayland-commons", 3208 | "wayland-protocols", 3209 | "wayland-scanner", 3210 | "web-sys", 3211 | "windows-sys 0.45.0", 3212 | "x11-dl", 3213 | ] 3214 | 3215 | [[package]] 3216 | name = "winnow" 3217 | version = "0.5.19" 3218 | source = "registry+https://github.com/rust-lang/crates.io-index" 3219 | checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" 3220 | dependencies = [ 3221 | "memchr", 3222 | ] 3223 | 3224 | [[package]] 3225 | name = "x11-dl" 3226 | version = "2.21.0" 3227 | source = "registry+https://github.com/rust-lang/crates.io-index" 3228 | checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" 3229 | dependencies = [ 3230 | "libc", 3231 | "once_cell", 3232 | "pkg-config", 3233 | ] 3234 | 3235 | [[package]] 3236 | name = "x11rb" 3237 | version = "0.12.0" 3238 | source = "registry+https://github.com/rust-lang/crates.io-index" 3239 | checksum = "b1641b26d4dec61337c35a1b1aaf9e3cba8f46f0b43636c609ab0291a648040a" 3240 | dependencies = [ 3241 | "gethostname", 3242 | "nix 0.26.4", 3243 | "winapi", 3244 | "winapi-wsapoll", 3245 | "x11rb-protocol", 3246 | ] 3247 | 3248 | [[package]] 3249 | name = "x11rb-protocol" 3250 | version = "0.12.0" 3251 | source = "registry+https://github.com/rust-lang/crates.io-index" 3252 | checksum = "82d6c3f9a0fb6701fab8f6cea9b0c0bd5d6876f1f89f7fada07e558077c344bc" 3253 | dependencies = [ 3254 | "nix 0.26.4", 3255 | ] 3256 | 3257 | [[package]] 3258 | name = "xcursor" 3259 | version = "0.3.4" 3260 | source = "registry+https://github.com/rust-lang/crates.io-index" 3261 | checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" 3262 | dependencies = [ 3263 | "nom", 3264 | ] 3265 | 3266 | [[package]] 3267 | name = "xdg-home" 3268 | version = "1.0.0" 3269 | source = "registry+https://github.com/rust-lang/crates.io-index" 3270 | checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd" 3271 | dependencies = [ 3272 | "nix 0.26.4", 3273 | "winapi", 3274 | ] 3275 | 3276 | [[package]] 3277 | name = "xml-rs" 3278 | version = "0.8.19" 3279 | source = "registry+https://github.com/rust-lang/crates.io-index" 3280 | checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" 3281 | 3282 | [[package]] 3283 | name = "zbus" 3284 | version = "3.14.1" 3285 | source = "registry+https://github.com/rust-lang/crates.io-index" 3286 | checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948" 3287 | dependencies = [ 3288 | "async-broadcast", 3289 | "async-executor", 3290 | "async-fs", 3291 | "async-io 1.13.0", 3292 | "async-lock 2.8.0", 3293 | "async-process", 3294 | "async-recursion", 3295 | "async-task", 3296 | "async-trait", 3297 | "blocking", 3298 | "byteorder", 3299 | "derivative", 3300 | "enumflags2", 3301 | "event-listener 2.5.3", 3302 | "futures-core", 3303 | "futures-sink", 3304 | "futures-util", 3305 | "hex", 3306 | "nix 0.26.4", 3307 | "once_cell", 3308 | "ordered-stream", 3309 | "rand", 3310 | "serde", 3311 | "serde_repr", 3312 | "sha1", 3313 | "static_assertions", 3314 | "tracing", 3315 | "uds_windows", 3316 | "winapi", 3317 | "xdg-home", 3318 | "zbus_macros", 3319 | "zbus_names", 3320 | "zvariant", 3321 | ] 3322 | 3323 | [[package]] 3324 | name = "zbus_macros" 3325 | version = "3.14.1" 3326 | source = "registry+https://github.com/rust-lang/crates.io-index" 3327 | checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d" 3328 | dependencies = [ 3329 | "proc-macro-crate", 3330 | "proc-macro2", 3331 | "quote", 3332 | "regex", 3333 | "syn 1.0.109", 3334 | "zvariant_utils", 3335 | ] 3336 | 3337 | [[package]] 3338 | name = "zbus_names" 3339 | version = "2.6.0" 3340 | source = "registry+https://github.com/rust-lang/crates.io-index" 3341 | checksum = "fb80bb776dbda6e23d705cf0123c3b95df99c4ebeaec6c2599d4a5419902b4a9" 3342 | dependencies = [ 3343 | "serde", 3344 | "static_assertions", 3345 | "zvariant", 3346 | ] 3347 | 3348 | [[package]] 3349 | name = "zerocopy" 3350 | version = "0.7.27" 3351 | source = "registry+https://github.com/rust-lang/crates.io-index" 3352 | checksum = "f43de342578a3a14a9314a2dab1942cbfcbe5686e1f91acdc513058063eafe18" 3353 | dependencies = [ 3354 | "zerocopy-derive", 3355 | ] 3356 | 3357 | [[package]] 3358 | name = "zerocopy-derive" 3359 | version = "0.7.27" 3360 | source = "registry+https://github.com/rust-lang/crates.io-index" 3361 | checksum = "e1012d89e3acb79fad7a799ce96866cfb8098b74638465ea1b1533d35900ca90" 3362 | dependencies = [ 3363 | "proc-macro2", 3364 | "quote", 3365 | "syn 2.0.39", 3366 | ] 3367 | 3368 | [[package]] 3369 | name = "zvariant" 3370 | version = "3.15.0" 3371 | source = "registry+https://github.com/rust-lang/crates.io-index" 3372 | checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c" 3373 | dependencies = [ 3374 | "byteorder", 3375 | "enumflags2", 3376 | "libc", 3377 | "serde", 3378 | "static_assertions", 3379 | "zvariant_derive", 3380 | ] 3381 | 3382 | [[package]] 3383 | name = "zvariant_derive" 3384 | version = "3.15.0" 3385 | source = "registry+https://github.com/rust-lang/crates.io-index" 3386 | checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd" 3387 | dependencies = [ 3388 | "proc-macro-crate", 3389 | "proc-macro2", 3390 | "quote", 3391 | "syn 1.0.109", 3392 | "zvariant_utils", 3393 | ] 3394 | 3395 | [[package]] 3396 | name = "zvariant_utils" 3397 | version = "1.0.1" 3398 | source = "registry+https://github.com/rust-lang/crates.io-index" 3399 | checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" 3400 | dependencies = [ 3401 | "proc-macro2", 3402 | "quote", 3403 | "syn 1.0.109", 3404 | ] 3405 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "sysex-drop" 3 | version = "1.4.0" 4 | authors = ["Oliver Rockstedt "] 5 | license = "MIT" 6 | edition = "2021" 7 | rust-version = "1.72" 8 | description = "Drag-and-drop MIDI SysEx dump utility" 9 | homepage = "https://github.com/sourcebox/sysex-drop" 10 | repository = "https://github.com/sourcebox/sysex-drop" 11 | 12 | [dependencies] 13 | anyhow = "1.0.75" 14 | log = { version = "0.4.20", features = [ 15 | "max_level_debug", 16 | "release_max_level_info", 17 | ] } 18 | midir = "0.9.1" 19 | midly = "0.5.3" 20 | serde = { version = "1.0.193", features = ["derive"] } 21 | simple_logger = "4.3.0" 22 | 23 | [dependencies.eframe] 24 | version = "0.24.1" 25 | features = ["persistence"] 26 | 27 | [profile.release] 28 | lto = true 29 | strip = true 30 | 31 | [package.metadata.bundle] 32 | icon = [ 33 | "icons/32x32/sysex-drop.png", 34 | "icons/128x128/sysex-drop.png", 35 | "icons/256x256/sysex-drop.png", 36 | ] 37 | identifier = "de.sourcebox.sysex-drop" 38 | name = "SysEx Drop" 39 | osx_minimum_system_version = "10.8" 40 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Oliver Rockstedt 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SysEx Drop 2 | 3 | ## About 4 | 5 | **SysEx Drop** is a cross-platform utility for sending SysEx files to MIDI devices via a simple drag-and-drop GUI. 6 | 7 | ![Screenshot](screenshot.png) 8 | 9 | ## Usage 10 | 11 | - Download and install the package for your platform from the [releases page](https://github.com/sourcebox/sysex-drop/releases/latest). 12 | - macOS: open the DMG file and drag the program symbol into the *Applications* folder on your disk. 13 | - Windows: open the MSI file to run the installer or run the EXE file directly without installation 14 | - Linux: open the AppImage to run the application without installation or use the DEB file to install it (Debian-based distributions only). 15 | - Launch the application. Depending on the platform, there may be security warnings about being from an untrusted developer or source. You have to accept these warnings or [build the application from source](BUILDING.md) yourself. This is a common issue for open source applications because they are not signed by their developers at the OS manufacturers. 16 | - Drop a file onto the application window. The file must either contain raw SysEx data or be in *Standard MIDI File (SMF)* format with a `.mid` extension. If the file is valid, some information about its content is displayed. In case of invalid file content, an error message is shown in the lower part of the window. 17 | - Press the *Start* button. The SysEx data from the file is sent now to the device. The progress bar will show how much data has already been transferred. 18 | - Transfers can be aborted using the *Cancel* button while in progress. This is mainly useful for large transfers that take a longer time and fail on the device side. 19 | - A status message is shown after the transfer is completed or cancelled. 20 | - You can enable the *Auto-Start* checkbox to make operation even faster. When enabled, each transfer immediately starts after dropping the file without the need for pressing the *Start* button. 21 | - The application window can be zoomed via key commands: 22 | - macOS: Cmd + +, Cmd + - and Cmd + 0. 23 | - Windows/Linux: Ctrl + +, Ctrl + - and Ctrl + 0. 24 | 25 | ### Adjusting the transfer delay setting 26 | 27 | You can adjust the transfer delay between the individual SysEx packets. The setting offers a range from 1 to 500ms with a default of 20ms. 28 | 29 | Which settings work is dependent on the receiving device but also the MIDI interface involved. Devices that are directly connected to the computer via USB MIDI can take advantage of the higher transfer rate USB offers. 30 | 31 | In short: 32 | 33 | - Most devices work properly with the default value. 34 | - If the receiving device does not recognize the data correctly, try to increase the delay setting. 35 | - If you have a large transfer to a device that can process it fast enough, you can try to lower the setting. There is no general rule how low it can be set. You have to find out the limits of reliable operation yourself. 36 | 37 | ## Building from Source 38 | 39 | See [separate document](BUILDING.md) for detailed instructions. 40 | 41 | ## License 42 | 43 | Published under the MIT license. All contributions to this project must be provided under the same license conditions. 44 | 45 | Author: Oliver Rockstedt 46 | 47 | ## Donations 48 | 49 | If you like to support my work, you can [buy me a coffee.](https://www.buymeacoffee.com/sourcebox) 50 | 51 | Buy Me A Coffee 52 | -------------------------------------------------------------------------------- /build-linux-appimage.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cargo build --release 4 | 5 | rm -rf target/release/appimage/* 6 | 7 | linuxdeploy-x86_64.AppImage \ 8 | --executable ./target/release/sysex-drop \ 9 | --desktop-file ./tools/sysex-drop.desktop \ 10 | --icon-file ./icons/16x16/sysex-drop.png \ 11 | --icon-file ./icons/32x32/sysex-drop.png \ 12 | --icon-file ./icons/64x64/sysex-drop.png \ 13 | --icon-file ./icons/128x128/sysex-drop.png \ 14 | --icon-file ./icons/256x256/sysex-drop.png \ 15 | --icon-file ./icons/sysex-drop.svg \ 16 | --appdir ./target/release/appimage/AppDir \ 17 | --output appimage 18 | 19 | echo "Moving appimage to target directory" 20 | mv *.AppImage ./target/release/appimage/sysex-drop-x86_64.AppImage 21 | -------------------------------------------------------------------------------- /build-mac-bundle.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | BUNDLE_DIR="./target/release/bundle/osx/SysEx Drop.app" 4 | POST_BUILD_SCRIPT="./tools/mac_bundle_post_build.py" 5 | 6 | cargo bundle --release 7 | 8 | echo "Running post build script $POST_BUILD_SCRIPT" 9 | chmod 755 "$POST_BUILD_SCRIPT" 10 | $POST_BUILD_SCRIPT "$BUNDLE_DIR" 11 | -------------------------------------------------------------------------------- /build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | #[cfg(target_os = "macos")] 3 | build_macos(); 4 | } 5 | 6 | #[allow(dead_code)] 7 | fn build_macos() { 8 | println!("cargo:rustc-env=MACOSX_DEPLOYMENT_TARGET=10.8"); 9 | } 10 | -------------------------------------------------------------------------------- /icons/128x128/sysex-drop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sourcebox/sysex-drop/4e4c2aedeb0232b9950dc63446f46ae7c79aa64c/icons/128x128/sysex-drop.png -------------------------------------------------------------------------------- /icons/16x16/sysex-drop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sourcebox/sysex-drop/4e4c2aedeb0232b9950dc63446f46ae7c79aa64c/icons/16x16/sysex-drop.png -------------------------------------------------------------------------------- /icons/256x256/sysex-drop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sourcebox/sysex-drop/4e4c2aedeb0232b9950dc63446f46ae7c79aa64c/icons/256x256/sysex-drop.png -------------------------------------------------------------------------------- /icons/32x32/sysex-drop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sourcebox/sysex-drop/4e4c2aedeb0232b9950dc63446f46ae7c79aa64c/icons/32x32/sysex-drop.png -------------------------------------------------------------------------------- /icons/64x64/sysex-drop.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sourcebox/sysex-drop/4e4c2aedeb0232b9950dc63446f46ae7c79aa64c/icons/64x64/sysex-drop.ico -------------------------------------------------------------------------------- /icons/64x64/sysex-drop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sourcebox/sysex-drop/4e4c2aedeb0232b9950dc63446f46ae7c79aa64c/icons/64x64/sysex-drop.png -------------------------------------------------------------------------------- /icons/sysex-drop.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 23 | 25 | 28 | 32 | 36 | 37 | 47 | 48 | 66 | 69 | 70 | 72 | 73 | 75 | image/svg+xml 76 | 78 | 79 | 80 | 81 | 82 | 86 | 96 | 102 | SYX 114 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sourcebox/sysex-drop/4e4c2aedeb0232b9950dc63446f46ae7c79aa64c/screenshot.png -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #![doc = include_str!("../README.md")] 2 | #![windows_subsystem = "windows"] 3 | #![warn(missing_docs)] 4 | 5 | mod midi; 6 | mod theme; 7 | 8 | use std::io::{BufRead, BufReader, Seek}; 9 | use std::sync::{Arc, Mutex}; 10 | use std::time::Duration; 11 | 12 | use anyhow::{anyhow, Result}; 13 | use eframe::egui; 14 | use simple_logger::SimpleLogger; 15 | 16 | /// Size of the native application window 17 | const WINDOW_SIZE: egui::Vec2 = egui::vec2(450.0, 340.0); 18 | 19 | /// Max number of frames per second 20 | const FPS_LIMIT: u32 = 25; 21 | 22 | //////////////////////////////////////////////////////////////////////////////// 23 | 24 | /// Starts the application 25 | fn main() { 26 | SimpleLogger::new() 27 | .with_level(log::LevelFilter::Debug) 28 | .init() 29 | .unwrap(); 30 | 31 | let native_options = eframe::NativeOptions { 32 | viewport: egui::ViewportBuilder::default() 33 | .with_inner_size(WINDOW_SIZE) 34 | .with_min_inner_size(WINDOW_SIZE) 35 | .with_resizable(false) 36 | .with_drag_and_drop(true), 37 | ..eframe::NativeOptions::default() 38 | }; 39 | eframe::run_native( 40 | "SysEx Drop", 41 | native_options, 42 | Box::new(|cc| { 43 | cc.egui_ctx.set_style(theme::style()); 44 | Box::new(App::new(cc)) 45 | }), 46 | ) 47 | .ok(); 48 | } 49 | 50 | //////////////////////////////////////////////////////////////////////////////// 51 | 52 | /// Application data and state 53 | #[derive(serde::Deserialize, serde::Serialize)] 54 | #[serde(default)] 55 | pub struct App { 56 | /// Selected file path 57 | #[serde(skip)] 58 | file_path: Option, 59 | 60 | /// File type 61 | #[serde(skip)] 62 | file_type: Option, 63 | 64 | /// File size in bytes 65 | #[serde(skip)] 66 | file_size: u64, 67 | 68 | /// No of packets in file 69 | #[serde(skip)] 70 | file_packet_count: usize, 71 | 72 | /// Selected MIDI device 73 | selected_device: Option, 74 | 75 | /// Interval in ms between packets 76 | packet_interval: u64, 77 | 78 | /// Auto-start enabled flag 79 | auto_start: bool, 80 | 81 | /// Always on top flag 82 | always_on_top: bool, 83 | 84 | /// Transfer state 85 | #[serde(skip)] 86 | transfer_state: TransferState, 87 | 88 | /// Transfer progress in range 0..1, representing 0..100% 89 | #[serde(skip)] 90 | transfer_progress: f32, 91 | 92 | /// MIDI handler 93 | #[serde(skip)] 94 | midi: Arc>, 95 | 96 | /// Last error message 97 | #[serde(skip)] 98 | error_message: Option, 99 | 100 | /// Channel for passing event messages 101 | #[serde(skip)] 102 | message_channel: ( 103 | std::sync::mpsc::Sender, 104 | std::sync::mpsc::Receiver, 105 | ), 106 | 107 | /// MPSC sender to cancel the transmit thread 108 | #[serde(skip)] 109 | transmit_thread_sender: Option>, 110 | 111 | /// Time interval between frames 112 | #[serde(skip)] 113 | frame_interval: std::time::Duration, 114 | 115 | /// Total number of rendered frames 116 | #[serde(skip)] 117 | frame_count: u32, 118 | 119 | /// Zoom factor. 120 | zoom_factor: f32, 121 | } 122 | 123 | //////////////////////////////////////////////////////////////////////////////// 124 | 125 | /// File type 126 | pub enum FileType { 127 | /// Raw SysEx file 128 | SysEx, 129 | 130 | /// Standard MIDI file 131 | SMF, 132 | } 133 | 134 | impl FileType { 135 | /// Create new file type from path 136 | /// 137 | /// TODO: check content to detect type, not just extension 138 | pub fn from_path(path: &std::path::Path) -> Result { 139 | let extension = path.extension().and_then(std::ffi::OsStr::to_str); 140 | let file_type = match extension { 141 | Some(ext) if ext.to_lowercase() == "mid" => FileType::SMF, 142 | _ => FileType::SysEx, 143 | }; 144 | 145 | Ok(file_type) 146 | } 147 | } 148 | 149 | //////////////////////////////////////////////////////////////////////////////// 150 | 151 | /// Event messages for application actions 152 | #[derive(Debug, Clone)] 153 | pub enum Message { 154 | /// Initialization on startup 155 | Init, 156 | 157 | /// Force rescanning of devices 158 | RescanDevices, 159 | 160 | /// Select a device by name 161 | SelectDevice(String), 162 | 163 | /// Start the transfer 164 | StartTransfer, 165 | 166 | /// Packet with number transferred 167 | PacketTransferred(usize), 168 | 169 | /// Transfer finished successfully 170 | TransferFinished, 171 | 172 | /// Transfer cancelled 173 | TransferCancelled, 174 | 175 | /// Error with text message 176 | Error(String), 177 | } 178 | 179 | //////////////////////////////////////////////////////////////////////////////// 180 | 181 | /// Transfer states 182 | #[derive(PartialEq, Eq)] 183 | pub enum TransferState { 184 | /// Initial state 185 | Idle, 186 | 187 | /// Transfer is in progress 188 | Running, 189 | 190 | /// Transfer is finished 191 | Finished, 192 | 193 | /// Transfer was cancelled 194 | Cancelled, 195 | } 196 | 197 | //////////////////////////////////////////////////////////////////////////////// 198 | 199 | impl Default for App { 200 | fn default() -> Self { 201 | Self { 202 | file_path: None, 203 | file_type: None, 204 | file_size: 0, 205 | file_packet_count: 0, 206 | selected_device: None, 207 | packet_interval: 20, 208 | auto_start: false, 209 | always_on_top: false, 210 | transfer_state: TransferState::Idle, 211 | transfer_progress: 0.0, 212 | midi: Arc::new(Mutex::new(midi::MidiConnector::new())), 213 | error_message: None, 214 | message_channel: std::sync::mpsc::channel(), 215 | transmit_thread_sender: None, 216 | frame_interval: std::time::Duration::from_secs_f64(1.0 / FPS_LIMIT as f64), 217 | frame_count: 0, 218 | zoom_factor: 1.0, 219 | } 220 | } 221 | } 222 | 223 | impl eframe::App for App { 224 | /// Called by the frame work to save state before shutdown 225 | fn save(&mut self, storage: &mut dyn eframe::Storage) { 226 | log::debug!("Saving persistent data."); 227 | eframe::set_value(storage, eframe::APP_KEY, self); 228 | } 229 | 230 | /// Called each time the UI needs repainting, which may be many times per second. 231 | fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { 232 | // Set initial always-on-top state and zoom factor once on startup. 233 | if self.frame_count == 1 { 234 | ctx.send_viewport_cmd(egui::ViewportCommand::WindowLevel(if self.always_on_top { 235 | egui::WindowLevel::AlwaysOnTop 236 | } else { 237 | egui::WindowLevel::Normal 238 | })); 239 | ctx.send_viewport_cmd(egui::ViewportCommand::InnerSize( 240 | WINDOW_SIZE * self.zoom_factor, 241 | )); 242 | } 243 | 244 | let zoom_factor = ctx.zoom_factor(); 245 | if self.zoom_factor != zoom_factor { 246 | ctx.send_viewport_cmd(egui::ViewportCommand::InnerSize(WINDOW_SIZE * zoom_factor)); 247 | self.zoom_factor = zoom_factor; 248 | } 249 | 250 | // Continuous run mode is required for message processing 251 | ctx.request_repaint_after(Duration::from_millis(1000 / FPS_LIMIT as u64)); 252 | 253 | while let Ok(message) = self.message_channel.1.try_recv() { 254 | self.process_message(&message, ctx); 255 | } 256 | 257 | egui::CentralPanel::default().show(ctx, |ui| { 258 | ui.add_space(10.0); 259 | 260 | ui.scope(|ui| { 261 | ui.set_enabled(self.transfer_state != TransferState::Running); 262 | 263 | device_selection( 264 | ui, 265 | self.midi.lock().unwrap().get_outputs(), 266 | self.selected_device.to_owned(), 267 | &self.message_channel.0, 268 | ); 269 | 270 | ui.add_space(20.0); 271 | 272 | ui.group(|ui| { 273 | ui.set_width(ui.available_width()); 274 | ui.set_height(70.0); 275 | 276 | ui.centered_and_justified(|ui| { 277 | if !ctx.input(|i| i.raw.hovered_files.is_empty()) 278 | && self.transfer_state != TransferState::Running 279 | { 280 | // Files hovered 281 | egui::Frame::group(ui.style()) 282 | .stroke(egui::Stroke::new(1.0, egui::Color32::YELLOW)) 283 | .show(ui, |ui| { 284 | ui.label("Drop file to open"); 285 | }); 286 | } else if self.file_path.is_some() { 287 | let basename = self.file_path.as_ref().unwrap().file_name().unwrap(); 288 | egui::Grid::new("file_info").show(ui, |ui| { 289 | ui.label("File:"); 290 | ui.label(basename.to_str().unwrap_or("Invalid filename")) 291 | .on_hover_text( 292 | self.file_path 293 | .as_ref() 294 | .unwrap() 295 | .to_str() 296 | .unwrap_or("Invalid filename"), 297 | ); 298 | ui.end_row(); 299 | ui.label("Size:"); 300 | ui.label(format!("{}", self.file_size)) 301 | .on_hover_text("File size in bytes"); 302 | ui.end_row(); 303 | ui.label("Packets:"); 304 | ui.label(format!("{}", self.file_packet_count)) 305 | .on_hover_text("Total number of packets in file"); 306 | ui.end_row(); 307 | }); 308 | } else { 309 | ui.label("Drop a SysEx file here!"); 310 | } 311 | }); 312 | 313 | // Files dropped 314 | if !ctx.input(|i| i.raw.dropped_files.is_empty()) 315 | && self.transfer_state != TransferState::Running 316 | { 317 | let dropped_files = ctx.input(|i| i.raw.dropped_files.clone()); 318 | for file in &dropped_files { 319 | if let Some(path) = &file.path { 320 | self.transfer_progress = 0.0; 321 | self.transfer_state = TransferState::Idle; 322 | match self.process_file(path) { 323 | Ok(()) => { 324 | self.error_message = None; 325 | if self.auto_start { 326 | self.message_channel 327 | .0 328 | .send(Message::StartTransfer) 329 | .ok(); 330 | } 331 | } 332 | Err(error) => { 333 | self.error_message = Some(error.to_string()); 334 | } 335 | } 336 | break; 337 | } 338 | } 339 | } 340 | }); 341 | 342 | ui.add_space(10.0); 343 | 344 | egui::Grid::new("settings").num_columns(2).show(ui, |ui| { 345 | ui.set_height(40.0); 346 | ui.with_layout(egui::Layout::left_to_right(egui::Align::Center), |ui| { 347 | ui.set_height(ui.available_height()); 348 | ui.label("Delay between packets:"); 349 | ui.add_sized( 350 | [70.0, 20.0], 351 | egui::DragValue::new(&mut self.packet_interval) 352 | .clamp_range(std::ops::RangeInclusive::new(1, 5000)) 353 | .speed(1.0), 354 | ) 355 | .on_hover_text("Hold SHIFT while dragging\n for fine-adjustments"); 356 | ui.label("ms"); 357 | }); 358 | ui.with_layout(egui::Layout::top_down(egui::Align::Max), |ui| { 359 | ui.set_width(110.0); 360 | ui.with_layout(egui::Layout::top_down(egui::Align::Min), |ui| { 361 | ui.set_width(ui.available_width()); 362 | ui.set_height(ui.available_height()); 363 | ui.checkbox(&mut self.auto_start, "Auto-Start") 364 | .on_hover_text("Start immediately after dropping a file"); 365 | let mut always_on_top = self.always_on_top; 366 | ui.checkbox(&mut always_on_top, "Always on top") 367 | .on_hover_text("Keep application window on top of others"); 368 | if always_on_top != self.always_on_top { 369 | ctx.send_viewport_cmd(egui::ViewportCommand::WindowLevel( 370 | if always_on_top { 371 | egui::WindowLevel::AlwaysOnTop 372 | } else { 373 | egui::WindowLevel::Normal 374 | }, 375 | )); 376 | self.always_on_top = always_on_top; 377 | } 378 | }); 379 | }); 380 | ui.end_row(); 381 | }); 382 | }); 383 | 384 | ui.add_space(20.0); 385 | 386 | ui.scope(|ui| { 387 | ui.set_enabled(self.file_path.is_some() && self.error_message.is_none()); 388 | 389 | ui.horizontal(|ui| { 390 | ui.vertical(|ui| { 391 | ui.add_space(4.0); 392 | ui.add( 393 | egui::ProgressBar::new(self.transfer_progress) 394 | .show_percentage() 395 | .desired_width(ui.available_width() - 100.0) 396 | .animate(self.transfer_state == TransferState::Running), 397 | ); 398 | }); 399 | ui.centered_and_justified(|ui| { 400 | if self.transfer_state != TransferState::Running { 401 | if ui 402 | .button("Start") 403 | .on_hover_text("Send file to the device") 404 | .clicked() 405 | { 406 | self.message_channel.0.send(Message::StartTransfer).ok(); 407 | }; 408 | } else if ui 409 | .button("Cancel") 410 | .on_hover_text("Cancel file transfer") 411 | .clicked() 412 | { 413 | self.transmit_thread_sender 414 | .as_ref() 415 | .unwrap() 416 | .send(true) 417 | .ok(); 418 | }; 419 | }); 420 | }); 421 | }); 422 | 423 | ui.add_space(12.0); 424 | 425 | ui.vertical_centered(|ui| { 426 | if let Some(error_message) = &self.error_message { 427 | ui.add(egui::Label::new( 428 | egui::RichText::new(format!("Error: {}", error_message)) 429 | .color(egui::Color32::RED), 430 | )); 431 | } else if self.file_path.is_none() { 432 | ui.add(egui::Label::new("No file selected.")); 433 | } else { 434 | match self.transfer_state { 435 | TransferState::Idle => { 436 | ui.add(egui::Label::new( 437 | egui::RichText::new("Press start to send the file.") 438 | .color(egui::Color32::YELLOW), 439 | )); 440 | } 441 | TransferState::Running => { 442 | ui.add(egui::Label::new("Transfer in progress.")); 443 | } 444 | TransferState::Finished => { 445 | ui.add(egui::Label::new( 446 | egui::RichText::new("Transfer finished.") 447 | .color(egui::Color32::GREEN), 448 | )); 449 | } 450 | TransferState::Cancelled => { 451 | ui.add(egui::Label::new( 452 | egui::RichText::new("Transfer cancelled.") 453 | .color(egui::Color32::RED), 454 | )); 455 | } 456 | } 457 | } 458 | }); 459 | }); 460 | 461 | // Bottom panel with app version 462 | egui::TopBottomPanel::bottom("bottom_panel").show(ctx, |ui| { 463 | ui.set_height(25.0); 464 | ui.add_space(4.0); 465 | ui.horizontal(|ui| { 466 | ui.label(format!("v{}", &env!("CARGO_PKG_VERSION"))); 467 | egui::warn_if_debug_build(ui); 468 | ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { 469 | ui.hyperlink_to("Project homepage", env!("CARGO_PKG_HOMEPAGE")); 470 | }); 471 | }); 472 | }); 473 | 474 | self.frame_count += 1; 475 | } 476 | } 477 | 478 | impl App { 479 | /// Create the application 480 | pub fn new(cc: &eframe::CreationContext<'_>) -> Self { 481 | let app = if let Some(storage) = cc.storage { 482 | eframe::get_value(storage, eframe::APP_KEY).unwrap_or_default() 483 | } else { 484 | Self::default() 485 | }; 486 | 487 | cc.egui_ctx.set_visuals(egui::Visuals::dark()); 488 | 489 | app.message_channel.0.send(Message::Init).ok(); 490 | 491 | let message_sender = app.message_channel.0.clone(); 492 | std::thread::spawn(move || loop { 493 | message_sender.send(Message::RescanDevices).ok(); 494 | std::thread::sleep(std::time::Duration::from_millis(250)); 495 | }); 496 | 497 | app 498 | } 499 | 500 | /// Process an event message 501 | fn process_message(&mut self, message: &Message, ctx: &egui::Context) { 502 | match message { 503 | Message::Init => { 504 | ctx.send_viewport_cmd(egui::ViewportCommand::InnerSize(WINDOW_SIZE)); 505 | } 506 | Message::RescanDevices => { 507 | let mut midi = self.midi.lock().unwrap(); 508 | let ports_changed = midi.scan_ports(); 509 | if ports_changed { 510 | if let Some(device) = &self.selected_device { 511 | self.message_channel 512 | .0 513 | .send(Message::SelectDevice(device.to_owned())) 514 | .ok(); 515 | } 516 | } 517 | } 518 | Message::SelectDevice(name) => { 519 | log::debug!("Device {} selected.", name); 520 | match self.midi.lock().unwrap().select_output(name.to_string()) { 521 | Ok(()) => self.error_message = None, 522 | Err(err) => self.error_message = Some(err.to_string()), 523 | } 524 | 525 | self.selected_device = Some(name.to_owned()) 526 | } 527 | Message::StartTransfer => { 528 | self.transfer_state = TransferState::Running; 529 | let file_path = self.file_path.as_ref().unwrap().clone(); 530 | let midi = self.midi.clone(); 531 | let packet_interval = self.packet_interval; 532 | let message_sender = self.message_channel.0.clone(); 533 | let message_sender_result = self.message_channel.0.clone(); 534 | let (sender, receiver): ( 535 | std::sync::mpsc::Sender, 536 | std::sync::mpsc::Receiver, 537 | ) = std::sync::mpsc::channel(); 538 | self.transmit_thread_sender = Some(sender); 539 | std::thread::spawn(move || { 540 | let result = send_sysex( 541 | file_path, 542 | midi, 543 | std::time::Duration::from_millis(packet_interval), 544 | message_sender, 545 | receiver, 546 | ); 547 | match result { 548 | Ok(finished) => { 549 | if finished { 550 | message_sender_result.send(Message::TransferFinished).ok(); 551 | } else { 552 | message_sender_result.send(Message::TransferCancelled).ok(); 553 | } 554 | } 555 | Err(error) => { 556 | message_sender_result 557 | .send(Message::Error(format!("{}", error))) 558 | .ok(); 559 | } 560 | } 561 | }); 562 | } 563 | Message::PacketTransferred(packet_count) => { 564 | self.transfer_progress = (*packet_count as f32) / (self.file_packet_count as f32) 565 | } 566 | Message::TransferFinished => { 567 | self.transfer_state = TransferState::Finished; 568 | } 569 | Message::TransferCancelled => { 570 | self.transfer_state = TransferState::Cancelled; 571 | } 572 | Message::Error(error) => self.error_message = Some(error.to_string()), 573 | } 574 | } 575 | 576 | /// Process the file dropped onto the window 577 | fn process_file(&mut self, path: &std::path::Path) -> Result<()> { 578 | // Reset file info initially 579 | self.file_path = None; 580 | self.file_type = None; 581 | self.file_size = 0; 582 | self.file_packet_count = 0; 583 | 584 | let file_type = FileType::from_path(path)?; 585 | 586 | let mut file = std::fs::File::open(path)?; 587 | let file_size = file.seek(std::io::SeekFrom::End(0))?; 588 | file.rewind()?; 589 | 590 | let mut packet_count = 0; 591 | 592 | match file_type { 593 | FileType::SysEx => { 594 | let mut buf_reader = BufReader::new(file); 595 | loop { 596 | let mut data = Vec::new(); 597 | let data_length = buf_reader.read_until(midi::SYSEX_END_BYTE, &mut data)?; 598 | if data_length == 0 { 599 | // End of file 600 | break; 601 | } 602 | if data[0] != midi::SYSEX_START_BYTE { 603 | return Err(anyhow!(Error::NoStartByte)); 604 | } 605 | if data[data_length - 1] != midi::SYSEX_END_BYTE { 606 | return Err(anyhow!(Error::NoEndByte)); 607 | } 608 | packet_count += 1; 609 | } 610 | } 611 | FileType::SMF => { 612 | let content = std::fs::read(path)?; 613 | let smf = midly::Smf::parse(&content)?; 614 | for track in smf.tracks { 615 | for event in track { 616 | if let midly::TrackEventKind::SysEx(_) = event.kind { 617 | packet_count += 1; 618 | } 619 | } 620 | } 621 | } 622 | } 623 | 624 | if packet_count == 0 { 625 | return Err(anyhow!(Error::NoPackets)); 626 | } 627 | 628 | // File is valid, so set the info fields 629 | self.file_path = Some(path.to_path_buf()); 630 | self.file_type = Some(file_type); 631 | self.file_size = file_size; 632 | self.file_packet_count = packet_count; 633 | 634 | Ok(()) 635 | } 636 | } 637 | 638 | /// Show combobox with devices 639 | pub fn device_selection( 640 | ui: &mut egui::Ui, 641 | devices: &[String], 642 | selected_device: Option, 643 | message_sender: &std::sync::mpsc::Sender, 644 | ) { 645 | let mut device_list = Vec::new(); 646 | let mut device_index = 0; 647 | 648 | if !devices.is_empty() { 649 | for (index, device) in devices.iter().enumerate() { 650 | device_list.push((&device).to_string()); 651 | 652 | if selected_device.is_some() && selected_device.as_ref().unwrap() == device { 653 | device_index = index; 654 | } 655 | } 656 | } 657 | 658 | let device_count = device_list.len(); 659 | 660 | ui.horizontal(|ui| { 661 | ui.vertical(|ui| { 662 | ui.add_space(5.0); 663 | ui.label("Device:"); 664 | }); 665 | 666 | ui.scope(|ui| { 667 | ui.set_enabled(!device_list.is_empty()); 668 | 669 | let combo_box = egui::ComboBox::from_id_source("device_list") 670 | .width(ui.available_width()) 671 | .show_index(ui, &mut device_index, device_list.len(), |i| { 672 | if device_count > 0 { 673 | device_list[i].clone() 674 | } else { 675 | String::from("No devices found") 676 | } 677 | }); 678 | 679 | if combo_box.changed() && !devices.is_empty() { 680 | for (index, device) in devices.iter().enumerate() { 681 | let d = devices.iter().find(|&x| x == device); 682 | if d.is_some() && index == device_index { 683 | message_sender 684 | .send(Message::SelectDevice(device.to_string())) 685 | .ok(); 686 | } 687 | } 688 | }; 689 | }); 690 | }); 691 | } 692 | 693 | /// Sends the SysEx data, called in separate thread 694 | fn send_sysex( 695 | file_path: std::path::PathBuf, 696 | midi: Arc>, 697 | packet_interval: std::time::Duration, 698 | message_sender: std::sync::mpsc::Sender, 699 | receiver: std::sync::mpsc::Receiver, 700 | ) -> Result { 701 | let file_type = FileType::from_path(file_path.as_path())?; 702 | 703 | match file_type { 704 | FileType::SysEx => { 705 | let file = std::fs::File::open(file_path)?; 706 | 707 | let mut buf_reader = BufReader::new(file); 708 | let mut packet_count = 0; 709 | 710 | loop { 711 | let mut data = Vec::new(); 712 | let data_length = buf_reader.read_until(midi::SYSEX_END_BYTE, &mut data)?; 713 | if data_length == 0 { 714 | // End of file 715 | break; 716 | } 717 | packet_count += 1; 718 | message_sender.send(Message::PacketTransferred(packet_count))?; 719 | 720 | midi.lock().unwrap().send(&data); 721 | 722 | std::thread::sleep(packet_interval); 723 | 724 | if receiver.try_recv().is_ok() { 725 | return Ok(false); 726 | } 727 | } 728 | } 729 | FileType::SMF => { 730 | let content = std::fs::read(file_path)?; 731 | let smf = midly::Smf::parse(&content)?; 732 | let mut packet_count = 0; 733 | 734 | for track in smf.tracks { 735 | for event in track { 736 | if let midly::TrackEventKind::SysEx(data) = event.kind { 737 | let mut message = vec![0xF0]; 738 | message.extend_from_slice(data); 739 | packet_count += 1; 740 | message_sender.send(Message::PacketTransferred(packet_count))?; 741 | 742 | midi.lock().unwrap().send(&message); 743 | 744 | std::thread::sleep(packet_interval); 745 | 746 | if receiver.try_recv().is_ok() { 747 | return Ok(false); 748 | } 749 | } 750 | } 751 | } 752 | } 753 | } 754 | 755 | Ok(true) 756 | } 757 | 758 | //////////////////////////////////////////////////////////////////////////////// 759 | 760 | /// Errors with associated messages 761 | #[derive(Debug)] 762 | pub enum Error { 763 | /// Sysex start byte not found in file 764 | NoStartByte, 765 | 766 | /// Sysex end byte not found in file 767 | NoEndByte, 768 | 769 | /// File does not contain any packets 770 | NoPackets, 771 | } 772 | 773 | impl std::error::Error for Error {} 774 | 775 | impl std::fmt::Display for Error { 776 | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { 777 | write!( 778 | f, 779 | "{}", 780 | match self { 781 | Self::NoStartByte => 782 | format!("Start byte 0x{:02X} not found.", midi::SYSEX_START_BYTE), 783 | Self::NoEndByte => format!("End byte 0x{:02X} not found.", midi::SYSEX_END_BYTE), 784 | Self::NoPackets => "No sysex packets found.".to_string(), 785 | } 786 | ) 787 | } 788 | } 789 | -------------------------------------------------------------------------------- /src/midi.rs: -------------------------------------------------------------------------------- 1 | //! Module containing the MIDI-related code 2 | 3 | use anyhow::{anyhow, Result}; 4 | use midir::{MidiOutput, MidiOutputConnection}; 5 | 6 | /// Sysex message start byte 7 | pub const SYSEX_START_BYTE: u8 = 0xF0; 8 | 9 | /// Sysex message end byte 10 | pub const SYSEX_END_BYTE: u8 = 0xF7; 11 | 12 | /// Container for connections and state 13 | pub struct MidiConnector { 14 | /// Objects used for port scanning 15 | scan_output: Option, 16 | 17 | /// Vector of port names that are usable as outputs 18 | outputs_list: Vec, 19 | 20 | /// Onput connection 21 | output: Option, 22 | 23 | /// Name of the Output port 24 | output_name: String, 25 | } 26 | 27 | impl MidiConnector { 28 | /// Constructs a new instance 29 | pub fn new() -> Self { 30 | Self { 31 | scan_output: None, 32 | outputs_list: Vec::new(), 33 | output: None, 34 | output_name: String::new(), 35 | } 36 | } 37 | 38 | /// Scan the ports and return if anything has changed since the last scan 39 | pub fn scan_ports(&mut self) -> bool { 40 | if self.scan_output.is_none() { 41 | match MidiOutput::new(&(env!("CARGO_PKG_NAME").to_owned() + " scan output")) { 42 | Ok(output) => { 43 | self.scan_output = Some(output); 44 | } 45 | Err(error) => { 46 | log::error!("MIDI scan output error: {}", error); 47 | } 48 | } 49 | } 50 | 51 | let mut ports_changed = false; 52 | 53 | if self.scan_output.is_some() { 54 | let output = self.scan_output.as_ref().unwrap(); 55 | let mut outputs_list = Vec::new(); 56 | for port in output.ports().iter() { 57 | let port_name = output.port_name(port).unwrap(); 58 | outputs_list.push(port_name); 59 | } 60 | ports_changed = self.outputs_list.len() != outputs_list.len(); 61 | self.outputs_list = outputs_list; 62 | } 63 | 64 | ports_changed 65 | } 66 | 67 | /// Sends a message 68 | pub fn send(&mut self, message: &[u8]) { 69 | if let Some(conn) = self.output.as_mut() { 70 | conn.send(message).ok(); 71 | } 72 | } 73 | 74 | /// Return a vector of outputs 75 | pub fn get_outputs(&self) -> &Vec { 76 | &self.outputs_list 77 | } 78 | 79 | /// Select the output 80 | pub fn select_output(&mut self, output_name: String) -> Result<()> { 81 | if self.output.is_some() { 82 | self.output = None; 83 | self.output_name = String::new(); 84 | } 85 | 86 | if self.scan_output.is_none() { 87 | match MidiOutput::new(&(env!("CARGO_PKG_NAME").to_owned() + " scan output")) { 88 | Ok(output) => { 89 | self.scan_output = Some(output); 90 | } 91 | Err(error) => { 92 | log::error!("MIDI scan output error: {}", error); 93 | } 94 | } 95 | } 96 | 97 | let output = self.scan_output.as_ref().unwrap(); 98 | 99 | for port in output.ports().iter() { 100 | let port_name = output.port_name(port).unwrap(); 101 | if port_name == output_name { 102 | log::info!("MIDI output connected to port {}", port_name); 103 | let scan_output = self 104 | .scan_output 105 | .take() 106 | .unwrap() 107 | .connect(port, "SysEx Drop Output"); 108 | if let Ok(scan_output) = scan_output { 109 | self.output = Some(scan_output); 110 | self.output_name = port_name; 111 | } else { 112 | return Err(anyhow!("MIDI connection error.")); 113 | } 114 | break; 115 | } 116 | } 117 | 118 | Ok(()) 119 | } 120 | 121 | /// Return the name of the selected output 122 | #[allow(dead_code)] 123 | pub fn output_name(&self) -> Option { 124 | self.output.as_ref().map(|_| self.output_name.clone()) 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /src/theme.rs: -------------------------------------------------------------------------------- 1 | //! Plasma theme. 2 | //! 3 | //! Taken from . 4 | 5 | use eframe::egui::{ 6 | epaint::Shadow, 7 | style::{ 8 | HandleShape, Interaction, Margin, ScrollStyle, Selection, Spacing, WidgetVisuals, Widgets, 9 | }, 10 | Color32, FontFamily, FontId, Rounding, Stroke, Style, TextStyle, Vec2, Visuals, 11 | }; 12 | 13 | pub fn style() -> Style { 14 | Style { 15 | text_styles: [ 16 | ( 17 | TextStyle::Small, 18 | FontId::new(11.0, FontFamily::Proportional), 19 | ), 20 | (TextStyle::Body, FontId::new(14.0, FontFamily::Proportional)), 21 | ( 22 | TextStyle::Button, 23 | FontId::new(14.0, FontFamily::Proportional), 24 | ), 25 | ( 26 | TextStyle::Heading, 27 | FontId::new(18.0, FontFamily::Proportional), 28 | ), 29 | ( 30 | TextStyle::Monospace, 31 | FontId::new(14.0, FontFamily::Monospace), 32 | ), 33 | ] 34 | .into(), 35 | spacing: Spacing { 36 | item_spacing: Vec2 { x: 6.0, y: 6.0 }, 37 | window_margin: Margin { 38 | left: 8.0, 39 | right: 8.0, 40 | top: 8.0, 41 | bottom: 8.0, 42 | }, 43 | button_padding: Vec2 { x: 16.0, y: 5.0 }, 44 | menu_margin: Margin { 45 | left: 6.0, 46 | right: 6.0, 47 | top: 6.0, 48 | bottom: 6.0, 49 | }, 50 | indent: 18.0, 51 | interact_size: Vec2 { x: 40.0, y: 18.0 }, 52 | slider_width: 100.0, 53 | combo_width: 100.0, 54 | text_edit_width: 280.0, 55 | icon_width: 16.0, 56 | icon_width_inner: 8.0, 57 | icon_spacing: 4.0, 58 | tooltip_width: 600.0, 59 | indent_ends_with_horizontal_line: false, 60 | combo_height: 200.0, 61 | scroll: ScrollStyle::floating(), 62 | }, 63 | interaction: Interaction { 64 | resize_grab_radius_side: 5.0, 65 | resize_grab_radius_corner: 10.0, 66 | show_tooltips_only_when_still: true, 67 | tooltip_delay: 0.0, 68 | }, 69 | visuals: Visuals { 70 | dark_mode: true, 71 | override_text_color: None, 72 | widgets: Widgets { 73 | noninteractive: WidgetVisuals { 74 | bg_fill: Color32::from_rgba_premultiplied(53, 47, 68, 255), 75 | weak_bg_fill: Color32::from_rgba_premultiplied(53, 47, 68, 255), 76 | bg_stroke: Stroke { 77 | width: 1.0, 78 | color: Color32::from_rgba_premultiplied(92, 84, 112, 255), 79 | }, 80 | rounding: Rounding { 81 | nw: 2.0, 82 | ne: 2.0, 83 | sw: 2.0, 84 | se: 2.0, 85 | }, 86 | fg_stroke: Stroke { 87 | width: 1.0, 88 | color: Color32::from_rgba_premultiplied(250, 240, 230, 255), 89 | }, 90 | expansion: 0.0, 91 | }, 92 | inactive: WidgetVisuals { 93 | bg_fill: Color32::from_rgba_premultiplied(39, 37, 45, 255), 94 | weak_bg_fill: Color32::from_rgba_premultiplied(44, 43, 43, 255), 95 | bg_stroke: Stroke { 96 | width: 0.0, 97 | color: Color32::from_rgba_premultiplied(0, 0, 0, 0), 98 | }, 99 | rounding: Rounding { 100 | nw: 2.0, 101 | ne: 2.0, 102 | sw: 2.0, 103 | se: 2.0, 104 | }, 105 | fg_stroke: Stroke { 106 | width: 1.0, 107 | color: Color32::from_rgba_premultiplied(205, 205, 205, 255), 108 | }, 109 | expansion: 0.0, 110 | }, 111 | hovered: WidgetVisuals { 112 | bg_fill: Color32::from_rgba_premultiplied(131, 132, 144, 255), 113 | weak_bg_fill: Color32::from_rgba_premultiplied(156, 154, 205, 255), 114 | bg_stroke: Stroke { 115 | width: 1.0, 116 | color: Color32::from_rgba_premultiplied(255, 255, 255, 255), 117 | }, 118 | rounding: Rounding { 119 | nw: 3.0, 120 | ne: 3.0, 121 | sw: 3.0, 122 | se: 3.0, 123 | }, 124 | fg_stroke: Stroke { 125 | width: 1.5, 126 | color: Color32::from_rgba_premultiplied(245, 245, 245, 255), 127 | }, 128 | expansion: 1.0, 129 | }, 130 | active: WidgetVisuals { 131 | bg_fill: Color32::from_rgba_premultiplied(70, 70, 70, 255), 132 | weak_bg_fill: Color32::from_rgba_premultiplied(70, 70, 70, 255), 133 | bg_stroke: Stroke { 134 | width: 1.0, 135 | color: Color32::from_rgba_premultiplied(255, 255, 255, 255), 136 | }, 137 | rounding: Rounding { 138 | nw: 2.0, 139 | ne: 2.0, 140 | sw: 2.0, 141 | se: 2.0, 142 | }, 143 | fg_stroke: Stroke { 144 | width: 2.0, 145 | color: Color32::from_rgba_premultiplied(255, 255, 255, 255), 146 | }, 147 | expansion: 1.0, 148 | }, 149 | open: WidgetVisuals { 150 | bg_fill: Color32::from_rgba_premultiplied(53, 47, 68, 255), 151 | weak_bg_fill: Color32::from_rgba_premultiplied(53, 47, 68, 255), 152 | bg_stroke: Stroke { 153 | width: 1.0, 154 | color: Color32::from_rgba_premultiplied(119, 119, 119, 255), 155 | }, 156 | rounding: Rounding { 157 | nw: 2.0, 158 | ne: 2.0, 159 | sw: 2.0, 160 | se: 2.0, 161 | }, 162 | fg_stroke: Stroke { 163 | width: 1.0, 164 | color: Color32::from_rgba_premultiplied(229, 229, 229, 255), 165 | }, 166 | expansion: 0.0, 167 | }, 168 | }, 169 | selection: Selection { 170 | bg_fill: Color32::from_rgba_premultiplied(139, 127, 218, 255), 171 | stroke: Stroke { 172 | width: 1.0, 173 | color: Color32::from_rgba_premultiplied(255, 255, 255, 255), 174 | }, 175 | }, 176 | hyperlink_color: Color32::from_rgba_premultiplied(156, 154, 205, 255), 177 | faint_bg_color: Color32::from_rgba_premultiplied(2, 2, 2, 0), 178 | extreme_bg_color: Color32::from_rgba_premultiplied(26, 25, 25, 255), 179 | code_bg_color: Color32::from_rgba_premultiplied(64, 64, 64, 255), 180 | warn_fg_color: Color32::from_rgba_premultiplied(255, 143, 0, 255), 181 | error_fg_color: Color32::from_rgba_premultiplied(255, 0, 0, 255), 182 | window_rounding: Rounding { 183 | nw: 0.0, 184 | ne: 0.0, 185 | sw: 0.0, 186 | se: 0.0, 187 | }, 188 | window_shadow: Shadow { 189 | extrusion: 32.0, 190 | color: Color32::from_rgba_premultiplied(0, 0, 0, 96), 191 | }, 192 | window_fill: Color32::from_rgba_premultiplied(30, 30, 30, 255), 193 | window_stroke: Stroke { 194 | width: 1.0, 195 | color: Color32::from_rgba_premultiplied(38, 38, 38, 255), 196 | }, 197 | menu_rounding: Rounding { 198 | nw: 6.0, 199 | ne: 6.0, 200 | sw: 6.0, 201 | se: 6.0, 202 | }, 203 | panel_fill: Color32::from_rgba_premultiplied(27, 27, 27, 255), 204 | popup_shadow: Shadow { 205 | extrusion: 16.0, 206 | color: Color32::from_rgba_premultiplied(0, 0, 0, 96), 207 | }, 208 | resize_corner_size: 12.0, 209 | text_cursor: Stroke { 210 | width: 2.0, 211 | color: Color32::from_rgba_premultiplied(255, 255, 255, 255), 212 | }, 213 | interact_cursor: None, 214 | image_loading_spinners: true, 215 | text_cursor_preview: false, 216 | clip_rect_margin: 3.0, 217 | button_frame: true, 218 | collapsing_header_frame: false, 219 | indent_has_left_vline: true, 220 | striped: false, 221 | slider_trailing_fill: false, 222 | handle_shape: HandleShape::Circle, 223 | }, 224 | animation_time: 0.083, 225 | explanation_tooltips: false, 226 | ..Default::default() 227 | } 228 | } 229 | -------------------------------------------------------------------------------- /tools/mac_bundle_post_build.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | """ 4 | Post build script to run with the path to the bundle as argument. 5 | 6 | Performed steps: 7 | - Strip off debug symbols from executable 8 | - Copy external frameworks and libraries to the bundle and configure the paths to them 9 | """ 10 | 11 | import sys 12 | import os 13 | import subprocess 14 | import shutil 15 | 16 | 17 | # System library locations, libs from these locations are not copied to bundle 18 | EXCLUDE_LIB_DIRS = ['/System/Library', '/usr/lib'] 19 | 20 | 21 | def get_exec_file(macos_dir): 22 | """Return the executable file of the bundle""" 23 | for item in os.listdir(macos_dir): 24 | file_ = os.path.join(macos_dir, item) 25 | executable = os.access(file_, os.X_OK) 26 | if os.path.isfile(file_) and executable: 27 | return file_ 28 | 29 | 30 | def strip_symbols(exec_file): 31 | """Strip debug symbols""" 32 | print(f"Stripping debug symbols on {exec_file}") 33 | subprocess.call(["strip", exec_file]) 34 | 35 | 36 | def get_used_libs(file_): 37 | """Return a list of libraries used by given application or dylib""" 38 | libs_output = subprocess.check_output( 39 | ['otool', '-L', file_], 40 | universal_newlines=True 41 | ) 42 | 43 | libs = [] 44 | 45 | for line in libs_output.splitlines()[1:]: 46 | lib_file = line.split(' ')[0].strip() 47 | for exclude_dir in EXCLUDE_LIB_DIRS: 48 | if lib_file.startswith(exclude_dir): 49 | lib_file = None 50 | break 51 | if lib_file: 52 | libs.append(lib_file) 53 | 54 | return libs 55 | 56 | 57 | def create_dmg(bundle_dir): 58 | """Create a DMG file with the bundle""" 59 | name, ext = os.path.splitext(os.path.basename(bundle_dir)) 60 | dmg_file = os.path.join(os.path.dirname(bundle_dir), 61 | name.replace(" ", "_") + '.dmg') 62 | print(f"Creating DMG file {dmg_file}") 63 | if os.path.exists(dmg_file): 64 | os.remove(dmg_file) 65 | subprocess.call(['hdiutil', 'create', '-fs', 'HFS+', 66 | '-volname', name, '-srcfolder', bundle_dir, dmg_file]) 67 | 68 | 69 | def main(): 70 | if len(sys.argv) < 2: 71 | sys.exit("No input argument given.") 72 | 73 | bundle_dir = sys.argv[1] 74 | 75 | if not os.path.exists(bundle_dir): 76 | sys.exit(f"Bundle {bundle_dir} does not exist") 77 | 78 | macos_dir = os.path.join(bundle_dir, "Contents", "MacOS") 79 | frameworks_dir = os.path.join(bundle_dir, "Contents", "Frameworks") 80 | exec_file = get_exec_file(macos_dir) 81 | 82 | if exec_file is None: 83 | sys.exit("Executable file not found") 84 | 85 | strip_symbols(exec_file) 86 | 87 | libs = get_used_libs(exec_file) 88 | 89 | if libs: 90 | os.makedirs(frameworks_dir) 91 | 92 | for lib in libs: 93 | orig_lib_file = os.path.realpath(lib) 94 | lib_file = os.path.join(frameworks_dir, 95 | os.path.basename(orig_lib_file)) 96 | 97 | print(f"Copying library {orig_lib_file} to bundle.") 98 | shutil.copy(orig_lib_file, frameworks_dir) 99 | os.chmod(lib_file, 0o755) 100 | 101 | new_lib_path = os.path.join('@executable_path', 102 | os.path.relpath(lib_file, macos_dir)) 103 | subprocess.call(['install_name_tool', '-id', 104 | new_lib_path, lib_file]) 105 | subprocess.call(['install_name_tool', '-change', lib, 106 | new_lib_path, exec_file]) 107 | 108 | lib_deps = get_used_libs(lib_file) 109 | 110 | for lib_dep in lib_deps: 111 | lib_dep_file = os.path.realpath(lib_dep) 112 | lib_dep_file = os.path.join(frameworks_dir, 113 | os.path.basename(lib_dep_file)) 114 | new_lib_path = os.path.join('@executable_path', 115 | os.path.relpath(lib_dep_file, macos_dir)) 116 | subprocess.call(['install_name_tool', '-change', lib_dep, 117 | new_lib_path, lib_file]) 118 | 119 | create_dmg(bundle_dir) 120 | 121 | 122 | if __name__ == '__main__': 123 | main() 124 | -------------------------------------------------------------------------------- /tools/sysex-drop.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Categories=Utility; 3 | Icon=sysex-drop 4 | Name=SysEx Drop 5 | Type=Application 6 | Exec=sysex-drop 7 | Name[de_DE]=sysex-drop.desktop 8 | -------------------------------------------------------------------------------- /wix/License.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\deff0\nouicompat{\fonttbl{\f0\fnil\fcharset0 Arial;}{\f1\fnil\fcharset0 Courier New;}} 2 | {\*\generator Riched20 10.0.15063}\viewkind4\uc1 3 | \pard\sa180\fs24\lang9 Copyright (c) 2021 Oliver Rockstedt\par 4 | 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:\par 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\par 6 | \f1 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.\f0\par 7 | } 8 | 9 | -------------------------------------------------------------------------------- /wix/main.wxs: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 42 | 43 | 53 | 54 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 73 | 74 | 79 | 80 | 81 | 82 | 83 | 91 | 92 | 93 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 131 | 132 | 133 | 134 | 135 | 136 | 145 | 149 | 150 | 151 | 152 | 153 | 159 | 160 | 161 | 162 | 163 | 171 | 172 | 173 | 174 | 175 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 210 | 211 | 212 | 213 | 214 | 215 | 219 | 220 | 221 | 222 | 230 | 231 | 232 | 233 | 241 | 242 | 243 | 244 | 245 | 246 | --------------------------------------------------------------------------------