From 1b892bc17aa821b448f7c0a5bb27e1f77799a00b Mon Sep 17 00:00:00 2001 From: Jason Tsai Date: Tue, 12 Nov 2024 16:24:06 +0800 Subject: [PATCH] feat: implement fixed context menu for mac and windows (#226) * feat: context menu poc for mac * refactor codes * update lockfil * build: fix linux build * build: move muda to macos and windows dep only * fix: exclude linux * apply suggestion --- Cargo.lock | 603 +++++++++++++++++++++++++++++++++++++++----- Cargo.toml | 10 +- src/context_menu.rs | 50 ++++ src/lib.rs | 2 + src/webview.rs | 4 + src/window.rs | 95 ++++++- 6 files changed, 696 insertions(+), 68 deletions(-) create mode 100644 src/context_menu.rs diff --git a/Cargo.lock b/Cargo.lock index 02de8026..e2af6147 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -92,9 +92,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "611cc2ae7d2e242c457e4be7f97036b8ad9ca152b499f53faf99b1ed8fc2553f" [[package]] name = "android-activity" @@ -267,7 +267,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -286,6 +286,29 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "atk" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4af014b17dd80e8af9fa689b2d4a211ddba6eb583c1622f35d0cb543f6b17e4" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "251e0b7d90e33e0ba930891a505a9a35ece37b2dd37a14f3ffc306c13b980009" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -394,7 +417,7 @@ dependencies = [ "bitflags 2.6.0", "cexpr", "clang-sys", - "itertools 0.10.5", + "itertools 0.12.1", "lazy_static", "lazycell", "proc-macro2", @@ -402,7 +425,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn", + "syn 2.0.87", "which", ] @@ -579,6 +602,31 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.6.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + [[package]] name = "calendrical_calculations" version = "0.1.1" @@ -683,7 +731,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c54b2cc2601d3f8d89a8d2e0edd4ef9e2685b29f6cc810964e7454c04e474ba2" dependencies = [ "cargo-packager-utils", - "heck", + "heck 0.5.0", "log", "thiserror", ] @@ -732,6 +780,16 @@ dependencies = [ "nom", ] +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -1134,7 +1192,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -1144,7 +1202,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -1182,7 +1240,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -1193,7 +1251,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -1213,7 +1271,7 @@ name = "deny_public_fields" version = "0.0.1" source = "git+https://github.com/servo/servo.git?rev=72971bd#72971bd2716a7e574a4c6c3395c7a710652427b4" dependencies = [ - "syn", + "syn 2.0.87", "synstructure", ] @@ -1235,7 +1293,7 @@ checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -1297,7 +1355,7 @@ dependencies = [ "diplomat_core", "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -1321,7 +1379,7 @@ dependencies = [ "serde", "smallvec", "strck_ident", - "syn", + "syn 2.0.87", ] [[package]] @@ -1359,7 +1417,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -1394,7 +1452,7 @@ version = "0.0.1" source = "git+https://github.com/servo/servo.git?rev=72971bd#72971bd2716a7e574a4c6c3395c7a710652427b4" dependencies = [ "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -1404,7 +1462,7 @@ source = "git+https://github.com/servo/servo.git?rev=72971bd#72971bd2716a7e574a4 dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -1596,6 +1654,16 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + [[package]] name = "filetime" version = "0.2.25" @@ -1778,7 +1846,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -1889,7 +1957,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -1941,6 +2009,64 @@ dependencies = [ "log", ] +[[package]] +name = "gdk" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5ba081bdef3b75ebcdbfc953699ed2d7417d6bd853347a42a37d76406a33646" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31ff856cb3386dae1703a920f803abafcc580e9b5f711ca62ed1620c25b51ff2" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1997,6 +2123,38 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + [[package]] name = "gl_generator" version = "0.14.0" @@ -2017,6 +2175,53 @@ dependencies = [ "gl_generator", ] +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.6.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + [[package]] name = "glob" version = "0.3.1" @@ -2122,6 +2327,17 @@ dependencies = [ "gl_generator", ] +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + [[package]] name = "gpu-alloc" version = "0.6.0" @@ -2161,7 +2377,7 @@ checksum = "9c08c1f623a8d0b722b8b99f821eb0ba672a1618f0d3b16ddbee1cedd2dd8557" dependencies = [ "bitflags 2.6.0", "gpu-descriptor-types", - "hashbrown", + "hashbrown 0.14.5", ] [[package]] @@ -2173,6 +2389,58 @@ dependencies = [ "bitflags 2.6.0", ] +[[package]] +name = "gtk" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93c4f5e0e20b60e10631a5f06da7fe3dda744b05ad0ea71fee2f47adf865890c" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771437bf1de2c1c0b496c11505bdf748e26066bbe942dfc8f614c9460f6d7722" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6063efb63db582968fb7df72e1ae68aa6360dcfb0a75143f34fc7d616bad75e" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "h2" version = "0.3.26" @@ -2227,6 +2495,12 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" + [[package]] name = "headers" version = "0.3.9" @@ -2251,6 +2525,12 @@ dependencies = [ "http", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "heck" version = "0.5.0" @@ -2301,7 +2581,7 @@ dependencies = [ "markup5ever", "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -2346,9 +2626,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.30" +version = "0.14.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" dependencies = [ "bytes", "futures-channel", @@ -2792,7 +3072,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -2904,12 +3184,12 @@ checksum = "76a49eaebc8750bcba241df1e1e47ebb51b81eb35c65e8f11ffa0aebac353f7f" [[package]] name = "indexmap" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.1", "serde", ] @@ -2969,6 +3249,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -3039,7 +3328,7 @@ version = "0.0.1" source = "git+https://github.com/servo/servo.git?rev=72971bd#72971bd2716a7e574a4c6c3395c7a710652427b4" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.87", "synstructure", ] @@ -3218,6 +3507,25 @@ dependencies = [ "redox_syscall 0.5.7", ] +[[package]] +name = "libxdo" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00333b8756a3d28e78def82067a377de7fa61b24909000aeaa2b446a948d14db" +dependencies = [ + "libxdo-sys", +] + +[[package]] +name = "libxdo-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db23b9e7e2b7831bbd8aac0bbeeeb7b68cbebc162b227e7052e8e55829a09212" +dependencies = [ + "libc", + "x11", +] + [[package]] name = "libz-sys" version = "1.1.20" @@ -3337,7 +3645,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f44db74bde26fdf427af23f1d146c211aed857c59e3be750cf2617f6b0b05c94" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.87", "synstructure", ] @@ -3392,6 +3700,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + [[package]] name = "metal" version = "0.24.0" @@ -3535,6 +3852,26 @@ dependencies = [ "walkdir", ] +[[package]] +name = "muda" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdae9c00e61cc0579bcac625e8ad22104c60548a025bfc972dc83868a28e1484" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "libxdo", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "png", + "thiserror", + "windows-sys 0.59.0", +] + [[package]] name = "naga" version = "23.0.0" @@ -3753,7 +4090,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -3811,10 +4148,10 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -4113,6 +4450,31 @@ dependencies = [ "ttf-parser", ] +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + [[package]] name = "parking_lot" version = "0.12.3" @@ -4177,7 +4539,7 @@ source = "git+https://github.com/servo/webrender?branch=0.65#8468e81608b00d83c62 dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", "synstructure", "unicode-xid", ] @@ -4248,7 +4610,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -4286,7 +4648,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -4390,11 +4752,46 @@ checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" [[package]] name = "proc-macro-crate" -version = "3.2.0" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "toml_edit", + "proc-macro2", + "quote", + "version_check", ] [[package]] @@ -4692,9 +5089,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.39" +version = "0.38.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" +checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0" dependencies = [ "bitflags 2.6.0", "errno", @@ -5018,7 +5415,7 @@ checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -5033,6 +5430,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -5099,7 +5505,7 @@ source = "git+https://github.com/servo/media#12dfb35619520eb6e78e25e9a975d625f64 dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -5210,7 +5616,7 @@ dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -5557,7 +5963,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.87", "synstructure", ] @@ -5631,6 +6037,16 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e454d048db5527d000bfddb77bd072bbf3a1e2ae785f16d9bd116e07c2ab45eb" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.87" @@ -5650,7 +6066,20 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml", + "version-compare", ] [[package]] @@ -5664,6 +6093,12 @@ dependencies = [ "xattr", ] +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + [[package]] name = "task_info" version = "0.0.1" @@ -5714,22 +6149,22 @@ checksum = "a38c90d48152c236a3ab59271da4f4ae63d678c5d7ad6b7714d7cb9760be5e4b" [[package]] name = "thiserror" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -5869,7 +6304,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.87", "synstructure", ] @@ -5897,7 +6332,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -5934,23 +6369,51 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.20.2", +] + [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap", "toml_datetime", "winnow", ] +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "topological-sort" version = "0.1.0" @@ -6176,6 +6639,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + [[package]] name = "version_check" version = "0.9.5" @@ -6221,10 +6690,12 @@ dependencies = [ "layout_thread_2020", "log", "media", + "muda", "net", "net_traits", "objc2", "objc2-app-kit", + "objc2-foundation", "profile", "profile_traits", "raw-window-handle", @@ -6346,7 +6817,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.87", "wasm-bindgen-shared", ] @@ -6380,7 +6851,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6885,7 +7356,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -6896,7 +7367,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -7186,9 +7657,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.20" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] @@ -7383,7 +7854,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", "synstructure", ] @@ -7405,7 +7876,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -7425,7 +7896,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", "synstructure", ] @@ -7459,7 +7930,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index cfe1e877..50faf204 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -109,9 +109,17 @@ url = { workspace = true } headers = "0.3" versoview_messages = { path = "./versoview_messages" } +[target.'cfg(any(target_os = "macos", target_os = "windows"))'.dependencies] +muda = "0.15" + [target.'cfg(any(target_os = "ios", target_os = "macos"))'.dependencies] objc2 = "0.5" -objc2-app-kit = {version = "0.2", features = ["NSView", "NSResponder", "NSWindow"]} +objc2-foundation = { version = "0.2.2", features = ["NSThread"] } +objc2-app-kit = { version = "0.2", features = [ + "NSView", + "NSResponder", + "NSWindow", +] } [[test]] name = "general" diff --git a/src/context_menu.rs b/src/context_menu.rs new file mode 100644 index 00000000..968aa93b --- /dev/null +++ b/src/context_menu.rs @@ -0,0 +1,50 @@ +#[cfg(any(target_os = "macos", target_os = "windows"))] +use muda::{ContextMenu as MudaContextMenu, Menu}; +#[cfg(any(target_os = "macos", target_os = "windows"))] +use raw_window_handle::{HasWindowHandle, RawWindowHandle}; + +/// Context Menu +#[cfg(any(target_os = "macos", target_os = "windows"))] +pub struct ContextMenu { + menu: Menu, +} + +/// Context Menu +#[cfg(linux)] +pub struct ContextMenu {} + +#[cfg(any(target_os = "macos", target_os = "windows"))] +impl ContextMenu { + /// Create context menu with custom items + pub fn new_with_menu(menu: Menu) -> Self { + Self { menu } + } + + /// Show the context menu on current cursor position + /// + /// This function returns when the context menu is dismissed + pub fn show(&self, rwh: impl HasWindowHandle) { + // Show the context menu + unsafe { + let wh = rwh.window_handle().unwrap(); + match wh.as_raw() { + #[cfg(target_os = "macos")] + RawWindowHandle::AppKit(handle) => { + // use objc2 + assert!( + objc2_foundation::is_main_thread(), + "can only access AppKit handles on the main thread" + ); + let ns_view = handle.ns_view.as_ptr(); + self.menu.show_context_menu_for_nsview(ns_view, None); + } + #[cfg(target_os = "windows")] + RawWindowHandle::Win32(handle) => { + let hwnd = handle.hwnd; + self.menu.show_context_menu_for_hwnd(hwnd.into(), None); + } + handle => unreachable!("unknown handle {handle:?} for platform"), + } + } + } +} diff --git a/src/lib.rs b/src/lib.rs index 73c34cb0..bdbc716b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -29,3 +29,5 @@ pub use errors::{Error, Result}; pub use verso::Verso; /// Re-exporting Winit for the sake of convenience. pub use winit; +/// Context +pub mod context_menu; diff --git a/src/webview.rs b/src/webview.rs index 796b47c4..096e112e 100644 --- a/src/webview.rs +++ b/src/webview.rs @@ -117,6 +117,7 @@ impl Window { } } EmbedderMsg::HistoryChanged(list, index) => { + self.update_history(&list, index); let url = list.get(index).unwrap(); if let Some(panel) = self.panel.as_ref() { let (tx, rx) = ipc::channel::().unwrap(); @@ -138,6 +139,9 @@ impl Window { send_to_constellation(sender, ConstellationMsg::FocusWebView(webview_id)); } } + EmbedderMsg::ShowContextMenu(_sender, _title, _options) => { + // TODO: Implement context menu + } e => { log::trace!("Verso WebView isn't supporting this message yet: {e:?}") } diff --git a/src/window.rs b/src/window.rs index cb679c1f..bbf5ea6e 100644 --- a/src/window.rs +++ b/src/window.rs @@ -10,6 +10,12 @@ use glutin::{ surface::{Surface, WindowSurface}, }; use glutin_winit::DisplayBuilder; +#[cfg(any(target_os = "macos", target_os = "windows"))] +use muda::{Menu, MenuEvent, MenuEventReceiver, MenuItem}; +#[cfg(any(target_os = "macos", target_os = "windows"))] +use raw_window_handle::HasWindowHandle; +#[cfg(any(target_os = "macos", target_os = "windows"))] +use script_traits::TraversalDirection; use script_traits::{TouchEventType, WheelDelta, WheelMode}; use servo_url::ServoUrl; use webrender_api::{ @@ -26,6 +32,8 @@ use winit::{ window::{CursorIcon, Window as WinitWindow, WindowId}, }; +#[cfg(any(target_os = "macos", target_os = "windows"))] +use crate::context_menu::ContextMenu; use crate::{ compositor::{IOCompositor, MouseWindowEvent}, keyboard::keyboard_event_from_winit, @@ -50,8 +58,14 @@ pub struct Window { mouse_position: Cell>>, /// Modifiers state of the keyboard. modifiers_state: Cell, + history: Vec, + current_history_index: usize, /// State to indicate if the window is resizing. pub(crate) resizing: bool, + + /// Global menu evnet receiver for muda crate + #[cfg(any(target_os = "macos", target_os = "windows"))] + menu_event_receiver: MenuEventReceiver, } impl Window { @@ -96,7 +110,11 @@ impl Window { webview: None, mouse_position: Default::default(), modifiers_state: Cell::new(ModifiersState::default()), + history: vec![], + current_history_index: 0, resizing: false, + #[cfg(any(target_os = "macos", target_os = "windows"))] + menu_event_receiver: MenuEvent::receiver().clone(), }, rendering_context, ) @@ -133,7 +151,11 @@ impl Window { webview: None, mouse_position: Default::default(), modifiers_state: Cell::new(ModifiersState::default()), + history: vec![], + current_history_index: 0, resizing: false, + #[cfg(any(target_os = "macos", target_os = "windows"))] + menu_event_receiver: MenuEvent::receiver().clone(), }; compositor.swap_current_window(&mut window); window @@ -247,6 +269,17 @@ impl Window { } } WindowEvent::MouseInput { state, button, .. } => { + // handle context menu + // TODO: should create on ShowContextMenu event + #[cfg(any(target_os = "macos", target_os = "windows"))] + if *button == winit::event::MouseButton::Right && *state == ElementState::Pressed { + self.show_context_menu(); + // FIXME: there's chance to lose the event since the channel is async. + if let Ok(event) = self.menu_event_receiver.try_recv() { + self.handle_context_menu_event(sender, event); + } + } + let position = match self.mouse_position.get() { Some(position) => Point2D::new(position.x as f32, position.y as f32), None => { @@ -492,6 +525,66 @@ impl Window { }; self.window.set_cursor(winit_cursor); } + + /// Update the history of the window. + pub fn update_history(&mut self, history: &Vec, current_index: usize) { + self.history = history.to_vec(); + self.current_history_index = current_index; + } +} + +// Dummy Context Menu +#[cfg(any(target_os = "macos", target_os = "windows"))] +impl Window { + pub(crate) fn show_context_menu(&self) { + let history_len = self.history.len(); + + // items + let back = MenuItem::with_id("back", "Back", self.current_history_index > 0, None); + let forward = MenuItem::with_id( + "forward", + "Forward", + self.current_history_index + 1 < history_len, + None, + ); + let reload = MenuItem::with_id("reload", "Reload", true, None); + + let menu = Menu::new(); + let _ = menu.append_items(&[&back, &forward, &reload]); + + let context_menu = ContextMenu::new_with_menu(menu); + context_menu.show(self.window.window_handle().unwrap()); + } + fn handle_context_menu_event(&self, sender: &Sender, event: MenuEvent) { + // TODO: should be more flexible to handle different menu items + match event.id().0.as_str() { + "back" => { + send_to_constellation( + sender, + ConstellationMsg::TraverseHistory( + self.webview.as_ref().unwrap().webview_id, + TraversalDirection::Back(1), + ), + ); + } + "forward" => { + send_to_constellation( + sender, + ConstellationMsg::TraverseHistory( + self.webview.as_ref().unwrap().webview_id, + TraversalDirection::Forward(1), + ), + ); + } + "reload" => { + send_to_constellation( + sender, + ConstellationMsg::Reload(self.webview.as_ref().unwrap().webview_id), + ); + } + _ => {} + } + } } // Non-decorated window resizing for Windows and Linux. @@ -587,7 +680,7 @@ impl Window { #[cfg(macos)] use objc2::runtime::AnyObject; #[cfg(macos)] -use raw_window_handle::{AppKitWindowHandle, HasWindowHandle, RawWindowHandle}; +use raw_window_handle::{AppKitWindowHandle, RawWindowHandle}; #[cfg(macos)] use winit::dpi::LogicalPosition;