diff --git a/Cargo.lock b/Cargo.lock index e919d79b07..79cc926df8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -116,9 +116,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.89" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" +checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95" [[package]] name = "arbitrary" @@ -137,7 +137,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -272,7 +272,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -307,7 +307,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -536,15 +536,15 @@ dependencies = [ "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", "syn_derive", ] [[package]] name = "brotli" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -563,9 +563,9 @@ dependencies = [ [[package]] name = "built" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "236e6289eda5a812bc6b53c3b024039382a2895fbbeef2d748b2931546d392c4" +checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" [[package]] name = "bumpalo" @@ -626,9 +626,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" dependencies = [ "serde", ] @@ -702,9 +702,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.30" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ "jobserver", "libc", @@ -1148,7 +1148,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1158,7 +1158,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1194,7 +1194,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1205,7 +1205,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1248,7 +1248,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1261,7 +1261,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1331,7 +1331,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1363,7 +1363,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1418,11 +1418,11 @@ checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" name = "eco-paste" version = "0.3.0-beta.1" dependencies = [ - "cocoa 0.25.0", "serde", "serde_json", "tauri", "tauri-build", + "tauri-nspanel", "tauri-plugin-autostart", "tauri-plugin-dialog", "tauri-plugin-eco-autostart", @@ -1526,7 +1526,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1686,9 +1686,9 @@ dependencies = [ [[package]] name = "flume" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ "futures-core", "futures-sink", @@ -1728,7 +1728,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1839,7 +1839,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -2113,7 +2113,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -2209,7 +2209,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -2490,9 +2490,9 @@ dependencies = [ [[package]] name = "image" -version = "0.25.3" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97eb9a8e0cd5b76afea91d7eecd5cf8338cd44ced04256cf1f800474b227c52" +checksum = "bc144d44a31d753b02ce64093d532f55ff8dc4ebf2ffb8a63c0dda691385acae" dependencies = [ "bytemuck", "byteorder-lite", @@ -2575,7 +2575,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -2699,7 +2699,19 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" dependencies = [ - "jsonptr", + "jsonptr 0.4.7", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr 0.6.3", "serde", "serde_json", "thiserror", @@ -2716,6 +2728,16 @@ dependencies = [ "serde_json", ] +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "keyboard-types" version = "0.7.0" @@ -2781,9 +2803,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.159" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libfuzzer-sys" @@ -3179,7 +3201,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -3241,7 +3263,7 @@ dependencies = [ "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -3749,7 +3771,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -3966,7 +3988,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" dependencies = [ "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -4203,9 +4225,9 @@ dependencies = [ [[package]] name = "ravif" -version = "0.11.10" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f0bfd976333248de2078d350bfdf182ff96e168a24d23d2436cef320dd4bdd" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" dependencies = [ "avif-serialize", "imgref", @@ -4603,7 +4625,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -4655,9 +4677,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.210" +version = "1.0.211" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "1ac55e59090389fb9f0dd9e0f3c09615afed1d19094284d0b200441f13550793" dependencies = [ "serde_derive", ] @@ -4675,13 +4697,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.211" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "54be4f245ce16bc58d57ef2716271d0d4519e0f6defa147f6e081005bcb278ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -4692,14 +4714,14 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa 1.0.11", "memchr", @@ -4715,7 +4737,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -4766,7 +4788,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -5065,7 +5087,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -5088,7 +5110,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.79", + "syn 2.0.82", "tempfile", "tokio", "url", @@ -5285,9 +5307,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.79" +version = "2.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "83540f837a8afc019423a8edb95b52a8effe46957ee402287f4292fae35be021" dependencies = [ "proc-macro2", "quote", @@ -5303,7 +5325,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -5383,7 +5405,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -5393,7 +5415,7 @@ source = "git+https://github.com/Legend-Master/tao?branch=fix-set-theme-mac-cras dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -5421,9 +5443,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.0.4" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44438500b50708bfc1e6083844e135d1b516325aae58710dcd8fb67e050ae87c" +checksum = "d3889b392db6d32a105d3757230ea0220090b8f94c90d3e60b6c5eb91178ab1b" dependencies = [ "anyhow", "bytes", @@ -5473,16 +5495,16 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "935f9b3c49b22b3e2e485a57f46d61cd1ae07b1cbb2ba87387a387caf2d8c4e7" +checksum = "9f96827ccfb1aa40d55d0ded79562d18ba18566657a553f992a982d755148376" dependencies = [ "anyhow", "cargo_toml", "dirs 5.0.1", "glob", "heck 0.5.0", - "json-patch", + "json-patch 3.0.1", "schemars", "semver", "serde", @@ -5495,14 +5517,14 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95d7443dd4f0b597704b6a14b964ee2ed16e99928d8e6292ae9825f09fbcd30e" +checksum = "8947f16f47becd9e9cd39b74ee337fd1981574d78819be18e4384d85e5a0b82f" dependencies = [ "base64 0.22.1", "brotli", "ico", - "json-patch", + "json-patch 2.0.0", "plist", "png", "proc-macro2", @@ -5511,7 +5533,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "syn 2.0.79", + "syn 2.0.82", "tauri-utils", "thiserror", "time", @@ -5522,23 +5544,39 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d2c0963ccfc3f5194415f2cce7acc975942a8797fbabfb0aa1ed6f59326ae7f" +checksum = "8bd1c8d4a66799d3438747c3a79705cd665a95d6f24cb5f315413ff7a981fe2a" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", "tauri-codegen", "tauri-utils", ] +[[package]] +name = "tauri-nspanel" +version = "2.0.0-beta" +source = "git+https://github.com/ahkohd/tauri-nspanel?branch=v2#005240ce43fe02108ce6d0aec6e2e436c46f46b7" +dependencies = [ + "bitflags 2.6.0", + "block", + "cocoa 0.26.0", + "core-foundation 0.10.0", + "core-graphics 0.24.0", + "objc", + "objc-foundation", + "objc_id", + "tauri", +] + [[package]] name = "tauri-plugin" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e6660a409963e4d57b9bfab4addd141eeff41bd3a7fb14e13004a832cf7ef6" +checksum = "6fa4e6c94cb1d635f65a770c69e23de1bc054b0e4c554fa037a7cc7676333d39" dependencies = [ "anyhow", "glob", @@ -5568,9 +5606,9 @@ dependencies = [ [[package]] name = "tauri-plugin-dialog" -version = "2.0.1" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddb2fe88b602461c118722c574e2775ab26a4e68886680583874b2f6520608b7" +checksum = "4307310e1d2c09ab110235834722e7c2b85099b683e1eb7342ab351b0be5ada3" dependencies = [ "log", "raw-window-handle", @@ -5680,6 +5718,7 @@ dependencies = [ "rdev", "serde", "tauri", + "tauri-nspanel", "tauri-plugin", "tauri-plugin-eco-window", "winapi", @@ -5692,6 +5731,7 @@ version = "0.1.0" dependencies = [ "serde", "tauri", + "tauri-nspanel", "tauri-plugin", ] @@ -5707,9 +5747,9 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" -version = "2.0.1" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab300488ebec3487ca5f56289692e7e45feb07eea8d5e1dba497f7dc9dd9c407" +checksum = "96ba7d46e86db8c830d143ef90ab5a453328365b0cc834c24edea4267b16aba0" dependencies = [ "anyhow", "dunce", @@ -5793,9 +5833,9 @@ dependencies = [ [[package]] name = "tauri-plugin-shell" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "371fb9aca2823990a2d0db7970573be5fdf07881fcaa2b835b29631feb84aec1" +checksum = "0ad7880c5586b6b2104be451e3d7fc0f3800c84bda69e9ba81c828f87cb34267" dependencies = [ "encoding_rs", "log", @@ -5878,9 +5918,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8f437293d6f5e5dce829250f4dbdce4e0b52905e297a6689cc2963eb53ac728" +checksum = "a1ef7363e7229ac8d04e8a5d405670dbd43dde8fc4bc3bc56105c35452d03784" dependencies = [ "dpi", "gtk", @@ -5897,9 +5937,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1431602bcc71f2f840ad623915c9842ecc32999b867c4a787d975a17a9625cc6" +checksum = "62fa2068e8498ad007b54d5773d03d57c3ff6dd96f8c8ce58beff44d0d5e0d30" dependencies = [ "gtk", "http", @@ -5923,9 +5963,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c38b0230d6880cf6dd07b6d7dd7789a0869f98ac12146e0d18d1c1049215a045" +checksum = "1fc65d6f5c54e56b66258948a6d9e47a82ea41f4b5a7612bfbdd1634c2913ed0" dependencies = [ "brotli", "cargo_metadata", @@ -5934,7 +5974,7 @@ dependencies = [ "glob", "html5ever", "infer", - "json-patch", + "json-patch 2.0.0", "kuchikiki", "log", "memchr", @@ -6014,7 +6054,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -6078,9 +6118,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" dependencies = [ "backtrace", "bytes", @@ -6213,7 +6253,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -6527,7 +6567,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", "wasm-bindgen-shared", ] @@ -6561,7 +6601,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6730,7 +6770,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -6877,7 +6917,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -6888,7 +6928,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -6899,7 +6939,7 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -6910,7 +6950,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -7214,9 +7254,9 @@ dependencies = [ [[package]] name = "wry" -version = "0.46.2" +version = "0.46.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa1c8c760041c64ce6be99f83d6cb55fe3fcd85a1ad46d32895f6e65cee87ba" +checksum = "cd5cdf57c66813d97601181349c63b96994b3074fc3d7a31a8cce96e968e3bbd" dependencies = [ "base64 0.22.1", "block2 0.5.1", @@ -7421,7 +7461,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 246fc25abc..8f24af8ebd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,7 @@ log = "0.4.22" cocoa = "0.25.0" tauri-plugin-shell = "2.0.1" tauri-plugin = { version = "2.0.1", features = ["build"] } +tauri-nspanel = { git = "https://github.com/ahkohd/tauri-nspanel", branch = "v2" } tauri-plugin-eco-window = { path = "./src-tauri/src/plugins/window" } tauri-plugin-eco-macos-permissions = { path = "./src-tauri/src/plugins/macos-permissions" } tauri-plugin-eco-mouse = { path = "./src-tauri/src/plugins/mouse" } diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index a2c0cfe042..9a323f0724 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -45,4 +45,4 @@ tauri-plugin-eco-window-state.workspace = true tauri-plugin-eco-autostart.workspace = true [target."cfg(target_os = \"macos\")".dependencies] -cocoa.workspace = true +tauri-nspanel.workspace = true diff --git a/src-tauri/src/core/setup/mac.rs b/src-tauri/src/core/setup/mac.rs index ccd623a9b3..28cbef3351 100644 --- a/src-tauri/src/core/setup/mac.rs +++ b/src-tauri/src/core/setup/mac.rs @@ -1,15 +1,50 @@ -use cocoa::appkit::{NSMainMenuWindowLevel, NSWindow}; -use cocoa::base::id; -use tauri::{ActivationPolicy, App, WebviewWindow}; +use tauri::{ActivationPolicy, App, Emitter, Manager, WebviewWindow}; +use tauri_nspanel::{ + cocoa::appkit::{NSMainMenuWindowLevel, NSWindowCollectionBehavior}, + panel_delegate, WebviewWindowExt, +}; + +#[allow(non_upper_case_globals)] +const NSWindowStyleMaskNonActivatingPanel: i32 = 1 << 7; +#[allow(non_upper_case_globals)] +const NSResizableWindowMask: i32 = 1 << 3; +const MACOS_PANEL_FOCUS: &str = "macos-panel-focus"; pub fn platform(app: &mut App, main_window: WebviewWindow, _preference_window: WebviewWindow) { + let app_handle = app.app_handle().clone(); + // 隐藏 mac 的程序坞图标:https://github.com/tauri-apps/tauri/issues/4852#issuecomment-1312716378 app.set_activation_policy(ActivationPolicy::Accessory); - unsafe { - let ns_window = main_window.ns_window().unwrap() as id; + // 把 ns_window 转换为 ns_panel + let panel = main_window.to_panel().unwrap(); + + // 让窗口在程序坞之上 + panel.set_level(NSMainMenuWindowLevel + 1); + + // 不抢占其它窗口的焦点和支持缩放 + panel.set_style_mask(NSWindowStyleMaskNonActivatingPanel | NSResizableWindowMask); + + // 定义面板的委托 (delegate),用于监听面板窗口的事件 + let delegate = panel_delegate!(EcoPanelDelegate { + window_did_become_key, + window_did_resign_key + }); + + delegate.set_listener(Box::new(move |delegate_name: String| { + match delegate_name.as_str() { + // 当窗口获得键盘焦点时调用 + "window_did_become_key" => { + app_handle.emit(MACOS_PANEL_FOCUS, true).unwrap(); + } + // 当窗口失去键盘焦点时调用 + "window_did_resign_key" => { + app_handle.emit(MACOS_PANEL_FOCUS, false).unwrap(); + } + _ => (), + } + })); - // 让窗口在程序坞和菜单栏之上 - ns_window.setLevel_(NSMainMenuWindowLevel as i64 + 1); - } + // 设置窗口的委托对象,用于处理窗口的事件。 + panel.set_delegate(delegate); } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 9ac26e89ee..ee7779205a 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -55,6 +55,8 @@ pub fn run() { .plugin(tauri_plugin_updater::Builder::new().build()) // 进程相关插件:https://github.com/tauri-apps/tauri-plugin-process .plugin(tauri_plugin_process::init()) + // macos window 转 ns_panel + .plugin(tauri_nspanel::init()) // 自定义的窗口管理插件 .plugin(tauri_plugin_eco_window::init()) // 自定义的 fs_extra 插件 diff --git a/src-tauri/src/plugins/paste/Cargo.toml b/src-tauri/src/plugins/paste/Cargo.toml index 6d40833f7d..63942d55fd 100644 --- a/src-tauri/src/plugins/paste/Cargo.toml +++ b/src-tauri/src/plugins/paste/Cargo.toml @@ -18,6 +18,7 @@ tauri-plugin.workspace = true [target."cfg(target_os = \"macos\")".dependencies] cocoa.workspace = true objc = "0.2.7" +tauri-nspanel.workspace = true [target."cfg(target_os = \"windows\")".dependencies] log.workspace = true diff --git a/src-tauri/src/plugins/paste/src/commands/mac.rs b/src-tauri/src/plugins/paste/src/commands/mac.rs index 73697cf7a1..6f4ce43e1b 100644 --- a/src-tauri/src/plugins/paste/src/commands/mac.rs +++ b/src-tauri/src/plugins/paste/src/commands/mac.rs @@ -1,14 +1,15 @@ -use cocoa::appkit::{NSApplicationActivationOptions, NSRunningApplication}; use cocoa::base::{id, nil}; use cocoa::foundation::{NSAutoreleasePool, NSString}; use objc::declare::ClassDecl; use objc::runtime::{Class, Object, Sel}; use objc::{msg_send, sel, sel_impl}; use std::ffi::CStr; +use std::process::Command; use std::sync::Mutex; use std::thread; -use tauri::command; -use tauri_plugin_eco_window::MAIN_WINDOW_TITLE; +use tauri::{command, AppHandle, Runtime}; +use tauri_nspanel::ManagerExt; +use tauri_plugin_eco_window::{MAIN_WINDOW_LABEL, MAIN_WINDOW_TITLE}; static PREVIOUS_WINDOW: Mutex> = Mutex::new(None); @@ -78,33 +79,21 @@ pub fn get_previous_window() -> Option { return PREVIOUS_WINDOW.lock().unwrap().clone(); } -// 聚焦前一个窗口 -fn focus_previous_window() { - let process_id = match get_previous_window() { - Some(process_id) => process_id, - None => return, - }; - - unsafe { - let app = NSRunningApplication::runningApplicationWithProcessIdentifier(nil, process_id); - - app.activateWithOptions_( - NSApplicationActivationOptions::NSApplicationActivateIgnoringOtherApps, - ); - } -} - // 粘贴 #[command] -pub async fn paste() { - focus_previous_window(); +pub async fn paste(app_handle: AppHandle) { + let handle = app_handle.clone(); + + let _ = app_handle.run_on_main_thread(move || { + let panel = handle.get_webview_panel(MAIN_WINDOW_LABEL).unwrap(); + + panel.resign_key_window(); + }); - let script = - r#"osascript -e 'tell application "System Events" to keystroke "v" using command down'"#; + let script = r#"tell application "System Events" to keystroke "v" using command down"#; - std::process::Command::new("sh") - .arg("-c") - .arg(script) + Command::new("osascript") + .args(["-e", script]) .output() .expect("failed to execute process"); } diff --git a/src-tauri/src/plugins/window/Cargo.toml b/src-tauri/src/plugins/window/Cargo.toml index faacc69819..f748705b18 100644 --- a/src-tauri/src/plugins/window/Cargo.toml +++ b/src-tauri/src/plugins/window/Cargo.toml @@ -13,3 +13,6 @@ serde.workspace = true [build-dependencies] tauri-plugin.workspace = true + +[target."cfg(target_os = \"macos\")".dependencies] +tauri-nspanel.workspace = true \ No newline at end of file diff --git a/src-tauri/src/plugins/window/src/commands.rs b/src-tauri/src/plugins/window/src/commands.rs index 8622104c13..0507c11796 100644 --- a/src-tauri/src/plugins/window/src/commands.rs +++ b/src-tauri/src/plugins/window/src/commands.rs @@ -1,4 +1,5 @@ use tauri::{async_runtime::spawn, command, AppHandle, Manager, Runtime, WebviewWindow}; +use tauri_nspanel::ManagerExt; // 主窗口的label pub static MAIN_WINDOW_LABEL: &str = "main"; @@ -9,16 +10,36 @@ pub static MAIN_WINDOW_TITLE: &str = "EcoPaste"; // 显示窗口 #[command] -pub async fn show_window(window: WebviewWindow) { - window.show().unwrap(); - window.unminimize().unwrap(); - window.set_focus().unwrap(); +pub async fn show_window(app_handle: AppHandle, window: WebviewWindow) { + if cfg!(target_os = "macos") && window.label() == MAIN_WINDOW_LABEL { + let handle = app_handle.clone(); + + let _ = app_handle.run_on_main_thread(move || { + let panel = handle.get_webview_panel(MAIN_WINDOW_LABEL).unwrap(); + + panel.show(); + }); + } else { + window.show().unwrap(); + window.unminimize().unwrap(); + window.set_focus().unwrap(); + } } // 隐藏窗口 #[command] -pub async fn hide_window(window: WebviewWindow) { - window.hide().unwrap(); +pub async fn hide_window(app_handle: AppHandle, window: WebviewWindow) { + if cfg!(target_os = "macos") && window.label() == MAIN_WINDOW_LABEL { + let handle = app_handle.clone(); + + let _ = app_handle.run_on_main_thread(move || { + let panel = handle.get_webview_panel(MAIN_WINDOW_LABEL).unwrap(); + + panel.order_out(None); + }); + } else { + window.hide().unwrap(); + } } // 显示任务栏图标 @@ -44,20 +65,24 @@ pub fn show_taskbar_icon( // 显示主窗口 pub fn show_main_window(app_handle: &AppHandle) { + let app_handle_clone = app_handle.clone(); + let window = app_handle.get_webview_window(MAIN_WINDOW_LABEL).unwrap(); spawn(async move { - show_window(window).await; + show_window(app_handle_clone, window).await; }); } // 显示偏好设置窗口 pub fn show_preference_window(app_handle: &AppHandle) { + let app_handle_clone = app_handle.clone(); + let window = app_handle .get_webview_window(PREFERENCE_WINDOW_LABEL) .unwrap(); spawn(async move { - show_window(window).await; + show_window(app_handle_clone, window).await; }); } diff --git a/src/constants/index.ts b/src/constants/index.ts index 1b672f2efe..580d8263a4 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -30,6 +30,7 @@ export const LISTEN_KEY = { CLIPBOARD_ITEM_SELECT_NEXT: "clipboard-item-select-next", CLOSE_DATABASE: "close-database", TOGGLE_LISTEN_CLIPBOARD: "toggle-listen-clipboard", + MACOS_PANEL_FOCUS: "macos-panel-focus", }; export const WINDOW_PLUGIN = { diff --git a/src/hooks/useFocus.ts b/src/hooks/useFocus.ts index 0c8925445d..0ed2bad7d7 100644 --- a/src/hooks/useFocus.ts +++ b/src/hooks/useFocus.ts @@ -1,3 +1,4 @@ +import { listen } from "@tauri-apps/api/event"; import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow"; interface Props { @@ -5,15 +6,9 @@ interface Props { onBlur?: () => void; } -interface State { - unlisten?: () => void; -} - export const useFocus = (props: Props) => { const { onFocus, onBlur } = props; - const state = useReactive({}); - const { run } = useDebounceFn( ({ payload }) => { if (payload) { @@ -28,10 +23,8 @@ export const useFocus = (props: Props) => { useMount(async () => { const appWindow = getCurrentWebviewWindow(); - state.unlisten = await appWindow.onFocusChanged(run); - }); + appWindow.onFocusChanged(run); - useUnmount(() => { - state.unlisten?.(); + listen(LISTEN_KEY.MACOS_PANEL_FOCUS, run); }); };