diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index f905eb2..a58d308 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,4 +1,4 @@ -# These are supported funding model platforms - -github: Kethku -ko_fi: keithsimmons +# These are supported funding model platforms + +github: Kethku +ko_fi: keithsimmons \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2d044aa..5daf9a5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,7 +10,21 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Check formatting + - name: Install Nightly Toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + components: rustfmt, clippy + override: true + + - name: Install Utilities + run: | + cargo install cargo2junit + + - uses: Swatinem/rust-cache@v1 + + - name: Check Formatting run: | cargo fmt --all -- --check @@ -27,7 +41,13 @@ jobs: NEOVIM_BIN: "C:/tools/neovim/Neovim/bin/nvim.exe" RUST_BACKTRACE: full run: | - cargo test + cargo test -- -- -Z unstable-options --format json | cargo2junit > results.xml + + - name: Publish Test Results + uses: EnricoMi/publish-unit-test-result-action/composite@v1 + if: always() + with: + files: results.xml - name: Build Release run: | @@ -45,17 +65,26 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Install Vulkan SDK - run: brew install apenngrace/vulkan/vulkan-sdk + - name: Install Nightly Toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + components: rustfmt, clippy + override: true - - name: Check formatting + - name: Install Utilities + run: | + cargo install cargo2junit + + - uses: Swatinem/rust-cache@v1 + + - name: Check Formatting run: | - rustup component add rustfmt --toolchain stable-x86_64-apple-darwin cargo fmt --all -- --check - name: Lint with Clippy run: | - rustup component add clippy --toolchain stable-x86_64-apple-darwin cargo clippy --all -- -D warnings - name: Uninstall Conflicting LLVM @@ -67,8 +96,16 @@ jobs: brew install neovim - name: Test + env: + RUST_BACKTRACE: full run: | - RUST_BACKTRACE=full cargo test + cargo test -- -- -Z unstable-options --format json | cargo2junit > results.xml + + - name: Publish Test Results + uses: EnricoMi/publish-unit-test-result-action/composite@v1 + if: always() + with: + files: results.xml - name: Build Release run: | @@ -76,18 +113,6 @@ jobs: cargo install cargo-bundle cargo bundle --release - - name: Update Bundle - run: | - cd target/release/bundle/osx/Neovide.app/Contents - mkdir Frameworks - cp /usr/local/lib/libvulkan.dylib ./Frameworks/ - cp /usr/local/lib/libMoltenVK.dylib ./Frameworks/ - mkdir -p Resources/vulkan - cp -r /usr/local/share/vulkan/icd.d ./Resources/vulkan/ - jq '.ICD.library_path = "../../../Frameworks/libMoltenVK.dylib"' ./Resources/vulkan/icd.d/MoltenVK_icd.json > MoltenVK_icd.json - mv MoltenVK_icd.json ./Resources/vulkan/icd.d/ - install_name_tool -add_rpath "@executable_path/../Frameworks" ./MacOS/neovide - - name: Create .dmg file run: | hdiutil create Neovide-uncompressed.dmg -volname "Neovide" -srcfolder target/release/bundle/osx @@ -105,18 +130,25 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Install Vulkan SDK - run: | - curl -sL "http://packages.lunarg.com/lunarg-signing-key-pub.asc" | sudo apt-key add - - sudo curl -sLo "/etc/apt/sources.list.d/lunarg-vulkan-1.2.131-bionic.list" "http://packages.lunarg.com/vulkan/1.2.131/lunarg-vulkan-1.2.131-bionic.list" - sudo apt-get update -y --ignore-missing - sudo apt-get install -y vulkan-sdk + - name: Install Nightly Toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + components: rustfmt, clippy + override: true + + - name: Install Utilities + run: | + cargo install cargo2junit + + - uses: Swatinem/rust-cache@v1 - - name: Install dependencies + - name: Install Dependencies run: | - sudo apt-get install -y curl gnupg ca-certificates git gcc-multilib g++-multilib cmake libssl-dev pkg-config libfreetype6-dev libasound2-dev libexpat1-dev libxcb-composite0-dev libbz2-dev freeglut3-dev libxi-dev libsdl2-dev + sudo apt-get install -y curl gnupg ca-certificates git gcc-multilib g++-multilib cmake libssl-dev pkg-config libfreetype6-dev libasound2-dev libexpat1-dev libxcb-composite0-dev libbz2-dev freeglut3-dev libxi-dev - - name: Check formatting + - name: Check Formatting run: | cargo fmt --all -- --check @@ -129,8 +161,16 @@ jobs: sudo apt-get install -y neovim - name: Test + env: + RUST_BACKTRACE: full run: | - RUST_BACKTRACE=full cargo test + cargo test -- -- -Z unstable-options --format json | cargo2junit > results.xml + + - name: Publish Test Results + uses: EnricoMi/publish-unit-test-result-action@v1 + if: always() + with: + files: results.xml - name: Build Release run: | @@ -140,3 +180,62 @@ jobs: with: name: neovide-linux path: ./target/release/neovide + + build-m1: + + runs-on: self-hosted + + steps: + - uses: actions/checkout@v2 + + - name: Install Nightly Toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + components: rustfmt, clippy + override: true + + - name: Install Utilities + run: | + cargo install cargo2junit + + - name: Check Formatting + run: | + cargo fmt --all -- --check + + - name: Lint with Clippy + run: | + cargo clippy --all -- -D warnings + + - name: Install Neovim + run: | + brew install neovim + + - name: Test + env: + RUST_BACKTRACE: full + run: | + cargo test -- -- -Z unstable-options --format json | cargo2junit > results.xml + + - name: Publish Test Results + uses: EnricoMi/publish-unit-test-result-action/composite@v1 + if: always() + with: + files: results.xml + + - name: Build Release + run: | + cargo build --release + cargo install cargo-bundle + cargo bundle --release + + - name: Create .dmg file + run: | + hdiutil create Neovide-uncompressed.dmg -volname "Neovide" -srcfolder target/release/bundle/osx + hdiutil convert Neovide-uncompressed.dmg -format UDZO -o Neovide.dmg + + - uses: actions/upload-artifact@v1 + with: + name: Neovide-m1.dmg + path: ./Neovide.dmg diff --git a/.github/workflows/snap.yaml b/.github/workflows/snap.yaml new file mode 100644 index 0000000..dab110d --- /dev/null +++ b/.github/workflows/snap.yaml @@ -0,0 +1,26 @@ +name: Snap + +on: [push] + +jobs: + snap: + runs-on: ubuntu-18.04 + + steps: + - name: Check out Git repository + uses: actions/checkout@v2 + + - uses: snapcore/action-build@v1 + env: + SNAPCRAFT_BUILD_ENVIRONMENT_MEMORY: 6G + id: snapcraft + + - uses: actions/upload-artifact@v2 + with: + name: snap + path: ${{ steps.snapcraft.outputs.snap }} + + - uses: snapcore/action-publish@v1 + with: + store_login: ${{ secrets.SNAPCRAFT_TOKEN }} + snap: ${{ steps.snapcraft.outputs.snap }} diff --git a/.vscode/launch.json b/.vscode/launch.json index 82015db..6abcc43 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,31 +1,15 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "(Mac/Linux) Debug", - "type": "lldb", - "request": "launch", - "program": "${workspaceRoot}/target/debug/neovide", - "args": [], - "cwd": "${workspaceRoot}", - "env": { - "RUST_LOG": "info", - "RUST_BACKTRACE": "1" - } - }, - { - "name": "(Windows) Debug", - "type": "cppvsdbg", - "request": "launch", - "program": "${workspaceRoot}/target/debug/neovide.exe", - "args": [], - "stopAtEntry": false, - "cwd": "${workspaceRoot}", - "environment": [], - "externalConsole": true - }, - ] -} \ No newline at end of file +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch", + "type": "lldb", + "request": "launch", + "program": "${workspaceFolder}/target/debug/neovide.exe", + "args": [], + }, + ] +} diff --git a/Cargo.lock b/Cargo.lock index 41b4cee..bc1cf57 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,9 +8,9 @@ checksum = "d9fe5e32de01730eb1f6b7f5b51c17e03e2325bf40a74f754f04f130043affff" [[package]] name = "adler" -version = "0.2.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "adler32" @@ -29,27 +29,13 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.15" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" dependencies = [ "memchr", ] -[[package]] -name = "andrew" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7f09f89872c2b6b29e319377b1fbe91c6f5947df19a25596e121cf19a7b35e" -dependencies = [ - "bitflags", - "line_drawing", - "rusttype 0.7.9", - "walkdir", - "xdg", - "xml-rs", -] - [[package]] name = "andrew" version = "0.3.1" @@ -57,17 +43,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c4afb09dd642feec8408e33f92f3ffc4052946f6b20f32fb99c1f58cd4fa7cf" dependencies = [ "bitflags", - "rusttype 0.9.2", + "rusttype", "walkdir", "xdg", "xml-rs", ] [[package]] -name = "android_log-sys" -version = "0.1.2" +name = "android_glue" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8052e2d8aabbb8d556d6abbcce2a22b9590996c5f849b9c7ce4544a2e3b984e" +checksum = "000444226fcff248f2bc4c7625be32c63caccfecc2723a2b9f78a7487a49c407" [[package]] name = "ansi_term" @@ -78,62 +64,15 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "anyhow" -version = "1.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afddf7f520a80dbf76e6f50a35bca42a2331ef227a28b3b6dc5c2e2338d114b1" - -[[package]] -name = "approx" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0e60b75072ecd4168020818c0107f2857bb6c4e64252d8d3983f6263b40a5c3" -dependencies = [ - "num-traits", -] - -[[package]] -name = "arrayref" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - -[[package]] -name = "ash" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c69a8137596e84c22d57f3da1b5de1d4230b1742a710091c85f4d7ce50f00f38" -dependencies = [ - "libloading 0.6.7", -] - -[[package]] -name = "ash-window" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905c4ca25f752e7ab3c3e8f2882625f876e4c3ea5feffbc83f81d697e043afd6" -dependencies = [ - "ash", - "raw-window-handle", - "raw-window-metal", -] - [[package]] name = "async-trait" -version = "0.1.42" +version = "0.1.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3a45e77e34375a7923b1e8febb049bb011f064714a8e17a1a616fef01da13d" +checksum = "0b98e84bbb4cbcdd97da190ba0c58a1bb0de2c1fdf67d159e192ed766aeca722" dependencies = [ - "proc-macro2 1.0.24", - "quote 1.0.8", - "syn 1.0.58", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.72", ] [[package]] @@ -167,13 +106,12 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "bindgen" -version = "0.54.0" +version = "0.58.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c0bb6167449588ff70803f4127f0684f9063097eca5016f37eb52b92c2cf36" +checksum = "0f8523b410d7187a43085e7e064416ea32ded16bd0a4e6fc025e21616d01258f" dependencies = [ "bitflags", "cexpr", - "cfg-if 0.1.10", "clang-sys", "clap", "env_logger", @@ -181,8 +119,8 @@ dependencies = [ "lazycell", "log", "peeking_take_while", - "proc-macro2 1.0.24", - "quote 1.0.8", + "proc-macro2 1.0.26", + "quote 1.0.9", "regex", "rustc-hash", "shlex", @@ -195,28 +133,23 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -[[package]] -name = "blake2b_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - [[package]] name = "block" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" +[[package]] +name = "bumpalo" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe" + [[package]] name = "byteorder" -version = "1.4.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" @@ -234,17 +167,6 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" -[[package]] -name = "calloop" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aa2097be53a00de9e8fc349fea6d76221f398f5c4fa550d420669906962d160" -dependencies = [ - "mio", - "mio-extras", - "nix 0.14.1", -] - [[package]] name = "calloop" version = "0.6.5" @@ -255,17 +177,11 @@ dependencies = [ "nix 0.18.0", ] -[[package]] -name = "cargo-husky" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b02b629252fe8ef6460461409564e2c21d0c8e77e0944f3d189ff06c4e932ad" - [[package]] name = "cc" -version = "1.0.66" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48" +checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" [[package]] name = "cexpr" @@ -288,6 +204,15 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + [[package]] name = "chrono" version = "0.4.19" @@ -301,15 +226,21 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "chunked_transfer" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff857943da45f546682664a79488be82e69e43c1a7a2307679ab9afb3a66d2e" + [[package]] name = "clang-sys" -version = "0.29.3" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6837df1d5cba2397b835c8530f51723267e16abbf83892e9e5af4f0e5dd10a" +checksum = "fa785e9017cb8e8c8045e3f096b7d1ebc4d7337cceccdca8d678a27f788ac133" dependencies = [ "glob", "libc", - "libloading 0.5.2", + "libloading 0.6.7", ] [[package]] @@ -336,30 +267,6 @@ dependencies = [ "bitflags", ] -[[package]] -name = "cmake" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb6210b637171dfba4cda12e579ac6dc73f5165ad56133e5d72ef3131f320855" -dependencies = [ - "cc", -] - -[[package]] -name = "cocoa" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c49e86fc36d5704151f5996b7b3795385f50ce09e3be0f47a0cfde869681cf8" -dependencies = [ - "bitflags", - "block", - "core-foundation 0.7.0", - "core-graphics 0.19.2", - "foreign-types", - "libc", - "objc", -] - [[package]] name = "cocoa" version = "0.23.0" @@ -435,18 +342,6 @@ dependencies = [ "tiny-keccak", ] -[[package]] -name = "const_fn" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6" - -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - [[package]] name = "core-foundation" version = "0.7.0" @@ -516,18 +411,6 @@ dependencies = [ "libc", ] -[[package]] -name = "core-text" -version = "19.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c7f46e8b820fd5f4b28528104b28b0a91cbe9e9c5bde8017087fb44bc93a60" -dependencies = [ - "core-foundation 0.9.1", - "core-graphics 0.22.2", - "foreign-types", - "libc", -] - [[package]] name = "core-video-sys" version = "0.1.4" @@ -576,12 +459,12 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils 0.8.1", + "crossbeam-utils 0.8.4", ] [[package]] @@ -602,8 +485,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9" dependencies = [ "cfg-if 1.0.0", - "crossbeam-epoch 0.9.1", - "crossbeam-utils 0.8.1", + "crossbeam-epoch 0.9.4", + "crossbeam-utils 0.8.4", ] [[package]] @@ -623,15 +506,14 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.1" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d" +checksum = "52fb27eab85b17fbb9f6fd667089e07d6a2eb8743d02639ee7f6a7a7729c9c94" dependencies = [ "cfg-if 1.0.0", - "const_fn", - "crossbeam-utils 0.8.1", + "crossbeam-utils 0.8.4", "lazy_static", - "memoffset 0.6.1", + "memoffset 0.6.3", "scopeguard", ] @@ -659,9 +541,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" +checksum = "4feb231f0d4d6af81aed15928e58ecf5816aa62a2393e2c82f46973e92a9a278" dependencies = [ "autocfg 1.0.1", "cfg-if 1.0.0", @@ -676,7 +558,7 @@ checksum = "8434f61eb40fc72030b18a370f7a06b428d27de66b0281977967216312b14dc7" dependencies = [ "async-trait", "crossbeam", - "futures 0.3.12", + "futures 0.3.15", ] [[package]] @@ -685,36 +567,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" -[[package]] -name = "curl" -version = "0.4.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e268162af1a5fe89917ae25ba3b0a77c8da752bdc58e7dbb4f15b91fbd33756e" -dependencies = [ - "curl-sys", - "libc", - "openssl-probe", - "openssl-sys", - "schannel", - "socket2", - "winapi 0.3.9", -] - -[[package]] -name = "curl-sys" -version = "0.4.39+curl-7.74.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07a8ce861e7b68a0b394e814d7ee9f1b2750ff8bd10372c6ad3bacc10e86f874" -dependencies = [ - "cc", - "libc", - "libz-sys", - "openssl-sys", - "pkg-config", - "vcpkg", - "winapi 0.3.9", -] - [[package]] name = "darling" version = "0.10.2" @@ -733,10 +585,10 @@ checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.24", - "quote 1.0.8", + "proc-macro2 1.0.26", + "quote 1.0.9", "strsim 0.9.3", - "syn 1.0.58", + "syn 1.0.72", ] [[package]] @@ -746,8 +598,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" dependencies = [ "darling_core", - "quote 1.0.8", - "syn 1.0.58", + "quote 1.0.9", + "syn 1.0.72", ] [[package]] @@ -762,24 +614,24 @@ dependencies = [ [[package]] name = "derivative" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaed5874effa6cde088c644ddcdcb4ffd1511391c5be4fdd7a5ccd02c7e4a183" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2 1.0.24", - "quote 1.0.8", - "syn 1.0.58", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.72", ] [[package]] name = "derive-new" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71f31892cd5c62e414316f2963c5689242c43d8e7bbcaaeca97e5e28c95d91d9" +checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535" dependencies = [ - "proc-macro2 1.0.24", - "quote 1.0.8", - "syn 1.0.58", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.72", ] [[package]] @@ -800,9 +652,9 @@ dependencies = [ [[package]] name = "dirs-sys" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e93d7f5705de3e49895a2b5e0b8855a1c27f080192ae9c32a6432d50741a57a" +checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" dependencies = [ "libc", "redox_users", @@ -824,6 +676,15 @@ dependencies = [ "libloading 0.6.7", ] +[[package]] +name = "dlib" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794" +dependencies = [ + "libloading 0.7.0", +] + [[package]] name = "downcast" version = "0.10.0" @@ -836,38 +697,17 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" -[[package]] -name = "dwrote" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439a1c2ba5611ad3ed731280541d36d2e9c4ac5e7fb818a27b604bdc5a6aa65b" -dependencies = [ - "lazy_static", - "libc", - "winapi 0.3.9", - "wio", -] - [[package]] name = "either" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" -[[package]] -name = "encoding_rs" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "801bbab217d7f79c0062f4f7205b5d4427c6d1a7bd7aafdd1475f7c59d62b283" -dependencies = [ - "cfg-if 1.0.0", -] - [[package]] name = "env_logger" -version = "0.7.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +checksum = "17392a012ea30ef05a610aa97dfb49496e71c9f676b27879922ea5bdf60d9d3f" dependencies = [ "atty", "humantime", @@ -885,33 +725,23 @@ dependencies = [ "num-traits", ] -[[package]] -name = "expat-sys" -version = "2.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658f19728920138342f68408b7cf7644d90d4784353d8ebc32e7e8663dbe45fa" -dependencies = [ - "cmake", - "pkg-config", -] - [[package]] name = "filetime" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c122a393ea57648015bf06fbd3d372378992e86b9ff5a7a497b076a28c79efe" +checksum = "1d34cfa13a63ae058bfa601fe9e313bbdb3746427c1459185464ce0fcf62e1e8" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall", + "redox_syscall 0.2.8", "winapi 0.3.9", ] [[package]] name = "flate2" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7411863d55df97a419aa64cb4d2f167103ea9d767e2c54a1868b7ac3f6b47129" +checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0" dependencies = [ "cfg-if 1.0.0", "crc32fast", @@ -921,14 +751,14 @@ dependencies = [ [[package]] name = "flexi_logger" -version = "0.14.8" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "515fb7f6541dafe542c87c12a7ab6a52190cccb6c348b5951ef62d9978189ae8" +checksum = "33ab94b6ac8eb69f1496a6993f26f785b5fd6d99b7416023eb2a6175c0b242b1" dependencies = [ "chrono", "glob", "log", - "regex", + "thiserror", ] [[package]] @@ -940,43 +770,12 @@ dependencies = [ "num-traits", ] -[[package]] -name = "float-ord" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bad48618fdb549078c333a7a8528acb57af271d0433bdecd523eb620628364e" - [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "font-kit" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f9042cb45150fb2b2a012fc03d0f1d2071f18e90397b9d2a5ec8ade8464bf20" -dependencies = [ - "bitflags", - "byteorder", - "core-foundation 0.9.1", - "core-graphics 0.22.2", - "core-text", - "dirs", - "dwrote", - "float-ord", - "freetype", - "lazy_static", - "libc", - "log", - "pathfinder_geometry", - "pathfinder_simd", - "servo-fontconfig", - "walkdir", - "winapi 0.3.9", -] - [[package]] name = "foreign-types" version = "0.3.2" @@ -993,31 +792,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] -name = "fragile" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69a039c3498dc930fe810151a34ba0c1c70b02b8625035592e74432f678591f2" - -[[package]] -name = "freetype" -version = "0.7.0" +name = "form_urlencoded" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee38378a9e3db1cc693b4f88d166ae375338a0ff75cb8263e1c601d51f35dc6" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" dependencies = [ - "freetype-sys", - "libc", + "matches", + "percent-encoding", ] [[package]] -name = "freetype-sys" -version = "0.13.1" +name = "fragile" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a37d4011c0cc628dfa766fcc195454f4b068d7afdc2adfd28861191d866e731a" -dependencies = [ - "cmake", - "libc", - "pkg-config", -] +checksum = "69a039c3498dc930fe810151a34ba0c1c70b02b8625035592e74432f678591f2" [[package]] name = "fuchsia-zircon" @@ -1037,15 +825,15 @@ checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" [[package]] name = "futures" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7e4c2612746b0df8fed4ce0c69156021b704c9aefa360311c04e6e9e002eed" +checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" [[package]] name = "futures" -version = "0.3.12" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9052a1a50244d8d5aa9bf55cbc2fb6f357c86cc52e46c62ed390a7180cf150" +checksum = "0e7e43a803dae2fa37c1f6a8fe121e1f7bf9548b4dfc0522a42f34145dadfc27" dependencies = [ "futures-channel", "futures-core", @@ -1058,9 +846,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.12" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d31b7ec7efab6eefc7c57233bb10b847986139d88cc2f5a02a1ae6871a1846" +checksum = "e682a68b29a882df0545c143dc3646daefe80ba479bcdede94d5a703de2871e2" dependencies = [ "futures-core", "futures-sink", @@ -1068,15 +856,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.12" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e5145dde8da7d1b3892dad07a9c98fc04bc39892b1ecc9692cf53e2b780a65" +checksum = "0402f765d8a89a26043b889b26ce3c4679d268fa6bb22cd7c6aad98340e179d1" [[package]] name = "futures-executor" -version = "0.3.12" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9e59fdc009a4b3096bf94f740a0f2424c082521f20a9b08c5c07c48d90fd9b9" +checksum = "badaa6a909fac9e7236d0620a2f57f7664640c56575b71a7552fbd68deafab79" dependencies = [ "futures-core", "futures-task", @@ -1085,44 +873,43 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.12" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28be053525281ad8259d47e4de5de657b25e7bac113458555bb4b70bc6870500" +checksum = "acc499defb3b348f8d8f3f66415835a9131856ff7714bf10dadfc4ec4bdb29a1" [[package]] name = "futures-macro" -version = "0.3.12" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c287d25add322d9f9abdcdc5927ca398917996600182178774032e9f8258fedd" +checksum = "a4c40298486cdf52cc00cd6d6987892ba502c7656a16a4192a9992b1ccedd121" dependencies = [ + "autocfg 1.0.1", "proc-macro-hack", - "proc-macro2 1.0.24", - "quote 1.0.8", - "syn 1.0.58", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.72", ] [[package]] name = "futures-sink" -version = "0.3.12" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf5c69029bda2e743fddd0582d1083951d65cc9539aebf8812f36c3491342d6" +checksum = "a57bead0ceff0d6dde8f465ecd96c9338121bb7717d3e7b108059531870c4282" [[package]] name = "futures-task" -version = "0.3.12" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13de07eb8ea81ae445aca7b69f5f7bf15d7bf4912d8ca37d6645c77ae8a58d86" -dependencies = [ - "once_cell", -] +checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae" [[package]] name = "futures-util" -version = "0.3.12" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632a8cd0f2a4b3fdea1657f08bde063848c3bd00f9bbf6e256b8be78802e624b" +checksum = "feb5c238d27e2bf94ffdfd27b2c29e3df4a68c4193bb6427384259e2bf191967" dependencies = [ - "futures 0.1.30", + "autocfg 1.0.1", + "futures 0.1.31", "futures-channel", "futures-core", "futures-io", @@ -1130,7 +917,7 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.6", "pin-utils", "proc-macro-hack", "proc-macro-nested", @@ -1157,7 +944,7 @@ checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi 0.10.1+wasi-snapshot-preview1", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] @@ -1171,56 +958,125 @@ dependencies = [ ] [[package]] -name = "glob" -version = "0.3.0" +name = "gl" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" +checksum = "a94edab108827d67608095e269cf862e60d920f144a5026d3dbcfd8b877fb404" +dependencies = [ + "gl_generator", +] [[package]] -name = "harfbuzz" -version = "0.4.0" +name = "gl_generator" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "776caa9519beb53f697d578b6777eebd1262265c84ae797620b7f8f9b3648d91" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" dependencies = [ - "harfbuzz-sys", + "khronos_api", + "log", + "xml-rs", ] [[package]] -name = "harfbuzz-sys" -version = "0.5.0" +name = "glob" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf8c27ca13930dc4ffe474880040fe9e0f03c2121600dc9c95423624cab3e467" -dependencies = [ - "cc", - "core-graphics 0.22.2", - "core-text", - "foreign-types", - "freetype", - "pkg-config", -] +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] -name = "hashbrown" -version = "0.6.3" +name = "glutin" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6073d0ca812575946eb5f35ff68dbe519907b25c42530389ff946dc84c6ead" +checksum = "1ae1cbb9176b9151c4ce03f012e3cd1c6c18c4be79edeaeb3d99f5d8085c5fa3" dependencies = [ - "ahash", - "autocfg 0.1.7", + "android_glue", + "cgl", + "cocoa 0.23.0", + "core-foundation 0.9.1", + "glutin_egl_sys", + "glutin_emscripten_sys", + "glutin_gles2_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "lazy_static", + "libloading 0.6.7", + "log", + "objc", + "osmesa-sys", + "parking_lot 0.11.1", + "wayland-client", + "wayland-egl", + "winapi 0.3.9", + "winit", ] [[package]] -name = "heck" -version = "0.3.2" +name = "glutin_egl_sys" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" +checksum = "2abb6aa55523480c4adc5a56bbaa249992e2dddb2fc63dc96e04a3355364c211" dependencies = [ - "unicode-segmentation", + "gl_generator", + "winapi 0.3.9", ] [[package]] -name = "hermit-abi" -version = "0.1.18" +name = "glutin_emscripten_sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80de4146df76e8a6c32b03007bc764ff3249dcaeb4f675d68a06caf1bac363f1" + +[[package]] +name = "glutin_gles2_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094e708b730a7c8a1954f4f8a31880af00eb8a1c5b5bf85d28a0a3c6d69103" +dependencies = [ + "gl_generator", + "objc", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e393c8fc02b807459410429150e9c4faffdb312d59b8c038566173c81991351" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5951a1569dbab865c6f2a863efafff193a93caf05538d193e9e3816d21696" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "hashbrown" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e6073d0ca812575946eb5f35ff68dbe519907b25c42530389ff946dc84c6ead" +dependencies = [ + "ahash", + "autocfg 0.1.7", +] + +[[package]] +name = "heck" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" dependencies = [ @@ -1229,12 +1085,9 @@ dependencies = [ [[package]] name = "humantime" -version = "1.3.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error", -] +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "ident_case" @@ -1242,6 +1095,17 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "image" version = "0.22.5" @@ -1300,14 +1164,22 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jpeg-decoder" -version = "0.1.20" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc797adac5f083b8ff0ca6f6294a999393d76e197c36488e2ef732c4715f6fa3" +checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" dependencies = [ - "byteorder", "rayon", ] +[[package]] +name = "js-sys" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "kernel32-sys" version = "0.2.2" @@ -1318,6 +1190,12 @@ dependencies = [ "winapi-build", ] +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + [[package]] name = "lazy_static" version = "1.4.0" @@ -1332,19 +1210,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89203f3fba0a3795506acaad8ebce3c80c0af93f994d5a1d7a0b1eeb23271929" - -[[package]] -name = "libloading" -version = "0.5.2" +version = "0.2.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" -dependencies = [ - "cc", - "winapi 0.3.9", -] +checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e" [[package]] name = "libloading" @@ -1357,24 +1225,13 @@ dependencies = [ ] [[package]] -name = "libz-sys" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "602113192b08db8f38796c4e85c39e960c145965140e918018bcde1952429655" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "line_drawing" +name = "libloading" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc7ad3d82c845bdb5dde34ffdcc7a5fb4d2996e1e1ee0f19c33bc80e15196b9" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" dependencies = [ - "num-traits", + "cfg-if 1.0.0", + "winapi 0.3.9", ] [[package]] @@ -1388,20 +1245,20 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" +checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb" dependencies = [ "scopeguard", ] [[package]] name = "log" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf3805d4480bb5b86070dcfeb9e2cb2ebc148adb753c5cca5f884d1d65a42b2" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", ] [[package]] @@ -1428,6 +1285,12 @@ dependencies = [ "libc", ] +[[package]] +name = "matches" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" + [[package]] name = "maybe-uninit" version = "2.0.0" @@ -1436,19 +1299,9 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" -version = "2.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" - -[[package]] -name = "memmap" -version = "0.7.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" -dependencies = [ - "libc", - "winapi 0.3.9", -] +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" [[package]] name = "memmap2" @@ -1470,18 +1323,18 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87" +checksum = "f83fb6581e8ed1f85fd45c116db8405483899489e38406156c25eb743554361d" dependencies = [ "autocfg 1.0.1", ] [[package]] name = "miniz_oxide" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" dependencies = [ "adler", "autocfg 1.0.1", @@ -1526,7 +1379,7 @@ checksum = "0840c1c50fd55e521b247f949c241c9997709f23bd7f023b9762cd561e935656" dependencies = [ "log", "mio", - "miow 0.3.6", + "miow 0.3.7", "winapi 0.3.9", ] @@ -1555,11 +1408,10 @@ dependencies = [ [[package]] name = "miow" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a33c1b55807fbed163481b5ba66db4b2fa6cde694a5027be10fb724206c5897" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" dependencies = [ - "socket2", "winapi 0.3.9", ] @@ -1585,20 +1437,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a673cb441f78cd9af4f5919c28576a3cc325fb6b54e42f7047dacce3c718c17b" dependencies = [ "cfg-if 0.1.10", - "proc-macro2 1.0.24", - "quote 1.0.8", - "syn 1.0.58", -] - -[[package]] -name = "ndk" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a356cafe20aee088789830bfea3a61336e84ded9e545e00d3869ce95dcb80c" -dependencies = [ - "jni-sys", - "ndk-sys 0.1.0", - "num_enum", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.72", ] [[package]] @@ -1608,25 +1449,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5eb167c1febed0a496639034d0c76b3b74263636045db5489eee52143c246e73" dependencies = [ "jni-sys", - "ndk-sys 0.2.1", + "ndk-sys", "num_enum", "thiserror", ] -[[package]] -name = "ndk-glue" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1730ee2e3de41c3321160a6da815f008c4006d71b095880ea50e17cf52332b8" -dependencies = [ - "android_log-sys", - "lazy_static", - "libc", - "log", - "ndk 0.1.0", - "ndk-sys 0.1.0", -] - [[package]] name = "ndk-glue" version = "0.2.1" @@ -1636,9 +1463,9 @@ dependencies = [ "lazy_static", "libc", "log", - "ndk 0.2.1", + "ndk", "ndk-macro", - "ndk-sys 0.2.1", + "ndk-sys", ] [[package]] @@ -1649,17 +1476,11 @@ checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d" dependencies = [ "darling", "proc-macro-crate", - "proc-macro2 1.0.24", - "quote 1.0.8", - "syn 1.0.58", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.72", ] -[[package]] -name = "ndk-sys" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2820aca934aba5ed91c79acc72b6a44048ceacc5d36c035ed4e051f12d887d" - [[package]] name = "ndk-sys" version = "0.2.1" @@ -1670,17 +1491,17 @@ checksum = "c44922cb3dbb1c70b5e5f443d63b64363a898564d739ba5198e3a9138442868d" name = "neovide" version = "0.7.0" dependencies = [ - "anyhow", "async-trait", - "cargo-husky", "cfg-if 0.1.10", + "clap", "crossfire", "derive-new", "dirs", "euclid", "flexi_logger", - "font-kit", - "futures 0.3.12", + "futures 0.3.15", + "gl", + "glutin", "image", "lazy_static", "log", @@ -1691,15 +1512,14 @@ dependencies = [ "parking_lot 0.10.2", "pin-project", "rand", + "regex", "rmpv", "rust-embed", - "sdl2-sys", "skia-safe", - "skribo", - "skulpin", + "swash", "tokio", "unicode-segmentation", - "which 4.0.2", + "which 4.1.0", "winapi 0.3.9", "winres", ] @@ -1708,8 +1528,8 @@ dependencies = [ name = "neovide-derive" version = "0.1.0" dependencies = [ - "quote 1.0.8", - "syn 1.0.58", + "quote 1.0.9", + "syn 1.0.72", ] [[package]] @@ -1725,26 +1545,25 @@ dependencies = [ [[package]] name = "nix" -version = "0.14.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c722bee1037d430d0f8e687bbdbf222f27cc6e4e68d5caf630857bb2b6dbdce" +checksum = "83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055" dependencies = [ "bitflags", "cc", "cfg-if 0.1.10", "libc", - "void", ] [[package]] name = "nix" -version = "0.18.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055" +checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a" dependencies = [ "bitflags", "cc", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "libc", ] @@ -1760,9 +1579,9 @@ dependencies = [ [[package]] name = "nom" -version = "6.0.1" +version = "6.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88034cfd6b4a0d54dd14f4a507eceee36c0b70e5a02236c4e4df571102be17f0" +checksum = "e7413f999671bd4745a7b624bd370a569fb6bc574b23c83a3c5ed2e453f3d5e2" dependencies = [ "memchr", "version_check", @@ -1853,9 +1672,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffa5a33ddddfee04c0283a7653987d634e880347e96b5b2ed64de07efb59db9d" dependencies = [ "proc-macro-crate", - "proc-macro2 1.0.24", - "quote 1.0.8", - "syn 1.0.58", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.72", ] [[package]] @@ -1864,7 +1683,7 @@ version = "0.1.1-alpha.0" source = "git+https://github.com/kethku/nvim-rs#109feea9e345fcbb2674384b0d6914ba4b8fc61e" dependencies = [ "async-trait", - "futures 0.3.12", + "futures 0.3.15", "log", "pin-project", "rmp", @@ -1883,36 +1702,17 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.5.2" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" +checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" [[package]] -name = "openssl-probe" +name = "osmesa-sys" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" - -[[package]] -name = "openssl-sys" -version = "0.9.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "921fc71883267538946025deffb622905ecad223c28efbfdef9bb59a0175f3e6" +checksum = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b" dependencies = [ - "autocfg 1.0.1", - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "ordered-float" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3305af35278dd29f46fcdd139e0b1fbfae2153f0e5928b39b035542dd31e37b7" -dependencies = [ - "num-traits", + "shared_library", ] [[package]] @@ -1941,8 +1741,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" dependencies = [ "instant", - "lock_api 0.4.2", - "parking_lot_core 0.8.2", + "lock_api 0.4.4", + "parking_lot_core 0.8.3", ] [[package]] @@ -1954,44 +1754,25 @@ dependencies = [ "cfg-if 0.1.10", "cloudabi", "libc", - "redox_syscall", + "redox_syscall 0.1.57", "smallvec", "winapi 0.3.9", ] [[package]] name = "parking_lot_core" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ccb628cad4f84851442432c60ad8e1f607e29752d0bf072cbd0baf28aa34272" +checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" dependencies = [ "cfg-if 1.0.0", "instant", "libc", - "redox_syscall", + "redox_syscall 0.2.8", "smallvec", "winapi 0.3.9", ] -[[package]] -name = "pathfinder_geometry" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" -dependencies = [ - "log", - "pathfinder_simd", -] - -[[package]] -name = "pathfinder_simd" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b451513912d6b3440e443aa75a73ab22203afedc4a90df8526d008c0f86f7cb3" -dependencies = [ - "rustc_version", -] - [[package]] name = "peeking_take_while" version = "0.1.2" @@ -2006,35 +1787,35 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "pin-project" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffbc8e94b38ea3d2d8ba92aea2983b503cd75d0888d75b86bb37970b5698e15" +checksum = "918192b5c59119d51e0cd221f4d49dde9112824ba717369e903c97d076083d0f" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65ad2ae56b6abe3a1ee25f15ee605bacadb9a764edaba9c2bf4103800d4a1895" +checksum = "3be26700300be6d9d23264c73211d8190e755b6b5ca7a1b28230025511b52a5e" dependencies = [ - "proc-macro2 1.0.24", - "quote 1.0.8", - "syn 1.0.58", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.72", ] [[package]] name = "pin-project-lite" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c917123afa01924fc84bb20c4c03f004d9c38e5127e3c039bbf7f4b9c76a2f6b" +checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" [[package]] name = "pin-project-lite" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439697af366c49a6d0a010c56a0d97685bc140ce0d377b13a2ea2aa42d64a827" +checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" [[package]] name = "pin-utils" @@ -2068,9 +1849,9 @@ checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "predicates" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73dd9b7b200044694dfede9edf907c1ca19630908443e9447e624993700c6932" +checksum = "f49cfaf7fdaa3bfacc6fa3e7054e65148878354a5cfddcf661df4c851f8021df" dependencies = [ "difference", "float-cmp", @@ -2081,15 +1862,15 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3dbeaaf793584e29c58c7e3a82bbb3c7c06b63cea68d13b0e3cddc124104dc" +checksum = "57e35a3326b75e49aa85f5dc6ec15b41108cf5aee58eabb1f274dd18b73c2451" [[package]] name = "predicates-tree" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aee95d988ee893cb35c06b148c80ed2cd52c8eea927f50ba7a0be1a786aeab73" +checksum = "15f553275e5721409451eb85e15fd9a860a6e5ab4496eb215987502b5f5391f2" dependencies = [ "predicates-core", "treeline", @@ -2127,19 +1908,13 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec" dependencies = [ - "unicode-xid 0.2.1", + "unicode-xid 0.2.2", ] -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quote" version = "0.6.13" @@ -2151,11 +1926,11 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", ] [[package]] @@ -2208,18 +1983,6 @@ dependencies = [ "libc", ] -[[package]] -name = "raw-window-metal" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cd21ed1cdef7f1b1579b972148ba6058b5b545959a14d91ea83c4f0ea9f289b" -dependencies = [ - "cocoa 0.24.0", - "core-graphics 0.22.2", - "objc", - "raw-window-handle", -] - [[package]] name = "rayon" version = "1.5.0" @@ -2238,9 +2001,9 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a" dependencies = [ - "crossbeam-channel 0.5.0", + "crossbeam-channel 0.5.1", "crossbeam-deque 0.8.0", - "crossbeam-utils 0.8.1", + "crossbeam-utils 0.8.4", "lazy_static", "num_cpus", ] @@ -2251,65 +2014,75 @@ version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" +[[package]] +name = "redox_syscall" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc" +dependencies = [ + "bitflags", +] + [[package]] name = "redox_users" -version = "0.3.5" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" +checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" dependencies = [ - "getrandom 0.1.16", - "redox_syscall", - "rust-argon2", + "getrandom 0.2.2", + "redox_syscall 0.2.8", ] [[package]] name = "regex" -version = "1.4.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9251239e129e16308e70d853559389de218ac275b515068abc96829d05b948a" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" dependencies = [ "aho-corasick", "memchr", "regex-syntax", - "thread_local", ] [[package]] name = "regex-syntax" -version = "0.6.22" +version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] -name = "rmp" -version = "0.8.9" +name = "ring" +version = "0.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f10b46df14cf1ee1ac7baa4d2fbc2c52c0622a4b82fa8740e37bc452ac0184f" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" dependencies = [ - "byteorder", - "num-traits", + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi 0.3.9", ] [[package]] -name = "rmpv" -version = "0.4.6" +name = "rmp" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601e306fb529fadf3faa482684fba756e1b93897864ef2ab2080b12775c04235" +checksum = "4f55e5fa1446c4d5dd1f5daeed2a4fe193071771a2636274d0d7a3b082aa7ad6" dependencies = [ + "byteorder", "num-traits", - "rmp", ] [[package]] -name = "rust-argon2" -version = "0.8.3" +name = "rmpv" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" +checksum = "7c760afe11955e16121e36485b6b828326c3f0eaff1c31758d96dbeb5cf09fd5" dependencies = [ - "base64", - "blake2b_simd", - "constant_time_eq", - "crossbeam-utils 0.8.1", + "num-traits", + "rmp", ] [[package]] @@ -2329,10 +2102,10 @@ version = "5.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed91c41c42ef7bf687384439c312e75e0da9c149b0390889b94de3c7d9d9e66" dependencies = [ - "proc-macro2 1.0.24", - "quote 1.0.8", + "proc-macro2 1.0.26", + "quote 1.0.9", "rust-embed-utils", - "syn 1.0.58", + "syn 1.0.72", "walkdir", ] @@ -2352,32 +2125,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - -[[package]] -name = "rusttype" -version = "0.7.9" +name = "rustls" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310942406a39981bed7e12b09182a221a29e0990f3e7e0c971f131922ed135d5" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" dependencies = [ - "rusttype 0.8.3", -] - -[[package]] -name = "rusttype" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f61411055101f7b60ecf1041d87fb74205fb20b0c7a723f07ef39174cf6b4c0" -dependencies = [ - "approx", - "ordered-float", - "stb_truetype", + "base64", + "log", + "ring", + "sct", + "webpki", ] [[package]] @@ -2405,16 +2162,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "schannel" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" -dependencies = [ - "lazy_static", - "winapi 0.3.9", -] - [[package]] name = "scoped-tls" version = "1.0.0" @@ -2434,59 +2181,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] -name = "sdl2" -version = "0.34.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcbb85f4211627a7291c83434d6bbfa723e28dcaa53c7606087e3c61929e4b9c" -dependencies = [ - "bitflags", - "lazy_static", - "libc", - "raw-window-handle", - "sdl2-sys", -] - -[[package]] -name = "sdl2-sys" -version = "0.34.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cb164f53dbcad111de976bbf1f3083d3fcdeda88da9cfa281c70822720ee3da" -dependencies = [ - "cfg-if 0.1.10", - "cmake", - "flate2", - "libc", - "tar", - "unidiff", - "version-compare", -] - -[[package]] -name = "semver" -version = "0.9.0" +name = "sct" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" dependencies = [ - "semver-parser", + "ring", + "untrusted", ] -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - [[package]] name = "serde" -version = "1.0.120" +version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "166b2349061381baf54a58e4b13c89369feb0ef2eaa57198899e2312aac30aab" +checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" [[package]] name = "serde_json" -version = "1.0.61" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fceb2595057b6891a4ee808f70054bd2d12f0e97f1cbb78689b59f676df325a" +checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" dependencies = [ "itoa", "ryu", @@ -2494,31 +2208,20 @@ dependencies = [ ] [[package]] -name = "servo-fontconfig" -version = "0.5.1" +name = "shared_library" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e3e22fe5fd73d04ebf0daa049d3efe3eae55369ce38ab16d07ddd9ac5c217c" +checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" dependencies = [ + "lazy_static", "libc", - "servo-fontconfig-sys", -] - -[[package]] -name = "servo-fontconfig-sys" -version = "5.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36b879db9892dfa40f95da1c38a835d41634b825fbd8c4c418093d53c24b388" -dependencies = [ - "expat-sys", - "freetype-sys", - "pkg-config", ] [[package]] name = "shlex" -version = "0.1.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" +checksum = "42a568c8f2cd051a4d283bd6eb0343ac214c1b0f1ac19f93e1175b2dee38c73d" [[package]] name = "signal-hook-registry" @@ -2531,113 +2234,38 @@ dependencies = [ [[package]] name = "skia-bindings" -version = "0.32.1" +version = "0.39.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad6f9d1f255ac966c531823efb71a0ad45f37325428ad3e4f363f676737184d8" +checksum = "751462e70a68391c38c76d5e14ea24ed4bedd7db4b9bcefffa179f63bddf5c86" dependencies = [ "bindgen", "cc", - "curl", + "clang-sys", "flate2", "heck", "regex", "serde_json", "tar", "toml", + "ureq", ] [[package]] name = "skia-safe" -version = "0.32.1" +version = "0.39.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea0f1e6e251bb1d895d99c4d32460adc206f9fb30f1a0b27c5edf4de4908946" +checksum = "4b06dfa844d8f75dd616b600c1dd018950ee5eff19bb36d97ec4a7232b3bdb60" dependencies = [ "bitflags", "lazy_static", "skia-bindings", ] -[[package]] -name = "skribo" -version = "0.1.0" -source = "git+https://github.com/linebender/skribo#a35c876b9297f23b854b082b71b6a275b26cc18d" -dependencies = [ - "font-kit", - "harfbuzz", - "harfbuzz-sys", - "log", - "pathfinder_geometry", - "unicode-normalization", -] - -[[package]] -name = "skulpin" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d11f1c75af5e20eaa1dd985692b42b697b49f3581eb8088526688120a951b1ad" -dependencies = [ - "log", - "skulpin-app-winit", - "skulpin-renderer", - "skulpin-renderer-sdl2", - "skulpin-renderer-winit", -] - -[[package]] -name = "skulpin-app-winit" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf156763a67080ce9a8965bba2b1c7cdee9f51f4e1fdb2b3ef6dcf7d9fbf63f" -dependencies = [ - "log", - "skulpin-renderer", - "skulpin-renderer-winit", -] - -[[package]] -name = "skulpin-renderer" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f77569926563e91b3e8a5b1b77d192be6a8db8e3f0c4e05e887843998dd47e" -dependencies = [ - "ash", - "log", - "skia-bindings", - "skia-safe", -] - -[[package]] -name = "skulpin-renderer-sdl2" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2391513a1fcb62aad9e95fa0c7ab2ecaf0565dd68fee8bf096f1ed9a25abf936" -dependencies = [ - "ash-window", - "log", - "raw-window-handle", - "sdl2", - "skulpin-renderer", -] - -[[package]] -name = "skulpin-renderer-winit" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc972e8252690259199c00f3e0a307082c6b666e57b72d629cf608e0396a0f01" -dependencies = [ - "ash-window", - "log", - "raw-window-handle", - "skulpin-renderer", - "winit 0.22.2", - "winit 0.23.0", -] - [[package]] name = "slab" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" [[package]] name = "smallvec" @@ -2647,58 +2275,28 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "smithay-client-toolkit" -version = "0.6.6" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "421c8dc7acf5cb205b88160f8b4cc2c5cfabe210e43b2f80f009f4c1ef910f1d" +checksum = "4750c76fd5d3ac95fa3ed80fe667d6a3d8590a960e5b575b98eea93339a80b80" dependencies = [ - "andrew 0.2.1", + "andrew", "bitflags", - "dlib", - "lazy_static", - "memmap", - "nix 0.14.1", - "wayland-client 0.23.6", - "wayland-protocols 0.23.6", -] - -[[package]] -name = "smithay-client-toolkit" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "316e13a3eb853ce7bf72ad3530dc186cb2005c57c521ef5f4ada5ee4eed74de6" -dependencies = [ - "andrew 0.3.1", - "bitflags", - "calloop 0.6.5", - "dlib", + "calloop", + "dlib 0.4.2", "lazy_static", "log", "memmap2", "nix 0.18.0", - "wayland-client 0.28.3", + "wayland-client", "wayland-cursor", - "wayland-protocols 0.28.3", -] - -[[package]] -name = "socket2" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "winapi 0.3.9", + "wayland-protocols", ] [[package]] -name = "stb_truetype" -version = "0.3.1" +name = "spin" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f77b6b07e862c66a9f3e62a07588fee67cd90a9135a2b942409f195507b4fb51" -dependencies = [ - "byteorder", -] +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "strsim" @@ -2712,6 +2310,16 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" +[[package]] +name = "swash" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f17dda4029832e4e76811523e06387273a9964c2cd4df1cecd35832d2b4b6d3" +dependencies = [ + "yazi", + "zeno", +] + [[package]] name = "syn" version = "0.15.44" @@ -2725,24 +2333,23 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.58" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc60a3d73ea6594cd712d830cc1f0390fd71542d8c8cd24e70cc54cdfd5e05d5" +checksum = "a1e8cdbefb79a9a5a65e0db8b47b723ee907b7c7f8496c76a1770b5c310bab82" dependencies = [ - "proc-macro2 1.0.24", - "quote 1.0.8", - "unicode-xid 0.2.1", + "proc-macro2 1.0.26", + "quote 1.0.9", + "unicode-xid 0.2.2", ] [[package]] name = "tar" -version = "0.4.30" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489997b7557e9a43e192c527face4feacc78bfbe6eed67fd55c4c9e381cba290" +checksum = "c0bcfbd6a598361fda270d82469fff3d65089dc33e175c9a131f7b4cd395f228" dependencies = [ "filetime", "libc", - "redox_syscall", "xattr", ] @@ -2766,31 +2373,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146" +checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1" -dependencies = [ - "proc-macro2 1.0.24", - "quote 1.0.8", - "syn 1.0.58", -] - -[[package]] -name = "thread_local" -version = "1.1.0" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb9bc092d0d51e76b2b19d9d85534ffc9ec2db959a2523cdae0697e2972cd447" +checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" dependencies = [ - "lazy_static", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.72", ] [[package]] @@ -2826,9 +2424,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf8dbc19eb42fba10e8feaaec282fb50e2c14b2726d6301dbfeed0f73306a6f" +checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" dependencies = [ "tinyvec_macros", ] @@ -2841,9 +2439,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "0.2.24" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099837d3464c16a808060bb3f02263b412f6fafcb5d01c533d309985fbeebe48" +checksum = "6703a273949a90131b290be1fe7b039d0fc884aa1935860dfcbe056f28cd8092" dependencies = [ "bytes 0.5.6", "fnv", @@ -2855,7 +2453,7 @@ dependencies = [ "mio-named-pipes", "mio-uds", "num_cpus", - "pin-project-lite 0.1.11", + "pin-project-lite 0.1.12", "signal-hook-registry", "slab", "tokio-macros", @@ -2869,7 +2467,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" dependencies = [ "bytes 0.4.12", - "futures 0.1.30", + "futures 0.1.31", "log", ] @@ -2879,9 +2477,9 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e44da00bfc73a25f814cd8d7e57a68a5c31b74b3152a0a1d1f590c97ed06265a" dependencies = [ - "proc-macro2 1.0.24", - "quote 1.0.8", - "syn 1.0.58", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.72", ] [[package]] @@ -2905,11 +2503,20 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e5d7cd7ab3e47dda6e56542f4bbf3824c15234958c6e1bd6aaa347e93499fdc" +[[package]] +name = "unicode-bidi" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" +dependencies = [ + "matches", +] + [[package]] name = "unicode-normalization" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13e63ab62dbe32aeee58d1c5408d35c36c392bba5d9d3142287219721afe606" +checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" dependencies = [ "tinyvec", ] @@ -2934,26 +2541,43 @@ checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" [[package]] name = "unicode-xid" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] -name = "unidiff" -version = "0.3.3" +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "ureq" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a62719acf1933bfdbeb73a657ecd9ecece70b405125267dd549e2e2edc232c" +checksum = "2475a6781e9bc546e7b64f4013d2f4032c8c6a40fcffd7c6f4ee734a890972ab" dependencies = [ - "encoding_rs", - "lazy_static", - "regex", + "base64", + "chunked_transfer", + "log", + "once_cell", + "rustls", + "url", + "webpki", + "webpki-roots", ] [[package]] -name = "vcpkg" -version = "0.2.11" +name = "url" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] [[package]] name = "vec_map" @@ -2961,29 +2585,17 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" -[[package]] -name = "version-compare" -version = "0.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d63556a25bae6ea31b52e640d7c41d1ab27faba4ccb600013837a3d0b3994ca1" - [[package]] name = "version_check" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" - -[[package]] -name = "void" -version = "1.0.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" [[package]] name = "walkdir" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" dependencies = [ "same-file", "winapi 0.3.9", @@ -2998,141 +2610,174 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.10.1+wasi-snapshot-preview1" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93c6c3420963c5c64bca373b25e77acb562081b9bb4dd5bb864187742186cea9" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] -name = "wayland-client" -version = "0.23.6" +name = "wasm-bindgen" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1080ebe0efabcf12aef2132152f616038f2d7dcbbccf7b2d8c5270fe14bcda" +checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" dependencies = [ - "bitflags", - "calloop 0.4.4", - "downcast-rs", - "libc", - "mio", - "nix 0.14.1", - "wayland-commons 0.23.6", - "wayland-scanner 0.23.6", - "wayland-sys 0.23.6", + "cfg-if 1.0.0", + "wasm-bindgen-macro", ] [[package]] -name = "wayland-client" -version = "0.28.3" +name = "wasm-bindgen-backend" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdbdbe01d03b2267809f3ed99495b37395387fde789e0f2ebb78e8b43f75b6d7" +checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" dependencies = [ - "bitflags", - "downcast-rs", - "libc", - "nix 0.18.0", - "scoped-tls", - "wayland-commons 0.28.3", - "wayland-scanner 0.28.3", - "wayland-sys 0.28.3", + "bumpalo", + "lazy_static", + "log", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.72", + "wasm-bindgen-shared", ] [[package]] -name = "wayland-commons" -version = "0.23.6" +name = "wasm-bindgen-macro" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +dependencies = [ + "quote 1.0.9", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb66b0d1a27c39bbce712b6372131c6e25149f03ffb0cd017cf8f7de8d66dbdb" +checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" dependencies = [ - "nix 0.14.1", - "wayland-sys 0.23.6", + "proc-macro2 1.0.26", + "quote 1.0.9", + "syn 1.0.72", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" + +[[package]] +name = "wayland-client" +version = "0.28.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ca44d86554b85cf449f1557edc6cc7da935cc748c8e4bf1c507cbd43bae02c" +dependencies = [ + "bitflags", + "downcast-rs", + "libc", + "nix 0.20.0", + "scoped-tls", + "wayland-commons", + "wayland-scanner", + "wayland-sys", ] [[package]] name = "wayland-commons" -version = "0.28.3" +version = "0.28.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "480450f76717edd64ad04a4426280d737fc3d10a236b982df7b1aee19f0e2d56" +checksum = "8bd75ae380325dbcff2707f0cd9869827ea1d2d6d534cff076858d3f0460fd5a" dependencies = [ - "nix 0.18.0", + "nix 0.20.0", "once_cell", "smallvec", - "wayland-sys 0.28.3", + "wayland-sys", ] [[package]] name = "wayland-cursor" -version = "0.28.3" +version = "0.28.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6eb122c160223a7660feeaf949d0100281d1279acaaed3720eb3c9894496e5f" +checksum = "b37e5455ec72f5de555ec39b5c3704036ac07c2ecd50d0bffe02d5fe2d4e65ab" dependencies = [ - "nix 0.18.0", - "wayland-client 0.28.3", + "nix 0.20.0", + "wayland-client", "xcursor", ] [[package]] -name = "wayland-protocols" -version = "0.23.6" +name = "wayland-egl" +version = "0.28.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cc286643656742777d55dc8e70d144fa4699e426ca8e9d4ef454f4bf15ffcf9" +checksum = "9461a67930ec16da7a4fd8b50e9ffa23f4417240b43ec84008bd1b2c94421c94" dependencies = [ - "bitflags", - "wayland-client 0.23.6", - "wayland-commons 0.23.6", - "wayland-scanner 0.23.6", + "wayland-client", + "wayland-sys", ] [[package]] name = "wayland-protocols" -version = "0.28.3" +version = "0.28.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "319a82b4d3054dd25acc32d9aee0f84fa95b63bc983fffe4703b6b8d47e01a30" +checksum = "95df3317872bcf9eec096c864b69aa4769a1d5d6291a5b513f8ba0af0efbd52c" dependencies = [ "bitflags", - "wayland-client 0.28.3", - "wayland-commons 0.28.3", - "wayland-scanner 0.28.3", + "wayland-client", + "wayland-commons", + "wayland-scanner", ] [[package]] name = "wayland-scanner" -version = "0.23.6" +version = "0.28.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93b02247366f395b9258054f964fe293ddd019c3237afba9be2ccbe9e1651c3d" +checksum = "389d680d7bd67512dc9c37f39560224327038deb0f0e8d33f870900441b68720" dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", + "proc-macro2 1.0.26", + "quote 1.0.9", "xml-rs", ] [[package]] -name = "wayland-scanner" -version = "0.28.3" +name = "wayland-sys" +version = "0.28.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7010ba5767b3fcd350decc59055390b4ebe6bd1b9279a9feb1f1888987f1133d" +checksum = "2907bd297eef464a95ba9349ea771611771aa285b932526c633dc94d5400a8e2" dependencies = [ - "proc-macro2 1.0.24", - "quote 1.0.8", - "xml-rs", + "dlib 0.5.0", + "lazy_static", + "pkg-config", ] [[package]] -name = "wayland-sys" -version = "0.23.6" +name = "web-sys" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d94e89a86e6d6d7c7c9b19ebf48a03afaac4af6bc22ae570e9a24124b75358f4" +checksum = "e828417b379f3df7111d3a2a9e5753706cae29c41f7c4029ee9fd77f3e09e582" dependencies = [ - "dlib", - "lazy_static", + "js-sys", + "wasm-bindgen", ] [[package]] -name = "wayland-sys" -version = "0.28.3" +name = "webpki" +version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6793834e0c35d11fd96a97297abe03d37be627e1847da52e17d7e0e3b51cc099" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" dependencies = [ - "dlib", - "lazy_static", - "pkg-config", + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" +dependencies = [ + "webpki", ] [[package]] @@ -3146,12 +2791,12 @@ dependencies = [ [[package]] name = "which" -version = "4.0.2" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87c14ef7e1b8b8ecfc75d5eca37949410046e66f15d185c01d70824f1f8111ef" +checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" dependencies = [ + "either", "libc", - "thiserror", ] [[package]] @@ -3199,43 +2844,12 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winit" -version = "0.22.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4ccbf7ddb6627828eace16cacde80fc6bf4dbb3469f88487262a02cf8e7862" -dependencies = [ - "bitflags", - "cocoa 0.20.2", - "core-foundation 0.7.0", - "core-graphics 0.19.2", - "core-video-sys", - "dispatch", - "instant", - "lazy_static", - "libc", - "log", - "mio", - "mio-extras", - "ndk 0.1.0", - "ndk-glue 0.1.0", - "ndk-sys 0.1.0", - "objc", - "parking_lot 0.10.2", - "percent-encoding", - "raw-window-handle", - "smithay-client-toolkit 0.6.6", - "wayland-client 0.23.6", - "winapi 0.3.9", - "x11-dl", -] - -[[package]] -name = "winit" -version = "0.23.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5bc559da567d8aa671bbcd08304d49e982c7bf2cb91e10288b9188931c1b772" +checksum = "da4eda6fce0eb84bd0a33e3c8794eb902e1033d0a1d5a31bc4f19b1b4bbff597" dependencies = [ "bitflags", - "cocoa 0.23.0", + "cocoa 0.24.0", "core-foundation 0.9.1", "core-graphics 0.22.2", "core-video-sys", @@ -3246,15 +2860,15 @@ dependencies = [ "log", "mio", "mio-extras", - "ndk 0.2.1", - "ndk-glue 0.2.1", - "ndk-sys 0.2.1", + "ndk", + "ndk-glue", + "ndk-sys", "objc", "parking_lot 0.11.1", "percent-encoding", "raw-window-handle", - "smithay-client-toolkit 0.12.2", - "wayland-client 0.28.3", + "smithay-client-toolkit", + "wayland-client", "winapi 0.3.9", "x11-dl", ] @@ -3268,15 +2882,6 @@ dependencies = [ "toml", ] -[[package]] -name = "wio" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -3314,7 +2919,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a9a231574ae78801646617cefd13bfe94be907c0e4fa979cfd8b770aa3c5d08" dependencies = [ - "nom 6.0.1", + "nom 6.1.2", ] [[package]] @@ -3328,3 +2933,15 @@ name = "xml-rs" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b07db065a5cf61a7e4ba64f29e67db906fb1787316516c4e6e5ff0fea1efcd8a" + +[[package]] +name = "yazi" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3c1df78998bea4c8b5f315efe7e5c12bc06eb794478f8b46636ac321306e972" + +[[package]] +name = "zeno" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea708573d4a67f939793b0d3f923d105bfdf06bbd6acb3f9cd02ce1bd905f6c8" diff --git a/Cargo.toml b/Cargo.toml index 5892245..11f3497 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,62 +8,57 @@ description = "A simple GUI for Neovim." resolver = "2" [workspace] -members = [ - "neovide-derive" -] +members = ["neovide-derive"] [features] -default = ["sdl2"] +default = [] embed-fonts = [] -sdl2 = ["skulpin/skulpin_sdl2"] -winit = ["skulpin/skulpin_winit", "skulpin/winit-23"] [dependencies] neovide-derive = { path = "neovide-derive" } euclid = "0.20.7" -font-kit = "0.10.0" -skribo = { git = "https://github.com/linebender/skribo" } lru = "0.4.3" -skulpin = "0.11.0" derive-new = "0.5" rmpv = "0.4.4" rust-embed = { version = "5.2.0", features = ["debug-embed"] } image = "0.22.3" -nvim-rs = { git = "https://github.com/kethku/nvim-rs", features = [ "use_tokio" ] } -tokio = { version = "0.2.9", features = [ "blocking", "process", "time", "tcp" ] } +nvim-rs = { git = "https://github.com/kethku/nvim-rs", features = ["use_tokio"] } +tokio = { version = "0.2.9", features = ["blocking", "process", "time", "tcp"] } async-trait = "0.1.18" crossfire = "0.1" lazy_static = "1.4.0" unicode-segmentation = "1.6.0" log = "0.4.8" -flexi_logger = { version = "0.14.6", default-features = false } -anyhow = "1.0.26" -parking_lot="0.10.0" +flexi_logger = { version = "0.17.1", default-features = false } +parking_lot = "0.10.0" cfg-if = "0.1.10" which = "4" dirs = "2" rand = "0.7" -skia-safe = "0.32.1" pin-project = "0.4.27" futures = "0.3.12" +glutin = "0.26" +gl = "0.14.0" +regex = "1.5.4" +swash = "0.1.2" +clap="2.33.3" [dev-dependencies] mockall = "0.7.0" -[dev-dependencies.cargo-husky] -version = "1" -default-features = false -features = ["precommit-hook", "run-cargo-test", "run-cargo-clippy", "run-cargo-fmt"] - [target.'cfg(windows)'.dependencies] winapi = { version = "0.3.9", features = ["winuser"] } [target.'cfg(windows)'.build-dependencies] winres = "0.1.11" -sdl2-sys = { version = "0.34.4", default-features = false, features = ["bundled", "static-link"] } -[target.'cfg(macos)'.build-dependencies] -sdl2-sys = { version = "0.34.4", default-features = false, features = ["bundled", "static-link"] } +[target.'cfg(linux)'.dependencies.skia-safe] +features = ["gl", "egl"] +version = "0.39.1" + +[target.'cfg(not(linux))'.dependencies.skia-safe] +features = ["gl"] +version = "0.39.1" [profile.release] debug = true @@ -74,9 +69,9 @@ incremental = true name = "Neovide" identifier = "com.kethku.neovide" icon = ["assets/nvim.ico"] -version = "0.6.0" +version = "0.7.0" resources = [] -copyright = "Copyright (c) keith 2020. All rights reserved." +copyright = "Copyright (c) Keith 2021. All rights reserved." category = "Productivity" short_description = "A simple GUI for Neovim." long_description = """ diff --git a/README.md b/README.md index 3d1ac93..a74827c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Neovide [![Gitter](https://badges.gitter.im/neovide/community.svg)](https://gitter.im/neovide/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Discussions](https://img.shields.io/badge/GitHub-Discussions-green?logo=github)](https://github.com/Kethku/neovide/discussions) -This is a simple graphical user interface for Neovim. Where possible there are some graphical improvements, but it should act -functionally like the terminal UI. +This is a simple graphical user interface for [Neovim](https://github.com/neovim/neovim) (an aggressively refactored and updated +Vim editor). Where possible there are some graphical improvements, but functionally it should act like the terminal UI. ![Basic Screen Cap](./assets/BasicScreenCap.png) @@ -14,7 +14,7 @@ any critiques that you might have to offer. I won't take all of them, but I prom ## Features -Should be a standard full features Neovim GUI. Beyond that there are some visual niceties: +Should be a standard fully featured Neovim GUI. Beyond that there are some visual niceties: ### Ligatures @@ -84,6 +84,8 @@ By specifying to listen on localhost, you only allow connections from your local ssh -L 6666:localhost:6666 ip.of.other.machine nvim --headless --listen localhost:6666 ``` +Finally, if you would like to leave the neovim server running, close the neovide application window instead of issuing a `:q` command. + ### Some Nonsense ;) ```vim @@ -110,11 +112,25 @@ necessary. On Windows this should be enabled by default if you have a relatively ### From binary -Relatively recent binaries can be found in the [project releases](https://github.com/Kethku/neovide/releases). But if you want the latest and greatest you should clone it and build yourself. +Building instructions are somewhat limited at the moment. All the libraries I use are cross platform and should have support for Windows, Mac, and Linux. The rendering is based on opengl, so a good gpu driver will be +necessary. On Windows this should be enabled by default if you have a relatively recent system. Installing should be as simple as downloading the binary, making sure `nvim.exe` with version 0.4 or greater is on your path, and running it. Everything should be self contained. -### Windows (from source) +### Windows + +#### Package manager + +[Scoop](https://scoop.sh/) has Neovide in the `extras` bucket. Ensure you have the `extras` bucket, and install: + +``` +$ scoop bucket list +main +extras +$ scoop install neovide +``` + +#### From source 1. Install the latest version of Rust. I recommend 2. Install CMake. I use chocolatey: `choco install cmake --installargs '"ADD_CMAKE_TO_PATH=System"' -y` @@ -134,16 +150,10 @@ Installing should be as simple as downloading the binary, making sure `nvim.exe` 1. Install the latest version of Rust. I recommend 2. Install CMake. Using homebrew: `brew install cmake` -3. Install the Vulkan SDK. I'm told `brew install apenngrace/vulkan/vulkan-sdk` works, but I can't test locally to find out. -4. Build and install Neovide: - - ```sh - git clone https://github.com/Kethku/neovide - cd neovide - cargo build --release - ``` - -5. Copy `./target/release/neovide` to a known location and enjoy. +3. `git clone https://github.com/Kethku/neovide` +4. `cd neovide` +5. `cargo build --release` +6. Copy `./target/release/neovide` to a known location and enjoy. ### Linux @@ -165,6 +175,20 @@ cd neovide-git makepkg -si ``` +To install a non-default branch: + +```sh +git clone https://aur.archlinux.org/neovide-git.git +cd neovide-git +nvim PKGBUILD +:%s/l}/l}#branch=branch-name-here/ +:wq +makepkg -si +``` + +Note: Neovide requires that a font be set in `init.vim` otherwise errors might be encountered. +See [#527](https://github.com/Kethku/neovide/issues/527) + ##### With non-default branch ```sh @@ -186,40 +210,31 @@ makepkg -si libbz2-dev libsndio-dev freeglut3-dev libxmu-dev libxi-dev ``` -2. Install Vulkan SDK (adjust for your preferred package manager, may already be in your repository) - - ```sh - curl -sL "http://packages.lunarg.com/lunarg-signing-key-pub.asc" | sudo apt-key add - - sudo curl -sLo "/etc/apt/sources.list.d/lunarg-vulkan-1.2.131-bionic.list" "http://packages.lunarg.com/vulkan/1.2.131/lunarg-vulkan-1.2.131-bionic.list" - sudo apt update -y - sudo apt install -y vulkan-sdk - ``` - -3. Install Rust +2. Install Rust ```sh curl --proto '=https' --tlsv1.2 -sSf "https://sh.rustup.rs" | sh ``` -4. Clone the repository +3. Clone the repository ```sh git clone "https://github.com/Kethku/neovide" ``` -5. Build +4. Build ```sh cd neovide && ~/.cargo/bin/cargo build --release ``` -6. Copy `./target/release/neovide` to a known location and enjoy. +5. Copy `./target/release/neovide` to a known location and enjoy. ## Troubleshooting - Neovide requires that a font be set in `init.vim` otherwise errors might be encountered. This can be fixed by adding `set guifont=Your\ Font\ Name:h15` in init.vim file. Reference issue [#527](https://github.com/Kethku/neovide/issues/527). -- On OSX, if you run into issues with the vulkan libraries being reported as not verified, please reference issue [#167](https://github.com/Kethku/neovide/issues/167#issuecomment-593314579). ### Linux-specific -- If you recieve an error of `SdlError("Installed Vulkan doesn't implement the VK_KHR_surface extension")`, please try installing the AMD Vulkan Driver (commonly, `amdvlk`). Reference issue [#209](https://github.com/Kethku/neovide/issues/209). - If you recieve errors complaining about DRI3 settings, please reference issue [#44](https://github.com/Kethku/neovide/issues/44#issuecomment-578618052). -- If you recieve libsndio-related errors, try building without default features (this disables static linking of the SDL library). + +[![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-white.svg)](https://snapcraft.io/neovide) + diff --git a/assets/fonts/FiraCode-Regular.ttf b/assets/fonts/FiraCode-Regular.ttf new file mode 100644 index 0000000..0d57068 Binary files /dev/null and b/assets/fonts/FiraCode-Regular.ttf differ diff --git a/assets/fonts/LICENSE b/assets/fonts/LICENSE new file mode 100644 index 0000000..10ab55d --- /dev/null +++ b/assets/fonts/LICENSE @@ -0,0 +1,86 @@ +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/fonts/LastResort-Regular.ttf b/assets/fonts/LastResort-Regular.ttf new file mode 100644 index 0000000..30dbb79 Binary files /dev/null and b/assets/fonts/LastResort-Regular.ttf differ diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml new file mode 100644 index 0000000..6906a83 --- /dev/null +++ b/snap/snapcraft.yaml @@ -0,0 +1,114 @@ +name: neovide # you probably want to 'snapcraft register ' +base: core18 # the base snap is the execution environment for this snap +version: "0.7.1+git" +summary: The snappiest vim editor you are likely to find. +description: | + This is a simple graphical user interface for Neovim. Where possible there are some graphical improvements, + but it should act functionally like the terminal UI. + +grade: devel # must be 'stable' to release into candidate/stable channels +confinement: strict # use 'strict' once you have the right plugs and slots +build-packages: + - cmake + - freeglut3-dev + - libbz2-dev + - libexpat1-dev + - libgl-dev + - libssl-dev + - libxmu-dev + - pkg-config + +parts: + nvim: + source: https://github.com/neovim/neovim.git + override-pull: | + snapcraftctl pull + latest_tag="$(git tag -l --sort=refname|head -1)" + git checkout "${latest_tag}" + major="$(awk '/NVIM_VERSION_MAJOR/{gsub(")","",$2); print $2}' CMakeLists.txt)" + minor="$(awk '/NVIM_VERSION_MINOR/{gsub(")","",$2); print $2}' CMakeLists.txt)" + patch="$(awk '/NVIM_VERSION_PATCH/{gsub(")","",$2); print $2}' CMakeLists.txt)" + version_prefix="v$major.$minor.$patch" + git_described="$(git describe --first-parent --dirty 2> /dev/null | perl -lpe 's/v\d.\d.\d-//g')" + git_described="${git_described:-$(git describe --first-parent --tags --always --dirty)}" + if [ "${version_prefix}" != "${git_described}" ]; then + VERSION="${version_prefix}-${git_described}-${latest_tag}" + else + VERSION="${version_prefix}-${latest_tag}" + fi + snapcraftctl set-version "${VERSION}" + plugin: make + make-parameters: + - CMAKE_BUILD_TYPE=RelWithDebInfo + - CMAKE_INSTALL_PREFIX=/usr + - CMAKE_FLAGS=-DPREFER_LUA=ON + - DEPS_CMAKE_FLAGS="-DUSE_BUNDLED_LUA=ON -DUSE_BUNDLED_LUAJIT=OFF" + override-build: | + echo "Building on $SNAP_ARCH" + set -x + case "$SNAP_ARCH" in + "arm64" | "ppc64el" | "s390x") + make -j"${SNAPCRAFT_PARALLEL_BUILD_COUNT}" \ + CMAKE_BUILD_TYPE=RelWithDebInfo \ + CMAKE_INSTALL_PREFIX=/usr \ + CMAKE_FLAGS=-DPREFER_LUA=ON \ + DEPS_CMAKE_FLAGS="-DUSE_BUNDLED_LUA=ON -DUSE_BUNDLED_LUAJIT=OFF" + ;; + *) + make -j"${SNAPCRAFT_PARALLEL_BUILD_COUNT}" \ + CMAKE_BUILD_TYPE=RelWithDebInfo \ + CMAKE_INSTALL_PREFIX=/usr + ;; + esac + make DESTDIR="$SNAPCRAFT_PART_INSTALL" install + # Fix Desktop file + sed -i 's|^Exec=nvim|Exec=/snap/bin/nvim.nvim|' ${SNAPCRAFT_PART_INSTALL}/usr/share/applications/nvim.desktop + sed -i 's|^TryExec=nvim|TryExec=/snap/bin/nvim.nvim|' ${SNAPCRAFT_PART_INSTALL}/usr/share/applications/nvim.desktop + sed -i 's|^Icon=.*|Icon=${SNAP}/usr/share/pixmaps/nvim.png|' ${SNAPCRAFT_PART_INSTALL}/usr/share/applications/nvim.desktop + build-packages: + - ninja-build + - libtool + - libtool-bin + - autoconf + - automake + - gawk + - g++ + - git + - gettext + - unzip + - wget + prime: + - -usr/share/man + desktop-glib-only: + plugin: make + source: https://github.com/ubuntu/snapcraft-desktop-helpers.git + source-subdir: glib-only + neovide: + plugin: rust + source: . + build-packages: + - fontconfig + - libfontconfig1-dev + - libfreetype6-dev + stage-packages: + - fontconfig + - fonts-noto + - libfontconfig1 + - libibus-1.0-5 + - libpng16-16 + - libx11-dev + - libx11-xcb1 + - libxcursor1 + - libxi-dev + - libxrandr-dev + - locales-all + - xdg-user-dirs + +apps: + neovide: + command: bin/neovide + plugs: + - desktop + - desktop-legacy + command-chain: + - bin/desktop-launch diff --git a/src/bridge/events.rs b/src/bridge/events.rs index e8bf172..dc7643f 100644 --- a/src/bridge/events.rs +++ b/src/bridge/events.rs @@ -1,40 +1,43 @@ use std::convert::TryInto; use std::error; use std::fmt; +use std::fmt::Debug; use rmpv::Value; -use skulpin::skia_safe::Color4f; +use skia_safe::Color4f; use crate::editor::{Colors, CursorMode, CursorShape, Style}; -#[derive(Debug, Clone)] +#[derive(Clone, Debug)] pub enum ParseError { - InvalidArray(Value), - InvalidMap(Value), - InvalidString(Value), - InvalidU64(Value), - InvalidI64(Value), - InvalidF64(Value), - InvalidBool(Value), - InvalidWindowAnchor(Value), - InvalidFormat, + Array(Value), + Map(Value), + String(Value), + U64(Value), + I64(Value), + F64(Value), + Bool(Value), + WindowAnchor(Value), + Format(String), } type Result = std::result::Result; impl fmt::Display for ParseError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { - ParseError::InvalidArray(value) => write!(f, "invalid array format {}", value), - ParseError::InvalidMap(value) => write!(f, "invalid map format {}", value), - ParseError::InvalidString(value) => write!(f, "invalid string format {}", value), - ParseError::InvalidU64(value) => write!(f, "invalid u64 format {}", value), - ParseError::InvalidI64(value) => write!(f, "invalid i64 format {}", value), - ParseError::InvalidF64(value) => write!(f, "invalid f64 format {}", value), - ParseError::InvalidBool(value) => write!(f, "invalid bool format {}", value), - ParseError::InvalidWindowAnchor(value) => { + ParseError::Array(value) => write!(f, "invalid array format {}", value), + ParseError::Map(value) => write!(f, "invalid map format {}", value), + ParseError::String(value) => write!(f, "invalid string format {}", value), + ParseError::U64(value) => write!(f, "invalid u64 format {}", value), + ParseError::I64(value) => write!(f, "invalid i64 format {}", value), + ParseError::F64(value) => write!(f, "invalid f64 format {}", value), + ParseError::Bool(value) => write!(f, "invalid bool format {}", value), + ParseError::WindowAnchor(value) => { write!(f, "invalid window anchor format {}", value) } - ParseError::InvalidFormat => write!(f, "invalid event format"), + ParseError::Format(debug_text) => { + write!(f, "invalid event format {}", debug_text) + } } } } @@ -45,7 +48,7 @@ impl error::Error for ParseError { } } -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct GridLineCell { pub text: String, pub highlight_id: Option, @@ -54,7 +57,7 @@ pub struct GridLineCell { pub type StyledContent = Vec<(u64, String)>; -#[derive(Debug)] +#[derive(Clone, Debug)] pub enum MessageKind { Unknown, Confirm, @@ -91,7 +94,7 @@ impl MessageKind { } } -#[derive(Debug)] +#[derive(Clone, Debug)] pub enum GuiOption { ArabicShape(bool), AmbiWidth(String), @@ -106,7 +109,7 @@ pub enum GuiOption { Unknown(String, Value), } -#[derive(Debug)] +#[derive(Clone, Debug)] pub enum WindowAnchor { NorthWest, NorthEast, @@ -114,7 +117,7 @@ pub enum WindowAnchor { SouthEast, } -#[derive(Debug, Clone)] +#[derive(Clone, Debug)] pub enum EditorMode { // The set of modes reported will change in new versions of Nvim, for // instance more sub-modes and temporary states might be represented as @@ -128,7 +131,7 @@ pub enum EditorMode { Unknown(String), } -#[derive(Debug)] +#[derive(Clone, Debug)] pub enum RedrawEvent { SetTitle { title: String, @@ -200,7 +203,7 @@ pub enum RedrawEvent { anchor_row: f64, anchor_column: f64, focusable: bool, - z_index: i64, + sort_order: Option, }, WindowExternalPosition { grid: u64, @@ -356,7 +359,7 @@ fn extract_values>(values: Vec, mut arr: Arr) -> Resu let arr_ref = arr.as_mut(); if values.len() != arr_ref.len() { - Err(ParseError::InvalidFormat) + Err(ParseError::Format(format!("{:?}", values))) } else { for (i, val) in values.into_iter().enumerate() { arr_ref[i] = val; @@ -367,31 +370,31 @@ fn extract_values>(values: Vec, mut arr: Arr) -> Resu } fn parse_array(array_value: Value) -> Result> { - array_value.try_into().map_err(ParseError::InvalidArray) + array_value.try_into().map_err(ParseError::Array) } fn parse_map(map_value: Value) -> Result> { - map_value.try_into().map_err(ParseError::InvalidMap) + map_value.try_into().map_err(ParseError::Map) } fn parse_string(string_value: Value) -> Result { - string_value.try_into().map_err(ParseError::InvalidString) + string_value.try_into().map_err(ParseError::String) } fn parse_u64(u64_value: Value) -> Result { - u64_value.try_into().map_err(ParseError::InvalidU64) + u64_value.try_into().map_err(ParseError::U64) } fn parse_i64(i64_value: Value) -> Result { - i64_value.try_into().map_err(ParseError::InvalidI64) + i64_value.try_into().map_err(ParseError::I64) } fn parse_f64(f64_value: Value) -> Result { - f64_value.try_into().map_err(ParseError::InvalidF64) + f64_value.try_into().map_err(ParseError::F64) } fn parse_bool(bool_value: Value) -> Result { - bool_value.try_into().map_err(ParseError::InvalidBool) + bool_value.try_into().map_err(ParseError::Bool) } fn parse_set_title(set_title_arguments: Vec) -> Result { @@ -564,7 +567,7 @@ fn parse_grid_line_cell(grid_line_cell: Value) -> Result { let text_value = cell_contents .first_mut() .map(|v| take_value(v)) - .ok_or(ParseError::InvalidFormat)?; + .ok_or_else(|| ParseError::Format(format!("{:?}", cell_contents)))?; let highlight_id = cell_contents .get_mut(1) @@ -677,33 +680,59 @@ fn parse_window_anchor(value: Value) -> Result { "NE" => Ok(WindowAnchor::NorthEast), "SW" => Ok(WindowAnchor::SouthWest), "SE" => Ok(WindowAnchor::SouthEast), - _ => Err(ParseError::InvalidWindowAnchor(value_str.into())), + _ => Err(ParseError::WindowAnchor(value_str.into())), } } fn parse_win_float_pos(win_float_pos_arguments: Vec) -> Result { - let values = [ - Value::Nil, - Value::Nil, - Value::Nil, - Value::Nil, - Value::Nil, - Value::Nil, - Value::Nil, - Value::Nil, - ]; - let [grid, _window, anchor, anchor_grid, anchor_row, anchor_column, focusable, z_index] = - extract_values(win_float_pos_arguments, values)?; - - Ok(RedrawEvent::WindowFloatPosition { - grid: parse_u64(grid)?, - anchor: parse_window_anchor(anchor)?, - anchor_grid: parse_u64(anchor_grid)?, - anchor_row: parse_f64(anchor_row)?, - anchor_column: parse_f64(anchor_column)?, - focusable: parse_bool(focusable)?, - z_index: parse_i64(z_index)?, - }) + if win_float_pos_arguments.len() == 8 { + let values = [ + Value::Nil, + Value::Nil, + Value::Nil, + Value::Nil, + Value::Nil, + Value::Nil, + Value::Nil, + Value::Nil, + ]; + + let [grid, _window, anchor, anchor_grid, anchor_row, anchor_column, focusable, sort_order] = + extract_values(win_float_pos_arguments, values)?; + + Ok(RedrawEvent::WindowFloatPosition { + grid: parse_u64(grid)?, + anchor: parse_window_anchor(anchor)?, + anchor_grid: parse_u64(anchor_grid)?, + anchor_row: parse_f64(anchor_row)?, + anchor_column: parse_f64(anchor_column)?, + focusable: parse_bool(focusable)?, + sort_order: Some(parse_u64(sort_order)?), + }) + } else { + let values = [ + Value::Nil, + Value::Nil, + Value::Nil, + Value::Nil, + Value::Nil, + Value::Nil, + Value::Nil, + ]; + + let [grid, _window, anchor, anchor_grid, anchor_row, anchor_column, focusable] = + extract_values(win_float_pos_arguments, values)?; + + Ok(RedrawEvent::WindowFloatPosition { + grid: parse_u64(grid)?, + anchor: parse_window_anchor(anchor)?, + anchor_grid: parse_u64(anchor_grid)?, + anchor_row: parse_f64(anchor_row)?, + anchor_column: parse_f64(anchor_column)?, + focusable: parse_bool(focusable)?, + sort_order: None, + }) + } } fn parse_win_external_pos(win_external_pos_arguments: Vec) -> Result { @@ -896,7 +925,7 @@ pub fn parse_redraw_event(event_value: Value) -> Result> { let mut event_contents = parse_array(event_value)?.into_iter(); let event_name = event_contents .next() - .ok_or(ParseError::InvalidFormat) + .ok_or_else(|| ParseError::Format(format!("{:?}", event_contents))) .and_then(parse_string)?; let events = event_contents; @@ -960,7 +989,7 @@ pub fn parse_channel_stream_type(channel_stream_value: Value) -> Result Ok(ChannelStreamType::Stderr), "socket" => Ok(ChannelStreamType::Socket), "job" => Ok(ChannelStreamType::Job), - _ => Err(ParseError::InvalidFormat), + stream_type => Err(ParseError::Format(format!("{:?}", stream_type))), } } @@ -969,7 +998,7 @@ pub fn parse_channel_mode(channel_mode_value: Value) -> Result { "bytes" => Ok(ChannelMode::Bytes), "terminal" => Ok(ChannelMode::Terminal), "rpc" => Ok(ChannelMode::Rpc), - _ => Err(ParseError::InvalidFormat), + channel_mode => Err(ParseError::Format(format!("{:?}", channel_mode))), } } @@ -1003,7 +1032,7 @@ pub fn parse_client_type(client_type_value: Value) -> Result { "embedder" => Ok(ClientType::Embedder), "host" => Ok(ClientType::Host), "plugin" => Ok(ClientType::Plugin), - _ => Err(ParseError::InvalidFormat), + client_type => Err(ParseError::Format(format!("{:?}", client_type))), } } diff --git a/src/bridge/handler.rs b/src/bridge/handler.rs index 3a75544..82094a4 100644 --- a/src/bridge/handler.rs +++ b/src/bridge/handler.rs @@ -1,7 +1,6 @@ use std::sync::Arc; use async_trait::async_trait; -use crossfire::mpsc::TxUnbounded; use log::trace; use nvim_rs::{Handler, Neovim}; use parking_lot::Mutex; @@ -11,19 +10,20 @@ use tokio::task; use super::events::{parse_redraw_event, RedrawEvent}; use super::ui_commands::UiCommand; use crate::bridge::TxWrapper; +use crate::channel_utils::*; use crate::error_handling::ResultPanicExplanation; use crate::settings::SETTINGS; #[derive(Clone)] pub struct NeovimHandler { - ui_command_sender: Arc>>, - redraw_event_sender: Arc>>, + ui_command_sender: Arc>>, + redraw_event_sender: Arc>>, } impl NeovimHandler { pub fn new( - ui_command_sender: TxUnbounded, - redraw_event_sender: TxUnbounded, + ui_command_sender: LoggingTx, + redraw_event_sender: LoggingTx, ) -> NeovimHandler { NeovimHandler { ui_command_sender: Arc::new(Mutex::new(ui_command_sender)), diff --git a/src/bridge/mod.rs b/src/bridge/mod.rs index f1d7c47..41147c5 100644 --- a/src/bridge/mod.rs +++ b/src/bridge/mod.rs @@ -4,24 +4,25 @@ mod handler; mod tx_wrapper; mod ui_commands; -use std::env; use std::path::Path; use std::process::Stdio; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; -use crossfire::mpsc::{RxUnbounded, TxUnbounded}; +use crossfire::mpsc::RxUnbounded; use log::{error, info, warn}; use nvim_rs::UiAttachOptions; use rmpv::Value; use tokio::process::Command; use tokio::runtime::Runtime; -use crate::error_handling::ResultPanicExplanation; +use crate::channel_utils::*; use crate::settings::*; use crate::window::window_geometry_or_default; +use crate::{cmd_line::CmdLineSettings, error_handling::ResultPanicExplanation}; pub use events::*; use handler::NeovimHandler; +use regex::Regex; pub use tx_wrapper::{TxWrapper, WrapTx}; pub use ui_commands::UiCommand; @@ -32,7 +33,7 @@ fn set_windows_creation_flags(cmd: &mut Command) { #[cfg(windows)] fn platform_build_nvim_cmd(bin: &str) -> Option { - if env::args().any(|arg| arg == "--wsl") { + if SETTINGS.get::().wsl { let mut cmd = Command::new("wsl"); cmd.args(&[ bin.trim(), @@ -57,7 +58,7 @@ fn platform_build_nvim_cmd(bin: &str) -> Option { } fn build_nvim_cmd() -> Command { - if let Ok(path) = env::var("NEOVIM_BIN") { + if let Some(path) = SETTINGS.get::().neovim_bin { if let Some(cmd) = platform_build_nvim_cmd(&path) { return cmd; } else { @@ -65,7 +66,7 @@ fn build_nvim_cmd() -> Command { } } #[cfg(windows)] - if env::args().any(|arg| arg == "--wsl") { + if SETTINGS.get::().wsl { if let Ok(output) = std::process::Command::new("wsl") .args(&["bash", "-ic", "which nvim"]) .output() @@ -125,7 +126,10 @@ pub fn create_nvim_command() -> Command { let mut cmd = build_nvim_cmd(); cmd.arg("--embed") - .args(SETTINGS.neovim_arguments.iter().skip(1)); + .args(SETTINGS.get::().neovim_args.iter()) + .args(SETTINGS.get::().files_to_open.iter()); + + info!("Starting neovim with: {:?}", cmd); #[cfg(not(debug_assertions))] cmd.stderr(Stdio::piped()); @@ -145,20 +149,17 @@ enum ConnectionMode { } fn connection_mode() -> ConnectionMode { - let tcp_prefix = "--remote-tcp="; - - if let Some(arg) = std::env::args().find(|arg| arg.starts_with(tcp_prefix)) { - let input = &arg[tcp_prefix.len()..]; - ConnectionMode::RemoteTcp(input.to_owned()) + if let Some(arg) = SETTINGS.get::().remote_tcp { + ConnectionMode::RemoteTcp(arg) } else { ConnectionMode::Child } } async fn start_neovim_runtime( - ui_command_sender: TxUnbounded, + ui_command_sender: LoggingTx, ui_command_receiver: RxUnbounded, - redraw_event_sender: TxUnbounded, + redraw_event_sender: LoggingTx, running: Arc, ) { let (width, height) = window_geometry_or_default(); @@ -189,13 +190,14 @@ async fn start_neovim_runtime( close_watcher_running.store(false, Ordering::Relaxed); }); - if let Ok(Value::Integer(correct_version)) = nvim.eval("has(\"nvim-0.4\")").await { - if correct_version.as_i64() != Some(1) { - error!("Neovide requires version 0.4 or higher"); + if let Ok(output) = nvim.command_output("version").await { + let re = Regex::new(r"NVIM v0.[4-9]\d*.\d+").unwrap(); + if !re.is_match(&output) { + error!("Neovide requires nvim version 0.4 or higher. Download the latest version here https://github.com/neovim/neovim/wiki/Installing-Neovim"); std::process::exit(0); } } else { - error!("Neovide requires version 0.4 or higher"); + error!("Neovide requires nvim version 0.4 or higher. Download the latest version here https://github.com/neovim/neovim/wiki/Installing-Neovim"); std::process::exit(0); }; @@ -276,7 +278,8 @@ async fn start_neovim_runtime( let mut options = UiAttachOptions::new(); options.set_linegrid_external(true); - if env::args().any(|arg| arg == "--multiGrid") || env::var("NeovideMultiGrid").is_ok() { + + if SETTINGS.get::().multi_grid { options.set_multigrid_external(true); } options.set_rgb(true); @@ -320,9 +323,9 @@ pub struct Bridge { } pub fn start_bridge( - ui_command_sender: TxUnbounded, + ui_command_sender: LoggingTx, ui_command_receiver: RxUnbounded, - redraw_event_sender: TxUnbounded, + redraw_event_sender: LoggingTx, running: Arc, ) -> Bridge { let runtime = Runtime::new().unwrap(); diff --git a/src/bridge/ui_commands.rs b/src/bridge/ui_commands.rs index c3fdc4a..4d501bb 100644 --- a/src/bridge/ui_commands.rs +++ b/src/bridge/ui_commands.rs @@ -14,6 +14,7 @@ use crate::windows_utils::{ #[derive(Debug, Clone)] pub enum UiCommand { + Quit, Resize { width: u32, height: u32, @@ -45,6 +46,9 @@ pub enum UiCommand { impl UiCommand { pub async fn execute(self, nvim: &Neovim) { match self { + UiCommand::Quit => { + nvim.command("qa!").await.ok(); + } UiCommand::Resize { width, height } => nvim .ui_try_resize(width.max(10) as i64, height.max(3) as i64) .await diff --git a/src/channel_utils.rs b/src/channel_utils.rs new file mode 100644 index 0000000..edb8807 --- /dev/null +++ b/src/channel_utils.rs @@ -0,0 +1,54 @@ +use std::fmt::Debug; +use std::sync::mpsc::{SendError, Sender}; + +use crossfire::mpsc::{SendError as TxError, TxUnbounded}; +use log::trace; + +#[derive(Clone)] +pub struct LoggingSender +where + T: Debug, +{ + sender: Sender, + channel_name: String, +} + +impl LoggingSender +where + T: Debug, +{ + pub fn attach(sender: Sender, channel_name: String) -> Self { + Self { + sender, + channel_name, + } + } + + pub fn send(&self, message: T) -> Result<(), SendError> { + trace!("{} {:?}", self.channel_name, &message); + self.sender.send(message) + } +} + +#[derive(Clone)] +pub struct LoggingTx +where + T: Debug, +{ + tx: TxUnbounded, + channel_name: String, +} + +impl LoggingTx +where + T: Debug, +{ + pub fn attach(tx: TxUnbounded, channel_name: String) -> Self { + Self { tx, channel_name } + } + + pub fn send(&self, message: T) -> Result<(), TxError> { + trace!("{} {:?}", self.channel_name, &message); + self.tx.send(message) + } +} diff --git a/src/cmd_line.rs b/src/cmd_line.rs new file mode 100644 index 0000000..1751902 --- /dev/null +++ b/src/cmd_line.rs @@ -0,0 +1,136 @@ +use crate::settings::*; + +use clap::{App, Arg}; + +#[derive(Clone, Debug)] +pub struct CmdLineSettings { + pub verbosity: u64, + pub log_to_file: bool, + pub neovim_args: Vec, + pub neovim_bin: Option, + pub files_to_open: Vec, + + pub disowned: bool, + pub geometry: Option, + pub wsl: bool, + pub remote_tcp: Option, + pub multi_grid: bool, + pub maximized: bool, + pub frameless: bool, +} + +impl Default for CmdLineSettings { + fn default() -> Self { + Self { + neovim_bin: None, + verbosity: 0, + log_to_file: false, + neovim_args: vec![], + files_to_open: vec![], + disowned: false, + geometry: None, + wsl: false, + remote_tcp: None, + multi_grid: false, + maximized: false, + frameless: false, + } + } +} + +pub fn handle_command_line_arguments() { + let clapp = App::new("Neovide") + .version(crate_version!()) + .author(crate_authors!()) + .about(crate_description!()) + .arg( + Arg::with_name("verbosity") + .short("v") + .multiple(true) + .help("Set the level of verbosity"), + ) + .arg( + Arg::with_name("log_to_file") + .long("log") + .help("Log to a file"), + ) + .arg( + Arg::with_name("disowned") + .long("disowned") + .help("Disown the process. (only on macos)"), + ) + .arg( + Arg::with_name("maximized") + .long("maximized") + .help("Maximize the window"), + ) + .arg( + Arg::with_name("multi_grid") + //.long("multi-grid") TODO: multiGrid is the current way to call this, but I + //personally would prefer sticking to a unix-y way of naming things... + .long("multiGrid") + .help("Enable Multigrid"), + ) + .arg( + Arg::with_name("frameless") + .long("frameless") + .help("Removes the window frame. NOTE: Window might not be resizable after this setting is enabled.") + ) + .arg(Arg::with_name("wsl").long("wsl").help("Run in WSL")) + .arg( + Arg::with_name("remote_tcp") + .long("remote-tcp") + .takes_value(true) + .help("Connect to Remote TCP"), + ) + .arg( + Arg::with_name("geometry") + .long("geometry") + .takes_value(true) + .help("Specify the Geometry of the window"), + ) + .arg( + Arg::with_name("files") + .multiple(true) + .takes_value(true) + .help("Specify the Geometry of the window"), + ) + .arg( + Arg::with_name("neovim_args") + .multiple(true) + .takes_value(true) + .last(true) + .help("Specify Arguments to pass down to neovim"), + ); + + let matches = clapp.get_matches(); + + /* + * Integrate Environment Variables as Defaults to the command-line ones. + * + * NEOVIM_BIN + * NeovideMultiGrid || --multiGrid + */ + SETTINGS.set::(&CmdLineSettings { + neovim_bin: std::env::var("NEOVIM_BIN").ok(), + neovim_args: matches + .values_of("neovim_args") + .map(|opt| opt.map(|v| v.to_owned()).collect()) + .unwrap_or_default(), + verbosity: matches.occurrences_of("verbosity"), + log_to_file: matches.is_present("log_to_file"), + files_to_open: matches + .values_of("files") + .map(|opt| opt.map(|v| v.to_owned()).collect()) + .unwrap_or_default(), + maximized: matches.is_present("maximized") || std::env::var("NEOVIDE_MAXIMIZED").is_ok(), + multi_grid: std::env::var("NEOVIDE_MULTIGRID").is_ok() + || std::env::var("NeovideMultiGrid").is_ok() + || matches.is_present("multi_grid"), + remote_tcp: matches.value_of("remote_tcp").map(|i| i.to_owned()), + disowned: matches.is_present("disowned"), + wsl: matches.is_present("wsl"), + geometry: matches.value_of("geometry").map(|i| i.to_owned()), + frameless: matches.is_present("frameless") || std::env::var("NEOVIDE_FRAMELESS").is_ok(), + }); +} diff --git a/src/editor/cursor.rs b/src/editor/cursor.rs index 5900097..4040e5a 100644 --- a/src/editor/cursor.rs +++ b/src/editor/cursor.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use std::sync::Arc; -use skulpin::skia_safe::Color4f; +use skia_safe::Color4f; use super::style::{Colors, Style}; @@ -70,10 +70,9 @@ impl Cursor { style .colors .foreground - .clone() - .unwrap_or_else(|| default_colors.background.clone().unwrap()) + .unwrap_or_else(|| default_colors.background.unwrap()) } else { - default_colors.background.clone().unwrap() + default_colors.background.unwrap() } } @@ -82,10 +81,9 @@ impl Cursor { style .colors .background - .clone() - .unwrap_or_else(|| default_colors.foreground.clone().unwrap()) + .unwrap_or_else(|| default_colors.foreground.unwrap()) } else { - default_colors.foreground.clone().unwrap() + default_colors.foreground.unwrap() } } @@ -159,18 +157,18 @@ mod tests { assert_eq!( cursor.foreground(&DEFAULT_COLORS), - DEFAULT_COLORS.background.clone().unwrap() + DEFAULT_COLORS.background.unwrap() ); cursor.style = style.clone(); assert_eq!( cursor.foreground(&DEFAULT_COLORS), - COLORS.foreground.clone().unwrap() + COLORS.foreground.unwrap() ); cursor.style = Some(Arc::new(Style::new(NONE_COLORS))); assert_eq!( cursor.foreground(&DEFAULT_COLORS), - DEFAULT_COLORS.background.clone().unwrap() + DEFAULT_COLORS.background.unwrap() ); } @@ -181,18 +179,18 @@ mod tests { assert_eq!( cursor.background(&DEFAULT_COLORS), - DEFAULT_COLORS.foreground.clone().unwrap() + DEFAULT_COLORS.foreground.unwrap() ); cursor.style = style.clone(); assert_eq!( cursor.background(&DEFAULT_COLORS), - COLORS.background.clone().unwrap() + COLORS.background.unwrap() ); cursor.style = Some(Arc::new(Style::new(NONE_COLORS))); assert_eq!( cursor.background(&DEFAULT_COLORS), - DEFAULT_COLORS.foreground.clone().unwrap() + DEFAULT_COLORS.foreground.unwrap() ); } diff --git a/src/editor/draw_command_batcher.rs b/src/editor/draw_command_batcher.rs index 8fef22e..d9f01d9 100644 --- a/src/editor/draw_command_batcher.rs +++ b/src/editor/draw_command_batcher.rs @@ -1,16 +1,17 @@ use std::sync::mpsc::{channel, Receiver, SendError, Sender}; use super::DrawCommand; +use crate::channel_utils::*; pub struct DrawCommandBatcher { window_draw_command_sender: Sender, window_draw_command_receiver: Receiver, - batched_draw_command_sender: Sender>, + batched_draw_command_sender: LoggingSender>, } impl DrawCommandBatcher { - pub fn new(batched_draw_command_sender: Sender>) -> DrawCommandBatcher { + pub fn new(batched_draw_command_sender: LoggingSender>) -> DrawCommandBatcher { let (sender, receiver) = channel(); DrawCommandBatcher { diff --git a/src/editor/grid.rs b/src/editor/grid.rs index 8c7fef1..604c45b 100644 --- a/src/editor/grid.rs +++ b/src/editor/grid.rs @@ -2,7 +2,14 @@ use std::sync::Arc; use super::style::Style; -pub type GridCell = Option<(String, Option>)>; +pub type GridCell = (String, Option>); + +#[macro_export] +macro_rules! default_cell { + () => { + (" ".to_owned(), None) + }; +} pub struct CharacterGrid { pub width: u64, @@ -16,7 +23,7 @@ impl CharacterGrid { let (width, height) = size; let cell_count = (width * height) as usize; CharacterGrid { - characters: vec![None; cell_count], + characters: vec![default_cell!(); cell_count], width, height, } @@ -24,8 +31,7 @@ impl CharacterGrid { pub fn resize(&mut self, width: u64, height: u64) { let new_cell_count = (width * height) as usize; - let default_cell: GridCell = None; - let mut new_characters = vec![default_cell; new_cell_count]; + let mut new_characters = vec![default_cell!(); new_cell_count]; for x in 0..self.width.min(width) { for y in 0..self.height.min(height) { @@ -41,7 +47,7 @@ impl CharacterGrid { } pub fn clear(&mut self) { - self.set_characters_all(None); + self.set_all_characters(default_cell!()); } fn cell_index(&self, x: u64, y: u64) -> Option { @@ -61,12 +67,10 @@ impl CharacterGrid { .map(move |idx| &mut self.characters[idx]) } - pub fn set_characters_all(&mut self, value: GridCell) { + pub fn set_all_characters(&mut self, value: GridCell) { self.characters.clear(); self.characters - .resize_with((self.width * self.height) as usize, || { - value.as_ref().cloned() - }); + .resize_with((self.width * self.height) as usize, || value.clone()); } pub fn row(&self, row_index: u64) -> Option<&[GridCell]> { @@ -123,25 +127,28 @@ mod tests { } #[test] - fn test_new() { + fn new_constructsGrid() { let context = Context::new(); // RUN FUNCTION let character_grid = CharacterGrid::new(context.size); assert_eq!(character_grid.width, context.size.0); assert_eq!(character_grid.height, context.size.1); - assert_eq!(character_grid.characters, vec![None; context.area]); + assert_eq!( + character_grid.characters, + vec![default_cell!(); context.area] + ); } #[test] - fn test_get_cell() { + fn getCell_returnsExpectedCell() { let context = Context::new(); let mut character_grid = CharacterGrid::new(context.size); - character_grid.characters[context.index] = Some(( + character_grid.characters[context.index] = ( "foo".to_string(), Some(Arc::new(Style::new(context.none_colors.clone()))), - )); + ); let result = ( "foo".to_string(), Some(Arc::new(Style::new(context.none_colors.clone()))), @@ -149,24 +156,20 @@ mod tests { // RUN FUNCTION assert_eq!( - character_grid - .get_cell(context.x, context.y) - .unwrap() - .as_ref() - .unwrap(), + character_grid.get_cell(context.x, context.y).unwrap(), &result ); } #[test] - fn test_get_cell_mut() { + fn getCellMut_modifiersGridProperly() { let context = Context::new(); let mut character_grid = CharacterGrid::new(context.size); - character_grid.characters[context.index] = Some(( + character_grid.characters[context.index] = ( "foo".to_string(), Some(Arc::new(Style::new(context.none_colors.clone()))), - )); + ); let result = ( "bar".to_string(), Some(Arc::new(Style::new(context.none_colors.clone()))), @@ -174,32 +177,28 @@ mod tests { // RUN FUNCTION let cell = character_grid.get_cell_mut(context.x, context.y).unwrap(); - *cell = Some(( + *cell = ( "bar".to_string(), Some(Arc::new(Style::new(context.none_colors.clone()))), - )); + ); assert_eq!( - character_grid - .get_cell_mut(context.x, context.y) - .unwrap() - .as_ref() - .unwrap(), + character_grid.get_cell_mut(context.x, context.y).unwrap(), &result ); } #[test] - fn test_set_characters_all() { + fn setAllCharacters_setsAllCellsToGivenCharacter() { let context = Context::new(); - let grid_cell = Some(( + let grid_cell = ( "foo".to_string(), Some(Arc::new(Style::new(context.none_colors))), - )); + ); let mut character_grid = CharacterGrid::new(context.size); // RUN FUNCTION - character_grid.set_characters_all(grid_cell.clone()); + character_grid.set_all_characters(grid_cell.clone()); assert_eq!( character_grid.characters, vec![grid_cell.clone(); context.area] @@ -207,14 +206,14 @@ mod tests { } #[test] - fn test_clear() { + fn clear_emptiesBuffer() { let context = Context::new(); let mut character_grid = CharacterGrid::new(context.size); - let grid_cell = Some(( + let grid_cell = ( "foo".to_string(), Some(Arc::new(Style::new(context.none_colors))), - )); + ); character_grid.characters = vec![grid_cell.clone(); context.area]; // RUN FUNCTION @@ -222,11 +221,14 @@ mod tests { assert_eq!(character_grid.width, context.size.0); assert_eq!(character_grid.height, context.size.1); - assert_eq!(character_grid.characters, vec![None; context.area]); + assert_eq!( + character_grid.characters, + vec![default_cell!(); context.area] + ); } #[test] - fn test_resize() { + fn resize_clearsAndResizesGrid() { let context = Context::new(); let mut character_grid = CharacterGrid::new(context.size); let (width, height) = ( @@ -234,10 +236,10 @@ mod tests { (thread_rng().gen::() % 500) + 1, ); - let grid_cell = Some(( + let grid_cell = ( "foo".to_string(), Some(Arc::new(Style::new(context.none_colors))), - )); + ); character_grid.characters = vec![grid_cell.clone(); context.area]; // RUN FUNCTION @@ -255,7 +257,7 @@ mod tests { for x in original_width..width { for y in original_height..height { - assert_eq!(character_grid.get_cell(x, y).unwrap(), &None); + assert_eq!(character_grid.get_cell(x, y).unwrap(), &default_cell!()); } } } diff --git a/src/editor/mod.rs b/src/editor/mod.rs index 04738af..e35b0f4 100644 --- a/src/editor/mod.rs +++ b/src/editor/mod.rs @@ -6,14 +6,14 @@ mod window; use std::collections::HashMap; use std::fmt; -use std::sync::mpsc::Sender; use std::sync::Arc; use std::thread; use crossfire::mpsc::RxUnbounded; -use log::{error, trace, warn}; +use log::{error, trace}; use crate::bridge::{EditorMode, GuiOption, RedrawEvent, WindowAnchor}; +use crate::channel_utils::*; use crate::redraw_scheduler::REDRAW_SCHEDULER; pub use cursor::{Cursor, CursorMode, CursorShape}; pub use draw_command_batcher::DrawCommandBatcher; @@ -21,11 +21,13 @@ pub use grid::CharacterGrid; pub use style::{Colors, Style}; pub use window::*; +#[derive(Clone)] pub struct AnchorInfo { pub anchor_grid_id: u64, pub anchor_type: WindowAnchor, pub anchor_left: f64, pub anchor_top: f64, + pub sort_order: u64, } impl WindowAnchor { @@ -57,6 +59,7 @@ pub enum DrawCommand { ModeChanged(EditorMode), } +#[derive(Debug)] pub enum WindowCommand { TitleChanged(String), SetMouseEnabled(bool), @@ -83,13 +86,13 @@ pub struct Editor { pub defined_styles: HashMap>, pub mode_list: Vec, pub draw_command_batcher: Arc, - pub window_command_sender: Sender, + pub window_command_sender: LoggingSender, } impl Editor { pub fn new( - batched_draw_command_sender: Sender>, - window_command_sender: Sender, + batched_draw_command_sender: LoggingSender>, + window_command_sender: LoggingSender, ) -> Editor { Editor { windows: HashMap::new(), @@ -208,8 +211,16 @@ impl Editor { anchor_grid, anchor_column: anchor_left, anchor_row: anchor_top, + sort_order, .. - } => self.set_window_float_position(grid, anchor_grid, anchor, anchor_left, anchor_top), + } => self.set_window_float_position( + grid, + anchor_grid, + anchor, + anchor_left, + anchor_top, + sort_order, + ), RedrawEvent::WindowHide { grid } => { let window = self.windows.get(&grid); if let Some(window) = window { @@ -240,7 +251,7 @@ impl Editor { } fn resize_window(&mut self, grid: u64, width: u64, height: u64) { - warn!("editor resize {}", grid); + trace!("editor resize {}", grid); if let Some(window) = self.windows.get_mut(&grid) { window.resize(width, height); } else { @@ -265,7 +276,6 @@ impl Editor { width: u64, height: u64, ) { - warn!("position {}", grid); if let Some(window) = self.windows.get_mut(&grid) { window.position(width, height, None, start_left as f64, start_top as f64); window.show(); @@ -290,8 +300,8 @@ impl Editor { anchor_type: WindowAnchor, anchor_left: f64, anchor_top: f64, + sort_order: Option, ) { - warn!("floating position {}", grid); let parent_position = self.get_window_top_left(anchor_grid); if let Some(window) = self.windows.get_mut(&grid) { let width = window.get_width(); @@ -312,6 +322,7 @@ impl Editor { anchor_type, anchor_left, anchor_top, + sort_order: sort_order.unwrap_or(grid), }), modified_left, modified_top, @@ -323,7 +334,6 @@ impl Editor { } fn set_message_position(&mut self, grid: u64, grid_top: u64) { - warn!("message position {}", grid); let parent_width = self .windows .get(&1) @@ -335,6 +345,7 @@ impl Editor { anchor_type: WindowAnchor::NorthWest, anchor_left: 0.0, anchor_top: grid_top as f64, + sort_order: std::u64::MAX, }; if let Some(window) = self.windows.get_mut(&grid) { @@ -422,15 +433,15 @@ impl Editor { if let Some(window) = self.windows.get_mut(&grid) { window.update_viewport(top_line, bottom_line); } else { - warn!("viewport event received before window initialized"); + trace!("viewport event received before window initialized"); } } } pub fn start_editor( redraw_event_receiver: RxUnbounded, - batched_draw_command_sender: Sender>, - window_command_sender: Sender, + batched_draw_command_sender: LoggingSender>, + window_command_sender: LoggingSender, ) { thread::spawn(move || { let mut editor = Editor::new(batched_draw_command_sender, window_command_sender); diff --git a/src/editor/style.rs b/src/editor/style.rs index cfe59d5..6870482 100644 --- a/src/editor/style.rs +++ b/src/editor/style.rs @@ -1,4 +1,4 @@ -use skulpin::skia_safe::Color4f; +use skia_safe::Color4f; #[derive(new, PartialEq, Debug, Clone)] pub struct Colors { @@ -31,13 +31,11 @@ impl Style { if self.reverse { self.colors .background - .clone() - .unwrap_or_else(|| default_colors.background.clone().unwrap()) + .unwrap_or_else(|| default_colors.background.unwrap()) } else { self.colors .foreground - .clone() - .unwrap_or_else(|| default_colors.foreground.clone().unwrap()) + .unwrap_or_else(|| default_colors.foreground.unwrap()) } } @@ -45,21 +43,18 @@ impl Style { if self.reverse { self.colors .foreground - .clone() - .unwrap_or_else(|| default_colors.foreground.clone().unwrap()) + .unwrap_or_else(|| default_colors.foreground.unwrap()) } else { self.colors .background - .clone() - .unwrap_or_else(|| default_colors.background.clone().unwrap()) + .unwrap_or_else(|| default_colors.background.unwrap()) } } pub fn special(&self, default_colors: &Colors) -> Color4f { self.colors .special - .clone() - .unwrap_or_else(|| default_colors.special.clone().unwrap()) + .unwrap_or_else(|| default_colors.special.unwrap()) } } @@ -85,12 +80,12 @@ mod tests { assert_eq!( style.foreground(&DEFAULT_COLORS), - COLORS.foreground.clone().unwrap() + COLORS.foreground.unwrap() ); style.colors.foreground = None; assert_eq!( style.foreground(&DEFAULT_COLORS), - DEFAULT_COLORS.foreground.clone().unwrap() + DEFAULT_COLORS.foreground.unwrap() ); } @@ -101,12 +96,12 @@ mod tests { assert_eq!( style.foreground(&DEFAULT_COLORS), - COLORS.background.clone().unwrap() + COLORS.background.unwrap() ); style.colors.background = None; assert_eq!( style.foreground(&DEFAULT_COLORS), - DEFAULT_COLORS.background.clone().unwrap() + DEFAULT_COLORS.background.unwrap() ); } @@ -116,12 +111,12 @@ mod tests { assert_eq!( style.background(&DEFAULT_COLORS), - COLORS.background.clone().unwrap() + COLORS.background.unwrap() ); style.colors.background = None; assert_eq!( style.background(&DEFAULT_COLORS), - DEFAULT_COLORS.background.clone().unwrap() + DEFAULT_COLORS.background.unwrap() ); } @@ -132,12 +127,12 @@ mod tests { assert_eq!( style.background(&DEFAULT_COLORS), - COLORS.foreground.clone().unwrap() + COLORS.foreground.unwrap() ); style.colors.foreground = None; assert_eq!( style.background(&DEFAULT_COLORS), - DEFAULT_COLORS.foreground.clone().unwrap() + DEFAULT_COLORS.foreground.unwrap() ); } @@ -145,14 +140,11 @@ mod tests { fn test_special() { let mut style = Style::new(COLORS); - assert_eq!( - style.special(&DEFAULT_COLORS), - COLORS.special.clone().unwrap() - ); + assert_eq!(style.special(&DEFAULT_COLORS), COLORS.special.unwrap()); style.colors.special = None; assert_eq!( style.special(&DEFAULT_COLORS), - DEFAULT_COLORS.special.clone().unwrap() + DEFAULT_COLORS.special.unwrap() ); } } diff --git a/src/editor/window.rs b/src/editor/window.rs index c9eb181..9fd6476 100644 --- a/src/editor/window.rs +++ b/src/editor/window.rs @@ -1,5 +1,4 @@ use std::collections::HashMap; -use std::fmt; use std::sync::Arc; use log::warn; @@ -10,20 +9,20 @@ use super::style::Style; use super::{AnchorInfo, DrawCommand, DrawCommandBatcher}; use crate::bridge::GridLineCell; -#[derive(new, Clone)] +#[derive(new, Clone, Debug)] pub enum WindowDrawCommand { Position { grid_left: f64, grid_top: f64, width: u64, height: u64, - floating: bool, + floating_order: Option, }, - Cell { - text: String, - cell_width: u64, + Cells { + cells: Vec, window_left: u64, window_top: u64, + width: u64, style: Option>, }, Scroll { @@ -44,36 +43,6 @@ pub enum WindowDrawCommand { }, } -impl fmt::Debug for WindowDrawCommand { - fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - WindowDrawCommand::Position { - grid_left, - grid_top, - .. - } => write!( - formatter, - "Position {{ left: {}, right: {} }}", - grid_left, grid_top - ), - WindowDrawCommand::Cell { .. } => write!(formatter, "Cell"), - WindowDrawCommand::Scroll { .. } => write!(formatter, "Scroll"), - WindowDrawCommand::Clear => write!(formatter, "Clear"), - WindowDrawCommand::Show => write!(formatter, "Show"), - WindowDrawCommand::Hide => write!(formatter, "Hide"), - WindowDrawCommand::Close => write!(formatter, "Close"), - WindowDrawCommand::Viewport { - top_line, - bottom_line, - } => write!( - formatter, - "Viewport {{ top: {}, bottom: {} }}", - top_line, bottom_line - ), - } - } -} - pub struct Window { grid_id: u64, grid: CharacterGrid, @@ -123,18 +92,18 @@ impl Window { grid_top: self.grid_top, width: self.grid.width, height: self.grid.height, - floating: self.anchor_info.is_some(), + floating_order: self.anchor_info.clone().map(|anchor| anchor.sort_order), }); } pub fn get_cursor_character(&self, window_left: u64, window_top: u64) -> (String, bool) { let character = match self.grid.get_cell(window_left, window_top) { - Some(Some((character, _))) => character.clone(), + Some((character, _)) => character.clone(), _ => ' '.to_string(), }; let double_width = match self.grid.get_cell(window_left + 1, window_top) { - Some(Some((character, _))) => character.is_empty(), + Some((character, _)) => character.is_empty(), _ => false, }; @@ -199,80 +168,58 @@ impl Window { // Insert the contents of the cell into the grid. if text.is_empty() { if let Some(cell) = self.grid.get_cell_mut(*column_pos, row_index) { - *cell = Some((" ".to_string(), style.clone())); + *cell = (text, style.clone()); } *column_pos += 1; } else { - for (i, character) in text.graphemes(true).enumerate() { - if let Some(cell) = self.grid.get_cell_mut(i as u64 + *column_pos, row_index) { - *cell = Some((character.to_string(), style.clone())); + for character in text.graphemes(true) { + if let Some(cell) = self.grid.get_cell_mut(*column_pos, row_index) { + *cell = (character.to_string(), style.clone()); } + *column_pos += 1; } - *column_pos += text.graphemes(true).count() as u64; } *previous_style = style; } // Send a draw command for the given row starting from current_start up until the next style - // change. If the current_start is the same as line_start, this will also work backwards in the - // line in order to ensure that ligatures before the beginning of the grid cell are also - // updated. - fn send_draw_command( - &self, - row_index: u64, - line_start: u64, - current_start: u64, - ) -> Option { + // change or double width character. + fn send_draw_command(&self, row_index: u64, start: u64) -> Option { let row = self.grid.row(row_index).unwrap(); - let (_, style) = &row[current_start as usize].as_ref()?; - - let mut draw_command_start_index = current_start; - if current_start == line_start { - // Locate contiguous same styled cells before the inserted cells. - // This way any ligatures are correctly rerendered. - // This could be sped up if we knew what characters were a part of a ligature, but in the - // current system we do not. - for possible_start_index in (0..current_start).rev() { - if let Some((_, possible_start_style)) = &row[possible_start_index as usize] { - if style == possible_start_style { - draw_command_start_index = possible_start_index; - continue; - } - } + let (_, style) = &row[start as usize]; + + let mut cells = Vec::new(); + let mut width = 0; + for possible_end_index in start..self.grid.width { + let (character, possible_end_style) = &row[possible_end_index as usize]; + + // Style doesn't match. Draw what we've got + if style != possible_end_style { break; } - } - let mut draw_command_end_index = current_start; - for possible_end_index in draw_command_start_index..self.grid.width { - if let Some((_, possible_end_style)) = &row[possible_end_index as usize] { - if style == possible_end_style { - draw_command_end_index = possible_end_index; - continue; - } + width += 1; + // The previous character is double width, so send this as its own draw command + if character.is_empty() { + break; } - break; - } - // Build up the actual text to be rendered including the contiguously styled bits. - let mut text = String::new(); - for x in draw_command_start_index..(draw_command_end_index + 1) { - let (character, _) = row[x as usize].as_ref().unwrap(); - text.push_str(character); + // Add the grid cell to the cells to render + cells.push(character.clone()); } // Send a window draw command to the current window. - self.send_command(WindowDrawCommand::Cell { - text, - cell_width: draw_command_end_index - draw_command_start_index + 1, - window_left: draw_command_start_index, + self.send_command(WindowDrawCommand::Cells { + cells, + window_left: start, window_top: row_index, + width, style: style.clone(), }); - Some(draw_command_end_index + 1) + Some(start + width) } pub fn draw_grid_line( @@ -295,9 +242,11 @@ impl Window { ); } - let mut current_start = column_start; - while current_start < column_pos { - if let Some(next_start) = self.send_draw_command(row, column_start, current_start) { + // Redraw the participating line by calling send_draw_command starting at 0 + // until current_start is greater than the grid width + let mut current_start = 0; + while current_start < self.grid.width { + if let Some(next_start) = self.send_draw_command(row, current_start) { current_start = next_start; } else { break; @@ -369,7 +318,7 @@ impl Window { for row in 0..self.grid.height { let mut current_start = 0; while current_start < self.grid.width { - if let Some(next_start) = self.send_draw_command(row, 0, current_start) { + if let Some(next_start) = self.send_draw_command(row, current_start) { current_start = next_start; } else { break; @@ -397,3 +346,54 @@ impl Window { }); } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::channel_utils::*; + use std::collections::HashMap; + use std::sync::mpsc::*; + + fn build_test_channels() -> (Receiver>, Arc) { + let (batched_draw_command_sender, batched_draw_command_receiver) = channel(); + let logging_batched_draw_command_sender = LoggingSender::attach( + batched_draw_command_sender, + "batched_draw_command".to_owned(), + ); + + let draw_command_batcher = + Arc::new(DrawCommandBatcher::new(logging_batched_draw_command_sender)); + + (batched_draw_command_receiver, draw_command_batcher) + } + + #[test] + fn windowSeparator_modifiesGridAndSendsDrawCommand() { + let (batched_receiver, batched_sender) = build_test_channels(); + let mut window = Window::new(1, 114, 64, None, 0.0, 0.0, batched_sender.clone()); + batched_sender + .send_batch() + .expect("Could not send batch of commands"); + batched_receiver.recv().expect("Could not receive commands"); + + window.draw_grid_line( + 1, + 70, + vec![GridLineCell { + text: "|".to_owned(), + highlight_id: None, + repeat: None, + }], + &HashMap::new(), + ); + + assert_eq!(window.grid.get_cell(70, 1), Some(&("|".to_owned(), None))); + + batched_sender + .send_batch() + .expect("Could not send batch of commands"); + + let sent_commands = batched_receiver.recv().expect("Could not receive commands"); + assert!(sent_commands.len() != 0); + } +} diff --git a/src/main.rs b/src/main.rs index baed787..8c122d2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,20 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] +#[cfg(not(test))] +use flexi_logger::{Cleanup, Criterion, Duplicate, Logger, Naming}; + +// Test naming occasionally uses camelCase with underscores to separate sections of +// the test name. +#[cfg_attr(test, allow(non_snake_case))] #[macro_use] extern crate neovide_derive; +#[macro_use] +extern crate clap; + mod bridge; +mod channel_utils; +mod cmd_line; mod editor; mod error_handling; mod redraw_scheduler; @@ -24,11 +35,15 @@ use std::sync::{atomic::AtomicBool, mpsc::channel, Arc}; use crossfire::mpsc::unbounded_future; use bridge::start_bridge; +#[cfg(not(test))] +use cmd_line::CmdLineSettings; use editor::start_editor; use renderer::{cursor_renderer::CursorSettings, RendererSettings}; +#[cfg(not(test))] +use settings::SETTINGS; use window::{create_window, window_geometry, KeyboardSettings, WindowSettings}; -use windows_utils::attach_parent_console; +pub use channel_utils::*; pub const INITIAL_DIMENSIONS: (u64, u64) = (100, 50); fn main() { @@ -101,28 +116,21 @@ fn main() { // Multiple other parts of the app "queue_next_frame" function to ensure animations continue // properly or updates to the graphics are pushed to the screen. - if std::env::args().any(|arg| arg == "--version" || arg == "-v") { - attach_parent_console(); - println!("Neovide version: {}", env!("CARGO_PKG_VERSION")); - return; - } - - if std::env::args().any(|arg| arg == "--help" || arg == "-h") { - attach_parent_console(); - println!("Neovide: {}", env!("CARGO_PKG_DESCRIPTION")); - return; - } + cmd_line::handle_command_line_arguments(); //Will exit if -h or -v if let Err(err) = window_geometry() { eprintln!("{}", err); return; } + #[cfg(not(test))] + init_logger(); + #[cfg(target_os = "macos")] { // incase of app bundle, we can just pass --disowned option straight away to bypass this check #[cfg(not(debug_assertions))] - if !std::env::args().any(|f| f == "--disowned") { + if !SETTINGS.get::().disowned { if let Ok(curr_exe) = std::env::current_exe() { assert!(std::process::Command::new(curr_exe) .args(std::env::args().skip(1)) @@ -156,33 +164,72 @@ fn main() { KeyboardSettings::register(); WindowSettings::register(); - redraw_scheduler::RedrawSettings::register(); RendererSettings::register(); CursorSettings::register(); let running = Arc::new(AtomicBool::new(true)); let (redraw_event_sender, redraw_event_receiver) = unbounded_future(); + let logging_redraw_event_sender = + LoggingTx::attach(redraw_event_sender, "redraw_event".to_owned()); + let (batched_draw_command_sender, batched_draw_command_receiver) = channel(); + let logging_batched_draw_command_sender = LoggingSender::attach( + batched_draw_command_sender, + "batched_draw_command".to_owned(), + ); + let (ui_command_sender, ui_command_receiver) = unbounded_future(); + let logging_ui_command_sender = LoggingTx::attach(ui_command_sender, "ui_command".to_owned()); + let (window_command_sender, window_command_receiver) = channel(); + let logging_window_command_sender = + LoggingSender::attach(window_command_sender, "window_command".to_owned()); // We need to keep the bridge reference around to prevent the tokio runtime from getting freed let _bridge = start_bridge( - ui_command_sender.clone(), + logging_ui_command_sender.clone(), ui_command_receiver, - redraw_event_sender, + logging_redraw_event_sender, running.clone(), ); start_editor( redraw_event_receiver, - batched_draw_command_sender, - window_command_sender, + logging_batched_draw_command_sender, + logging_window_command_sender, ); create_window( batched_draw_command_receiver, window_command_receiver, - ui_command_sender, + logging_ui_command_sender, running, ); } + +#[cfg(not(test))] +pub fn init_logger() { + let verbosity = match SETTINGS.get::().verbosity { + 0 => "warn", + 1 => "info", + 2 => "debug", + _ => "trace", + }; + let log_to_file = SETTINGS.get::().log_to_file; + + if log_to_file { + Logger::with_env_or_str("neovide") + .duplicate_to_stderr(Duplicate::Error) + .log_to_file() + .rotate( + Criterion::Size(10_000_000), + Naming::Timestamps, + Cleanup::KeepLogFiles(1), + ) + .start() + .expect("Could not start logger"); + } else { + Logger::with_env_or_str(format!("neovide = {}", verbosity)) + .start() + .expect("Could not start logger"); + } +} diff --git a/src/redraw_scheduler.rs b/src/redraw_scheduler.rs index ec261d6..4784591 100644 --- a/src/redraw_scheduler.rs +++ b/src/redraw_scheduler.rs @@ -1,10 +1,10 @@ -use std::sync::atomic::{AtomicU16, Ordering}; +use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Mutex; use std::time::Instant; use log::trace; -use crate::settings::*; +use crate::{cmd_line::CmdLineSettings, settings::*}; lazy_static! { pub static ref REDRAW_SCHEDULER: RedrawScheduler = RedrawScheduler::new(); @@ -19,7 +19,8 @@ impl Default for RedrawSettings { fn default() -> Self { Self { extra_buffer_frames: if SETTINGS - .neovim_arguments + .get::() + .neovim_args .contains(&"--extraBufferFrames".to_string()) { 60 @@ -31,15 +32,15 @@ impl Default for RedrawSettings { } pub struct RedrawScheduler { - frames_queued: AtomicU16, scheduled_frame: Mutex>, + frame_queued: AtomicBool, } impl RedrawScheduler { pub fn new() -> RedrawScheduler { RedrawScheduler { - frames_queued: AtomicU16::new(1), scheduled_frame: Mutex::new(None), + frame_queued: AtomicBool::new(true), } } @@ -58,18 +59,12 @@ impl RedrawScheduler { pub fn queue_next_frame(&self) { trace!("Next frame queued"); - let buffer_frames = SETTINGS.get::().extra_buffer_frames; - - self.frames_queued - .store(buffer_frames as u16, Ordering::Relaxed); + self.frame_queued.store(true, Ordering::Relaxed); } pub fn should_draw(&self) -> bool { - let frames_queued = self.frames_queued.load(Ordering::Relaxed); - - if frames_queued > 0 { - self.frames_queued - .store(frames_queued - 1, Ordering::Relaxed); + if self.frame_queued.load(Ordering::Relaxed) { + self.frame_queued.store(false, Ordering::Relaxed); true } else { let mut next_scheduled_frame = self.scheduled_frame.lock().unwrap(); diff --git a/src/renderer/animation_utils.rs b/src/renderer/animation_utils.rs index 22f8930..e884490 100644 --- a/src/renderer/animation_utils.rs +++ b/src/renderer/animation_utils.rs @@ -1,4 +1,4 @@ -use skulpin::skia_safe::Point; +use skia_safe::Point; #[allow(dead_code)] pub fn ease_linear(t: f32) -> f32 { diff --git a/src/renderer/cursor_renderer/blink.rs b/src/renderer/cursor_renderer/blink.rs index 89ef9ad..ab1dfe4 100644 --- a/src/renderer/cursor_renderer/blink.rs +++ b/src/renderer/cursor_renderer/blink.rs @@ -3,6 +3,7 @@ use std::time::{Duration, Instant}; use crate::editor::Cursor; use crate::redraw_scheduler::REDRAW_SCHEDULER; +#[derive(Debug)] pub enum BlinkState { Waiting, On, @@ -74,8 +75,8 @@ impl BlinkStatus { } match self.state { - BlinkState::Waiting | BlinkState::Off => false, - BlinkState::On => true, + BlinkState::Off => false, + BlinkState::On | BlinkState::Waiting => true, } } } diff --git a/src/renderer/cursor_renderer/cursor_vfx.rs b/src/renderer/cursor_renderer/cursor_vfx.rs index 058666d..2a50d6e 100644 --- a/src/renderer/cursor_renderer/cursor_vfx.rs +++ b/src/renderer/cursor_renderer/cursor_vfx.rs @@ -1,5 +1,5 @@ use log::error; -use skulpin::skia_safe::{paint::Style, BlendMode, Canvas, Color, Paint, Point, Rect}; +use skia_safe::{paint::Style, BlendMode, Canvas, Color, Paint, Point, Rect}; use super::CursorSettings; use crate::editor::{Colors, Cursor}; @@ -11,7 +11,7 @@ pub trait CursorVfx { &mut self, settings: &CursorSettings, current_cursor_destination: Point, - font_size: (f32, f32), + font_size: (u64, u64), dt: f32, ) -> bool; fn restart(&mut self, position: Point); @@ -21,7 +21,7 @@ pub trait CursorVfx { canvas: &mut Canvas, cursor: &Cursor, colors: &Colors, - font_size: (f32, f32), + font_size: (u64, u64), ); } @@ -111,7 +111,7 @@ impl CursorVfx for PointHighlight { &mut self, _settings: &CursorSettings, _current_cursor_destination: Point, - _font_size: (f32, f32), + _font_size: (u64, u64), dt: f32, ) -> bool { self.t = (self.t + dt * 5.0).min(1.0); // TODO - speed config @@ -129,23 +129,23 @@ impl CursorVfx for PointHighlight { canvas: &mut Canvas, cursor: &Cursor, colors: &Colors, - font_size: (f32, f32), + font_size: (u64, u64), ) { if (self.t - 1.0).abs() < std::f32::EPSILON { return; } - let mut paint = Paint::new(skulpin::skia_safe::colors::WHITE, None); + let mut paint = Paint::new(skia_safe::colors::WHITE, None); paint.set_blend_mode(BlendMode::SrcOver); - let base_color: Color = cursor.background(&colors).to_color(); + let base_color: Color = cursor.background(colors).to_color(); let alpha = ease(ease_in_quad, settings.vfx_opacity, 0.0, self.t) as u8; let color = Color::from_argb(alpha, base_color.r(), base_color.g(), base_color.b()); paint.set_color(color); - let size = 3.0 * font_size.1; - let radius = self.t * size; + let size = 3 * font_size.1; + let radius = self.t * size as f32; let hr = radius * 0.5; let rect = Rect::from_xywh( self.center_position.x - hr, @@ -160,12 +160,12 @@ impl CursorVfx for PointHighlight { } HighlightMode::Ripple => { paint.set_style(Style::Stroke); - paint.set_stroke_width(font_size.1 * 0.2); + paint.set_stroke_width(font_size.1 as f32 * 0.2); canvas.draw_oval(&rect, &paint); } HighlightMode::Wireframe => { paint.set_style(Style::Stroke); - paint.set_stroke_width(font_size.1 * 0.2); + paint.set_stroke_width(font_size.1 as f32 * 0.2); canvas.draw_rect(&rect, &paint); } } @@ -218,7 +218,7 @@ impl CursorVfx for ParticleTrail { &mut self, settings: &CursorSettings, current_cursor_dest: Point, - font_size: (f32, f32), + font_size: (u64, u64), dt: f32, ) -> bool { // Update lifetimes and remove dead particles @@ -246,7 +246,7 @@ impl CursorVfx for ParticleTrail { let travel_distance = travel.length(); // Increase amount of particles when cursor travels further - let particle_count = ((travel_distance / font_size.0).powf(1.5) + let particle_count = ((travel_distance / font_size.0 as f32).powf(1.5) * settings.vfx_particle_density * 0.01) as usize; @@ -259,7 +259,7 @@ impl CursorVfx for ParticleTrail { TrailMode::Railgun => { let phase = t / std::f32::consts::PI * settings.vfx_particle_phase - * (travel_distance / font_size.0); + * (travel_distance / font_size.0 as f32); Point::new(phase.sin(), phase.cos()) * 2.0 * settings.vfx_particle_speed } TrailMode::Torpedo => { @@ -280,7 +280,9 @@ impl CursorVfx for ParticleTrail { let pos = match self.trail_mode { TrailMode::Railgun => prev_p + travel * t, TrailMode::PixieDust | TrailMode::Torpedo => { - prev_p + travel * self.rng.next_f32() + Point::new(0.0, font_size.1 * 0.5) + prev_p + + travel * self.rng.next_f32() + + Point::new(0.0, font_size.1 as f32 * 0.5) } }; @@ -316,30 +318,30 @@ impl CursorVfx for ParticleTrail { canvas: &mut Canvas, cursor: &Cursor, colors: &Colors, - font_size: (f32, f32), + font_size: (u64, u64), ) { - let mut paint = Paint::new(skulpin::skia_safe::colors::WHITE, None); + let mut paint = Paint::new(skia_safe::colors::WHITE, None); match self.trail_mode { TrailMode::Torpedo | TrailMode::Railgun => { paint.set_style(Style::Stroke); - paint.set_stroke_width(font_size.1 * 0.2); + paint.set_stroke_width(font_size.1 as f32 * 0.2); } _ => {} } - let base_color: Color = cursor.background(&colors).to_color(); + let base_color: Color = cursor.background(colors).to_color(); paint.set_blend_mode(BlendMode::SrcOver); self.particles.iter().for_each(|particle| { - let l = particle.lifetime / settings.vfx_particle_lifetime; - let alpha = (l * settings.vfx_opacity) as u8; + let lifetime = particle.lifetime / settings.vfx_particle_lifetime; + let alpha = (lifetime * settings.vfx_opacity) as u8; let color = Color::from_argb(alpha, base_color.r(), base_color.g(), base_color.b()); paint.set_color(color); let radius = match self.trail_mode { - TrailMode::Torpedo | TrailMode::Railgun => font_size.0 * 0.5 * l, - TrailMode::PixieDust => font_size.0 * 0.2, + TrailMode::Torpedo | TrailMode::Railgun => font_size.0 as f32 * 0.5 * lifetime, + TrailMode::PixieDust => font_size.0 as f32 * 0.2, }; let hr = radius * 0.5; diff --git a/src/renderer/cursor_renderer/mod.rs b/src/renderer/cursor_renderer/mod.rs index 9ffc522..6d51c46 100644 --- a/src/renderer/cursor_renderer/mod.rs +++ b/src/renderer/cursor_renderer/mod.rs @@ -4,7 +4,7 @@ mod cursor_vfx; use std::collections::HashMap; // use neovide_derive::SettingGroup; -use skulpin::skia_safe::{Canvas, Paint, Path, Point}; +use skia_safe::{Canvas, Paint, Path, Point}; use super::RenderedWindow; use crate::bridge::EditorMode; @@ -20,8 +20,9 @@ const DEFAULT_CELL_PERCENTAGE: f32 = 1.0 / 8.0; const STANDARD_CORNERS: &[(f32, f32); 4] = &[(-0.5, -0.5), (0.5, -0.5), (0.5, 0.5), (-0.5, 0.5)]; -#[derive(Clone, SettingGroup)] +#[derive(SettingGroup)] #[setting_prefix = "cursor"] +#[derive(Clone)] pub struct CursorSettings { antialiasing: bool, animation_length: f32, @@ -42,7 +43,8 @@ impl Default for CursorSettings { fn default() -> Self { CursorSettings { antialiasing: true, - animation_length: 0.13, + animation_length: 0.06, + distance_length_adjust: true, animate_in_insert_mode: true, animate_command_line: true, trail_size: 0.7, @@ -146,7 +148,8 @@ impl Corner { (1.0 - settings.trail_size).max(0.0).min(1.0), -direction_alignment, ); - self.t = (self.t + corner_dt / (settings.animation_length * self.length_multiplier)).min(1.0) + self.t = + (self.t + corner_dt / (settings.animation_length * self.length_multiplier)).min(1.0) } self.current_position = ease_point( @@ -223,32 +226,30 @@ impl CursorRenderer { pub fn update_cursor_destination( &mut self, - font_width: f32, - font_height: f32, + font_width: u64, + font_height: u64, windows: &HashMap, current_mode: &EditorMode, ) { let (cursor_grid_x, cursor_grid_y) = self.cursor.grid_position; if let Some(window) = windows.get(&self.cursor.parent_window_id) { - if cursor_grid_y < window.grid_height-1 || matches!(current_mode, EditorMode::CmdLine) { - let grid_x = cursor_grid_x as f32 + window.grid_current_position.x; - let mut grid_y = cursor_grid_y as f32 + window.grid_current_position.y - - (window.current_scroll - window.current_surfaces.top_line); - - // Prevent the cursor from targeting a position outside its current window. Since only - // the vertical direction is effected by scrolling, we only have to clamp the vertical - // grid position. - grid_y = grid_y - .max(window.grid_current_position.y) - .min(window.grid_current_position.y + window.grid_height as f32 - 1.0); - - self.destination = (grid_x * font_width, grid_y * font_height).into(); - } + let grid_x = cursor_grid_x as f32 + window.grid_current_position.x; + let mut grid_y = cursor_grid_y as f32 + window.grid_current_position.y + - (window.current_scroll - window.current_surface.top_line as f32); + + // Prevent the cursor from targeting a position outside its current window. Since only + // the vertical direction is effected by scrolling, we only have to clamp the vertical + // grid position. + grid_y = grid_y + .max(window.grid_current_position.y) + .min(window.grid_current_position.y + window.grid_height as f32 - 1.0); + + self.destination = (grid_x * font_width as f32, grid_y * font_height as f32).into(); } else { self.destination = ( - cursor_grid_x as f32 * font_width, - cursor_grid_y as f32 * font_height, + (cursor_grid_x * font_width) as f32, + (cursor_grid_y * font_height) as f32, ) .into(); } @@ -257,7 +258,7 @@ impl CursorRenderer { pub fn draw( &mut self, default_colors: &Colors, - font_size: (f32, f32), + font_size: (u64, u64), current_mode: &EditorMode, shaper: &mut CachingShaper, canvas: &mut Canvas, @@ -272,21 +273,22 @@ impl CursorRenderer { self.previous_vfx_mode = settings.vfx_mode.clone(); } - let mut paint = Paint::new(skulpin::skia_safe::colors::WHITE, None); + let mut paint = Paint::new(skia_safe::colors::WHITE, None); paint.set_anti_alias(settings.antialiasing); let character = self.cursor.character.clone(); let font_width = match (self.cursor.double_width, &self.cursor.shape) { - (true, CursorShape::Block) => font_width * 2.0, + (true, CursorShape::Block) => font_width * 2, _ => font_width, }; - let font_dimensions: Point = (font_width, font_height).into(); + let font_dimensions: Point = (font_width as f32, font_height as f32).into(); let in_insert_mode = matches!(current_mode, EditorMode::Insert); - let changed_to_from_cmdline = !matches!(self.previous_editor_mode, EditorMode::CmdLine) - ^ matches!(current_mode, EditorMode::CmdLine); + + let changed_to_from_cmdline = !matches!(self.previous_editor_mode, EditorMode::CmdLine) + ^ matches!(current_mode, EditorMode::CmdLine); let center_destination = self.destination + font_dimensions * 0.5; let new_cursor = Some(self.cursor.shape.clone()); @@ -309,13 +311,15 @@ impl CursorRenderer { if !center_destination.is_zero() { for corner in self.corners.iter_mut() { + let immediate_movement = !settings.animate_in_insert_mode && in_insert_mode + || !settings.animate_command_line && !changed_to_from_cmdline; + let corner_animating = corner.update( &settings, font_dimensions, center_destination, dt, - !settings.animate_in_insert_mode && in_insert_mode - || !settings.animate_command_line && !changed_to_from_cmdline, + immediate_movement, ); animating |= corner_animating; @@ -338,7 +342,7 @@ impl CursorRenderer { if self.cursor.enabled && render { // Draw Background - paint.set_color(self.cursor.background(&default_colors).to_color()); + paint.set_color(self.cursor.background(default_colors).to_color()); // The cursor is made up of four points, so I create a path with each of the four // corners. @@ -353,15 +357,20 @@ impl CursorRenderer { canvas.draw_path(&path, &paint); // Draw foreground - paint.set_color(self.cursor.foreground(&default_colors).to_color()); + paint.set_color(self.cursor.foreground(default_colors).to_color()); canvas.save(); canvas.clip_path(&path, None, Some(false)); - let blobs = &shaper.shape_cached(&character, false, false); + let y_adjustment = shaper.y_adjustment(); + let blobs = &shaper.shape_cached(&[character], false, false); for blob in blobs.iter() { - canvas.draw_text_blob(&blob, self.destination, &paint); + canvas.draw_text_blob( + &blob, + (self.destination.x, self.destination.y + y_adjustment as f32), + &paint, + ); } canvas.restore(); @@ -371,7 +380,7 @@ impl CursorRenderer { &settings, canvas, &self.cursor, - &default_colors, + default_colors, (font_width, font_height), ); } diff --git a/src/renderer/fonts/caching_shaper.rs b/src/renderer/fonts/caching_shaper.rs index 42a9049..164bc8f 100644 --- a/src/renderer/fonts/caching_shaper.rs +++ b/src/renderer/fonts/caching_shaper.rs @@ -1,190 +1,266 @@ -use std::collections::HashMap; +use std::sync::Arc; -use font_kit::metrics::Metrics; use log::{trace, warn}; use lru::LruCache; -use skribo::{FontCollection, FontRef as SkriboFont, LayoutSession, TextStyle}; -use skulpin::skia_safe::{Font as SkiaFont, TextBlob, TextBlobBuilder}; +use skia_safe::{TextBlob, TextBlobBuilder}; +use swash::shape::ShapeContext; +use swash::text::cluster::{CharCluster, Parser, Status, Token}; +use swash::text::Script; +use swash::Metrics; +use unicode_segmentation::UnicodeSegmentation; use super::font_loader::*; use super::font_options::*; -use super::utils::*; - -const STANDARD_CHARACTER_STRING: &str = - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; - -#[cfg(any(feature = "embed-fonts", test))] -#[derive(RustEmbed)] -#[folder = "assets/fonts/"] -pub struct Asset; const DEFAULT_FONT_SIZE: f32 = 14.0; #[derive(new, Clone, Hash, PartialEq, Eq, Debug)] struct ShapeKey { - pub text: String, + pub cells: Vec, pub bold: bool, pub italic: bool, } -struct FontSet { - normal: FontCollection, - bold: FontCollection, - italic: FontCollection, -} - -impl FontSet { - fn new(fallback_list: &[String], loader: &mut FontLoader) -> FontSet { - FontSet { - normal: loader - .build_collection_by_font_name(fallback_list, build_properties(false, false)), - bold: loader - .build_collection_by_font_name(fallback_list, build_properties(true, false)), - italic: loader - .build_collection_by_font_name(fallback_list, build_properties(false, true)), - } - } - - fn get(&self, bold: bool, italic: bool) -> &FontCollection { - match (bold, italic) { - (true, _) => &self.bold, - (false, false) => &self.normal, - (false, true) => &self.italic, - } - } -} - pub struct CachingShaper { - pub options: FontOptions, - font_set: FontSet, + pub options: Option, font_loader: FontLoader, - font_cache: LruCache, blob_cache: LruCache>, + shape_context: ShapeContext, } impl CachingShaper { pub fn new() -> CachingShaper { - let options = FontOptions::new(String::from(SYSTEM_DEFAULT_FONT), DEFAULT_FONT_SIZE); - let mut loader = FontLoader::new(); - let font_set = FontSet::new(&options.fallback_list, &mut loader); - CachingShaper { - options, - font_set, - font_loader: loader, - font_cache: LruCache::new(10), + options: None, + font_loader: FontLoader::new(DEFAULT_FONT_SIZE), blob_cache: LruCache::new(10000), + shape_context: ShapeContext::new(), } } - fn get_skia_font(&mut self, skribo_font: &SkriboFont) -> Option<&SkiaFont> { - let font_name = skribo_font.font.postscript_name()?; - if !self.font_cache.contains(&font_name) { - let font = build_skia_font_from_skribo_font(skribo_font, self.options.size)?; - self.font_cache.put(font_name.clone(), font); + fn current_font_pair(&mut self) -> Arc { + let font_key = self + .options + .as_ref() + .map(|options| options.fallback_list.first().unwrap().clone().into()) + .unwrap_or(FontKey::Default); + + self.font_loader + .get_or_load(font_key) + .expect("Could not load font") + } + + pub fn current_size(&self) -> f32 { + self.options + .as_ref() + .map(|options| options.size) + .unwrap_or(DEFAULT_FONT_SIZE) + } + + pub fn update_font(&mut self, guifont_setting: &str) -> bool { + let new_options = FontOptions::parse(guifont_setting, DEFAULT_FONT_SIZE); + + if new_options != self.options && new_options.is_some() { + self.font_loader = FontLoader::new(new_options.as_ref().unwrap().size); + self.blob_cache.clear(); + self.options = new_options; + + true + } else { + false } + } + + fn metrics(&mut self) -> Metrics { + let font_pair = self.current_font_pair(); + let size = self.current_size(); + let shaper = self + .shape_context + .builder(font_pair.swash_font.as_ref()) + .size(size) + .build(); - self.font_cache.get(&font_name) + shaper.metrics() } - fn metrics(&self) -> Metrics { - self.font_set - .normal - .itemize("a") - .next() - .expect("Cannot get font metrics") - .1 - .font - .metrics() + pub fn font_base_dimensions(&mut self) -> (u64, u64) { + let metrics = self.metrics(); + let font_height = (metrics.ascent + metrics.descent + metrics.leading).ceil() as u64; + let font_width = metrics.average_width as u64; + + (font_width, font_height) } - pub fn shape(&mut self, text: &str, bold: bool, italic: bool) -> Vec { - let style = TextStyle { - size: self.options.size, - }; - let session = LayoutSession::create(text, &style, &self.font_set.get(bold, italic)); + pub fn underline_position(&mut self) -> u64 { + self.metrics().underline_offset as u64 + } + + pub fn y_adjustment(&mut self) -> u64 { let metrics = self.metrics(); - let ascent = metrics.ascent * self.options.size / metrics.units_per_em as f32; - let mut blobs = Vec::new(); + (metrics.ascent + metrics.leading) as u64 + } + + fn build_clusters(&mut self, text: &str) -> Vec<(Vec, Arc)> { + let mut cluster = CharCluster::new(); + + // Enumerate the characters storing the glyph index in the user data so that we can position + // glyphs according to Neovim's grid rules + let mut character_index = 0; + let mut parser = Parser::new( + Script::Latin, + text.graphemes(true) + .enumerate() + .map(|(glyph_index, unicode_segment)| { + unicode_segment.chars().map(move |character| { + let token = Token { + ch: character, + offset: character_index as u32, + len: character.len_utf8() as u8, + info: character.into(), + data: glyph_index as u32, + }; + character_index += 1; + token + }) + }) + .flatten(), + ); - for layout_run in session.iter_all() { - let skribo_font = layout_run.font(); + let mut results = Vec::new(); + 'cluster: while parser.next(&mut cluster) { + let mut font_fallback_keys = Vec::new(); - if let Some(skia_font) = self.get_skia_font(&skribo_font) { - let mut blob_builder = TextBlobBuilder::new(); - let count = layout_run.glyphs().count(); - let (glyphs, positions) = - blob_builder.alloc_run_pos_h(&skia_font, count, ascent, None); + // Add guifont fallback list + if let Some(options) = &self.options { + font_fallback_keys.extend( + options + .fallback_list + .iter() + .map(|font_name| font_name.into()), + ); + } + // Add default font + font_fallback_keys.push(FontKey::Default); + + // Add skia fallback + font_fallback_keys.push(cluster.chars()[0].ch.into()); - for (i, glyph) in layout_run.glyphs().enumerate() { - glyphs[i] = glyph.glyph_id as u16; - positions[i] = glyph.offset.x(); + let mut best = None; + // Use the cluster.map function to select a viable font from the fallback list + for fallback_key in font_fallback_keys.into_iter() { + if let Some(font_pair) = self.font_loader.get_or_load(fallback_key) { + let charmap = font_pair.swash_font.as_ref().charmap(); + match cluster.map(|ch| charmap.map(ch)) { + Status::Complete => { + results.push((cluster.to_owned(), font_pair.clone())); + continue 'cluster; + } + Status::Keep => best = Some(font_pair), + Status::Discard => {} + } } + } + + // If we find a font with partial coverage of the cluster, select it + if let Some(best) = best { + results.push((cluster.to_owned(), best.clone())); + continue 'cluster; + } else { + warn!("No valid font for {:?}", cluster.chars()); - blobs.push(blob_builder.make().unwrap()); + // No good match. Just render with the default font. + let default_font = self + .font_loader + .get_or_load(FontKey::Default) + .expect("Could not load default font"); + results.push((cluster.to_owned(), default_font)); + } + } + + // Now we have to group clusters by the font used so that the shaper can actually form + // ligatures across clusters + let mut grouped_results = Vec::new(); + let mut current_group = Vec::new(); + let mut current_font_option = None; + for (cluster, font) in results { + if let Some(current_font) = current_font_option.clone() { + if current_font == font { + current_group.push(cluster); + } else { + grouped_results.push((current_group, current_font)); + current_group = Vec::new(); + current_font_option = Some(font); + } } else { - warn!("Could not load skribo font"); + current_group = vec![cluster]; + current_font_option = Some(font); } } - blobs + if !current_group.is_empty() { + grouped_results.push((current_group, current_font_option.unwrap())); + } + + grouped_results } - pub fn shape_cached(&mut self, text: &str, bold: bool, italic: bool) -> &Vec { - let key = ShapeKey::new(text.to_string(), bold, italic); + pub fn shape(&mut self, cells: &[String]) -> Vec { + let current_size = self.current_size(); + let (glyph_width, _) = self.font_base_dimensions(); - if !self.blob_cache.contains(&key) { - let blobs = self.shape(text, bold, italic); - self.blob_cache.put(key.clone(), blobs); - } + let mut resulting_blobs = Vec::new(); - self.blob_cache.get(&key).unwrap() - } + let text = cells.concat(); + trace!("Shaping text: {}", text); - pub fn update_font(&mut self, guifont_setting: &str) -> bool { - let updated = self.options.update(guifont_setting); - if updated { - trace!("Font changed: {:?}", self.options); - self.font_set = FontSet::new(&self.options.fallback_list, &mut self.font_loader); - self.font_cache.clear(); - self.blob_cache.clear(); - } - updated - } + for (cluster_group, font_pair) in self.build_clusters(&text) { + let mut shaper = self + .shape_context + .builder(font_pair.swash_font.as_ref()) + .size(current_size) + .build(); - pub fn font_base_dimensions(&mut self) -> (f32, f32) { - let metrics = self.metrics(); - let font_height = - (metrics.ascent - metrics.descent) * self.options.size / metrics.units_per_em as f32; - let style = TextStyle { - size: self.options.size, - }; - let session = - LayoutSession::create(STANDARD_CHARACTER_STRING, &style, &self.font_set.normal); - let layout_run = session.iter_all().next().unwrap(); - let glyph_offsets: Vec = layout_run.glyphs().map(|glyph| glyph.offset.x()).collect(); - let glyph_advances: Vec = glyph_offsets - .windows(2) - .map(|pair| pair[1] - pair[0]) - .collect(); - - let mut amounts = HashMap::new(); - - for advance in glyph_advances.iter() { - amounts - .entry(advance.to_string()) - .and_modify(|e| *e += 1) - .or_insert(1); - } + let charmap = font_pair.swash_font.as_ref().charmap(); + for mut cluster in cluster_group { + cluster.map(|ch| charmap.map(ch)); + shaper.add_cluster(&cluster); + } - let (font_width, _) = amounts.into_iter().max_by_key(|(_, count)| *count).unwrap(); - let font_width = font_width.parse::().unwrap(); + let mut glyph_data = Vec::new(); - (font_width, font_height) + shaper.shape_with(|glyph_cluster| { + for glyph in glyph_cluster.glyphs { + glyph_data.push((glyph.id, glyph.data as u64 * glyph_width)); + } + }); + + if glyph_data.is_empty() { + return Vec::new(); + } + + let mut blob_builder = TextBlobBuilder::new(); + let (glyphs, positions) = + blob_builder.alloc_run_pos_h(&font_pair.skia_font, glyph_data.len(), 0.0, None); + for (i, (glyph_id, glyph_x_position)) in glyph_data.iter().enumerate() { + glyphs[i] = *glyph_id; + positions[i] = *glyph_x_position as f32; + } + + let blob = blob_builder.make(); + resulting_blobs.push(blob.expect("Could not create textblob")); + } + + resulting_blobs } - pub fn underline_position(&mut self) -> f32 { - let metrics = self.metrics(); - -metrics.underline_position * self.options.size / metrics.units_per_em as f32 + pub fn shape_cached(&mut self, cells: &[String], bold: bool, italic: bool) -> &Vec { + let key = ShapeKey::new(cells.to_vec(), bold, italic); + + if !self.blob_cache.contains(&key) { + let blobs = self.shape(cells); + self.blob_cache.put(key.clone(), blobs); + } + + self.blob_cache.get(&key).unwrap() } } diff --git a/src/renderer/fonts/extended_font_family.rs b/src/renderer/fonts/extended_font_family.rs deleted file mode 100644 index 34d1274..0000000 --- a/src/renderer/fonts/extended_font_family.rs +++ /dev/null @@ -1,116 +0,0 @@ -use font_kit::{family_handle::FamilyHandle, font::Font, properties::Properties}; -use skribo::{FontFamily, FontRef as SkriboFont}; - -#[derive(Clone)] -pub struct ExtendedFontFamily { - pub fonts: Vec, -} - -impl Default for ExtendedFontFamily { - fn default() -> Self { - Self::new() - } -} - -impl ExtendedFontFamily { - pub fn new() -> ExtendedFontFamily { - ExtendedFontFamily { fonts: Vec::new() } - } - - pub fn add_font(&mut self, font: SkriboFont) { - self.fonts.push(font); - } - - pub fn get(&self, props: Properties) -> Option<&Font> { - if let Some(first_handle) = &self.fonts.first() { - for handle in &self.fonts { - let font = &handle.font; - let properties = font.properties(); - - if properties.weight == props.weight - && properties.style == props.style - && properties.stretch == props.stretch - { - return Some(&font); - } - } - - return Some(&first_handle.font); - } - - None - } -} - -impl From for ExtendedFontFamily { - fn from(handle: FamilyHandle) -> Self { - handle - .fonts() - .iter() - .fold(ExtendedFontFamily::new(), |mut family, font| { - if let Ok(font) = font.load() { - family.add_font(SkriboFont::new(font)); - } - family - }) - } -} - -impl From for FontFamily { - fn from(extended_font_family: ExtendedFontFamily) -> Self { - extended_font_family - .fonts - .iter() - .fold(FontFamily::new(), |mut new_family, font| { - new_family.add_font(font.clone()); - new_family - }) - } -} - -#[cfg(test)] -mod test { - use font_kit::properties::{Properties, Stretch, Style, Weight}; - - use super::*; - use crate::renderer::fonts::caching_shaper::Asset; - - const PROPERTIES: Properties = Properties { - weight: Weight::NORMAL, - style: Style::Normal, - stretch: Stretch::NORMAL, - }; - const EXTRA_SYMBOL_FONT: &str = "Extra Symbols.otf"; - - fn dummy_font() -> SkriboFont { - SkriboFont::new( - Asset::get(EXTRA_SYMBOL_FONT) - .and_then(|font_data| Font::from_bytes(font_data.to_vec().into(), 0).ok()) - .unwrap(), - ) - } - - #[test] - fn test_add_font() { - let mut eft = ExtendedFontFamily::new(); - let font = dummy_font(); - eft.add_font(font.clone()); - assert_eq!( - eft.fonts.first().unwrap().font.full_name(), - font.font.full_name() - ); - } - - #[test] - fn test_get() { - let mut eft = ExtendedFontFamily::new(); - assert!(eft.get(PROPERTIES).is_none()); - - let font = dummy_font(); - eft.fonts.push(font.clone()); - assert_eq!( - eft.get(font.font.properties()).unwrap().full_name(), - font.font.full_name() - ); - } -} diff --git a/src/renderer/fonts/font_loader.rs b/src/renderer/fonts/font_loader.rs index aeb253c..2159ca8 100644 --- a/src/renderer/fonts/font_loader.rs +++ b/src/renderer/fonts/font_loader.rs @@ -1,278 +1,128 @@ -use std::iter; +use std::sync::Arc; -use cfg_if::cfg_if; -use font_kit::{properties::Properties, source::SystemSource}; use lru::LruCache; -use rand::Rng; -use skribo::{FontCollection, FontFamily}; +use skia_safe::{font::Edging, Data, Font, FontHinting, FontMgr, FontStyle, Typeface}; -#[cfg(any(feature = "embed-fonts", test))] -use super::caching_shaper::Asset; -use super::extended_font_family::*; +use super::swash_font::SwashFont; -cfg_if! { - if #[cfg(target_os = "windows")] { - pub const SYSTEM_DEFAULT_FONT: &str = "Consolas"; - pub const SYSTEM_SYMBOL_FONT: &str = "Segoe UI Symbol"; - pub const SYSTEM_EMOJI_FONT: &str = "Segoe UI Emoji"; - } else if #[cfg(target_os = "linux")] { - pub const SYSTEM_DEFAULT_FONT: &str = "Noto Sans Mono"; - pub const SYSTEM_SYMBOL_FONT: &str = "Noto Sans Mono"; - pub const SYSTEM_EMOJI_FONT: &str = "Noto Color Emoji"; - } else if #[cfg(target_os = "macos")] { - pub const SYSTEM_DEFAULT_FONT: &str = "Menlo"; - pub const SYSTEM_SYMBOL_FONT: &str = "Apple Symbols"; - pub const SYSTEM_EMOJI_FONT: &str = "Apple Color Emoji"; - } -} +#[derive(RustEmbed)] +#[folder = "assets/fonts/"] +pub struct Asset; -pub const EXTRA_SYMBOL_FONT: &str = "Extra Symbols.otf"; -pub const MISSING_GLYPH_FONT: &str = "Missing Glyphs.otf"; +const DEFAULT_FONT: &str = "FiraCode-Regular.ttf"; -pub struct FontLoader { - cache: LruCache, - source: SystemSource, - random_font_name: Option, +pub struct FontPair { + pub skia_font: Font, + pub swash_font: SwashFont, } -impl FontLoader { - pub fn new() -> FontLoader { - FontLoader { - cache: LruCache::new(10), - source: SystemSource::new(), - random_font_name: None, - } - } - - fn get(&mut self, font_name: &str) -> Option { - self.cache.get(&String::from(font_name)).cloned() - } +impl FontPair { + fn new(mut skia_font: Font) -> Option { + skia_font.set_subpixel(true); + skia_font.set_hinting(FontHinting::Full); + skia_font.set_edging(Edging::SubpixelAntiAlias); - #[cfg(any(feature = "embed-fonts", test))] - fn load_from_asset(&mut self, font_name: &str) -> Option { - use font_kit::font::Font; - use skribo::FontRef as SkriboFont; - let mut family = ExtendedFontFamily::new(); + let (font_data, index) = skia_font.typeface().unwrap().to_font_data().unwrap(); + let swash_font = SwashFont::from_data(font_data, index)?; - if let Some(font) = Asset::get(font_name) - .and_then(|font_data| Font::from_bytes(font_data.to_vec().into(), 0).ok()) - { - family.add_font(SkriboFont::new(font)); - self.cache.put(String::from(font_name), family); - self.get(font_name) - } else { - None - } + Some(Self { + skia_font, + swash_font, + }) } +} - #[cfg(not(any(feature = "embed-fonts", test)))] - fn load_from_asset(&self, font_name: &str) -> Option { - log::warn!( - "Tried to load {} from assets but build didn't include embed-fonts feature", - font_name - ); - None +impl PartialEq for FontPair { + fn eq(&self, other: &Self) -> bool { + self.swash_font.key == other.swash_font.key } +} - fn load(&mut self, font_name: &str) -> Option { - let handle = match self.source.select_family_by_name(font_name) { - Ok(it) => it, - _ => return None, - }; +pub struct FontLoader { + font_mgr: FontMgr, + cache: LruCache>, + font_size: f32, +} - if !handle.is_empty() { - let family = ExtendedFontFamily::from(handle); - self.cache.put(String::from(font_name), family); - self.get(font_name) - } else { - None - } - } +#[derive(Debug, Hash, PartialEq, Eq, Clone)] +pub enum FontKey { + Default, + Name(String), + Character(char), +} - fn get_random_system_font_family(&mut self) -> Option { - if let Some(font) = self.random_font_name.clone() { - self.get(&font) - } else { - let font_names = self.source.all_families().expect("fonts exist"); - let n = rand::thread_rng().gen::() % font_names.len(); - let font_name = &font_names[n]; - self.random_font_name = Some(font_name.clone()); - self.load(&font_name) - } +impl From<&str> for FontKey { + fn from(string: &str) -> FontKey { + let string = string.to_string(); + FontKey::Name(string) } +} - pub fn get_or_load(&mut self, font_name: &str) -> Option { - if let Some(cached) = self.get(font_name) { - Some(cached) - } else if let Some(loaded) = self.load(font_name) { - Some(loaded) - } else { - self.load_from_asset(font_name) - } +impl From<&String> for FontKey { + fn from(string: &String) -> FontKey { + let string = string.to_owned(); + FontKey::Name(string) } +} - pub fn build_collection_by_font_name( - &mut self, - fallback_list: &[String], - properties: Properties, - ) -> FontCollection { - let mut collection = FontCollection::new(); - - let gui_fonts = fallback_list - .iter() - .map(|fallback_item| fallback_item.as_ref()) - .chain(iter::once(SYSTEM_DEFAULT_FONT)); - - for font_name in gui_fonts { - if let Some(family) = self.get_or_load(font_name) { - if let Some(font) = family.get(properties) { - collection.add_family(FontFamily::new_from_font(font.clone())); - } - } - } - - for font in &[ - SYSTEM_SYMBOL_FONT, - SYSTEM_EMOJI_FONT, - EXTRA_SYMBOL_FONT, - MISSING_GLYPH_FONT, - ] { - if let Some(family) = self.get_or_load(font) { - collection.add_family(FontFamily::from(family)); - } - } - - if self.cache.is_empty() { - let font_family = self.get_random_system_font_family(); - collection.add_family(FontFamily::from(font_family.expect("font family loaded"))); - } - collection +impl From for FontKey { + fn from(string: String) -> FontKey { + FontKey::Name(string) } } -#[cfg(test)] -mod test { - use font_kit::{ - font::Font, - properties::{Properties, Stretch, Style, Weight}, - }; - use skribo::FontRef as SkriboFont; - - use super::*; - use crate::renderer::fonts::utils::*; - - const PROPERTIES1: Properties = Properties { - weight: Weight::NORMAL, - style: Style::Normal, - stretch: Stretch::NORMAL, - }; - - const PROPERTIES2: Properties = Properties { - weight: Weight::BOLD, - style: Style::Normal, - stretch: Stretch::NORMAL, - }; - - const PROPERTIES3: Properties = Properties { - weight: Weight::NORMAL, - style: Style::Italic, - stretch: Stretch::NORMAL, - }; - - const PROPERTIES4: Properties = Properties { - weight: Weight::BOLD, - style: Style::Italic, - stretch: Stretch::NORMAL, - }; - - fn dummy_font() -> SkriboFont { - SkriboFont::new( - Asset::get(EXTRA_SYMBOL_FONT) - .and_then(|font_data| Font::from_bytes(font_data.to_vec().into(), 0).ok()) - .unwrap(), - ) +impl From for FontKey { + fn from(character: char) -> FontKey { + FontKey::Character(character) } +} - #[test] - fn test_build_properties() { - assert_eq!(build_properties(false, false), PROPERTIES1); - assert_eq!(build_properties(true, false), PROPERTIES2); - assert_eq!(build_properties(false, true), PROPERTIES3); - assert_eq!(build_properties(true, true), PROPERTIES4); +impl FontLoader { + pub fn new(font_size: f32) -> FontLoader { + FontLoader { + font_mgr: FontMgr::new(), + cache: LruCache::new(10), + font_size, + } } - #[test] - fn test_load_from_asset() { - let mut loader = FontLoader::new(); - - let font_family = loader.load_from_asset(""); - assert!(font_family.is_none()); - - let font = dummy_font(); - let mut eft = ExtendedFontFamily::new(); - eft.add_font(font.clone()); - let font_family = loader.load_from_asset(EXTRA_SYMBOL_FONT); - let result = font_family.unwrap().fonts.first().unwrap().font.full_name(); - assert_eq!(&result, &eft.fonts.first().unwrap().font.full_name()); - - assert_eq!( - &result, - &loader - .cache - .get(&EXTRA_SYMBOL_FONT.to_string()) - .unwrap() - .fonts - .first() - .unwrap() - .font - .full_name() - ); + fn load(&mut self, font_key: FontKey) -> Option { + match font_key { + FontKey::Default => { + let default_font_data = Asset::get(DEFAULT_FONT).unwrap(); + let data = Data::new_copy(&default_font_data); + let typeface = Typeface::from_data(data, 0).unwrap(); + FontPair::new(Font::from_typeface(typeface, self.font_size)) + } + FontKey::Name(name) => { + let font_style = FontStyle::normal(); + let typeface = self.font_mgr.match_family_style(name, font_style)?; + FontPair::new(Font::from_typeface(typeface, self.font_size)) + } + FontKey::Character(character) => { + let font_style = FontStyle::normal(); + let typeface = self.font_mgr.match_family_style_character( + "", + font_style, + &[], + character as i32, + )?; + FontPair::new(Font::from_typeface(typeface, self.font_size)) + } + } } - #[test] - fn test_load() { - let mut loader = FontLoader::new(); - let junk_text = "uhasiudhaiudshiaushd"; - let font_family = loader.load(junk_text); - assert!(font_family.is_none()); + pub fn get_or_load(&mut self, font_key: FontKey) -> Option> { + if let Some(cached) = self.cache.get(&font_key) { + return Some(cached.clone()); + } - #[cfg(target_os = "linux")] - const SYSTEM_DEFAULT_FONT: &str = "monospace"; + let loaded_font = self.load(font_key.clone())?; - let font_family = loader.load(SYSTEM_DEFAULT_FONT); - let result = font_family.unwrap().fonts.first().unwrap().font.full_name(); - assert_eq!( - &result, - &loader - .cache - .get(&SYSTEM_DEFAULT_FONT.to_string()) - .unwrap() - .fonts - .first() - .unwrap() - .font - .full_name() - ); - } + let font_arc = Arc::new(loaded_font); - #[test] - fn test_get_random_system_font() { - let mut loader = FontLoader::new(); + self.cache.put(font_key, font_arc.clone()); - let font_family = loader.get_random_system_font_family(); - let font_name = loader.random_font_name.unwrap(); - let result = font_family.unwrap().fonts.first().unwrap().font.full_name(); - assert_eq!( - &result, - &loader - .cache - .get(&font_name) - .unwrap() - .fonts - .first() - .unwrap() - .font - .full_name() - ); + Some(font_arc) } } diff --git a/src/renderer/fonts/font_options.rs b/src/renderer/fonts/font_options.rs index fdf426c..ee7689e 100644 --- a/src/renderer/fonts/font_options.rs +++ b/src/renderer/fonts/font_options.rs @@ -1,29 +1,16 @@ -#[derive(Clone, PartialEq, Debug)] +#[derive(Clone, Debug)] pub struct FontOptions { - previous_guifont_setting: Option, + guifont_setting: Option, pub fallback_list: Vec, pub size: f32, } impl FontOptions { - pub fn new(name: String, size: f32) -> FontOptions { - FontOptions { - previous_guifont_setting: None, - fallback_list: vec![name], - size, - } - } - - pub fn update(self: &mut FontOptions, guifont_setting: &str) -> bool { - if self.previous_guifont_setting.is_some() - && guifont_setting == self.previous_guifont_setting.as_ref().unwrap() - { - return false; - } - self.previous_guifont_setting = Some(guifont_setting.to_string()); + pub fn parse(guifont_setting: &str, default_size: f32) -> Option { + let mut fallback_list = None; + let mut size = default_size; let mut parts = guifont_setting.split(':').filter(|part| !part.is_empty()); - let mut updated = false; if let Some(parts) = parts.next() { let parsed_fallback_list: Vec = parts @@ -32,23 +19,34 @@ impl FontOptions { .map(|fallback| fallback.to_string()) .collect(); - if !parsed_fallback_list.is_empty() && self.fallback_list != parsed_fallback_list { - self.fallback_list = parsed_fallback_list; - updated = true; + if !parsed_fallback_list.is_empty() { + fallback_list = Some(parsed_fallback_list); } } for part in parts { if part.starts_with('h') && part.len() > 1 { - if let Ok(size) = part[1..].parse::() { - if (self.size - size).abs() > std::f32::EPSILON { - self.size = size; - updated = true; - } + if let Ok(parsed_size) = part[1..].parse::() { + size = parsed_size } } } - updated + fallback_list.map(|fallback_list| FontOptions { + guifont_setting: Some(guifont_setting.to_string()), + fallback_list, + size, + }) + } +} + +impl PartialEq for FontOptions { + fn eq(&self, other: &Self) -> bool { + if self.guifont_setting.is_some() && self.guifont_setting == other.guifont_setting { + return true; + } + + self.fallback_list == other.fallback_list + && (self.size - other.size).abs() < std::f32::EPSILON } } diff --git a/src/renderer/fonts/mod.rs b/src/renderer/fonts/mod.rs index 621054f..8aee327 100644 --- a/src/renderer/fonts/mod.rs +++ b/src/renderer/fonts/mod.rs @@ -1,5 +1,4 @@ -pub mod caching_shaper; -mod extended_font_family; -mod font_loader; -mod font_options; -mod utils; +pub mod caching_shaper; +mod font_loader; +mod font_options; +mod swash_font; diff --git a/src/renderer/fonts/swash_font.rs b/src/renderer/fonts/swash_font.rs new file mode 100644 index 0000000..39c91cf --- /dev/null +++ b/src/renderer/fonts/swash_font.rs @@ -0,0 +1,23 @@ +use swash::{CacheKey, FontRef}; + +pub struct SwashFont { + data: Vec, + offset: u32, + pub key: CacheKey, +} + +impl SwashFont { + pub fn from_data(data: Vec, index: usize) -> Option { + let font = FontRef::from_index(&data, index)?; + let (offset, key) = (font.offset, font.key); + Some(Self { data, offset, key }) + } + + pub fn as_ref(&self) -> FontRef { + FontRef { + data: &self.data, + offset: self.offset, + key: self.key, + } + } +} diff --git a/src/renderer/fonts/utils.rs b/src/renderer/fonts/utils.rs deleted file mode 100644 index e4a74cf..0000000 --- a/src/renderer/fonts/utils.rs +++ /dev/null @@ -1,24 +0,0 @@ -use font_kit::properties::{Properties, Stretch, Style, Weight}; -use skribo::FontRef as SkriboFont; -use skulpin::skia_safe::{Data, Font as SkiaFont, Typeface}; - -pub fn build_skia_font_from_skribo_font( - skribo_font: &SkriboFont, - base_size: f32, -) -> Option { - let font_data = skribo_font.font.copy_font_data()?; - let skia_data = Data::new_copy(&font_data[..]); - let typeface = Typeface::from_data(skia_data, None)?; - - Some(SkiaFont::from_typeface(typeface, base_size)) -} - -pub fn build_properties(bold: bool, italic: bool) -> Properties { - let weight = if bold { Weight::BOLD } else { Weight::NORMAL }; - let style = if italic { Style::Italic } else { Style::Normal }; - Properties { - weight, - style, - stretch: Stretch::NORMAL, - } -} diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 7227743..572ccc0 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -2,9 +2,8 @@ use std::collections::HashMap; use std::sync::mpsc::Receiver; use std::sync::Arc; -use log::{error, trace, warn}; -use skulpin::skia_safe::{colors, dash_path_effect, BlendMode, Canvas, Color, Paint, Rect}; -use skulpin::CoordinateSystemHelper; +use log::{error, trace}; +use skia_safe::{colors, dash_path_effect, BlendMode, Canvas, Color, Paint, Rect}; pub mod animation_utils; pub mod cursor_renderer; @@ -19,8 +18,9 @@ use crate::editor::{Colors, DrawCommand, Style, WindowDrawCommand}; use crate::settings::*; use cursor_renderer::CursorRenderer; -#[derive(Clone, SettingGroup)] +#[derive(SettingGroup)] #[setting_prefix = "window"] +#[derive(Clone)] pub struct RendererSettings { position_animation_length: f32, scroll_animation_length: f32, @@ -47,8 +47,8 @@ pub struct Renderer { pub paint: Paint, pub shaper: CachingShaper, pub default_style: Arc