From f65060e8c957888286122fe32b94ebb487bd5747 Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Thu, 11 Jan 2024 21:22:47 +0100 Subject: [PATCH] desktop: Update winit to 0.29.10 and egui to 0.25.0 --- Cargo.lock | 540 +++++++++++++++++++--------------- Cargo.toml | 8 +- core/Cargo.toml | 2 +- desktop/Cargo.toml | 8 +- desktop/src/app.rs | 121 ++++---- desktop/src/gui/controller.rs | 27 +- desktop/src/main.rs | 2 +- desktop/src/util.rs | 375 ++++++++--------------- 8 files changed, 524 insertions(+), 559 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aa73ac4ce..b1ecf107c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,6 +56,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ "cfg-if", + "getrandom", "once_cell", "serde", "version_check", @@ -107,20 +108,23 @@ dependencies = [ [[package]] name = "android-activity" -version = "0.4.3" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64529721f27c2314ced0890ce45e469574a73e5e6fdd6e9da1860eb29285f5e0" +checksum = "39b801912a977c3fd52d80511fe1c0c8480c6f957f21ae2ce1b92ffe970cf4b9" dependencies = [ "android-properties", - "bitflags 1.3.2", + "bitflags 2.4.1", "cc", + "cesu8", + "jni 0.21.1", "jni-sys", "libc", "log", - "ndk", + "ndk 0.8.0", "ndk-context", - "ndk-sys", - "num_enum 0.6.1", + "ndk-sys 0.5.0+25.2.9519653", + "num_enum 0.7.2", + "thiserror", ] [[package]] @@ -214,7 +218,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aafb29b107435aa276664c1db8954ac27a6e105cdad3c88287a199eb0e313c08" dependencies = [ "clipboard-win", - "core-graphics", + "core-graphics 0.22.3", "image", "log", "objc", @@ -224,7 +228,7 @@ dependencies = [ "thiserror", "winapi", "wl-clipboard-rs", - "x11rb", + "x11rb 0.12.0", ] [[package]] @@ -248,6 +252,12 @@ dependencies = [ "serde", ] +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + [[package]] name = "ash" version = "0.37.3+1.3.251" @@ -283,9 +293,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.2.2" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6afaa937395a620e33dc6a742c593c01aced20aa376ffb0f628121198578ccc7" +checksum = "fb41eb19024a91746eba0773aa5e16036045bbf45733766661099e182ea6a744" dependencies = [ "async-lock", "cfg-if", @@ -481,21 +491,21 @@ dependencies = [ [[package]] name = "block-sys" -version = "0.1.0-beta.1" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" +checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7" dependencies = [ "objc-sys", ] [[package]] name = "block2" -version = "0.2.0-alpha.6" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" +checksum = "15b55663a85f33501257357e6421bb33e769d5c9ffb5ba0921c975a123e35e68" dependencies = [ "block-sys", - "objc2-encode", + "objc2", ] [[package]] @@ -596,16 +606,28 @@ dependencies = [ [[package]] name = "calloop" -version = "0.10.6" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e0d00eb1ea24371a97d2da6201c6747a633dc6dc1988ef503403b4c59504a8" +checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.1", "log", - "nix 0.25.1", - "slotmap", + "polling 3.3.2", + "rustix", + "slab", "thiserror", - "vec_map", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02" +dependencies = [ + "calloop", + "rustix", + "wayland-backend", + "wayland-client", ] [[package]] @@ -893,6 +915,19 @@ dependencies = [ "libc", ] +[[package]] +name = "core-graphics" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "970a29baf4110c26fedbc7f82107d42c23f7e88e404c4577ed73fe99ff85a212" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types 0.5.0", + "libc", +] + [[package]] name = "core-graphics-types" version = "0.1.3" @@ -947,7 +982,7 @@ dependencies = [ "js-sys", "libc", "mach2", - "ndk", + "ndk 0.7.0", "ndk-context", "oboe", "once_cell", @@ -1093,6 +1128,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "cursor-icon" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" + [[package]] name = "d3d12" version = "0.7.0" @@ -1366,9 +1407,8 @@ checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" [[package]] name = "ecolor" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b7637fc2e74d17e52931bac90ff4fc061ac776ada9c7fa272f24cdca5991972" +version = "0.25.0" +source = "git+https://github.com/ruffle-rs/egui?branch=consume_keys#bdecb2cbbc5b43e77e98b0524c3678a07a0b4e04" dependencies = [ "bytemuck", "serde", @@ -1376,9 +1416,8 @@ dependencies = [ [[package]] name = "egui" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55bcb864b764eb889515a38b8924757657a250738ad15126637ee2df291ee6b" +version = "0.25.0" +source = "git+https://github.com/ruffle-rs/egui?branch=consume_keys#bdecb2cbbc5b43e77e98b0524c3678a07a0b4e04" dependencies = [ "accesskit", "ahash", @@ -1390,9 +1429,8 @@ dependencies = [ [[package]] name = "egui-wgpu" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d8ea73b329649be625fac2c9b190a2a8f9a66f98610c4b09124b596c6695053" +version = "0.25.0" +source = "git+https://github.com/ruffle-rs/egui?branch=consume_keys#bdecb2cbbc5b43e77e98b0524c3678a07a0b4e04" dependencies = [ "bytemuck", "egui", @@ -1406,14 +1444,13 @@ dependencies = [ [[package]] name = "egui-winit" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b673606b6606b12b95e3a3194d7882bf5cff302db36a520b8144c7c342e4e84" +version = "0.25.0" +source = "git+https://github.com/ruffle-rs/egui?branch=consume_keys#bdecb2cbbc5b43e77e98b0524c3678a07a0b4e04" dependencies = [ "arboard", "egui", "log", - "raw-window-handle", + "raw-window-handle 0.5.2", "smithay-clipboard", "web-time", "webbrowser", @@ -1422,9 +1459,8 @@ dependencies = [ [[package]] name = "egui_extras" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97624eaf17a16058265d3a3e712e167798655baf7c8f693de25be75cdd6c57b5" +version = "0.25.0" +source = "git+https://github.com/ruffle-rs/egui?branch=consume_keys#bdecb2cbbc5b43e77e98b0524c3678a07a0b4e04" dependencies = [ "egui", "enum-map", @@ -1442,9 +1478,8 @@ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "emath" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a045c6c0b44b35e98513fc1e9d183ab42881ac27caccb9fa345465601f56cce4" +version = "0.25.0" +source = "git+https://github.com/ruffle-rs/egui?branch=consume_keys#bdecb2cbbc5b43e77e98b0524c3678a07a0b4e04" dependencies = [ "bytemuck", "serde", @@ -1547,9 +1582,8 @@ dependencies = [ [[package]] name = "epaint" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d1b9e000d21bab9b535ce78f9f7745be28b3f777f6c7223936561c5c7fefab8" +version = "0.25.0" +source = "git+https://github.com/ruffle-rs/egui?branch=consume_keys#bdecb2cbbc5b43e77e98b0524c3678a07a0b4e04" dependencies = [ "ab_glyph", "ahash", @@ -1866,7 +1900,7 @@ checksum = "98b88c54a38407f7352dd2c4238830115a6377741098ffd1f997c813d0e088a6" dependencies = [ "fontconfig-parser", "log", - "memmap2 0.9.3", + "memmap2", "slotmap", "tinyvec", "ttf-parser", @@ -2135,6 +2169,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + [[package]] name = "getrandom" version = "0.2.12" @@ -2495,6 +2539,17 @@ dependencies = [ "cc", ] +[[package]] +name = "icrate" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d3aaff8a54577104bafdf686ff18565c3b6903ca5782a2026ef06e2c7aa319" +dependencies = [ + "block2", + "dispatch", + "objc2", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -2589,9 +2644,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", ] [[package]] @@ -3076,15 +3128,6 @@ version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" -[[package]] -name = "memmap2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" -dependencies = [ - "libc", -] - [[package]] name = "memmap2" version = "0.9.3" @@ -3094,15 +3137,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.7.1" @@ -3159,18 +3193,6 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "mio" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys 0.48.0", -] - [[package]] name = "mocket" version = "0.1.0" @@ -3263,9 +3285,25 @@ checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" dependencies = [ "bitflags 1.3.2", "jni-sys", - "ndk-sys", + "ndk-sys 0.4.1+23.1.7779620", "num_enum 0.5.11", - "raw-window-handle", + "raw-window-handle 0.5.2", + "thiserror", +] + +[[package]] +name = "ndk" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +dependencies = [ + "bitflags 2.4.1", + "jni-sys", + "log", + "ndk-sys 0.5.0+25.2.9519653", + "num_enum 0.7.2", + "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", "thiserror", ] @@ -3284,6 +3322,15 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + [[package]] name = "nellymoser-rs" version = "0.1.2" @@ -3325,20 +3372,6 @@ dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", - "memoffset 0.6.5", -] - -[[package]] -name = "nix" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if", - "libc", - "memoffset 0.6.5", ] [[package]] @@ -3350,7 +3383,7 @@ dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", - "memoffset 0.7.1", + "memoffset", "pin-utils", ] @@ -3463,11 +3496,11 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.6.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" dependencies = [ - "num_enum_derive 0.6.1", + "num_enum_derive 0.7.2", ] [[package]] @@ -3476,7 +3509,7 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -3484,11 +3517,11 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.6.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 3.0.0", "proc-macro2", "quote", "syn 2.0.48", @@ -3532,29 +3565,25 @@ dependencies = [ [[package]] name = "objc-sys" -version = "0.2.0-beta.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" +checksum = "c7c71324e4180d0899963fc83d9d241ac39e699609fc1025a850aadac8257459" [[package]] name = "objc2" -version = "0.3.0-beta.3.patch-leaks.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468" +checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d" dependencies = [ - "block2", "objc-sys", "objc2-encode", ] [[package]] name = "objc2-encode" -version = "2.0.0-pre.2" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" -dependencies = [ - "objc-sys", -] +checksum = "d079845b37af429bfe5dfa76e6d087d788031045b25cfc6fd898486fd9847666" [[package]] name = "objc_exception" @@ -3590,7 +3619,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8868cc237ee02e2d9618539a23a8d228b9bb3fc2e7a5b11eed3831de77c395d0" dependencies = [ "jni 0.20.0", - "ndk", + "ndk 0.7.0", "ndk-context", "num-derive 0.3.3", "num-traits", @@ -3944,6 +3973,15 @@ dependencies = [ "toml_edit 0.19.15", ] +[[package]] +name = "proc-macro-crate" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b2685dd208a3771337d8d386a89840f0f43cd68be8dae90a5f8c2384effc9cd" +dependencies = [ + "toml_edit 0.21.0", +] + [[package]] name = "proc-macro-hack" version = "0.5.20+deprecated" @@ -4070,6 +4108,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" +[[package]] +name = "raw-window-handle" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544" + [[package]] name = "rayon" version = "1.8.0" @@ -4225,7 +4269,7 @@ dependencies = [ "objc", "objc-foundation", "objc_id", - "raw-window-handle", + "raw-window-handle 0.5.2", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -4471,7 +4515,7 @@ dependencies = [ "naga_oil", "ouroboros", "profiling", - "raw-window-handle", + "raw-window-handle 0.5.2", "ruffle_render", "swf", "tracing", @@ -4727,13 +4771,13 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sctk-adwaita" -version = "0.5.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda4e97be1fd174ccc2aae81c8b694e803fa99b34e8fd0f057a9d70698e3ed09" +checksum = "82b2eaf3a5b264a521b988b2e73042e742df700c4f962cde845d1541adb46550" dependencies = [ "ab_glyph", "log", - "memmap2 0.5.10", + "memmap2", "smithay-client-toolkit", "tiny-skia", ] @@ -4913,31 +4957,47 @@ checksum = "2593d31f82ead8df961d8bd23a64c2ccf2eb5dd34b0a34bfb4dd54011c72009e" [[package]] name = "smithay-client-toolkit" -version = "0.16.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9" +checksum = "60e3d9941fa3bacf7c2bf4b065304faa14164151254cd16ce1b1bc8fc381600f" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.1", "calloop", - "dlib", - "lazy_static", + "calloop-wayland-source", + "cursor-icon", + "libc", "log", - "memmap2 0.5.10", - "nix 0.24.3", - "pkg-config", - "wayland-client 0.29.5", + "memmap2", + "rustix", + "thiserror", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", "wayland-cursor", - "wayland-protocols 0.29.5", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", ] [[package]] name = "smithay-clipboard" -version = "0.6.6" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" +checksum = "0bb62b280ce5a5cba847669933a0948d00904cf83845c944eae96a4738cea1a6" dependencies = [ + "libc", "smithay-client-toolkit", - "wayland-client 0.29.5", + "wayland-backend", +] + +[[package]] +name = "smol_str" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6845563ada680337a52d43bb0b29f396f2d911616f6573012645b9e3d048a49" +dependencies = [ + "serde", ] [[package]] @@ -5276,23 +5336,23 @@ dependencies = [ [[package]] name = "tiny-skia" -version = "0.8.4" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8493a203431061e901613751931f047d1971337153f96d0e5e363d6dbf6a67" +checksum = "b6a067b809476893fce6a254cf285850ff69c847e6cfbade6a20b655b6c7e80d" dependencies = [ "arrayref", "arrayvec", "bytemuck", "cfg-if", - "png", + "log", "tiny-skia-path", ] [[package]] name = "tiny-skia-path" -version = "0.8.4" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adbfb5d3f3dd57a0e11d12f4f13d4ebbbc1b5c15b7ab0a156d030b21da5f677c" +checksum = "5de35e8a90052baaaf61f171680ac2f8e925a1e43ea9d2e3a00514772250e541" dependencies = [ "arrayref", "bytemuck", @@ -5662,20 +5722,15 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "vergen" -version = "8.2.10" +version = "8.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a78365c3f8ca9dc5428a9f5c6349558c3f9f3eeb65e3fc00b6a981379462947" +checksum = "ec0d895592fa7710eba03fe072e614e3dc6a61ab76ae7ae10d2eb4a7ed5b00ca" dependencies = [ "anyhow", "cargo_metadata", + "cfg-if", "regex", "rustversion", "time", @@ -5818,23 +5873,7 @@ dependencies = [ "nix 0.26.4", "scoped-tls", "smallvec", - "wayland-sys 0.31.1", -] - -[[package]] -name = "wayland-client" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" -dependencies = [ - "bitflags 1.3.2", - "downcast-rs", - "libc", - "nix 0.24.3", - "scoped-tls", - "wayland-commons", - "wayland-scanner 0.29.5", - "wayland-sys 0.29.5", + "wayland-sys", ] [[package]] @@ -5846,44 +5885,31 @@ dependencies = [ "bitflags 2.4.1", "nix 0.26.4", "wayland-backend", - "wayland-scanner 0.31.0", + "wayland-scanner", ] [[package]] -name = "wayland-commons" -version = "0.29.5" +name = "wayland-csd-frame" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "nix 0.24.3", - "once_cell", - "smallvec", - "wayland-sys 0.29.5", + "bitflags 2.4.1", + "cursor-icon", + "wayland-backend", ] [[package]] name = "wayland-cursor" -version = "0.29.5" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" +checksum = "a44aa20ae986659d6c77d64d808a046996a932aa763913864dc40c359ef7ad5b" dependencies = [ - "nix 0.24.3", - "wayland-client 0.29.5", + "nix 0.26.4", + "wayland-client", "xcursor", ] -[[package]] -name = "wayland-protocols" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" -dependencies = [ - "bitflags 1.3.2", - "wayland-client 0.29.5", - "wayland-commons", - "wayland-scanner 0.29.5", -] - [[package]] name = "wayland-protocols" version = "0.31.0" @@ -5892,8 +5918,21 @@ checksum = "e253d7107ba913923dc253967f35e8561a3c65f914543e46843c88ddd729e21c" dependencies = [ "bitflags 2.4.1", "wayland-backend", - "wayland-client 0.31.1", - "wayland-scanner 0.31.0", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479" +dependencies = [ + "bitflags 2.4.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", ] [[package]] @@ -5904,20 +5943,9 @@ checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" dependencies = [ "bitflags 2.4.1", "wayland-backend", - "wayland-client 0.31.1", - "wayland-protocols 0.31.0", - "wayland-scanner 0.31.0", -] - -[[package]] -name = "wayland-scanner" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" -dependencies = [ - "proc-macro2", - "quote", - "xml-rs", + "wayland-client", + "wayland-protocols", + "wayland-scanner", ] [[package]] @@ -5931,17 +5959,6 @@ dependencies = [ "quote", ] -[[package]] -name = "wayland-sys" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" -dependencies = [ - "dlib", - "lazy_static", - "pkg-config", -] - [[package]] name = "wayland-sys" version = "0.31.1" @@ -5950,6 +5967,7 @@ checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af" dependencies = [ "dlib", "log", + "once_cell", "pkg-config", ] @@ -5991,7 +6009,7 @@ dependencies = [ "log", "ndk-context", "objc", - "raw-window-handle", + "raw-window-handle 0.5.2", "url", "web-sys", ] @@ -6015,7 +6033,7 @@ dependencies = [ "naga", "parking_lot", "profiling", - "raw-window-handle", + "raw-window-handle 0.5.2", "serde", "smallvec", "static_assertions", @@ -6040,7 +6058,7 @@ dependencies = [ "naga", "parking_lot", "profiling", - "raw-window-handle", + "raw-window-handle 0.5.2", "ron", "rustc-hash", "serde", @@ -6082,7 +6100,7 @@ dependencies = [ "parking_lot", "profiling", "range-alloc", - "raw-window-handle", + "raw-window-handle 0.5.2", "renderdoc-sys", "rustc-hash", "smallvec", @@ -6418,37 +6436,51 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winit" -version = "0.28.7" +version = "0.29.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9596d90b45384f5281384ab204224876e8e8bf7d58366d9b795ad99aa9894b94" +checksum = "4c824f11941eeae66ec71111cc2674373c772f482b58939bb4066b642aa2ffcf" dependencies = [ + "ahash", "android-activity", - "bitflags 1.3.2", + "atomic-waker", + "bitflags 2.4.1", + "bytemuck", + "calloop", "cfg_aliases", "core-foundation", - "core-graphics", - "dispatch", - "instant", + "core-graphics 0.23.1", + "cursor-icon", + "icrate", + "js-sys", "libc", "log", - "mio", - "ndk", + "memmap2", + "ndk 0.8.0", + "ndk-sys 0.5.0+25.2.9519653", "objc2", "once_cell", "orbclient", "percent-encoding", - "raw-window-handle", + "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", "redox_syscall 0.3.5", + "rustix", "sctk-adwaita", "smithay-client-toolkit", + "smol_str", + "unicode-segmentation", "wasm-bindgen", - "wayland-client 0.29.5", - "wayland-commons", - "wayland-protocols 0.29.5", - "wayland-scanner 0.29.5", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", "web-sys", - "windows-sys 0.45.0", + "web-time", + "windows-sys 0.48.0", "x11-dl", + "x11rb 0.13.0", + "xkbcommon-dl", ] [[package]] @@ -6494,8 +6526,8 @@ dependencies = [ "thiserror", "tree_magic_mini", "wayland-backend", - "wayland-client 0.31.1", - "wayland-protocols 0.31.0", + "wayland-client", + "wayland-protocols", "wayland-protocols-wlr", ] @@ -6516,11 +6548,26 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1641b26d4dec61337c35a1b1aaf9e3cba8f46f0b43636c609ab0291a648040a" dependencies = [ - "gethostname", + "gethostname 0.3.0", "nix 0.26.4", "winapi", "winapi-wsapoll", - "x11rb-protocol", + "x11rb-protocol 0.12.0", +] + +[[package]] +name = "x11rb" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8f25ead8c7e4cba123243a6367da5d3990e0d3affa708ea19dce96356bd9f1a" +dependencies = [ + "as-raw-xcb-connection", + "gethostname 0.4.3", + "libc", + "libloading 0.8.1", + "once_cell", + "rustix", + "x11rb-protocol 0.13.0", ] [[package]] @@ -6532,12 +6579,37 @@ dependencies = [ "nix 0.26.4", ] +[[package]] +name = "x11rb-protocol" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e63e71c4b8bd9ffec2c963173a4dc4cbde9ee96961d4fcb4429db9929b606c34" + [[package]] name = "xcursor" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a0ccd7b4a5345edfcd0c3535718a4e9ff7798ffc536bb5b5a0e26ff84732911" +[[package]] +name = "xkbcommon-dl" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6924668544c48c0133152e7eec86d644a056ca3d09275eb8d5cdb9855f9d8699" +dependencies = [ + "bitflags 2.4.1", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054a8e68b76250b253f671d1268cb7f1ae089ec35e195b2efb2a4e9a836d0621" + [[package]] name = "xml-rs" version = "0.8.19" diff --git a/Cargo.toml b/Cargo.toml index a579a59bb..97f81468d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,7 +46,7 @@ tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } naga = { version = "0.14.2", features = ["validate", "wgsl-out"] } naga_oil = "0.11.0" wgpu = "0.18.0" -egui = "0.24.1" +egui = "0.25.0" [workspace.lints.rust] # Clippy nightly often adds new/buggy lints that we want to ignore. @@ -99,3 +99,9 @@ inherits = "release" # is not yet in the latest wgpu release. TODO: Remove when it is. wgpu = { git = "https://github.com/gfx-rs/wgpu", branch = "v0.18" } naga = { git = "https://github.com/gfx-rs/wgpu", branch = "v0.18" } + +# https://github.com/emilk/egui/pull/3812 +egui = { git = "https://github.com/ruffle-rs/egui", branch = "consume_keys"} +egui_extras = { git = "https://github.com/ruffle-rs/egui", branch = "consume_keys"} +egui-winit = { git = "https://github.com/ruffle-rs/egui", branch = "consume_keys"} +egui-wgpu = { git = "https://github.com/ruffle-rs/egui", branch = "consume_keys"} diff --git a/core/Cargo.toml b/core/Cargo.toml index d016ee637..7de687356 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -55,7 +55,7 @@ hashbrown = { version = "0.14.3", features = ["raw"] } scopeguard = "1.2.0" fluent-templates = "0.8.0" egui = { workspace = true, optional = true } -egui_extras = { version = "0.24.2", optional = true } +egui_extras = { version = "0.25.0", optional = true } png = { version = "0.17.11", optional = true } flv-rs = { path = "../flv" } async-channel = "2.1.1" diff --git a/desktop/Cargo.toml b/desktop/Cargo.toml index b9eef243a..797ac5df9 100644 --- a/desktop/Cargo.toml +++ b/desktop/Cargo.toml @@ -14,10 +14,10 @@ workspace = true clap = { version = "4.4.17", features = ["derive"] } cpal = "0.15.2" egui = { workspace = true } -egui_extras = { version = "0.24.2", features = ["image"] } -egui-wgpu = { version = "0.24.1", features = ["winit"] } +egui_extras = { version = "0.25.0", features = ["image"] } +egui-wgpu = { version = "0.25.0", features = ["winit"] } image = { version = "0.24", features = ["png"] } -egui-winit = "0.24.1" +egui-winit = "0.25.0" fontdb = "0.16" ruffle_core = { path = "../core", features = ["audio", "clap", "mp3", "nellymoser", "default_compatibility_rules", "egui"] } ruffle_render = { path = "../render", features = ["clap"] } @@ -26,7 +26,7 @@ ruffle_video_software = { path = "../video/software", optional = true } tracing = { workspace = true} tracing-subscriber = { workspace = true } generational-arena = "0.2.9" -winit = "0.28.7" +winit = "0.29.10" webbrowser = "0.8.12" url = "2.5.0" arboard = { version = "3.3.0", features = ["wayland-data-control"] } diff --git a/desktop/src/app.rs b/desktop/src/app.rs index c1436e641..eddc0228a 100644 --- a/desktop/src/app.rs +++ b/desktop/src/app.rs @@ -3,8 +3,8 @@ use crate::custom_event::RuffleEvent; use crate::gui::{GuiController, MENU_HEIGHT}; use crate::player::{PlayerController, PlayerOptions}; use crate::util::{ - get_screen_size, parse_url, pick_file, plot_stats_in_tracy, winit_key_to_char, - winit_to_ruffle_key_code, winit_to_ruffle_text_control, + get_screen_size, parse_url, pick_file, plot_stats_in_tracy, winit_to_ruffle_key_code, + winit_to_ruffle_text_control, }; use anyhow::{Context, Error}; use ruffle_core::{PlayerEvent, StageDisplayState}; @@ -14,8 +14,9 @@ use std::rc::Rc; use std::time::{Duration, Instant}; use url::Url; use winit::dpi::{LogicalSize, PhysicalPosition, PhysicalSize, Size}; -use winit::event::{ElementState, KeyboardInput, ModifiersState, VirtualKeyCode, WindowEvent}; +use winit::event::{ElementState, KeyEvent, Modifiers, WindowEvent}; use winit::event_loop::{ControlFlow, EventLoop, EventLoopBuilder}; +use winit::keyboard::{Key, NamedKey}; use winit::window::{Fullscreen, Icon, Window, WindowBuilder}; pub struct App { @@ -35,7 +36,7 @@ impl App { let icon = Icon::from_rgba(icon_bytes.to_vec(), 32, 32).context("Couldn't load app icon")?; - let event_loop = EventLoopBuilder::with_user_event().build(); + let event_loop = EventLoopBuilder::with_user_event().build()?; let min_window_size = (16, if opt.no_gui { 16 } else { MENU_HEIGHT + 16 }).into(); let max_window_size = get_screen_size(&event_loop); @@ -78,7 +79,7 @@ impl App { }) } - pub fn run(mut self) -> ! { + pub fn run(mut self) -> Result<(), Error> { enum LoadingState { Loading, WaitingForResize, @@ -89,7 +90,7 @@ impl App { let mut time = Instant::now(); let mut next_frame_time = None; let mut minimized = false; - let mut modifiers = ModifiersState::empty(); + let mut modifiers = Modifiers::default(); let mut fullscreen_down = false; if self.opt.movie_url.is_none() { @@ -100,10 +101,10 @@ impl App { // Poll UI events. let event_loop = self.event_loop.take().expect("App already running"); - event_loop.run(move |event, _window_target, control_flow| { + event_loop.run(move |event, elwt| { let mut check_redraw = false; match event { - winit::event::Event::LoopDestroyed => { + winit::event::Event::LoopExiting => { if let Some(mut player) = self.player.get() { player.flush_shared_objects(); } @@ -112,9 +113,9 @@ impl App { } // Core loop - winit::event::Event::MainEventsCleared - if matches!(loaded, LoadingState::Loaded) => - { + // [NA] This used to be called `MainEventsCleared`, but I think the behaviour is different now. + // We should look at changing our tick to happen somewhere else if we see any behavioural problems. + winit::event::Event::AboutToWait if matches!(loaded, LoadingState::Loaded) => { let new_time = Instant::now(); let dt = new_time.duration_since(time).as_micros(); if dt > 0 { @@ -130,7 +131,10 @@ impl App { } // Render - winit::event::Event::RedrawRequested(_) => { + winit::event::Event::WindowEvent { + event: WindowEvent::RedrawRequested, + .. + } => { // Don't render when minimized to avoid potential swap chain errors in `wgpu`. if !minimized { if let Some(mut player) = self.player.get() { @@ -156,7 +160,7 @@ impl App { }; match event { WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; + elwt.exit(); return; } WindowEvent::Resized(size) => { @@ -211,7 +215,7 @@ impl App { MouseButton::Left => RuffleMouseButton::Left, MouseButton::Right => RuffleMouseButton::Right, MouseButton::Middle => RuffleMouseButton::Middle, - MouseButton::Other(_) => RuffleMouseButton::Unknown, + _ => RuffleMouseButton::Unknown, }; let event = match state { ElementState::Pressed => PlayerEvent::MouseDown { x, y, button }, @@ -260,14 +264,14 @@ impl App { WindowEvent::ModifiersChanged(new_modifiers) => { modifiers = new_modifiers; } - WindowEvent::KeyboardInput { input, .. } => { + WindowEvent::KeyboardInput { event, .. } => { // Handle fullscreen keyboard shortcuts: Alt+Return, Escape. - match input { - KeyboardInput { + match event { + KeyEvent { state: ElementState::Pressed, - virtual_keycode: Some(VirtualKeyCode::Return), + logical_key: Key::Named(NamedKey::Enter), .. - } if modifiers.alt() => { + } if modifiers.state().alt_key() => { if !fullscreen_down { if let Some(mut player) = self.player.get() { player.update(|uc| { @@ -278,16 +282,16 @@ impl App { fullscreen_down = true; return; } - KeyboardInput { + KeyEvent { state: ElementState::Released, - virtual_keycode: Some(VirtualKeyCode::Return), + logical_key: Key::Named(NamedKey::Enter), .. } if fullscreen_down => { fullscreen_down = false; } - KeyboardInput { + KeyEvent { state: ElementState::Pressed, - virtual_keycode: Some(VirtualKeyCode::Escape), + logical_key: Key::Named(NamedKey::Escape), .. } => { if let Some(mut player) = self.player.get() { @@ -304,37 +308,41 @@ impl App { _ => (), } - if let Some(key) = input.virtual_keycode { - let key_code = winit_to_ruffle_key_code(key); - let key_char = winit_key_to_char(key, modifiers.shift()); - match input.state { - ElementState::Pressed => { - self.player.handle_event(PlayerEvent::KeyDown { - key_code, - key_char, + let key_code = winit_to_ruffle_key_code(&event); + // [NA] TODO: This event used to give a single char. `last()` is functionally the same, + // but we may want to be better at this in the future. + let key_char = event.text.clone().and_then(|text| text.chars().last()); + let mut allow_text = true; + + match &event.state { + ElementState::Pressed => { + self.player + .handle_event(PlayerEvent::KeyDown { key_code, key_char }); + if let Some(control_code) = + winit_to_ruffle_text_control(&event, &modifiers) + { + self.player.handle_event(PlayerEvent::TextControl { + code: control_code, }); - if let Some(control_code) = - winit_to_ruffle_text_control(key, modifiers) - { - self.player.handle_event(PlayerEvent::TextControl { - code: control_code, - }); - } + allow_text = false; } - ElementState::Released => { - self.player.handle_event(PlayerEvent::KeyUp { - key_code, - key_char, - }); - } - }; - check_redraw = true; - } - } - WindowEvent::ReceivedCharacter(codepoint) => { - let event = PlayerEvent::TextInput { codepoint }; - self.player.handle_event(event); + } + ElementState::Released => { + self.player + .handle_event(PlayerEvent::KeyUp { key_code, key_char }); + } + }; check_redraw = true; + + if allow_text { + if let Some(text) = event.text { + for codepoint in text.chars() { + self.player + .handle_event(PlayerEvent::TextInput { codepoint }); + } + check_redraw = true; + } + } } _ => (), } @@ -385,7 +393,7 @@ impl App { self.window.scale_factor(), ); - self.window.set_inner_size(window_size); + let _ = self.window.request_inner_size(window_size); self.window.set_fullscreen(if self.opt.fullscreen { Some(Fullscreen::Borderless(None)) } else { @@ -441,7 +449,7 @@ impl App { } winit::event::Event::UserEvent(RuffleEvent::ExitRequested) => { - *control_flow = ControlFlow::Exit; + elwt.exit(); return; } @@ -458,7 +466,7 @@ impl App { } // After polling events, sleep the event loop until the next event or the next frame. - *control_flow = if matches!(loaded, LoadingState::Loaded) { + elwt.set_control_flow(if matches!(loaded, LoadingState::Loaded) { if let Some(next_frame_time) = next_frame_time { ControlFlow::WaitUntil(next_frame_time) } else { @@ -468,7 +476,8 @@ impl App { } } else { ControlFlow::Wait - }; - }); + }); + })?; + Ok(()) } } diff --git a/desktop/src/gui/controller.rs b/desktop/src/gui/controller.rs index d371d8931..0fac61f12 100644 --- a/desktop/src/gui/controller.rs +++ b/desktop/src/gui/controller.rs @@ -23,7 +23,6 @@ use winit::window::{Theme, Window}; /// Integration layer connecting wgpu+winit to egui. pub struct GuiController { descriptors: Arc, - egui_ctx: egui::Context, egui_winit: egui_winit::State, egui_renderer: egui_wgpu::renderer::Renderer, gui: RuffleGui, @@ -92,7 +91,8 @@ impl GuiController { egui_ctx.set_visuals(egui::Visuals::light()); } - let mut egui_winit = egui_winit::State::new(ViewportId::ROOT, window.as_ref(), None, None); + let mut egui_winit = + egui_winit::State::new(egui_ctx, ViewportId::ROOT, window.as_ref(), None, None); egui_winit.set_max_texture_side(descriptors.limits.max_texture_dimension_2d as usize); let movie_view_renderer = Arc::new(MovieViewRenderer::new( @@ -107,13 +107,12 @@ impl GuiController { let gui = RuffleGui::new(event_loop, opt.movie_url.clone(), PlayerOptions::from(opt)); let system_fonts = load_system_fonts(font_database, gui.locale.to_owned()).unwrap_or_default(); - egui_ctx.set_fonts(system_fonts); + egui_winit.egui_ctx().set_fonts(system_fonts); - egui_extras::install_image_loaders(&egui_ctx); + egui_extras::install_image_loaders(egui_winit.egui_ctx()); Ok(Self { descriptors: Arc::new(descriptors), - egui_ctx, egui_winit, egui_renderer, gui, @@ -163,10 +162,10 @@ impl GuiController { Theme::Dark => egui::Visuals::dark(), Theme::Light => egui::Visuals::light(), }; - self.egui_ctx.set_visuals(visuals); + self.egui_winit.egui_ctx().set_visuals(visuals); } - let response = self.egui_winit.on_window_event(&self.egui_ctx, event); + let response = self.egui_winit.on_window_event(&self.window, event); if response.repaint { self.window.request_redraw(); } @@ -203,7 +202,7 @@ impl GuiController { let raw_input = self.egui_winit.take_egui_input(&self.window); let show_menu = self.window.fullscreen().is_none() && !self.no_gui; - let mut full_output = self.egui_ctx.run(raw_input, |context| { + let mut full_output = self.egui_winit.egui_ctx().run(raw_input, |context| { self.gui.update( context, show_menu, @@ -222,7 +221,7 @@ impl GuiController { .repaint_delay; // If we're not in a UI, tell egui which cursor we prefer to use instead - if !self.egui_ctx.wants_pointer_input() { + if !self.egui_winit.egui_ctx().wants_pointer_input() { if let Some(player) = player.as_deref() { full_output.platform_output.cursor_icon = player .ui() @@ -231,14 +230,12 @@ impl GuiController { .cursor(); } } - self.egui_winit.handle_platform_output( - &self.window, - &self.egui_ctx, - full_output.platform_output, - ); + self.egui_winit + .handle_platform_output(&self.window, full_output.platform_output); let clipped_primitives = self - .egui_ctx + .egui_winit + .egui_ctx() .tessellate(full_output.shapes, full_output.pixels_per_point); let scale_factor = self.window.scale_factor() as f32; diff --git a/desktop/src/main.rs b/desktop/src/main.rs index f4057c442..dd5ed68d4 100644 --- a/desktop/src/main.rs +++ b/desktop/src/main.rs @@ -159,7 +159,7 @@ fn main() -> Result<(), Error> { let result = if opt.timedemo { time_demo::run_timedemo(opt) } else { - App::new(opt).map(|app| app.run()) + App::new(opt).and_then(|app| app.run()) }; #[cfg(windows)] if let Err(error) = &result { diff --git a/desktop/src/util.rs b/desktop/src/util.rs index 7ca22ca62..709f86dea 100644 --- a/desktop/src/util.rs +++ b/desktop/src/util.rs @@ -5,39 +5,40 @@ use ruffle_core::events::{KeyCode, TextControlCode}; use std::path::{Path, PathBuf}; use url::Url; use winit::dpi::PhysicalSize; -use winit::event::{ModifiersState, VirtualKeyCode}; +use winit::event::{KeyEvent, Modifiers}; use winit::event_loop::EventLoop; +use winit::keyboard::{Key, KeyLocation, NamedKey}; -/// Converts a `VirtualKeyCode` and `ModifiersState` to a Ruffle `TextControlCode`. +/// Converts a winit event to a Ruffle `TextControlCode`. /// Returns `None` if there is no match. /// TODO: Handle Ctrl+Arrows and Home/End keys pub fn winit_to_ruffle_text_control( - key: VirtualKeyCode, - modifiers: ModifiersState, + event: &KeyEvent, + modifiers: &Modifiers, ) -> Option { - let shift = modifiers.contains(ModifiersState::SHIFT); - let ctrl_cmd = modifiers.contains(ModifiersState::CTRL) - || (modifiers.contains(ModifiersState::LOGO) && cfg!(target_os = "macos")); + let shift = modifiers.state().shift_key(); + let ctrl_cmd = modifiers.state().control_key() + || (modifiers.state().super_key() && cfg!(target_os = "macos")); if ctrl_cmd { - match key { - VirtualKeyCode::A => Some(TextControlCode::SelectAll), - VirtualKeyCode::C => Some(TextControlCode::Copy), - VirtualKeyCode::V => Some(TextControlCode::Paste), - VirtualKeyCode::X => Some(TextControlCode::Cut), + match event.logical_key.as_ref() { + Key::Character("a") => Some(TextControlCode::SelectAll), + Key::Character("c") => Some(TextControlCode::Copy), + Key::Character("v") => Some(TextControlCode::Paste), + Key::Character("x") => Some(TextControlCode::Cut), _ => None, } } else { - match key { - VirtualKeyCode::Back => Some(TextControlCode::Backspace), - VirtualKeyCode::Delete => Some(TextControlCode::Delete), - VirtualKeyCode::Left => { + match event.logical_key.as_ref() { + Key::Named(NamedKey::Backspace) => Some(TextControlCode::Backspace), + Key::Named(NamedKey::Delete) => Some(TextControlCode::Delete), + Key::Named(NamedKey::ArrowLeft) => { if shift { Some(TextControlCode::SelectLeft) } else { Some(TextControlCode::MoveLeft) } } - VirtualKeyCode::Right => { + Key::Named(NamedKey::ArrowRight) => { if shift { Some(TextControlCode::SelectRight) } else { @@ -49,241 +50,121 @@ pub fn winit_to_ruffle_text_control( } } -/// Convert a winit `VirtualKeyCode` into a Ruffle `KeyCode`. +/// Convert a winit event into a Ruffle `KeyCode`. /// Return `KeyCode::Unknown` if there is no matching Flash key code. -pub fn winit_to_ruffle_key_code(key_code: VirtualKeyCode) -> KeyCode { - match key_code { - VirtualKeyCode::Back => KeyCode::Backspace, - VirtualKeyCode::Tab => KeyCode::Tab, - VirtualKeyCode::Return => KeyCode::Return, - VirtualKeyCode::LShift | VirtualKeyCode::RShift => KeyCode::Shift, - VirtualKeyCode::LControl | VirtualKeyCode::RControl => KeyCode::Control, - VirtualKeyCode::LAlt | VirtualKeyCode::RAlt => KeyCode::Alt, - VirtualKeyCode::Capital => KeyCode::CapsLock, - VirtualKeyCode::Escape => KeyCode::Escape, - VirtualKeyCode::Space => KeyCode::Space, - VirtualKeyCode::Key0 => KeyCode::Key0, - VirtualKeyCode::Key1 => KeyCode::Key1, - VirtualKeyCode::Key2 => KeyCode::Key2, - VirtualKeyCode::Key3 => KeyCode::Key3, - VirtualKeyCode::Key4 => KeyCode::Key4, - VirtualKeyCode::Key5 => KeyCode::Key5, - VirtualKeyCode::Key6 => KeyCode::Key6, - VirtualKeyCode::Key7 => KeyCode::Key7, - VirtualKeyCode::Key8 => KeyCode::Key8, - VirtualKeyCode::Key9 => KeyCode::Key9, - VirtualKeyCode::A => KeyCode::A, - VirtualKeyCode::B => KeyCode::B, - VirtualKeyCode::C => KeyCode::C, - VirtualKeyCode::D => KeyCode::D, - VirtualKeyCode::E => KeyCode::E, - VirtualKeyCode::F => KeyCode::F, - VirtualKeyCode::G => KeyCode::G, - VirtualKeyCode::H => KeyCode::H, - VirtualKeyCode::I => KeyCode::I, - VirtualKeyCode::J => KeyCode::J, - VirtualKeyCode::K => KeyCode::K, - VirtualKeyCode::L => KeyCode::L, - VirtualKeyCode::M => KeyCode::M, - VirtualKeyCode::N => KeyCode::N, - VirtualKeyCode::O => KeyCode::O, - VirtualKeyCode::P => KeyCode::P, - VirtualKeyCode::Q => KeyCode::Q, - VirtualKeyCode::R => KeyCode::R, - VirtualKeyCode::S => KeyCode::S, - VirtualKeyCode::T => KeyCode::T, - VirtualKeyCode::U => KeyCode::U, - VirtualKeyCode::V => KeyCode::V, - VirtualKeyCode::W => KeyCode::W, - VirtualKeyCode::X => KeyCode::X, - VirtualKeyCode::Y => KeyCode::Y, - VirtualKeyCode::Z => KeyCode::Z, - VirtualKeyCode::Semicolon => KeyCode::Semicolon, - VirtualKeyCode::Equals => KeyCode::Equals, - VirtualKeyCode::Comma => KeyCode::Comma, - VirtualKeyCode::Minus => KeyCode::Minus, - VirtualKeyCode::Period => KeyCode::Period, - VirtualKeyCode::Slash => KeyCode::Slash, - VirtualKeyCode::Grave => KeyCode::Grave, - VirtualKeyCode::LBracket => KeyCode::LBracket, - VirtualKeyCode::Backslash => KeyCode::Backslash, - VirtualKeyCode::RBracket => KeyCode::RBracket, - VirtualKeyCode::Apostrophe => KeyCode::Apostrophe, - VirtualKeyCode::Numpad0 => KeyCode::Numpad0, - VirtualKeyCode::Numpad1 => KeyCode::Numpad1, - VirtualKeyCode::Numpad2 => KeyCode::Numpad2, - VirtualKeyCode::Numpad3 => KeyCode::Numpad3, - VirtualKeyCode::Numpad4 => KeyCode::Numpad4, - VirtualKeyCode::Numpad5 => KeyCode::Numpad5, - VirtualKeyCode::Numpad6 => KeyCode::Numpad6, - VirtualKeyCode::Numpad7 => KeyCode::Numpad7, - VirtualKeyCode::Numpad8 => KeyCode::Numpad8, - VirtualKeyCode::Numpad9 => KeyCode::Numpad9, - VirtualKeyCode::NumpadMultiply => KeyCode::Multiply, - VirtualKeyCode::NumpadAdd => KeyCode::Plus, - VirtualKeyCode::NumpadSubtract => KeyCode::NumpadMinus, - VirtualKeyCode::NumpadDecimal => KeyCode::NumpadPeriod, - VirtualKeyCode::NumpadDivide => KeyCode::NumpadSlash, - VirtualKeyCode::PageUp => KeyCode::PgUp, - VirtualKeyCode::PageDown => KeyCode::PgDown, - VirtualKeyCode::End => KeyCode::End, - VirtualKeyCode::Home => KeyCode::Home, - VirtualKeyCode::Left => KeyCode::Left, - VirtualKeyCode::Up => KeyCode::Up, - VirtualKeyCode::Right => KeyCode::Right, - VirtualKeyCode::Down => KeyCode::Down, - VirtualKeyCode::Insert => KeyCode::Insert, - VirtualKeyCode::Delete => KeyCode::Delete, - VirtualKeyCode::Pause => KeyCode::Pause, - VirtualKeyCode::Scroll => KeyCode::ScrollLock, - VirtualKeyCode::F1 => KeyCode::F1, - VirtualKeyCode::F2 => KeyCode::F2, - VirtualKeyCode::F3 => KeyCode::F3, - VirtualKeyCode::F4 => KeyCode::F4, - VirtualKeyCode::F5 => KeyCode::F5, - VirtualKeyCode::F6 => KeyCode::F6, - VirtualKeyCode::F7 => KeyCode::F7, - VirtualKeyCode::F8 => KeyCode::F8, - VirtualKeyCode::F9 => KeyCode::F9, - VirtualKeyCode::F10 => KeyCode::F10, - VirtualKeyCode::F11 => KeyCode::F11, - VirtualKeyCode::F12 => KeyCode::F12, - VirtualKeyCode::F13 => KeyCode::F13, - VirtualKeyCode::F14 => KeyCode::F14, - VirtualKeyCode::F15 => KeyCode::F15, - VirtualKeyCode::F16 => KeyCode::F16, - VirtualKeyCode::F17 => KeyCode::F17, - VirtualKeyCode::F18 => KeyCode::F18, - VirtualKeyCode::F19 => KeyCode::F19, - VirtualKeyCode::F20 => KeyCode::F20, - VirtualKeyCode::F21 => KeyCode::F21, - VirtualKeyCode::F22 => KeyCode::F22, - VirtualKeyCode::F23 => KeyCode::F23, - VirtualKeyCode::F24 => KeyCode::F24, +pub fn winit_to_ruffle_key_code(event: &KeyEvent) -> KeyCode { + match event.logical_key.as_ref() { + Key::Named(NamedKey::Backspace) => KeyCode::Backspace, + Key::Named(NamedKey::Tab) => KeyCode::Tab, + Key::Named(NamedKey::Enter) => KeyCode::Return, + Key::Named(NamedKey::Shift) => KeyCode::Shift, + Key::Named(NamedKey::Control) => KeyCode::Control, + Key::Named(NamedKey::Alt) => KeyCode::Alt, + Key::Named(NamedKey::CapsLock) => KeyCode::CapsLock, + Key::Named(NamedKey::Escape) => KeyCode::Escape, + Key::Named(NamedKey::Space) => KeyCode::Space, + Key::Character("0") if event.location == KeyLocation::Numpad => KeyCode::Numpad0, + Key::Character("1") if event.location == KeyLocation::Numpad => KeyCode::Numpad1, + Key::Character("2") if event.location == KeyLocation::Numpad => KeyCode::Numpad2, + Key::Character("3") if event.location == KeyLocation::Numpad => KeyCode::Numpad3, + Key::Character("4") if event.location == KeyLocation::Numpad => KeyCode::Numpad4, + Key::Character("5") if event.location == KeyLocation::Numpad => KeyCode::Numpad5, + Key::Character("6") if event.location == KeyLocation::Numpad => KeyCode::Numpad6, + Key::Character("7") if event.location == KeyLocation::Numpad => KeyCode::Numpad7, + Key::Character("8") if event.location == KeyLocation::Numpad => KeyCode::Numpad8, + Key::Character("9") if event.location == KeyLocation::Numpad => KeyCode::Numpad9, + Key::Character("0") => KeyCode::Key0, + Key::Character("1") => KeyCode::Key1, + Key::Character("2") => KeyCode::Key2, + Key::Character("3") => KeyCode::Key3, + Key::Character("4") => KeyCode::Key4, + Key::Character("5") => KeyCode::Key5, + Key::Character("6") => KeyCode::Key6, + Key::Character("7") => KeyCode::Key7, + Key::Character("8") => KeyCode::Key8, + Key::Character("9") => KeyCode::Key9, + Key::Character("a") => KeyCode::A, + Key::Character("b") => KeyCode::B, + Key::Character("c") => KeyCode::C, + Key::Character("d") => KeyCode::D, + Key::Character("e") => KeyCode::E, + Key::Character("f") => KeyCode::F, + Key::Character("g") => KeyCode::G, + Key::Character("h") => KeyCode::H, + Key::Character("i") => KeyCode::I, + Key::Character("j") => KeyCode::J, + Key::Character("k") => KeyCode::K, + Key::Character("l") => KeyCode::L, + Key::Character("m") => KeyCode::M, + Key::Character("n") => KeyCode::N, + Key::Character("o") => KeyCode::O, + Key::Character("p") => KeyCode::P, + Key::Character("q") => KeyCode::Q, + Key::Character("r") => KeyCode::R, + Key::Character("s") => KeyCode::S, + Key::Character("t") => KeyCode::T, + Key::Character("u") => KeyCode::U, + Key::Character("v") => KeyCode::V, + Key::Character("w") => KeyCode::W, + Key::Character("x") => KeyCode::X, + Key::Character("y") => KeyCode::Y, + Key::Character("z") => KeyCode::Z, + Key::Character(";") => KeyCode::Semicolon, + Key::Character("=") => KeyCode::Equals, + Key::Character(",") => KeyCode::Comma, + Key::Character("-") if event.location == KeyLocation::Numpad => KeyCode::NumpadMinus, + Key::Character("-") => KeyCode::Minus, + Key::Character(".") if event.location == KeyLocation::Numpad => KeyCode::NumpadPeriod, + Key::Character(".") => KeyCode::Period, + Key::Character("/") if event.location == KeyLocation::Numpad => KeyCode::NumpadSlash, + Key::Character("/") => KeyCode::Slash, + Key::Character("`") => KeyCode::Grave, + Key::Character("[") => KeyCode::LBracket, + Key::Character("\\") => KeyCode::Backslash, + Key::Character("]") => KeyCode::RBracket, + Key::Character("'") => KeyCode::Apostrophe, + Key::Character("*") => KeyCode::Multiply, + Key::Character("+") => KeyCode::Plus, + Key::Named(NamedKey::PageUp) => KeyCode::PgUp, + Key::Named(NamedKey::PageDown) => KeyCode::PgDown, + Key::Named(NamedKey::End) => KeyCode::End, + Key::Named(NamedKey::Home) => KeyCode::Home, + Key::Named(NamedKey::ArrowLeft) => KeyCode::Left, + Key::Named(NamedKey::ArrowUp) => KeyCode::Up, + Key::Named(NamedKey::ArrowRight) => KeyCode::Right, + Key::Named(NamedKey::ArrowDown) => KeyCode::Down, + Key::Named(NamedKey::Insert) => KeyCode::Insert, + Key::Named(NamedKey::Delete) => KeyCode::Delete, + Key::Named(NamedKey::Pause) => KeyCode::Pause, + Key::Named(NamedKey::ScrollLock) => KeyCode::ScrollLock, + Key::Named(NamedKey::F1) => KeyCode::F1, + Key::Named(NamedKey::F2) => KeyCode::F2, + Key::Named(NamedKey::F3) => KeyCode::F3, + Key::Named(NamedKey::F4) => KeyCode::F4, + Key::Named(NamedKey::F5) => KeyCode::F5, + Key::Named(NamedKey::F6) => KeyCode::F6, + Key::Named(NamedKey::F7) => KeyCode::F7, + Key::Named(NamedKey::F8) => KeyCode::F8, + Key::Named(NamedKey::F9) => KeyCode::F9, + Key::Named(NamedKey::F10) => KeyCode::F10, + Key::Named(NamedKey::F11) => KeyCode::F11, + Key::Named(NamedKey::F12) => KeyCode::F12, + Key::Named(NamedKey::F13) => KeyCode::F13, + Key::Named(NamedKey::F14) => KeyCode::F14, + Key::Named(NamedKey::F15) => KeyCode::F15, + Key::Named(NamedKey::F16) => KeyCode::F16, + Key::Named(NamedKey::F17) => KeyCode::F17, + Key::Named(NamedKey::F18) => KeyCode::F18, + Key::Named(NamedKey::F19) => KeyCode::F19, + Key::Named(NamedKey::F20) => KeyCode::F20, + Key::Named(NamedKey::F21) => KeyCode::F21, + Key::Named(NamedKey::F22) => KeyCode::F22, + Key::Named(NamedKey::F23) => KeyCode::F23, + Key::Named(NamedKey::F24) => KeyCode::F24, _ => KeyCode::Unknown, } } -/// Return a character for the given key code and shift state. -pub fn winit_key_to_char(key_code: VirtualKeyCode, is_shift_down: bool) -> Option { - // We need to know the character that a keypress outputs for both key down and key up events, - // but the winit keyboard API does not provide a way to do this (winit/#753). - // CharacterReceived events are insufficent because they only fire on key down, not on key up. - // This is a half-measure to map from keyboard keys back to a character, but does will not work fully - // for international layouts. - Some(match (key_code, is_shift_down) { - (VirtualKeyCode::Space, _) => ' ', - (VirtualKeyCode::Key0, _) => '0', - (VirtualKeyCode::Key1, _) => '1', - (VirtualKeyCode::Key2, _) => '2', - (VirtualKeyCode::Key3, _) => '3', - (VirtualKeyCode::Key4, _) => '4', - (VirtualKeyCode::Key5, _) => '5', - (VirtualKeyCode::Key6, _) => '6', - (VirtualKeyCode::Key7, _) => '7', - (VirtualKeyCode::Key8, _) => '8', - (VirtualKeyCode::Key9, _) => '9', - (VirtualKeyCode::A, false) => 'a', - (VirtualKeyCode::A, true) => 'A', - (VirtualKeyCode::B, false) => 'b', - (VirtualKeyCode::B, true) => 'B', - (VirtualKeyCode::C, false) => 'c', - (VirtualKeyCode::C, true) => 'C', - (VirtualKeyCode::D, false) => 'd', - (VirtualKeyCode::D, true) => 'D', - (VirtualKeyCode::E, false) => 'e', - (VirtualKeyCode::E, true) => 'E', - (VirtualKeyCode::F, false) => 'f', - (VirtualKeyCode::F, true) => 'F', - (VirtualKeyCode::G, false) => 'g', - (VirtualKeyCode::G, true) => 'G', - (VirtualKeyCode::H, false) => 'h', - (VirtualKeyCode::H, true) => 'H', - (VirtualKeyCode::I, false) => 'i', - (VirtualKeyCode::I, true) => 'I', - (VirtualKeyCode::J, false) => 'j', - (VirtualKeyCode::J, true) => 'J', - (VirtualKeyCode::K, false) => 'k', - (VirtualKeyCode::K, true) => 'K', - (VirtualKeyCode::L, false) => 'l', - (VirtualKeyCode::L, true) => 'L', - (VirtualKeyCode::M, false) => 'm', - (VirtualKeyCode::M, true) => 'M', - (VirtualKeyCode::N, false) => 'n', - (VirtualKeyCode::N, true) => 'N', - (VirtualKeyCode::O, false) => 'o', - (VirtualKeyCode::O, true) => 'O', - (VirtualKeyCode::P, false) => 'p', - (VirtualKeyCode::P, true) => 'P', - (VirtualKeyCode::Q, false) => 'q', - (VirtualKeyCode::Q, true) => 'Q', - (VirtualKeyCode::R, false) => 'r', - (VirtualKeyCode::R, true) => 'R', - (VirtualKeyCode::S, false) => 's', - (VirtualKeyCode::S, true) => 'S', - (VirtualKeyCode::T, false) => 't', - (VirtualKeyCode::T, true) => 'T', - (VirtualKeyCode::U, false) => 'u', - (VirtualKeyCode::U, true) => 'U', - (VirtualKeyCode::V, false) => 'v', - (VirtualKeyCode::V, true) => 'V', - (VirtualKeyCode::W, false) => 'w', - (VirtualKeyCode::W, true) => 'W', - (VirtualKeyCode::X, false) => 'x', - (VirtualKeyCode::X, true) => 'X', - (VirtualKeyCode::Y, false) => 'y', - (VirtualKeyCode::Y, true) => 'Y', - (VirtualKeyCode::Z, false) => 'z', - (VirtualKeyCode::Z, true) => 'Z', - - (VirtualKeyCode::Semicolon, false) => ';', - (VirtualKeyCode::Semicolon, true) => ':', - (VirtualKeyCode::Equals, false) => '=', - (VirtualKeyCode::Equals, true) => '+', - (VirtualKeyCode::Comma, false) => ',', - (VirtualKeyCode::Comma, true) => '<', - (VirtualKeyCode::Minus, false) => '-', - (VirtualKeyCode::Minus, true) => '_', - (VirtualKeyCode::Period, false) => '.', - (VirtualKeyCode::Period, true) => '>', - (VirtualKeyCode::Slash, false) => '/', - (VirtualKeyCode::Slash, true) => '?', - (VirtualKeyCode::Grave, false) => '`', - (VirtualKeyCode::Grave, true) => '~', - (VirtualKeyCode::LBracket, false) => '[', - (VirtualKeyCode::LBracket, true) => '{', - (VirtualKeyCode::Backslash, false) => '\\', - (VirtualKeyCode::Backslash, true) => '|', - (VirtualKeyCode::RBracket, false) => ']', - (VirtualKeyCode::RBracket, true) => '}', - (VirtualKeyCode::Apostrophe, false) => '\'', - (VirtualKeyCode::Apostrophe, true) => '"', - (VirtualKeyCode::NumpadMultiply, _) => '*', - (VirtualKeyCode::NumpadAdd, _) => '+', - (VirtualKeyCode::NumpadSubtract, _) => '-', - (VirtualKeyCode::NumpadDecimal, _) => '.', - (VirtualKeyCode::NumpadDivide, _) => '/', - - (VirtualKeyCode::Numpad0, false) => '0', - (VirtualKeyCode::Numpad1, false) => '1', - (VirtualKeyCode::Numpad2, false) => '2', - (VirtualKeyCode::Numpad3, false) => '3', - (VirtualKeyCode::Numpad4, false) => '4', - (VirtualKeyCode::Numpad5, false) => '5', - (VirtualKeyCode::Numpad6, false) => '6', - (VirtualKeyCode::Numpad7, false) => '7', - (VirtualKeyCode::Numpad8, false) => '8', - (VirtualKeyCode::Numpad9, false) => '9', - (VirtualKeyCode::NumpadEnter, _) => '\r', - - (VirtualKeyCode::Tab, _) => '\t', - (VirtualKeyCode::Return, _) => '\r', - (VirtualKeyCode::Back, _) => '\u{0008}', - - _ => return None, - }) -} - pub fn get_screen_size(event_loop: &EventLoop) -> PhysicalSize { let mut min_x = 0; let mut min_y = 0;