diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..65326bb --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use nix \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..7e22b11 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,50 @@ +name: Rust Tests + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y pkg-config libwayland-dev + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt, clippy + + - name: Cache cargo registry + uses: actions/cache@v3 + with: + path: ~/.cargo/registry + key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} + + - name: Cache cargo index + uses: actions/cache@v3 + with: + path: ~/.cargo/git + key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} + + - name: Cache cargo build + uses: actions/cache@v3 + with: + path: target + key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} + + - name: Run tests + run: cargo test --workspace + + - name: Check formatting + run: cargo fmt --all -- --check + + - name: Run clippy + run: cargo clippy --workspace -- -D warnings diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 73f69e0..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/.idea/launcher.iml b/.idea/launcher.iml deleted file mode 100644 index c254557..0000000 --- a/.idea/launcher.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 28a804d..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 1515be0..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 4a39d42..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - // 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": [ - { - "type": "lldb", - "request": "launch", - "name": "Debug executable 'sirula'", - "cargo": { - "args": [ - "build", - "--bin=sirula", - "--package=sirula" - ], - "filter": { - "name": "sirula", - "kind": "bin" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - }, - { - "type": "lldb", - "request": "launch", - "name": "Debug unit tests in executable 'sirula'", - "cargo": { - "args": [ - "test", - "--no-run", - "--bin=sirula", - "--package=sirula" - ], - "filter": { - "name": "sirula", - "kind": "bin" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - } - ] -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 9545db4..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "saveAndRun": { - "commands": [ - { - "match": ".rs", - "cmd": "cargo check", - "useShortcut": false, - "silent": false - }, - ] - }, - "cSpell.enabled": false -} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 1ab183c..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "type": "cargo", - "subcommand": "run", - "problemMatcher": [ - "$rustc" - ], - "label": "Rust: cargo run - sirula", - "group": { - "kind": "build", - "isDefault": true - } - }, - { - "label": "Cargo release run", - "type": "process", - "command": "cargo", - "args": [ - "run", - "--release" - ], - "problemMatcher": [ - "$rustc" - ] - } - ] -} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index ee5afc1..e192cc4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,219 +2,475 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "ab_glyph" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" -version = "0.7.18" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] [[package]] -name = "anyhow" -version = "1.0.44" +name = "aligned" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61604a8f862e1d5c3229fdd78f8b02c68dcf73a4c4b05fd636d12240aaa242c1" +checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" +dependencies = [ + "as-slice", +] [[package]] -name = "arrayvec" -version = "0.5.2" +name = "aligned-vec" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] [[package]] -name = "atk" -version = "0.15.1" +name = "android-activity" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" dependencies = [ - "atk-sys", - "bitflags", - "glib", + "android-properties", + "bitflags 2.10.0", + "cc", + "cesu8", + "jni", + "jni-sys", "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum", + "thiserror 1.0.69", +] + +[[package]] +name = "android-build" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cac4c64175d504608cf239756339c07f6384a476f97f20a7043f92920b0b8fd" +dependencies = [ + "windows-sys 0.52.0", ] [[package]] -name = "atk-sys" -version = "0.15.1" +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android_system_properties" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ - "glib-sys", - "gobject-sys", "libc", - "system-deps", ] [[package]] -name = "autocfg" +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-raw-xcb-connection" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" [[package]] -name = "bitflags" -version = "1.3.2" +name = "as-slice" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] [[package]] -name = "bitvec" -version = "0.19.5" +name = "ash" +version = "0.38.0+1.3.281" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8942c8d352ae1838c9dda0b0ca2ab657696ef2232a20147cf1b30ae1a9cb4321" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" dependencies = [ - "funty", - "radium", - "tap", - "wyz", + "libloading", ] [[package]] -name = "cairo-rs" -version = "0.15.12" +name = "async-broadcast" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ - "bitflags", - "cairo-sys-rs", - "glib", - "libc", - "thiserror", + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", ] [[package]] -name = "cairo-sys-rs" -version = "0.15.1" +name = "async-channel" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ - "glib-sys", - "libc", - "system-deps", + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", ] [[package]] -name = "cfg-expr" -version = "0.10.3" +name = "async-executor" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aacacf4d96c24b2ad6eb8ee6df040e4f27b0d0b39a5710c30091baa830485db" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" dependencies = [ - "smallvec", + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", ] [[package]] -name = "cfg-if" -version = "1.0.0" +name = "async-io" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 1.1.2", + "slab", + "windows-sys 0.61.2", +] [[package]] -name = "dirs" -version = "4.0.0" +name = "async-lock" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ - "dirs-sys", + "event-listener", + "event-listener-strategy", + "pin-project-lite", ] [[package]] -name = "dirs-sys" -version = "0.3.7" +name = "async-process" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ - "libc", - "redox_users", - "winapi", + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix 1.1.2", ] [[package]] -name = "either" -version = "1.9.0" +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-signal" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.1.2", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] [[package]] -name = "field-offset" -version = "0.3.4" +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ - "memoffset", - "rustc_version", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "freedesktop_entry_parser" -version = "1.2.0" +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "av-scenechange" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +dependencies = [ + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey", + "rayon", + "thiserror 2.0.17", + "v_frame", + "y4m", +] + +[[package]] +name = "av1-grain" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "347aa21b13048c0a0a4dc3118b661eb89d73ea675eca95b6a0f11e698ff66ec1" +checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" dependencies = [ + "anyhow", + "arrayvec", + "log", "nom", - "thiserror", + "num-rational", + "v_frame", ] [[package]] -name = "funty" -version = "1.1.0" +name = "avif-serialize" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" +checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f" +dependencies = [ + "arrayvec", +] [[package]] -name = "futures" -version = "0.3.21" +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "beul" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +checksum = "d3c3baedf037b161e69da9200947329f52afa3b6e1cdbe6f344d6aa350fedd2f" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", + "bit-vec", ] [[package]] -name = "futures-channel" -version = "0.3.21" +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bit_field" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "bitstream-io" +version = "4.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757" dependencies = [ - "futures-core", - "futures-sink", + "core2", ] [[package]] -name = "futures-core" -version = "0.3.21" +name = "block" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] -name = "futures-executor" -version = "0.3.21" +name = "block2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ - "futures-core", - "futures-task", - "futures-util", + "objc2 0.5.2", ] [[package]] -name = "futures-io" -version = "0.3.21" +name = "block2" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2 0.6.3", +] [[package]] -name = "futures-macro" -version = "0.3.21" +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "built" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" + +[[package]] +name = "bumpalo" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "bytemuck" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", @@ -222,752 +478,5127 @@ dependencies = [ ] [[package]] -name = "futures-sink" -version = "0.3.21" +name = "byteorder-lite" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] -name = "futures-task" -version = "0.3.21" +name = "bytes" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] -name = "futures-util" -version = "0.3.21" +name = "calloop" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", + "bitflags 2.10.0", + "log", + "polling", + "rustix 0.38.44", "slab", + "thiserror 1.0.69", ] [[package]] -name = "fuzzy-matcher" -version = "0.3.7" +name = "calloop" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" +checksum = "cb9f6e1368bd4621d2c86baa7e37de77a938adf5221e5dd3d6133340101b309e" dependencies = [ - "thread_local", + "bitflags 2.10.0", + "polling", + "rustix 1.1.2", + "slab", + "tracing", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop 0.13.0", + "rustix 0.38.44", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" +dependencies = [ + "calloop 0.14.3", + "rustix 1.1.2", + "wayland-backend", + "wayland-client", ] [[package]] -name = "gdk" -version = "0.15.4" +name = "cc" +version = "1.2.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" dependencies = [ - "bitflags", - "cairo-rs", - "gdk-pixbuf", - "gdk-sys", - "gio", - "glib", + "find-msvc-tools", + "jobserver", "libc", - "pango", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cirula" +version = "0.1.0" +dependencies = [ + "freedesktop_entry_parser", + "fuzzy-matcher", + "iced", + "iced_font_awesome", + "iced_layershell", + "icu_collator", + "icu_locale", + "regex", + "serde", + "shlex", + "strum", + "tokio", + "toml", + "tracing", + "tracing-subscriber", + "xdg", ] [[package]] -name = "gdk-pixbuf" -version = "0.15.11" +name = "clipboard-win" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +dependencies = [ + "error-code", +] + +[[package]] +name = "clipboard_macos" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7f4aaa047ba3c3630b080bb9860894732ff23e2aee290a418909aa6d5df38f" +dependencies = [ + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "clipboard_wayland" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003f886bc4e2987729d10c1db3424e7f80809f3fc22dbc16c685738887cb37b8" +dependencies = [ + "smithay-clipboard", +] + +[[package]] +name = "clipboard_x11" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd63e33452ffdafd39924c4f05a5dd1e94db646c779c6bd59148a3d95fff5ad4" +dependencies = [ + "thiserror 2.0.17", + "x11rb", +] + +[[package]] +name = "codespan-reporting" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.10.1", + "libc", +] + +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[package]] +name = "core_maths" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" +dependencies = [ + "libm", +] + +[[package]] +name = "cosmic-text" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173852283a9a57a3cbe365d86e74dc428a09c50421477d5ad6fe9d9509e37737" +dependencies = [ + "bitflags 2.10.0", + "fontdb", + "harfrust", + "linebender_resource_handle", + "log", + "rangemap", + "rustc-hash 1.1.0", + "self_cell", + "skrifa", + "smol_str", + "swash", + "sys-locale", + "unicode-bidi", + "unicode-linebreak", + "unicode-script", + "unicode-segmentation", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "cryoglyph" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc795bdbccdbd461736fb163930a009da6597b226d6f6fce33e7a8eb6ec519" +dependencies = [ + "cosmic-text", + "etagere", + "lru", + "rustc-hash 2.1.1", + "wgpu", +] + +[[package]] +name = "ctor-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f791803201ab277ace03903de1594460708d2d54df6053f2d9e82f592b19e3b" + +[[package]] +name = "cursor-icon" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "data-url" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "error-code" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" + +[[package]] +name = "etagere" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc89bf99e5dc15954a60f707c1e09d7540e5cd9af85fa75caa0b510bc08c5342" +dependencies = [ + "euclid", + "svg_fmt", +] + +[[package]] +name = "euclid" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" +dependencies = [ + "num-traits", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "exr" +version = "1.74.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fax" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" +dependencies = [ + "fax_derive", +] + +[[package]] +name = "fax_derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + +[[package]] +name = "flate2" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "font-types" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39a654f404bbcbd48ea58c617c2993ee91d1cb63727a37bf2323a4edeed1b8c5" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "fontconfig-parser" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" +dependencies = [ + "roxmltree", +] + +[[package]] +name = "fontdb" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "freedesktop_entry_parser" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b368437186ec63ceb50d0832ee1ebcb5878037fe16ead1c68081d4aee0d140a" +dependencies = [ + "indexmap", + "nom", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", + "num_cpus", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fuzzy-matcher" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" +dependencies = [ + "thread_local", +] + +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix 1.1.2", + "windows-link", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "gif" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gif" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glam" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" + +[[package]] +name = "glow" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.10.0", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "gpu-allocator" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" +dependencies = [ + "log", + "presser", + "thiserror 1.0.69", + "windows 0.58.0", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" +dependencies = [ + "bitflags 2.10.0", + "gpu-descriptor-types", + "hashbrown 0.15.5", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "guillotiere" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" +dependencies = [ + "euclid", + "svg_fmt", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "num-traits", + "zerocopy", +] + +[[package]] +name = "harfrust" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c020db12c71d8a12a3fe7607873cade3a01a6287e29d540c8723276221b9d8" +dependencies = [ + "bitflags 2.10.0", + "bytemuck", + "core_maths", + "read-fonts", + "smallvec", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash 0.2.0", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "iced" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000e01026c93ba643f8357a3db3ada0e6555265a377f6f9291c472f6dd701fb3" +dependencies = [ + "iced_core", + "iced_debug", + "iced_futures", + "iced_renderer", + "iced_runtime", + "iced_widget", + "iced_winit", + "image", + "thiserror 2.0.17", +] + +[[package]] +name = "iced_core" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ab1937d699403e7e69252ae743a902bcee9f4ab2052cc4c9a46fcf34729d85" +dependencies = [ + "bitflags 2.10.0", + "bytes", + "glam", + "lilt", + "log", + "num-traits", + "rustc-hash 2.1.1", + "smol_str", + "thiserror 2.0.17", + "web-time", +] + +[[package]] +name = "iced_debug" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25035ab0215a620e53f4103e36fc4e59a1fb2817e4bfc38a30ad27b4202ea0be" +dependencies = [ + "iced_core", + "iced_futures", + "log", +] + +[[package]] +name = "iced_devtools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b8e2a306ac5c583234b02f5404afdb7b7467c8f72a4a44ad3e7be30fc4b339" +dependencies = [ + "iced_debug", + "iced_program", + "iced_widget", + "log", +] + +[[package]] +name = "iced_exdevtools" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a53845eb72374fa1ce7d32c5948dd799e1b901de5c8ca64ffad115c0b13ca8e" +dependencies = [ + "iced_debug", + "iced_devtools", + "iced_program", + "iced_widget", + "log", +] + +[[package]] +name = "iced_font_awesome" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd18ad9721e8095ac7b131b5c232e4211911e0defb293e62d8e5689d34bebe7" +dependencies = [ + "iced", + "serde", + "serde_json", +] + +[[package]] +name = "iced_futures" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c0c85ccad42dfbec7293c36c018af0ea0dbcc52d137a4a9a0b0f6822a3fdf0a" +dependencies = [ + "futures", + "iced_core", + "log", + "rustc-hash 2.1.1", + "tokio", + "wasm-bindgen-futures", + "wasmtimer", +] + +[[package]] +name = "iced_graphics" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234ca1c2cec4155055f68fa5fad1b5242c496ac8238d80a259bca382fb44a102" +dependencies = [ + "bitflags 2.10.0", + "bytemuck", + "cosmic-text", + "half", + "iced_core", + "iced_futures", + "image", + "kamadak-exif", + "log", + "raw-window-handle", + "rustc-hash 2.1.1", + "thiserror 2.0.17", + "unicode-segmentation", +] + +[[package]] +name = "iced_layershell" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "433a671c3b243235a82346a2bafa62d478890fc3fdc716361309947f78d567b3" +dependencies = [ + "enumflags2", + "futures", + "iced", + "iced_core", + "iced_debug", + "iced_devtools", + "iced_exdevtools", + "iced_futures", + "iced_graphics", + "iced_layershell_macros", + "iced_program", + "iced_renderer", + "iced_runtime", + "layershellev", + "log", + "mundy", + "thiserror 2.0.17", + "tracing", + "window_clipboard", +] + +[[package]] +name = "iced_layershell_macros" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ec55822490e0937acd0e484244a2aac65c8906b2ca4e0faea069f9fdc64c4e" +dependencies = [ + "darling", + "manyhow", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "iced_program" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dfafec2947cda688d8eb00dac337ba11aa60f9ef6335aed343e189d26e4a673" +dependencies = [ + "iced_graphics", + "iced_runtime", +] + +[[package]] +name = "iced_renderer" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250cc0802408e8c077986ec56c7d07c65f423ee658a4b9fd795a1f2aae5dac05" +dependencies = [ + "iced_graphics", + "iced_tiny_skia", + "iced_wgpu", + "log", + "thiserror 2.0.17", +] + +[[package]] +name = "iced_runtime" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1889b819ce4c06674183242e336c8d49465665441396914dc07cc86f44fa8d4" +dependencies = [ + "bytes", + "iced_core", + "iced_futures", + "raw-window-handle", + "thiserror 2.0.17", +] + +[[package]] +name = "iced_tiny_skia" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe0acf8b75a3bc914aff5f2329fdffc1b36eeaea29dda0e4bd232f1c62e9cc3d" +dependencies = [ + "bytemuck", + "cosmic-text", + "iced_debug", + "iced_graphics", + "kurbo 0.10.4", + "log", + "resvg", + "rustc-hash 2.1.1", + "softbuffer", + "tiny-skia", +] + +[[package]] +name = "iced_wgpu" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff144a999b0ca0f8a10257934500060240825c42e950ec0ebee9c8ae30561c13" +dependencies = [ + "bitflags 2.10.0", + "bytemuck", + "cryoglyph", + "futures", + "glam", + "guillotiere", + "iced_debug", + "iced_graphics", + "log", + "resvg", + "rustc-hash 2.1.1", + "thiserror 2.0.17", + "wgpu", +] + +[[package]] +name = "iced_widget" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1596afa0d3109c2618e8bc12bae6c11d3064df8f95c42dfce570397dbe957ab" +dependencies = [ + "iced_renderer", + "log", + "num-traits", + "rustc-hash 2.1.1", + "thiserror 2.0.17", + "unicode-segmentation", +] + +[[package]] +name = "iced_winit" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b7dbedc47562d1de3b9707d939f678b88c382004b7ab5a18f7a7dd723162d75" +dependencies = [ + "iced_debug", + "iced_program", + "log", + "mundy", + "rustc-hash 2.1.1", + "thiserror 2.0.17", + "tracing", + "wasm-bindgen-futures", + "web-sys", + "window_clipboard", + "winit", +] + +[[package]] +name = "icu_collator" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32eed11a5572f1088b63fa21dc2e70d4a865e5739fc2d10abc05be93bae97019" +dependencies = [ + "icu_collator_data", + "icu_collections", + "icu_locale", + "icu_locale_core", + "icu_normalizer", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "zerovec", +] + +[[package]] +name = "icu_collator_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab06f0e83a613efddba3e4913e00e43ed4001fae651cb7d40fc7e66b83b6fb9" + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "serde", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532b11722e350ab6bf916ba6eb0efe3ee54b932666afec989465f9243fe6dd60" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_locale_data", + "icu_provider", + "potential_utf", + "serde", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "serde", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locale_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f03e2fcaefecdf05619f3d6f91740e79ab969b4dd54f77cbf546b1d0d28e3147" + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "serde", + "stable_deref_trait", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "image" +version = "0.25.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif 0.14.1", + "image-webp", + "moxcms", + "num-traits", + "png 0.18.0", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core 0.5.0", + "zune-jpeg 0.5.7", +] + +[[package]] +name = "image-webp" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imagesize" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" + +[[package]] +name = "imgref" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" + +[[package]] +name = "indexmap" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", +] + +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "kamadak-exif" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1130d80c7374efad55a117d715a3af9368f0fa7a2c54573afc15a188cd984837" +dependencies = [ + "mutate_once", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "kurbo" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1618d4ebd923e97d67e7cd363d80aef35fe961005cbbbb3d2dad8bdd1bc63440" +dependencies = [ + "arrayvec", + "smallvec", +] + +[[package]] +name = "kurbo" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" +dependencies = [ + "arrayvec", + "euclid", + "smallvec", +] + +[[package]] +name = "layershellev" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2bdc69b1539d90ccb3af2a8d9c63b087efa04e08d5c8d9168c3cd7acad739" +dependencies = [ + "bitflags 2.10.0", + "calloop 0.14.3", + "calloop-wayland-source 0.4.1", + "log", + "raw-window-handle", + "tempfile", + "thiserror 2.0.17", + "waycrate_xkbkeycode", + "wayland-backend", + "wayland-client", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-misc", + "wayland-protocols-wlr", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lebe" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" + +[[package]] +name = "libc" +version = "0.2.178" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" +dependencies = [ + "arbitrary", + "cc", +] + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50" +dependencies = [ + "bitflags 2.10.0", + "libc", + "redox_syscall 0.6.0", +] + +[[package]] +name = "lilt" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f67562e5eff6b20553fa9be1c503356768420994e28f67e3eafe6f41910e57ad" +dependencies = [ + "web-time", +] + +[[package]] +name = "linebender_resource_handle" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "lru" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96051b46fc183dc9cd4a223960ef37b9af631b55191852a8274bfef064cda20f" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "manyhow" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b33efb3ca6d3b07393750d4030418d594ab1139cee518f0dc88db70fec873587" +dependencies = [ + "darling_core", + "manyhow-macros", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "manyhow-macros" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46fce34d199b78b6e6073abf984c9cf5fd3e9330145a93ee0738a7443e371495" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "memmap2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "metal" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" +dependencies = [ + "bitflags 2.10.0", + "block", + "core-graphics-types 0.2.0", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "moxcms" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "mundy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523813c9e194ec43693805214eb112551f99382115b67f38600d724a692e7e8b" +dependencies = [ + "android-build", + "async-io", + "beul", + "cfg-if", + "dispatch", + "futures-channel", + "futures-lite", + "jni", + "ndk-context", + "objc2 0.6.3", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "pin-project-lite", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.62.2", + "zbus", +] + +[[package]] +name = "mutate_once" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268be27d2af" + +[[package]] +name = "naga" +version = "27.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.10.0", + "cfg-if", + "cfg_aliases", + "codespan-reporting", + "half", + "hashbrown 0.16.1", + "hexf-parse", + "indexmap", + "libm", + "log", + "num-traits", + "once_cell", + "rustc-hash 1.1.0", + "spirv", + "thiserror 2.0.17", + "unicode-ident", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.10.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.10.0", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.10.0", + "block2 0.5.1", + "libc", + "objc2 0.5.2", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", + "objc2-foundation 0.2.2", + "objc2-quartz-core 0.2.2", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.10.0", + "block2 0.6.2", + "libc", + "objc2 0.6.3", + "objc2-cloud-kit 0.3.2", + "objc2-core-data 0.3.2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image 0.3.2", + "objc2-core-text", + "objc2-core-video", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.10.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.10.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.10.0", + "dispatch2", + "objc2 0.6.3", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.10.0", + "dispatch2", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-contacts", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.10.0", + "block2 0.5.1", + "dispatch", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.10.0", + "block2 0.6.2", + "libc", + "objc2 0.6.3", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.10.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.10.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.10.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-cloud-kit 0.2.2", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", + "objc2-core-location", + "objc2-foundation 0.2.2", + "objc2-link-presentation", + "objc2-quartz-core 0.2.2", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.10.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "orbclient" +version = "0.3.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "247ad146e19b9437f8604c21f8652423595cf710ad108af40e77d3ae6e96b827" +dependencies = [ + "libredox", +] + +[[package]] +name = "ordered-float" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "png" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" +dependencies = [ + "bitflags 2.10.0", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 1.1.2", + "windows-sys 0.61.2", +] + +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "serde_core", + "writeable", + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit 0.23.9", +] + +[[package]] +name = "proc-macro-utils" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "pxfm" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8" +dependencies = [ + "num-traits", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-xml" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom", +] + +[[package]] +name = "range-alloc" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" + +[[package]] +name = "rangemap" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbbbbea733ec66275512d0b9694f34102e7d5406fdbe2ad8d21b28dce92887c" + +[[package]] +name = "rav1e" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" +dependencies = [ + "aligned-vec", + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av-scenechange", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "thiserror 2.0.17", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "read-fonts" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6717cf23b488adf64b9d711329542ba34de147df262370221940dfabc2c91358" +dependencies = [ + "bytemuck", + "core_maths", + "font-types", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "redox_syscall" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec96166dafa0886eb81fe1c0a388bece180fbef2135f97c1e2cf8302e74b43b5" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "resvg" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" +dependencies = [ + "gif 0.13.3", + "image-webp", + "log", + "pico-args", + "rgb", + "svgtypes", + "tiny-skia", + "usvg", + "zune-jpeg 0.4.21", +] + +[[package]] +name = "rgb" +version = "0.8.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "roxmltree" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "rustybuzz" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" +dependencies = [ + "bitflags 2.10.0", + "bytemuck", + "core_maths", + "log", + "smallvec", + "ttf-parser", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-properties", + "unicode-script", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sctk-adwaita" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" +dependencies = [ + "ab_glyph", + "log", + "memmap2", + "smithay-client-toolkit 0.19.2", + "tiny-skia", +] + +[[package]] +name = "self_cell" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16c2f82143577edb4921b71ede051dac62ca3c16084e918bf7b40c96ae10eb33" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + +[[package]] +name = "simplecss" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" +dependencies = [ + "log", +] + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "skrifa" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c31071dedf532758ecf3fed987cdb4bd9509f900e026ab684b4ecb81ea49841" +dependencies = [ + "bytemuck", + "read-fonts", +] + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.10.0", + "calloop 0.13.0", + "calloop-wayland-source 0.3.0", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 0.38.44", + "thiserror 1.0.69", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" +dependencies = [ + "bitflags 2.10.0", + "calloop 0.14.3", + "calloop-wayland-source 0.4.1", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 1.1.2", + "thiserror 2.0.17", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-experimental", + "wayland-protocols-misc", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-clipboard" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226" +dependencies = [ + "libc", + "smithay-client-toolkit 0.20.0", + "wayland-backend", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "as-raw-xcb-connection", + "bytemuck", + "fastrand", + "js-sys", + "memmap2", + "ndk", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", + "raw-window-handle", + "redox_syscall 0.5.18", + "rustix 1.1.2", + "tiny-xlib", + "tracing", + "wasm-bindgen", + "wayland-backend", + "wayland-client", + "wayland-sys", + "web-sys", + "windows-sys 0.61.2", + "x11rb", +] + +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +dependencies = [ + "float-cmp", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "svg_fmt" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" + +[[package]] +name = "svgtypes" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" +dependencies = [ + "kurbo 0.11.3", + "siphasher", +] + +[[package]] +name = "swash" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47846491253e976bdd07d0f9cc24b7daf24720d11309302ccbbc6e6b6e53550a" +dependencies = [ + "skrifa", + "yazi", + "zeno", +] + +[[package]] +name = "syn" +version = "2.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sys-locale" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" +dependencies = [ + "libc", +] + +[[package]] +name = "tempfile" +version = "3.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix 1.1.2", + "windows-sys 0.61.2", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "tiff" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" +dependencies = [ + "fax", + "flate2", + "half", + "quick-error", + "weezl", + "zune-jpeg 0.4.21", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "png 0.17.16", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tiny-xlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e" +dependencies = [ + "as-raw-xcb-connection", + "ctor-lite", + "libloading", + "pkg-config", + "tracing", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "serde_core", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ + "pin-project-lite", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.23.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d7cbc3b4b49633d57a0509303158ca50de80ae32c265093b24c414705807832" +dependencies = [ + "indexmap", + "toml_datetime 0.7.3", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "tracing" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" +dependencies = [ + "core_maths", +] + +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset", + "tempfile", + "winapi", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" + +[[package]] +name = "unicode-ccc" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "unicode-script" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-vo" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "usvg" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" +dependencies = [ + "base64", + "data-url", + "flate2", + "fontdb", + "imagesize", + "kurbo 0.11.3", + "log", + "pico-args", + "roxmltree", + "rustybuzz", + "simplecss", + "siphasher", + "strict-num", + "svgtypes", + "tiny-skia-path", + "unicode-bidi", + "unicode-script", + "unicode-vo", + "xmlwriter", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +dependencies = [ + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "v_frame" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasmtimer" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "waycrate_xkbkeycode" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa04d3abb9381cd5fa0dd40ebcdfde60ade02a2641911c7976bd898f253afcd3" +dependencies = [ + "bitflags 2.10.0", + "calloop 0.14.3", + "log", + "memmap2", + "smol_str", + "wayland-backend", + "wayland-client", + "xkbcommon-dl", +] + +[[package]] +name = "wayland-backend" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" +dependencies = [ + "cc", + "downcast-rs", + "rustix 1.1.2", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" +dependencies = [ + "bitflags 2.10.0", + "rustix 1.1.2", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.10.0", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29" +dependencies = [ + "rustix 1.1.2", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" +dependencies = [ + "bitflags 2.10.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-experimental" +version = "20250721.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" +dependencies = [ + "bitflags 2.10.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-misc" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dfe33d551eb8bffd03ff067a8b44bb963919157841a99957151299a6307d19c" +dependencies = [ + "bitflags 2.10.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" +dependencies = [ + "bitflags 2.10.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" +dependencies = [ + "bitflags 2.10.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + +[[package]] +name = "wgpu" +version = "27.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" +dependencies = [ + "arrayvec", + "bitflags 2.10.0", + "cfg-if", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", + "js-sys", + "log", + "naga", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "27.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27a75de515543b1897b26119f93731b385a19aea165a1ec5f0e3acecc229cae7" +dependencies = [ + "arrayvec", + "bit-set", + "bit-vec", + "bitflags 2.10.0", + "bytemuck", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 2.0.17", + "wgpu-core-deps-apple", + "wgpu-core-deps-emscripten", + "wgpu-core-deps-windows-linux-android", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core-deps-apple" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0772ae958e9be0c729561d5e3fd9a19679bcdfb945b8b1a1969d9bfe8056d233" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-emscripten" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06ac3444a95b0813ecfd81ddb2774b66220b264b3e2031152a4a29fda4da6b5" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-windows-linux-android" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71197027d61a71748e4120f05a9242b2ad142e3c01f8c1b47707945a879a03c3" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-hal" +version = "27.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b21cb61c57ee198bc4aff71aeadff4cbb80b927beb912506af9c780d64313ce" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.10.0", + "block", + "bytemuck", + "cfg-if", + "cfg_aliases", + "core-graphics-types 0.2.0", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hashbrown 0.16.1", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga", + "ndk-sys", + "objc", + "once_cell", + "ordered-float", + "parking_lot", + "portable-atomic", + "portable-atomic-util", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "smallvec", + "thiserror 2.0.17", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "windows 0.58.0", + "windows-core 0.58.0", +] + +[[package]] +name = "wgpu-types" +version = "27.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" +dependencies = [ + "bitflags 2.10.0", + "bytemuck", + "js-sys", + "log", + "thiserror 2.0.17", + "web-sys", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window_clipboard" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5654226305eaf2dde8853fb482861d28e5dcecbbd40cb88e8393d94bb80d733" +dependencies = [ + "clipboard-win", + "clipboard_macos", + "clipboard_wayland", + "clipboard_x11", + "raw-window-handle", + "thiserror 2.0.17", +] + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections", + "windows-core 0.62.2", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core 0.62.2", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core 0.62.2", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" dependencies = [ - "bitflags", - "gdk-pixbuf-sys", - "gio", - "glib", - "libc", + "windows-core 0.62.2", + "windows-link", ] [[package]] -name = "gdk-pixbuf-sys" -version = "0.15.10" +name = "windows-result" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", + "windows-targets 0.52.6", ] [[package]] -name = "gdk-sys" -version = "0.15.1" +name = "windows-result" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "pkg-config", - "system-deps", + "windows-link", ] [[package]] -name = "getrandom" -version = "0.2.7" +name = "windows-strings" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "cfg-if", - "libc", - "wasi", + "windows-result 0.2.0", + "windows-targets 0.52.6", ] [[package]] -name = "gio" -version = "0.15.12" +name = "windows-strings" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "bitflags", - "futures-channel", - "futures-core", - "futures-io", - "gio-sys", - "glib", - "libc", - "once_cell", - "thiserror", + "windows-link", ] [[package]] -name = "gio-sys" -version = "0.15.10" +name = "windows-sys" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", - "winapi", + "windows-targets 0.42.2", ] [[package]] -name = "glib" -version = "0.15.12" +name = "windows-sys" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "bitflags", - "futures-channel", - "futures-core", - "futures-executor", - "futures-task", - "glib-macros", - "glib-sys", - "gobject-sys", - "libc", - "once_cell", - "smallvec", - "thiserror", + "windows-targets 0.52.6", ] [[package]] -name = "glib-macros" -version = "0.15.13" +name = "windows-sys" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "anyhow", - "heck", - "proc-macro-crate", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", + "windows-targets 0.52.6", ] [[package]] -name = "glib-sys" -version = "0.15.10" +name = "windows-sys" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "libc", - "system-deps", + "windows-link", ] [[package]] -name = "gobject-sys" -version = "0.15.10" +name = "windows-targets" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" dependencies = [ - "glib-sys", - "libc", - "system-deps", + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", ] [[package]] -name = "gtk" -version = "0.15.5" +name = "windows-targets" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "atk", - "bitflags", - "cairo-rs", - "field-offset", - "futures-channel", - "gdk", - "gdk-pixbuf", - "gio", - "glib", - "gtk-sys", - "gtk3-macros", - "libc", - "once_cell", - "pango", - "pkg-config", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] -name = "gtk-layer-shell" -version = "0.4.4" +name = "windows-threading" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4316ff523ae445bd6efaf253f217598dd074619fe67b9199b5b0cd5ff99144da" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" dependencies = [ - "bitflags", - "gdk", - "glib", - "glib-sys", - "gtk", - "gtk-layer-shell-sys", - "libc", + "windows-link", ] [[package]] -name = "gtk-layer-shell-sys" -version = "0.4.4" +name = "windows_aarch64_gnullvm" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff60230d690445577655416055dbd279d05631b03ab07f935e39f5fe81084c0a" -dependencies = [ - "gdk-sys", - "glib-sys", - "gtk-sys", - "libc", - "system-deps", -] +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] -name = "gtk-sys" -version = "0.15.3" +name = "windows_aarch64_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" -dependencies = [ - "atk-sys", - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "system-deps", -] +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] -name = "gtk3-macros" -version = "0.15.6" +name = "windows_aarch64_msvc" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" -dependencies = [ - "anyhow", - "proc-macro-crate", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", -] +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] -name = "heck" -version = "0.4.0" +name = "windows_aarch64_msvc" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] -name = "itertools" -version = "0.8.2" +name = "windows_i686_gnu" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" -dependencies = [ - "either", -] +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] -name = "lazy_static" -version = "1.4.0" +name = "windows_i686_gnu" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] -name = "lexical-core" -version = "0.7.6" +name = "windows_i686_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" -dependencies = [ - "arrayvec", - "bitflags", - "cfg-if", - "ryu", - "static_assertions", -] +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] -name = "libc" -version = "0.2.126" +name = "windows_i686_msvc" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] -name = "locale-types" -version = "0.4.0" +name = "windows_i686_msvc" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02be1c159bff06af0fdec8942a4f3a9242cc2ecebdfccb0d29d3c100ca5e7a97" -dependencies = [ - "lazy_static", - "regex", -] +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] -name = "memchr" -version = "2.6.2" +name = "windows_x86_64_gnu" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5486aed0026218e61b8a01d5fbd5a0a134649abb71a0e53b7bc088529dced86e" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] -name = "memoffset" -version = "0.6.4" +name = "windows_x86_64_gnu" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" -dependencies = [ - "autocfg", -] +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] -name = "nom" -version = "6.1.2" +name = "windows_x86_64_gnullvm" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7413f999671bd4745a7b624bd370a569fb6bc574b23c83a3c5ed2e453f3d5e2" -dependencies = [ - "bitvec", - "funty", - "lexical-core", - "memchr", - "version_check", -] +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] -name = "once_cell" -version = "1.8.0" +name = "windows_x86_64_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] -name = "osstrtools" -version = "0.2.2" -source = "git+https://github.com/Artturin/osstrtools.git?rev=6360f4f842eb542ff4e62e75851ea8ba83808471#6360f4f842eb542ff4e62e75851ea8ba83808471" -dependencies = [ - "itertools", -] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] -name = "pango" -version = "0.15.10" +name = "windows_x86_64_msvc" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" -dependencies = [ - "bitflags", - "glib", - "libc", - "once_cell", - "pango-sys", -] +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "pango-sys" -version = "0.15.10" +name = "winit" +version = "0.30.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" dependencies = [ - "glib-sys", - "gobject-sys", + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.10.0", + "block2 0.5.1", + "bytemuck", + "calloop 0.13.0", + "cfg_aliases", + "concurrent-queue", + "core-foundation 0.9.4", + "core-graphics", + "cursor-icon", + "dpi", + "js-sys", "libc", - "system-deps", + "memmap2", + "ndk", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix 0.38.44", + "sctk-adwaita", + "smithay-client-toolkit 0.19.2", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", ] [[package]] -name = "pest" -version = "2.1.3" +name = "winnow" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ - "ucd-trie", + "memchr", ] [[package]] -name = "pin-project-lite" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" - -[[package]] -name = "pin-utils" -version = "0.1.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] -name = "pkg-config" -version = "0.3.20" +name = "write16" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c9b1041b4387893b91ee6746cddfc28516aff326a3519fb2adf820932c5e6cb" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" [[package]] -name = "proc-macro-crate" -version = "1.1.0" +name = "writeable" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83" -dependencies = [ - "thiserror", - "toml", -] +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "x11-dl" +version = "2.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn", - "version_check", + "libc", + "once_cell", + "pkg-config", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "x11rb" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" dependencies = [ - "proc-macro2", - "quote", - "version_check", + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix 1.1.2", + "x11rb-protocol", ] [[package]] -name = "proc-macro2" -version = "1.0.66" +name = "x11rb-protocol" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" -dependencies = [ - "unicode-ident", -] +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" [[package]] -name = "quote" -version = "1.0.33" +name = "xcursor" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" -dependencies = [ - "proc-macro2", -] +checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" [[package]] -name = "radium" -version = "0.5.3" +name = "xdg" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "941ba9d78d8e2f7ce474c015eea4d9c6d25b6a3327f9832ee29a4de27f91bbb8" +checksum = "2fb433233f2df9344722454bc7e96465c9d03bff9d77c248f9e7523fe79585b5" [[package]] -name = "redox_syscall" -version = "0.2.13" +name = "xkbcommon-dl" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags", + "bitflags 2.10.0", + "dlib", + "log", + "once_cell", + "xkeysym", ] [[package]] -name = "redox_users" -version = "0.4.3" +name = "xkeysym" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom", - "redox_syscall", - "thiserror", -] +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] -name = "regex" -version = "1.6.0" +name = "xml-rs" +version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" [[package]] -name = "regex-syntax" -version = "0.6.27" +name = "xmlwriter" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" +checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" [[package]] -name = "rustc_version" -version = "0.3.3" +name = "y4m" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver", -] +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" [[package]] -name = "ryu" -version = "1.0.5" +name = "yazi" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" [[package]] -name = "semver" -version = "0.11.0" +name = "yoke" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "semver-parser", + "stable_deref_trait", + "yoke-derive", + "zerofrom", ] [[package]] -name = "semver-parser" -version = "0.10.2" +name = "yoke-derive" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ - "pest", + "proc-macro2", + "quote", + "syn", + "synstructure", ] [[package]] -name = "serde" -version = "1.0.185" +name = "zbus" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be9b6f69f1dfd54c3b568ffa45c310d6973a5e5148fd40cf515acaf38cf5bc31" +checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "nix", + "ordered-stream", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow", + "zbus_macros", + "zbus_names", + "zvariant", +] [[package]] -name = "serde_derive" -version = "1.0.138" +name = "zbus_macros" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "023e9b1467aef8a10fb88f25611870ada9800ef7e22afce356bb0d2387b6f27c" +checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" dependencies = [ + "proc-macro-crate", "proc-macro2", "quote", "syn", + "zbus_names", + "zvariant", + "zvariant_utils", ] [[package]] -name = "shlex" -version = "1.3.0" +name = "zbus_names" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "sirula" -version = "1.1.0" +checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" dependencies = [ - "freedesktop_entry_parser", - "futures", - "fuzzy-matcher", - "gdk", - "gdk-pixbuf", - "gio", - "glib", - "gtk", - "gtk-layer-shell", - "libc", - "locale-types", - "osstrtools", - "pango", - "regex", "serde", - "serde_derive", - "shlex", - "toml", - "xdg", + "static_assertions", + "winnow", + "zvariant", ] [[package]] -name = "slab" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" - -[[package]] -name = "smallvec" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" - -[[package]] -name = "static_assertions" -version = "1.1.0" +name = "zeno" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] -name = "syn" -version = "1.0.98" +name = "zerocopy" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "zerocopy-derive", ] [[package]] -name = "system-deps" -version = "6.0.2" +name = "zerocopy-derive" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a45a1c4c9015217e12347f2a411b57ce2c4fc543913b14b6fe40483328e709" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" dependencies = [ - "cfg-expr", - "heck", - "pkg-config", - "toml", - "version-compare", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "thiserror" -version = "1.0.30" +name = "zerofrom" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ - "thiserror-impl", + "zerofrom-derive", ] [[package]] -name = "thiserror-impl" -version = "1.0.30" +name = "zerofrom-derive" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", "syn", + "synstructure", ] [[package]] -name = "thread_local" -version = "1.1.3" +name = "zerotrie" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ - "once_cell", + "displaydoc", + "yoke", + "zerofrom", ] [[package]] -name = "toml" -version = "0.5.9" +name = "zerovec" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "serde", + "yoke", + "zerofrom", + "zerovec-derive", ] [[package]] -name = "ucd-trie" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" - -[[package]] -name = "unicode-ident" -version = "1.0.1" +name = "zerovec-derive" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] -name = "version-compare" -version = "0.1.0" +name = "zune-core" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe88247b92c1df6b6de80ddc290f3976dbdf2f5f5d3fd049a9fb598c6dd5ca73" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" [[package]] -name = "version_check" -version = "0.9.3" +name = "zune-core" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +checksum = "111f7d9820f05fd715df3144e254d6fc02ee4088b0644c0ffd0efc9e6d9d2773" [[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +name = "zune-inflate" +version = "0.2.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] [[package]] -name = "winapi" -version = "0.3.9" +name = "zune-jpeg" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "zune-core 0.4.12", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "zune-jpeg" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +checksum = "51d915729b0e7d5fe35c2f294c5dc10b30207cc637920e5b59077bfa3da63f28" +dependencies = [ + "zune-core 0.5.0", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "zvariant" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow", + "zvariant_derive", + "zvariant_utils", +] [[package]] -name = "wyz" -version = "0.2.0" +name = "zvariant_derive" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" +checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zvariant_utils", +] [[package]] -name = "xdg" -version = "2.4.1" +name = "zvariant_utils" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4583db5cbd4c4c0303df2d15af80f0539db703fa1c68802d4cbbd2dd0f88f6" +checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" dependencies = [ - "dirs", + "proc-macro2", + "quote", + "serde", + "syn", + "winnow", ] diff --git a/Cargo.toml b/Cargo.toml index 4c8cbb5..f5547f9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,29 +1,38 @@ [package] -name = "sirula" -version = "1.1.0" -authors = ["Dorian Rudolph", "Jan Luca"] +name = "cirula" +version = "0.1.0" +authors = ["Dorian Rudolph", "Jan Luca", "Michael Lee"] edition = "2021" [dependencies] -freedesktop_entry_parser = "1.2.0" -locale-types = "0.4.0" -libc = "0.2.103" -gtk-layer-shell = "0.4.1" -gtk = { version = "0.15.5", features = ["v3_22"] } -gio = { version = "0.15.12", features = ["v2_60"] } -gdk = "0.15.4" -pango = "0.15.4" -gdk-pixbuf = "0.15.11" -glib = "0.15.12" -futures = "0.3.21" -fuzzy-matcher = "0.3.7" -xdg = "2.4.1" -serde = "1.0.138" -serde_derive = "1.0.138" -toml = "0.5.9" -regex = "1.6.0" -osstrtools = {git = "https://github.com/Artturin/osstrtools.git", rev="6360f4f842eb542ff4e62e75851ea8ba83808471"} -shlex = "1.3.0" +# UI Framework +iced = { version = "0.14", features = ["tokio", "image", "svg"] } +iced_layershell = "0.14" +iced_font_awesome = "0.4" + +# Async runtime +tokio = { version = "1", features = ["rt", "rt-multi-thread", "sync", "fs"] } + +# App discovery +freedesktop_entry_parser = "2.0" + +# Search +fuzzy-matcher = "0.3" +regex = "1.12" + +# Config and serialization +serde = { version = "1.0", features = ["derive"] } +toml = "0.8" + +# Utilities +xdg = "3.0" +shlex = "1.3" +icu_collator = "2" +icu_locale = { version = "2", features = ["serde"] } +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } +strum = { version = "0.27", features = ["derive"] } [profile.release] +# Link-Time Optimization: reduces binary size and improves performance at the cost of longer compile times lto = true diff --git a/README.md b/README.md index 2d0f074..e115ac6 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,110 @@ -# Sirula +# Cirula -Sirula (simple rust launcher) is an app launcher for wayland. +Cirula (simple rust launcher) is an app launcher for wayland. Currently, the only feature is launching apps from `.desktop` files. Feel free to submit pull requests for any feature you like. -I wrote sirula partially to learn rust, so do not expect perfect rust code. -I'd be happy to hear any criticism of my code. +Fork of [Sirula](https://github.com/DorianRudolph/sirula) that replaces GTK with Iced. -## Examples +## Why fork it? + +I liked the simplicity of Sirula, but it's not been maintained for a while. I'm also more familiar with Iced than GTK, and it has fewer non-rust dependencies. This makes it easier to actively fix dependencies. + +## Does it support everything Sirula supports -`sample-config/a`: +I have not thoroughly tested every option yet. The main goal was to have a working launcher to replace the one I used. :) -![](sample-config/a/sirula.gif) -[open](https://raw.githubusercontent.com/DorianRudolph/sirula/master/sample-config/sirula.gif) +## Examples -`sample-config/b`: Overlay in the center of the screen. +Coming soon! This is still Work in progress! Though, it's mostly the same minus the CSS. Colours/transparency can be controlled with the `app_theme`/`custom_palette` settings in the `~/.config/cirula/config.toml` file. -![](sample-config/b/sirula.png) ## Building -- Dependency: [gtk-layer-shell](https://github.com/wmww/gtk-layer-shell) +- Dependencies: [iced](https://github.com/iced-rs/iced), [iced_layershell](https://github.com/waycrate/exwlshelleventloop) - Build: `cargo build --release` - Optionally, `strip` the binary to reduce size - Alternatively, install with `cargo install --path .` -- There is also an unofficial [AUR package](https://aur.archlinux.org/packages/sirula-git/) ## Configuration -Use `config.toml` and `style.css` in your `.config/sirula` directory. -See `sample-config` for documentation. \ No newline at end of file +Use `config.toml` (`~/.config/cirula/config.toml`). +See `sample-config` for documentation. + +## Built-in themes + +You can set the theme in the config.toml file (snake-case): + +### Example +```toml +app_theme: tokyo_night_storm +``` + +### Available themes + +- light +- dark +- dracula +- nord +- solarized_light +- solarized_dark +- gruvbox_light +- gruvbox_dark +- catppuccin_latte +- catppuccin_frappe +- catppuccin_macchiato +- catppuccin_mocha +- tokyo_night +- tokyo_night_storm +- tokyo_night_light +- kanagawa_wave +- kanagawa_dragon +- kanagawa_lotus +- moonfly +- nightfly +- oxocarbon +- ferra + +## Custom 'theme' + +You can also set a custom colour palette, including transparency. + +### Example 'Cyberpunk/Synthwave palette' +```toml +[custom_palette] +background = "#14141f" +text = "#f2f2fa" +primary = "#8066e6" +success = "#4dcc99" +danger = "#e64d66" +warning = "#e6b34d" +``` + +## Sorting locale + +You can override the sorting locale using the ICU format: + +```toml +locale = "nb-NO" # Norwegian bokmål: æ ø å sorted after z +``` + +If not set, uses system locale from `LC_COLLATE`, `LC_ALL`, or `LANG`. + +## Differences from Sirula + +| | Cirula | Sirula | +| ------------- | ------ | --------------------------------- | +| UI framework | Iced | GTK | +| Theming | TOML | GTK CSS / TOML | +| NixOS support | Yes | Partial (many icons don't render) | + +### Known, unsupported toml config: +- `close_on_unfocus` : Currently it will close if you press `ESC` +- `lines` : Not implemented +- `markup_default` : Not implemented +- `markup_higlight` : Not implemented +- `markup_extra` : Not implemented + +## Roadmap + +- Re-add `close_on_unfocus` +- Implement a feature for controlling the [Niri](https://github.com/YaLTeR/niri) desktop environment diff --git a/sample-config/a/config.toml b/sample-config/a/config.toml deleted file mode 100644 index fe48213..0000000 --- a/sample-config/a/config.toml +++ /dev/null @@ -1 +0,0 @@ -markup_highlight = 'foreground="#dc69ff" underline="double"' \ No newline at end of file diff --git a/sample-config/a/readme.md b/sample-config/a/readme.md deleted file mode 100644 index 6bbc7f0..0000000 --- a/sample-config/a/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Config A - -![config-a](./sirula.gif) diff --git a/sample-config/a/sirula.gif b/sample-config/a/sirula.gif deleted file mode 100644 index d8bb337..0000000 Binary files a/sample-config/a/sirula.gif and /dev/null differ diff --git a/sample-config/a/style.css b/sample-config/a/style.css deleted file mode 100644 index c774f8d..0000000 --- a/sample-config/a/style.css +++ /dev/null @@ -1,83 +0,0 @@ -/* -Sirula uses GTK and can be themed with CSS (https://developer.gnome.org/gtk3/stable/chap-css-overview.html) -This theme was tested on top of Adwaita-Dark. -See consts.rs for a list of defined classes and names. - -The style.css can be omitted but sirula will not look very nice since there are no hardcoded margins. - -To remove the global theme completely, use -* { all: unset; } -*/ - -* { - font-family: Iosevka; - font-size: 16px; -} - -.background { - background: transparent; -} - -#root-box, .background, #app-list, .overlay-indicator { - background: transparent; -} - -.app-row { - transition: unset; - border-radius: 4px; - padding: 5px; - margin: 0 3px; - background-clip: padding-box; -} - -.app-row:focus { - outline: unset; -} - -.app-row:hover:selected { - background-color: alpha(white, 0.1); -} - -.app-row:hover { - background-color: alpha(white, 0.035); -} - -.app-row:selected { - background-color: alpha(white, 0.05); -} - - -.app-row:hover.selected { - background-color: alpha(white, 0.1); -} - -.app-label { - margin-left: 10px; -} - -#app-list { - padding: 0 5px; -} - - -#root-box { - min-width: 300px; -} - -scrollbar.vertical slider { - background-color: alpha(white, 0.15); -} - -#search { - background: transparent; - border: unset; - outline: unset; - box-shadow: inset 0px 0px 0px 1px alpha(#dc69ff, 0.5); - margin: 10px 5px 10px 5px; - font-size: 18px; - padding: 2px 8px; -} - -selection { - background-color: alpha(#dc69ff, 0.5); -} diff --git a/sample-config/b/readme.md b/sample-config/b/readme.md deleted file mode 100644 index 86a9fb3..0000000 --- a/sample-config/b/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Config E - -![config-b](./sirula.png) diff --git a/sample-config/b/sirula.png b/sample-config/b/sirula.png deleted file mode 100644 index 59bf4a4..0000000 Binary files a/sample-config/b/sirula.png and /dev/null differ diff --git a/sample-config/b/style.css b/sample-config/b/style.css deleted file mode 100644 index d5479fa..0000000 --- a/sample-config/b/style.css +++ /dev/null @@ -1,20 +0,0 @@ -.app-row { - transition: unset; - padding: 5px 0 5px 10px; -} - -.app-label { - margin-left: 10px; - font-family: Iosevka; - font-size: 16px; -} - -#root-box { - border: 1px solid black; -} - -#search { - font-size: 18px; - padding: 2px 8px; - margin: 5px; -} \ No newline at end of file diff --git a/sample-config/c/README.md b/sample-config/c/README.md deleted file mode 100644 index e95bcc4..0000000 --- a/sample-config/c/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# config-c - -![config-c](./screenshot.png) diff --git a/sample-config/c/config.toml b/sample-config/c/config.toml deleted file mode 100644 index 73b5049..0000000 --- a/sample-config/c/config.toml +++ /dev/null @@ -1,16 +0,0 @@ -markup_highlight = 'underline="low" weight="bold"' -#markup_extra = 'foreground="blue"' -#markup_default = 'foreground="yellow"' -exclusive = true -lines = 1 -icon_size = 20 -anchor_left = false -anchor_right = false -anchor_top = false -anchor_bottom = false -margin_top = 1 -margin_bottom = 0 -margin_left = 0 -margin_right = 0 -width = 750 -height = 450 diff --git a/sample-config/c/screenshot.png b/sample-config/c/screenshot.png deleted file mode 100644 index 61cb189..0000000 Binary files a/sample-config/c/screenshot.png and /dev/null differ diff --git a/sample-config/c/style.css b/sample-config/c/style.css deleted file mode 100644 index 1e52b27..0000000 --- a/sample-config/c/style.css +++ /dev/null @@ -1,35 +0,0 @@ -.app-row { - transition: unset; - padding: 5px 0 5px 10px; - background-color: #263238; -} - -.app-row:selected { - background-color: #37474F; -} - -.app-label { - margin-left: 10px; - font-family: Roboto; - font-size: 14px; - font-weight: 300; -} - -.app-list { - background-color: #f00; - } - -#root-box { - border: 3px solid #263238; - border-radius: 5px 5px 5px 5px; - box-shadow: 0 19px 38px rgba(0,0,0,0.30), 0 15px 12px rgba(0,0,0,0.22); - margin: 100px; - background-color: #263238; -} - -#search { - font-family: Roboto; - font-size: 14px; - padding: 2px 8px; - margin: 5px; -} \ No newline at end of file diff --git a/sample-config/b/config.toml b/sample-config/cyberpunk/config.toml similarity index 56% rename from sample-config/b/config.toml rename to sample-config/cyberpunk/config.toml index ddd186e..df96d94 100644 --- a/sample-config/b/config.toml +++ b/sample-config/cyberpunk/config.toml @@ -1,6 +1,4 @@ -markup_highlight = 'underline="low"' exclusive = true -lines = 1 icon_size = 32 anchor_left = false anchor_right = false @@ -12,4 +10,12 @@ margin_left = 0 margin_right = 0 width = 400 height = 800 -command_prefix = ":" \ No newline at end of file +command_prefix = ":" + +[custom_palette] +background = "#14141f" +text = "#f2f2fa" +primary = "#8066e6" +success = "#4dcc99" +danger = "#e64d66" +warning = "#e6b34d" diff --git a/sample-config/d/config.toml b/sample-config/d/config.toml deleted file mode 100644 index 919d51f..0000000 --- a/sample-config/d/config.toml +++ /dev/null @@ -1,14 +0,0 @@ -markup_highlight = 'underline="low"' -exclusive = true -lines = 10 -icon_size = 48 -anchor_left = false -anchor_right = false -anchor_top = false -anchor_bottom = false -margin_top = 0 -margin_bottom = 0 -margin_left = 0 -margin_right = 0 -width = 600 -height = 400 diff --git a/sample-config/d/readme.md b/sample-config/d/readme.md deleted file mode 100644 index c578e18..0000000 --- a/sample-config/d/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Config D - -![config-d](./screenshot.png) diff --git a/sample-config/d/screenshot.png b/sample-config/d/screenshot.png deleted file mode 100644 index c3abb57..0000000 Binary files a/sample-config/d/screenshot.png and /dev/null differ diff --git a/sample-config/d/style.css b/sample-config/d/style.css deleted file mode 100644 index c80e2de..0000000 --- a/sample-config/d/style.css +++ /dev/null @@ -1,56 +0,0 @@ -* { - background-clip: padding-box; - border-radius: 8px; -} - -/* GtkApplicationWindow */ -.background { - opacity: 1; - background: transparent; - font-family: Rubik, sans-serif; - color: @fg_color; -} - -#root-box { - /* Seems like this isn't really the root */ - background: transparent; -} - -#search { - font-size: 1.5em; - font-weight: 500; - padding: 8px 11px; - margin-bottom: 6px; - - color: inherit; - /*box-shadow: red 3px 3px 3px; */ /* We'd need a way to set the z index */ -} - -#scroll { /*background: transparent;*/ /* It never actually turns transparent */ } - -.app-list { /*background: transparent;*/ } - -.frame { - /*opacity: 0.5;*/ - /*border-radius: 40px; *//* We'd need clipping to be effective */ - background: transparent; -} - -.app-row { - transition: unset; - padding: 6px 0; - /*background-color: transparent;*/ - /*border-radius: 1rem;*/ /*Clipping works kind of here*/ - box-shadow: lightgray 0 4px 4px; -} - -.app-label { - padding-left: 1em; - font-size: 16px; - border: none; -} - -.app-icon { - border-radius: 1rem; - margin: 0 8px; -} diff --git a/sample-config/default-config.toml b/sample-config/default-config.toml index 9ec577f..27d3ab7 100644 --- a/sample-config/default-config.toml +++ b/sample-config/default-config.toml @@ -2,16 +2,10 @@ exclusive = true # push all windows aside or appear above existing windows icon_size = 64 # icon size in pixels -lines = 2 # maximum number of lines of app labels -# markup for app labels -# it seems impossible to theme only parts of a label with CSS -# therefore, we need to use pango directly -# you can use all attributes of the tag (https://developer.gnome.org/pygtk/stable/pango-markup-language.html) -markup_default = '' -# an extra field is appended to the app name (e.g., evince calls itself just "Document Viewer") -markup_extra = 'font_style="italic" font_size="smaller"' -markup_highlight = 'foreground="red" underline="double"' # highlight matched characters +# locale for sorting in BCP-47 format (e.g., "en-US", "de", "sv", "nb-NO") +# if not set, uses system locale from LC_COLLATE, LC_ALL, or LANG +# locale = "en-US" # anchor window to screen edge anchor_left = false @@ -29,9 +23,6 @@ margin_right = 0 width = -1 height = -1 -# close window on unfocus -close_on_unfocus = true - # specify extra field to be displayed alongside the name (may be empty) extra_field = ["id_suffix"] # variants: id, id_suffix, executable, command_line extra_field_newline = false # show extra field under name and not alongside diff --git a/sample-config/e/config.toml b/sample-config/e/config.toml deleted file mode 100644 index 9d5e582..0000000 --- a/sample-config/e/config.toml +++ /dev/null @@ -1,28 +0,0 @@ -markup_highlight = 'underline="low"' -command_prefix = ":" -lines = 2 -icon_size = 48 - -extra_field = ["comment"] -extra_field_newline = true -hidden_fields = ["commandline", "executable"] -markup_extra = 'font_size="smaller"' - -frequent_first = true -recent_first = true -cgroups = true -term_command = "footclient {}" -close_on_unfocus = true -prune_history = 360 - -exclusive = false -anchor_left = false -anchor_right = false -anchor_top = true -anchor_bottom = false -margin_top = 300 -margin_bottom = 0 -margin_left = 0 -margin_right = 0 -width = 400 -height = 550 diff --git a/sample-config/e/readme.md b/sample-config/e/readme.md deleted file mode 100644 index fee41cc..0000000 --- a/sample-config/e/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Config E - -![config-e](./sirula.gif) diff --git a/sample-config/e/sirula.gif b/sample-config/e/sirula.gif deleted file mode 100644 index d168870..0000000 Binary files a/sample-config/e/sirula.gif and /dev/null differ diff --git a/sample-config/e/style.css b/sample-config/e/style.css deleted file mode 100644 index 32e35e8..0000000 --- a/sample-config/e/style.css +++ /dev/null @@ -1,55 +0,0 @@ -* { - background-clip: padding-box; - border-radius: 10px; - text-shadow: none; - outline: none; - box-shadow: none; - color: white; - background: transparent; -} - -/* GtkApplicationWindow */ -.background { - opacity: 1; - font-family: Rubik, sans-serif; -} - -#root-box {} - -#app-list, #search { - background: alpha(#04232A, 0.8); -} - -#search { - font-size: 1.5em; - font-weight: 500; - padding: 8px 11px; - margin-bottom: 6px; - border: 3px solid #8000ff; -} - -.app-row { - border-radius: 10px; - transition: 0.2s; - padding: 6px 16px 6px 0; - opacity: 0.95; -} - -.app-row:selected, .app-row:hover { - padding-left: 8px; - padding-right: 8px; - opacity: 1; - background-color: alpha(#8000ff, 0.8); - outline: none; -} - -.app-label { - padding-left: 1em; - font-size: 16px; - border: none; -} - -.app-icon { - border-radius: 1rem; - margin: 0 8px; -} diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..287266d --- /dev/null +++ b/shell.nix @@ -0,0 +1,66 @@ +{ pkgs ? import { } +, +}: +let + libPath = + with pkgs; + lib.makeLibraryPath [ + libGL + libxkbcommon + wayland + ]; + + currentSystemIsMac = builtins.isList (builtins.match ".*darwin" (builtins.currentSystem)); + + platformDeps = + if currentSystemIsMac then + [ + pkgs.rustup + ] + else + [ + pkgs.gcc + pkgs.rustup + ]; + + deps = with pkgs; [ + pkg-config + glib + ]; + + env = + if currentSystemIsMac then + { + shellHook = '' + rustup update stable + rustup default stable + ''; + } + else + { + RUST_LOG = "debug"; + RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}"; + LD_LIBRARY_PATH = libPath; + shellHook = '' + export PATH="$HOME/.cargo/bin:$PATH" + rustup update stable + rustup default stable + ''; + }; + +in +{ + devShell = + with pkgs; + mkShell ( + { + buildInputs = [ + nil + nixd + ] + ++ platformDeps + ++ deps; + } + // env + ); +} diff --git a/src/app_entry.rs b/src/app_entry.rs index 32104ca..0026a0e 100644 --- a/src/app_entry.rs +++ b/src/app_entry.rs @@ -18,64 +18,48 @@ along with sirula. If not, see . */ use crate::locale::string_collate; +use freedesktop_entry_parser::{parse_entry, Entry}; use fuzzy_matcher::{skim::SkimMatcherV2, FuzzyMatcher}; -use gio::AppInfo; -use glib::shell_unquote; -use gtk::{ - builders::{BoxBuilder, ImageBuilder, LabelBuilder}, - prelude::*, - IconLookupFlags, IconTheme, Label, ListBoxRow, Orientation, -}; -use pango::{AttrList, Attribute, EllipsizeMode}; +use regex::RegexSet; use std::cmp::Ordering; use std::collections::HashMap; +use std::path::PathBuf; +use tokio::task::JoinSet; +use tracing::{debug, trace}; -use super::{consts::*, Config, Field, HistoryData}; -use regex::RegexSet; +use super::{Config, Field, HistoryData}; -#[derive(Eq)] +#[derive(Clone)] pub struct AppEntry { + pub id: String, + pub name: String, pub display_string: String, pub search_string: String, - pub extra_range: Option<(u32, u32)>, - pub info: AppInfo, - pub label: Label, + pub extra_text: Option, + pub command_line: String, + pub icon_path: Option, + pub is_terminal: bool, pub score: i64, pub history: HistoryData, } impl AppEntry { - pub fn update_match(&mut self, pattern: &str, matcher: &SkimMatcherV2, config: &Config) { - self.set_markup(config); - - let attr_list = self.label.attributes().unwrap_or_default(); - self.score = if pattern.is_empty() { - self.label.set_attributes(None); - 100 - } else if let Some((score, indices)) = matcher.fuzzy_indices(&self.search_string, pattern) { - let mut chars = vec![]; - for cur in self.search_string.as_str().char_indices() { - chars.push(cur); - } - chars.push((self.search_string.len(), ' ')); - - for i in indices { - if i < self.display_string.len() { - let i = i as usize; - add_attrs( - &attr_list, - &config.markup_highlight, - chars[i].0 as u32, - chars[i + 1].0 as u32, - ); - } - } - score - } else { - 0 - }; + pub fn update_match(&mut self, pattern: &str, matcher: &SkimMatcherV2) -> Vec { + if pattern.is_empty() { + self.score = 100; + return vec![]; + } - self.label.set_attributes(Some(&attr_list)); + if let Some((score, indices)) = matcher.fuzzy_indices(&self.search_string, pattern) { + self.score = score; + indices + .into_iter() + .filter(|&i| i < self.display_string.len()) + .collect() + } else { + self.score = 0; + vec![] + } } pub fn hide(&mut self) { @@ -83,22 +67,7 @@ impl AppEntry { } pub fn hidden(&self) -> bool { - 0 == self.score - } - - fn set_markup(&self, config: &Config) { - let attr_list = AttrList::new(); - - add_attrs( - &attr_list, - &config.markup_default, - 0, - self.display_string.len() as u32, - ); - if let Some((lo, hi)) = self.extra_range { - add_attrs(&attr_list, &config.markup_extra, lo, hi); - } - self.label.set_attributes(Some(&attr_list)); + self.score == 0 } } @@ -108,6 +77,8 @@ impl PartialEq for AppEntry { } } +impl Eq for AppEntry {} + impl Ord for AppEntry { fn cmp(&self, other: &Self) -> Ordering { match self.score.cmp(&other.score) { @@ -129,165 +100,328 @@ impl PartialOrd for AppEntry { } } -fn get_app_field(app: &AppInfo, field: Field) -> Option { +/// Helper to get first value from attr (freedesktop_entry_parser 2.0 returns &[String]) +fn get_attr(entry: &Entry, key: &str) -> Option { + entry + .section("Desktop Entry") + .and_then(|s| s.attr(key).first().map(|s| s.to_string())) +} + +fn get_app_field(entry: &Entry, field: Field) -> Option { match field { - Field::Comment => app.description().map(Into::into), - Field::Id => app - .id() - .and_then(|s| s.to_string().strip_suffix(".desktop").map(Into::into)), - Field::IdSuffix => app.id().and_then(|id| { - let id = id.to_string(); - let parts: Vec<&str> = id.split('.').collect(); - parts.get(parts.len() - 2).map(|s| s.to_string()) + Field::Comment => get_attr(entry, "Comment"), + Field::Id => None, + Field::IdSuffix => None, + Field::Executable => get_attr(entry, "Exec").and_then(|exec| { + exec.split_whitespace().next().map(|s| { + std::path::Path::new(s) + .file_name() + .map(|n| n.to_string_lossy().to_string()) + .unwrap_or_else(|| s.to_string()) + }) }), - Field::Executable => app - .executable() - .file_name() - .and_then(|e| shell_unquote(e).ok()) - .map(|s| s.to_string_lossy().to_string()), - //TODO: clean up command line from % for all what is not done in launch_app() in src/util.rx - Field::Commandline => app.commandline().map(|s| s.to_string_lossy().to_string()), + Field::Commandline => get_attr(entry, "Exec"), } } -fn add_attrs(list: &AttrList, attrs: &Vec, start: u32, end: u32) { - for attr in attrs { - let mut attr = attr.clone(); - attr.set_start_index(start); - attr.set_end_index(end); - list.insert(attr); +fn get_id_field(id: &str, field: Field) -> Option { + let id_without_desktop = id.strip_suffix(".desktop").unwrap_or(id); + match field { + Field::Id => Some(id_without_desktop.to_string()), + Field::IdSuffix => { + let parts: Vec<&str> = id_without_desktop.split('.').collect(); + parts + .get(parts.len().saturating_sub(1)) + .map(|s| s.to_string()) + } + _ => None, } } -pub fn load_entries( - config: &Config, - history: &HashMap, -) -> HashMap { - let mut entries = HashMap::new(); - let icon_theme = IconTheme::default().unwrap(); - let apps = gio::AppInfo::all(); - let exclude = RegexSet::new(&config.exclude).expect("Invalid regex"); +/// Fallback icon lookup for NixOS and other systems where freedesktop-icons may not find icons +/// Prefers SVG icons, then highest resolution PNG +fn lookup_icon(icon_name: &str, _icon_size: i32) -> Option { + // Get search dirs from XDG_DATA_DIRS environment variable + let mut search_dirs: Vec = std::env::var("XDG_DATA_DIRS") + .unwrap_or_default() + .split(':') + .filter(|s| !s.is_empty()) + .map(PathBuf::from) + .collect(); + + trace!(icon_name, "XDG_DATA_DIRS has {} entries", search_dirs.len()); + + // Add common system paths that might not be in XDG_DATA_DIRS + search_dirs.push(PathBuf::from("/run/current-system/sw/share")); + search_dirs.push(PathBuf::from("/usr/share")); + search_dirs.push(PathBuf::from("/usr/local/share")); + + // Add home data dir + if let Ok(home) = std::env::var("HOME") { + search_dirs.push(PathBuf::from(home).join(".local/share")); + } - for app in apps { - if !app.should_show() { - continue; + // Icon sizes to try, prefer scalable (SVG) and larger sizes first + let sizes = [ + "scalable", "512x512", "256x256", "128x128", "96x96", "72x72", "64x64", "48x48", "32x32", + "24x24", "22x22", "16x16", + ]; + + let themes = [ + "hicolor", + "Adwaita", + "breeze", + "Cosmic", + "Pop", + "MoreWaita", + "gnome", + "oxygen", + ]; + let categories = ["apps", "applications", "mimetypes", "places", "devices"]; + + // First pass: look for SVG icons (best quality, scalable) + for base in &search_dirs { + // Check pixmaps for SVG first + let path = base.join("pixmaps").join(format!("{}.svg", icon_name)); + if path.exists() { + trace!(icon_name, ?path, "Found SVG icon in pixmaps"); + return Some(path); } - let name = app.display_name().to_string(); - - let id = match app.id() { - Some(id) => id.to_string(), - _ => continue, - }; + // Check icon themes for SVG (scalable directory) + for theme in &themes { + for category in &categories { + let path = base + .join("icons") + .join(theme) + .join("scalable") + .join(category) + .join(format!("{}.svg", icon_name)); + if path.exists() { + trace!(icon_name, ?path, "Found scalable SVG icon"); + return Some(path); + } + } + } - if exclude.is_match(&id) { - continue; + // Check sized directories for SVG (some themes put SVGs in sized dirs) + for theme in &themes { + for size in &sizes { + for category in &categories { + let path = base + .join("icons") + .join(theme) + .join(size) + .join(category) + .join(format!("{}.svg", icon_name)); + if path.exists() { + trace!(icon_name, ?path, "Found SVG icon"); + return Some(path); + } + } + } } + } - let (display_string, extra_range) = if let Some(name) = - get_app_field(&app, Field::Id).and_then(|id| config.name_overrides.get(&id)) - { - let i = name.find('\r'); - ( - name.replace('\r', " "), - i.map(|i| (i as u32 + 1, name.len() as u32)), - ) - } else { - let extra = config - .extra_field - .get(0) - .and_then(|f| get_app_field(&app, *f)); - match extra { - Some(e) - if (!config.hide_extra_if_contained - || !name.to_lowercase().contains(&e.to_lowercase())) => - { - ( - format!("{}{}{}", - name, - if config.extra_field_newline {"\n"} else {" "}, - e - ), - Some(( - name.len() as u32 + 1, - name.len() as u32 + 1 + e.len() as u32, - )), - ) + // Second pass: look for PNG icons, preferring highest resolution + for base in &search_dirs { + for theme in &themes { + for size in &sizes { + if *size == "scalable" { + continue; // Skip scalable for PNG lookup + } + for category in &categories { + let path = base + .join("icons") + .join(theme) + .join(size) + .join(category) + .join(format!("{}.png", icon_name)); + if path.exists() { + trace!(icon_name, ?path, "Found PNG icon"); + return Some(path); + } } - _ => (name, None), } - }; + } - let hidden = config - .hidden_fields - .iter() - .map(|f| get_app_field(&app, *f).unwrap_or_default()) - .collect::>() - .join(" "); + // Check pixmaps for PNG (usually lower quality, check last) + let path = base.join("pixmaps").join(format!("{}.png", icon_name)); + if path.exists() { + trace!(icon_name, ?path, "Found PNG icon in pixmaps"); + return Some(path); + } + } - let search_string = if hidden.is_empty() { - display_string.clone() - } else { - format!("{} {}", display_string, hidden) - }; - - let label = LabelBuilder::new() - .xalign(0.0f32) - .label(&display_string) - .wrap(true) - .ellipsize(EllipsizeMode::End) - .lines(config.lines) - .build(); - label.style_context().add_class(APP_LABEL_CLASS); - - let image = ImageBuilder::new().pixel_size(config.icon_size).build(); - if let Some(icon) = app.icon() { - // Don't set the icon if it'd give us an ugly fallback icon - if icon_theme - .lookup_by_gicon(&icon, config.icon_size, IconLookupFlags::FORCE_SIZE) - .is_some() + // Third pass: XPM as last resort + for base in &search_dirs { + let path = base.join("pixmaps").join(format!("{}.xpm", icon_name)); + if path.exists() { + trace!(icon_name, ?path, "Found XPM icon in pixmaps"); + return Some(path); + } + } + + debug!(icon_name, "Icon not found"); + None +} + +/// Parse a single .desktop file and return an AppEntry if valid +fn parse_desktop_file( + path: PathBuf, + config: &Config, + history: &HashMap, + exclude: &RegexSet, +) -> Option { + let entry = parse_entry(&path).ok()?; + + // Skip if NoDisplay or Hidden + if get_attr(&entry, "NoDisplay").is_some_and(|v| v == "true") { + return None; + } + if get_attr(&entry, "Hidden").is_some_and(|v| v == "true") { + return None; + } + + // Get app ID from filename + let id = path.file_name()?.to_str()?.to_string(); + + if id.is_empty() || exclude.is_match(&id) { + return None; + } + + let name = get_attr(&entry, "Name")?; + let command_line = get_attr(&entry, "Exec")?; + + let is_terminal = get_attr(&entry, "Terminal").is_some_and(|t| t == "true" || t == "1"); + let icon_path = + get_attr(&entry, "Icon").and_then(|icon_name| lookup_icon(&icon_name, config.icon_size)); + + // Build display string + let (display_string, extra_text) = if let Some(override_name) = + get_id_field(&id, Field::Id).and_then(|app_id| config.name_overrides.get(&app_id)) + { + let i = override_name.find('\r'); + ( + override_name.replace('\r', " "), + i.map(|idx| override_name[idx + 1..].to_string()), + ) + } else { + let extra = config + .extra_field + .first() + .and_then(|f| get_app_field(&entry, *f).or_else(|| get_id_field(&id, *f))); + match extra { + Some(e) + if (!config.hide_extra_if_contained + || !name.to_lowercase().contains(&e.to_lowercase())) => { - image.set_from_gicon(&icon, gtk::IconSize::Menu); + let separator = if config.extra_field_newline { + "\n" + } else { + " " + }; + (format!("{}{}{}", name, separator, e), Some(e)) } + _ => (name.clone(), None), } - image.style_context().add_class(APP_ICON_CLASS); + }; + + let hidden = config + .hidden_fields + .iter() + .filter_map(|f| get_app_field(&entry, *f).or_else(|| get_id_field(&id, *f))) + .collect::>() + .join(" "); + + let search_string = if hidden.is_empty() { + display_string.clone() + } else { + format!("{} {}", display_string, hidden) + }; + + let history_data = history.get(&id).copied().unwrap_or_default(); + let last_used = if config.recent_first { + history_data.last_used + } else { + 0 + }; + let usage_count = if config.frequent_first { + history_data.usage_count + } else { + 0 + }; + + Some(AppEntry { + id, + name, + display_string, + search_string, + extra_text, + command_line, + icon_path, + is_terminal, + score: 100, + history: HistoryData { + last_used, + usage_count, + }, + }) +} - let hbox = BoxBuilder::new() - .orientation(Orientation::Horizontal) - .build(); - hbox.pack_start(&image, false, false, 0); - hbox.pack_end(&label, true, true, 0); +/// Async version of load_entries using tokio for parallel file discovery +pub async fn load_entries_async( + config: &'static Config, + history: &'static HashMap, +) -> Vec { + let exclude = RegexSet::new(&config.exclude).expect("Invalid regex"); - let row = ListBoxRow::new(); - row.add(&hbox); - row.style_context().add_class(APP_ROW_CLASS); + // Find all .desktop files in XDG data directories + let data_dirs = xdg::BaseDirectories::new(); + let mut desktop_files: Vec = Vec::new(); + + // Search in applications directories using tokio::fs + for dir in data_dirs.get_data_dirs() { + let apps_dir = dir.join("applications"); + if let Ok(mut read_dir) = tokio::fs::read_dir(&apps_dir).await { + while let Ok(Some(entry)) = read_dir.next_entry().await { + let path = entry.path(); + if path.extension().is_some_and(|e| e == "desktop") { + desktop_files.push(path); + } + } + } + } - let history_data = history.get(&id).copied().unwrap_or_default(); - let last_used = if config.recent_first { - history_data.last_used - } else { - 0 - }; - let usage_count = if config.frequent_first { - history_data.usage_count - } else { - 0 - }; - - let app_entry = AppEntry { - display_string, - search_string, - extra_range, - info: app, - label, - score: 100, - history: HistoryData { - last_used, - usage_count, - }, - }; - app_entry.set_markup(config); - entries.insert(row, app_entry); + // Also check user's local applications + if let Some(data_home) = data_dirs.get_data_home() { + let local_apps = data_home.join("applications"); + if let Ok(mut read_dir) = tokio::fs::read_dir(&local_apps).await { + while let Ok(Some(entry)) = read_dir.next_entry().await { + let path = entry.path(); + if path.extension().is_some_and(|e| e == "desktop") { + desktop_files.push(path); + } + } + } + } + + // Parse all .desktop files in parallel using spawn_blocking for CPU-bound parsing + let mut join_set: JoinSet> = JoinSet::new(); + let exclude = std::sync::Arc::new(exclude); + + for path in desktop_files { + let exclude = exclude.clone(); + join_set.spawn_blocking(move || parse_desktop_file(path, config, history, &exclude)); } + + let mut entries = Vec::new(); + while let Some(result) = join_set.join_next().await { + if let Ok(Some(entry)) = result { + entries.push(entry); + } + } + + entries.sort(); entries } diff --git a/src/config.rs b/src/config.rs index c28eece..783ed9f 100644 --- a/src/config.rs +++ b/src/config.rs @@ -17,17 +17,80 @@ along with sirula. If not, see . use super::consts::*; use super::util::get_config_file; -use pango::Attribute; -use serde::{de::Error, Deserializer}; -use serde_derive::Deserialize; +use iced::Color; +use icu_locale::Locale; +use serde::Deserialize; use std::collections::HashMap; +use strum::{Display, EnumString}; + +/// Parse a hex color string (supports #RGB, #RGBA, #RRGGBB, #RRGGBBAA) +fn parse_hex_color(s: &str) -> Option { + let s = s.trim_start_matches('#'); + match s.len() { + 3 => { + // #RGB + let r = u8::from_str_radix(&s[0..1], 16).ok()? * 17; + let g = u8::from_str_radix(&s[1..2], 16).ok()? * 17; + let b = u8::from_str_radix(&s[2..3], 16).ok()? * 17; + Some(Color::from_rgb8(r, g, b)) + } + 4 => { + // #RGBA + let r = u8::from_str_radix(&s[0..1], 16).ok()? * 17; + let g = u8::from_str_radix(&s[1..2], 16).ok()? * 17; + let b = u8::from_str_radix(&s[2..3], 16).ok()? * 17; + let a = u8::from_str_radix(&s[3..4], 16).ok()? * 17; + Some(Color::from_rgba8(r, g, b, a as f32 / 255.0)) + } + 6 => { + // #RRGGBB + let r = u8::from_str_radix(&s[0..2], 16).ok()?; + let g = u8::from_str_radix(&s[2..4], 16).ok()?; + let b = u8::from_str_radix(&s[4..6], 16).ok()?; + Some(Color::from_rgb8(r, g, b)) + } + 8 => { + // #RRGGBBAA + let r = u8::from_str_radix(&s[0..2], 16).ok()?; + let g = u8::from_str_radix(&s[2..4], 16).ok()?; + let b = u8::from_str_radix(&s[4..6], 16).ok()?; + let a = u8::from_str_radix(&s[6..8], 16).ok()?; + Some(Color::from_rgba8(r, g, b, a as f32 / 255.0)) + } + _ => None, + } +} + +/// Custom palette configuration +#[derive(Deserialize, Debug, Clone, Default)] +pub struct CustomPalette { + pub background: Option, + pub text: Option, + pub primary: Option, + pub success: Option, + pub danger: Option, + pub warning: Option, +} + +impl CustomPalette { + pub fn to_iced_palette(&self) -> Option { + // All colors must be specified for a custom palette + Some(iced::theme::Palette { + background: parse_hex_color(self.background.as_ref()?)?, + text: parse_hex_color(self.text.as_ref()?)?, + primary: parse_hex_color(self.primary.as_ref()?)?, + success: parse_hex_color(self.success.as_ref()?)?, + danger: parse_hex_color(self.danger.as_ref()?)?, + warning: parse_hex_color(self.warning.as_ref()?)?, + }) + } +} macro_rules! make_config { - ($name:ident { $($field:ident : $type:ty $( = ($default:expr) $field_str:literal )? $( [$serde_opts:expr])? ),* }) => { + ($name:ident { $($field:ident : $type:ty $( = ($default:expr) $field_str:literal )? ),* }) => { #[derive(Deserialize, Debug)] pub struct $name { $( #[serde( $(default = $field_str )? )] - $(#[serde($serde_opts)])? pub $field: $type, )* } $( $( fn $field() -> $type { $default } )? )* @@ -44,17 +107,44 @@ pub enum Field { Commandline, } -// not sure how to avoid having to specify the name twice +#[derive(Deserialize, Debug, Clone, Default, EnumString, Display)] +#[serde(rename_all = "snake_case")] +#[strum(serialize_all = "snake_case")] +pub enum ThemeName { + Light, + Dark, + Dracula, + Nord, + SolarizedLight, + SolarizedDark, + GruvboxLight, + GruvboxDark, + CatppuccinLatte, + #[default] + CatppuccinFrappe, + CatppuccinMacchiato, + CatppuccinMocha, + TokyoNight, + TokyoNightStorm, + TokyoNightLight, + KanagawaWave, + KanagawaDragon, + KanagawaLotus, + Moonfly, + Nightfly, + Oxocarbon, + Ferra, +} + make_config!(Config { - markup_default: Vec = (Vec::new()) "markup_default" [deserialize_with = "deserialize_markup"], - markup_highlight: Vec = (parse_attributes("foreground=\"red\" underline=\"double\"").unwrap()) "markup_highlight" [deserialize_with = "deserialize_markup"], - markup_extra: Vec = (parse_attributes("font_style=\"italic\" font_size=\"smaller\"").unwrap()) "markup_extra" [deserialize_with = "deserialize_markup"], + app_theme: ThemeName = (ThemeName::default()) "app_theme", + custom_palette: CustomPalette = (CustomPalette::default()) "custom_palette", + locale: Option = (None) "locale", exclusive: bool = (true) "exclusive", frequent_first: bool = (false) "frequent_first", recent_first: bool = (true) "recent_first", prune_history: u32 = (0) "prune_history", icon_size: i32 = (64) "icon_size", - lines: i32 = (2) "lines", margin_left: i32 = (0) "margin_left", margin_right: i32 = (0) "margin_right", margin_top: i32 = (0) "margin_top", @@ -73,32 +163,16 @@ make_config!(Config { cgroups: bool = (true) "cgroups", command_prefix: String = (":".into()) "command_prefix", exclude: Vec = (Vec::new()) "exclude", - term_command: Option = (None) "term_command", - close_on_unfocus: bool = (true) "close_on_unfocus" + term_command: Option = (None) "term_command" }); -fn deserialize_markup<'de, D>(deserializer: D) -> Result, D::Error> -where - D: Deserializer<'de>, -{ - let s: &str = serde::Deserialize::deserialize(deserializer)?; - parse_attributes(s).map_err(D::Error::custom) -} - impl Config { pub fn load() -> Config { let config_str = match get_config_file(CONFIG_FILE) { Some(file) => std::fs::read_to_string(file).expect("Cannot read config"), _ => "".to_owned(), }; - let config: Config = toml::from_str(&config_str).expect("Cannot parse config: {}"); + let config: Config = toml::from_str(&config_str).expect("Cannot parse config"); config } } - -fn parse_attributes(markup: &str) -> Result, String> { - let (attributes, _, _) = pango::parse_markup(&format!("X", markup), '\0') - .map_err(|err| format!("Failed to parse markup: {}", err))?; - let mut iter = attributes.iterator().ok_or("Failed to parse markup")?; - Ok(iter.attrs()) -} diff --git a/src/consts.rs b/src/consts.rs index 5872f58..fae46d1 100644 --- a/src/consts.rs +++ b/src/consts.rs @@ -15,17 +15,7 @@ You should have received a copy of the GNU General Public License along with sirula. If not, see . */ -pub const APP_ID: &str = "com.dorian.sirula"; -pub const APP_NAME: &str = "sirula"; +pub const APP_NAME: &str = "cirula"; -pub const STYLE_FILE: &str = "style.css"; pub const CONFIG_FILE: &str = "config.toml"; pub const HISTORY_FILE: &str = "history"; - -pub const APP_LABEL_CLASS: &str = "app-label"; -pub const APP_ICON_CLASS: &str = "app-icon"; -pub const APP_ROW_CLASS: &str = "app-row"; -pub const ROOT_BOX_NAME: &str = "root-box"; -pub const LISTBOX_NAME: &str = "app-list"; -pub const SEARCH_ENTRY_NAME: &str = "search"; -pub const SCROLL_NAME: &str = "scroll"; diff --git a/src/history.rs b/src/history.rs index 80486df..7d72f5f 100644 --- a/src/history.rs +++ b/src/history.rs @@ -1,5 +1,22 @@ -use super::util::get_history_file; -use serde_derive::{Deserialize, Serialize}; +/* +Copyright (C) 2020 Dorian Rudolph + +sirula is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +sirula is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with sirula. If not, see . +*/ + +use crate::util::get_history_file; +use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::fs::File; use std::io::Write; @@ -20,38 +37,52 @@ impl PartialEq for HistoryData { pub fn load_history(days: u32) -> HashMap { match get_history_file(false) { Some(file) => { - let history_str = std::fs::read_to_string(file).expect("Cannot read history file"); + let history_str = match std::fs::read_to_string(&file) { + Ok(s) => s, + Err(_) => return HashMap::new(), + }; let epoch = SystemTime::now() .duration_since(UNIX_EPOCH) .expect("Time went backwards"); let cutoff = epoch.as_secs() - (days as u64) * 86400; - let mut history = toml::from_str(&history_str) + let mut history: HashMap = toml::from_str(&history_str) .unwrap_or_else(|err| { eprintln!("Cannot parse history file: {}", err); HashMap::new() }); - history.retain(|_, data : &mut HistoryData| { - days == 0 || data.last_used >= cutoff - }); - return history; + history.retain(|_, data: &mut HistoryData| days == 0 || data.last_used >= cutoff); + history } - _ => HashMap::new(), + None => HashMap::new(), } } pub fn save_history(history: &HashMap) { - let file = get_history_file(true).expect("Cannot create history file or cache directory"); - let mut file = File::create(file).expect("Cannot open history file for writing"); + let file = match get_history_file(true) { + Some(f) => f, + None => { + eprintln!("Cannot create history file or cache directory"); + return; + } + }; + let mut file = match File::create(file) { + Ok(f) => f, + Err(e) => { + eprintln!("Cannot open history file for writing: {}", e); + return; + } + }; let s = toml::to_string(history).unwrap(); - file.write_all(s.as_bytes()) - .expect("Cannot write to history file"); + if let Err(e) = file.write_all(s.as_bytes()) { + eprintln!("Cannot write to history file: {}", e); + } } pub fn update_history(history: &mut HashMap, id: &str) { let epoch = SystemTime::now() .duration_since(UNIX_EPOCH) .expect("Time went backwards"); - let usage_count = history.get(&id.to_string()).map_or(0, |h| h.usage_count) + 1; + let usage_count = history.get(id).map_or(0, |h| h.usage_count) + 1; history.insert( id.to_string(), diff --git a/src/locale.rs b/src/locale.rs index 7f4e843..5394029 100644 --- a/src/locale.rs +++ b/src/locale.rs @@ -1,56 +1,95 @@ -/* -Copyright (C) 2020 Dorian Rudolph - -sirula is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -sirula is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with sirula. If not, see . -*/ - -use libc::{setlocale, strcoll}; -pub use locale_types::{LocaleIdentifier}; -use std::{ - cmp::{Ord, Ordering}, - ffi::{CStr, CString}, - os::raw::c_char, - ptr, -}; +use crate::get_config; +use icu_collator::{Collator, CollatorBorrowed}; +use icu_locale::Locale; +use std::cmp::Ordering; +use std::sync::OnceLock; + +static COLLATOR: OnceLock> = OnceLock::new(); + +/// Parse a POSIX locale string (e.g., "en_US.UTF-8") to ICU Locale format +fn parse_posix_locale(locale_str: &str) -> Option { + // Strip encoding suffix (e.g., ".UTF-8") + let locale_str = locale_str.split('.').next()?; + + if locale_str.is_empty() { + return None; + } + + // "C" and "POSIX" are special locales that use ASCII byte-order comparison. + // Fall back to ICU's default (DUCET) for sensible Unicode-aware sorting. + if locale_str == "C" || locale_str == "POSIX" { + return None; + } + + // Convert POSIX format (en_US) to BCP-47/ICU format (en-US) + let locale_str = locale_str.replace('_', "-"); + + locale_str.parse().ok() +} + +/// Get system locale from environment variables (LC_COLLATE, LC_ALL, or LANG) +fn get_system_locale() -> Option { + let locale_str = std::env::var("LC_COLLATE") + .or_else(|_| std::env::var("LC_ALL")) + .or_else(|_| std::env::var("LANG")) + .ok()?; + + parse_posix_locale(&locale_str) +} + +fn get_collator() -> &'static CollatorBorrowed<'static> { + COLLATOR.get_or_init(|| { + let locale = get_config().locale.clone().or_else(get_system_locale); + let prefs = locale.map(|l| l.into()).unwrap_or_default(); + Collator::try_new(prefs, Default::default()).expect("Failed to create collator") + }) +} pub fn string_collate(a: &str, b: &str) -> Ordering { - // Note: Only works properly if locale is set to UTF-8 - let ord = unsafe { - let c_a = CString::new(a).unwrap(); - let c_b = CString::new(b).unwrap(); - strcoll(c_a.as_ptr(), c_b.as_ptr()) - }; - ord.cmp(&0) + get_collator().compare(a, b) } -unsafe fn setlocale_wrapper(category: i32, locale: *const c_char) -> Option { - let ret = setlocale(category, locale); - if ret.is_null() { - None - } else { - Some(CStr::from_ptr(ret).to_str().unwrap().to_owned()) +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parse_posix_locale() { + // Standard POSIX format with encoding + assert_eq!( + parse_posix_locale("en_US.UTF-8"), + Some("en-US".parse().unwrap()) + ); + assert_eq!( + parse_posix_locale("de_DE.UTF-8"), + Some("de-DE".parse().unwrap()) + ); + assert_eq!( + parse_posix_locale("sv_SE.UTF-8"), + Some("sv-SE".parse().unwrap()) + ); + assert_eq!( + parse_posix_locale("nb_NO.UTF-8"), + Some("nb-NO".parse().unwrap()) + ); } -} -pub fn set_locale(category: i32, locale: &str) -> Option { - unsafe { - let c_locale = CString::new(locale).unwrap(); - setlocale_wrapper(category, c_locale.as_ptr()) + #[test] + fn test_parse_posix_locale_without_encoding() { + assert_eq!(parse_posix_locale("en_US"), Some("en-US".parse().unwrap())); + assert_eq!(parse_posix_locale("de"), Some("de".parse().unwrap())); } -} -#[allow(unused)] -pub fn get_locale(category: i32) -> Option { - unsafe { setlocale_wrapper(category, ptr::null()) } + #[test] + fn test_parse_posix_locale_special() { + // C and POSIX should return None + assert_eq!(parse_posix_locale("C"), None); + assert_eq!(parse_posix_locale("POSIX"), None); + assert_eq!(parse_posix_locale("C.UTF-8"), None); + } + + #[test] + fn test_parse_posix_locale_empty() { + assert_eq!(parse_posix_locale(""), None); + } } diff --git a/src/main.rs b/src/main.rs index 02eeb98..1237b89 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,16 +16,17 @@ along with sirula. If not, see . */ use fuzzy_matcher::skim::SkimMatcherV2; -use gdk::keys::constants; -use gio::prelude::*; -use gtk::{ - builders::{BoxBuilder, EntryBuilder, ListBoxBuilder, ScrolledWindowBuilder}, - prelude::*, - ListBoxRow, -}; -use libc::LC_ALL; -use std::env::args; -use std::{cell::RefCell, collections::HashMap, rc::Rc}; +use iced::widget::operation::{focus, scroll_to, AbsoluteOffset}; +use iced::widget::{column, container, image, row, scrollable, svg, text, text_input, Column}; +use iced::{event, keyboard, Element, Event, Length, Subscription, Task}; +use iced_layershell::build_pattern::application; +use iced_layershell::reexport::{Anchor, KeyboardInteractivity, Layer}; +use iced_layershell::settings::{LayerShellSettings, Settings}; +use iced_layershell::to_layer_message; +use std::collections::HashMap; +use std::sync::OnceLock; + +const ITEM_HEIGHT: f32 = 50.0; // Approximate height of each entry row mod consts; use consts::*; @@ -40,184 +41,447 @@ mod app_entry; use app_entry::*; mod locale; -use locale::*; mod history; use history::*; -fn app_startup(application: >k::Application) { - let config = Config::load(); - let launch_cgroups = config.cgroups; - let cmd_prefix = config.command_prefix.clone(); +mod theme; +use theme::{ + app_row_container, extra_text_color, get_theme_with_custom, rounded_text_input_style, + scrollable_style, +}; - let window = gtk::ApplicationWindow::new(application); - window.set_size_request(config.width, config.height); +static INPUT_ID: OnceLock = OnceLock::new(); +static SCROLL_ID: OnceLock = OnceLock::new(); +static CONFIG: OnceLock = OnceLock::new(); +static THEME: OnceLock = OnceLock::new(); +static HISTORY: OnceLock> = OnceLock::new(); - gtk_layer_shell::init_for_window(&window); - gtk_layer_shell::set_keyboard_interactivity(&window, true); - gtk_layer_shell::set_layer(&window, gtk_layer_shell::Layer::Overlay); - gtk_layer_shell::set_namespace(&window, "sirula"); +fn get_input_id() -> iced::widget::Id { + INPUT_ID.get_or_init(iced::widget::Id::unique).clone() +} - if config.exclusive { - gtk_layer_shell::auto_exclusive_zone_enable(&window); - } +fn get_scroll_id() -> iced::widget::Id { + SCROLL_ID.get_or_init(iced::widget::Id::unique).clone() +} - gtk_layer_shell::set_margin(&window, gtk_layer_shell::Edge::Left, config.margin_left); - gtk_layer_shell::set_margin(&window, gtk_layer_shell::Edge::Right, config.margin_right); - gtk_layer_shell::set_margin(&window, gtk_layer_shell::Edge::Top, config.margin_top); - gtk_layer_shell::set_margin(&window, gtk_layer_shell::Edge::Bottom, config.margin_bottom); +fn get_config() -> &'static Config { + CONFIG.get_or_init(Config::load) +} + +fn get_theme() -> &'static iced::Theme { + THEME.get_or_init(|| { + let config = get_config(); + get_theme_with_custom(&config.app_theme, &config.custom_palette) + }) +} - gtk_layer_shell::set_anchor(&window, gtk_layer_shell::Edge::Left, config.anchor_left); - gtk_layer_shell::set_anchor(&window, gtk_layer_shell::Edge::Right, config.anchor_right); - gtk_layer_shell::set_anchor(&window, gtk_layer_shell::Edge::Top, config.anchor_top); - gtk_layer_shell::set_anchor(&window, gtk_layer_shell::Edge::Bottom, config.anchor_bottom); +fn get_history() -> &'static HashMap { + HISTORY.get_or_init(|| load_history(get_config().prune_history)) +} - window.set_decorated(false); - window.set_app_paintable(true); +fn scroll_to_selected(selected: usize) -> Task { + let offset = AbsoluteOffset { + x: 0.0, + y: selected as f32 * ITEM_HEIGHT, + }; + scroll_to(get_scroll_id(), offset) +} - let vbox = BoxBuilder::new() - .name(ROOT_BOX_NAME) - .orientation(gtk::Orientation::Vertical) - .build(); - let entry = EntryBuilder::new().name(SEARCH_ENTRY_NAME).build(); // .width_request(300) - vbox.pack_start(&entry, false, false, 0); +fn main() -> Result<(), iced_layershell::Error> { + // Initialize tracing (set RUST_LOG=sirula=debug to see debug output) + tracing_subscriber::fmt() + .with_env_filter( + tracing_subscriber::EnvFilter::from_default_env() + .add_directive("iced_layershell=warn".parse().unwrap()) + .add_directive("iced=warn".parse().unwrap()) + .add_directive("wgpu=warn".parse().unwrap()) + .add_directive("naga=warn".parse().unwrap()) + .add_directive("cosmic_text=warn".parse().unwrap()) + .add_directive("usvg=error".parse().unwrap()), + ) + .init(); + + let config = get_config(); + + // Calculate size based on config + let width = if config.width > 0 { + config.width as u32 + } else { + 400 + }; + let height = if config.height > 0 { + config.height as u32 + } else { + 600 + }; + + // Build anchor from config + let mut anchor = Anchor::empty(); + if config.anchor_left { + anchor |= Anchor::Left; + } + if config.anchor_right { + anchor |= Anchor::Right; + } + if config.anchor_top { + anchor |= Anchor::Top; + } + if config.anchor_bottom { + anchor |= Anchor::Bottom; + } - let scroll = ScrolledWindowBuilder::new() - .name(SCROLL_NAME) - .hscrollbar_policy(gtk::PolicyType::Never) - .build(); - vbox.pack_end(&scroll, true, true, 0); + application(Launcher::new, namespace, update, view) + .subscription(subscription) + .style(style) + .theme(theme) + .settings(Settings { + layer_settings: LayerShellSettings { + size: Some((width, height)), + anchor, + layer: Layer::Overlay, + keyboard_interactivity: KeyboardInteractivity::Exclusive, + margin: ( + config.margin_top, + config.margin_right, + config.margin_bottom, + config.margin_left, + ), + exclusive_zone: if config.exclusive { -1 } else { 0 }, + ..Default::default() + }, + ..Default::default() + }) + .run() +} - let listbox = ListBoxBuilder::new().name(LISTBOX_NAME).build(); - scroll.add(&listbox); +fn namespace() -> String { + APP_NAME.to_string() +} - let history = Rc::new(RefCell::new(load_history(config.prune_history))); - let entries = Rc::new(RefCell::new(load_entries(&config, &history.borrow()))); +fn subscription(_state: &Launcher) -> Subscription { + event::listen_with(|event, _status, _id| { + // Only capture keyboard key press events, ignore everything else + if let Event::Keyboard(keyboard::Event::KeyPressed { key, .. }) = &event { + match key { + keyboard::Key::Named( + keyboard::key::Named::Escape + | keyboard::key::Named::ArrowUp + | keyboard::key::Named::ArrowDown + | keyboard::key::Named::Tab, + ) => Some(Message::IcedEvent(event)), + _ => None, // Let text_input handle other keys + } + } else { + None // Ignore mouse events, key releases, etc. + } + }) +} - for row in (&entries.borrow() as &HashMap).keys() { - listbox.add(row); +fn style(_state: &Launcher, _theme: &iced::Theme) -> iced::theme::Style { + let palette = get_theme().palette(); + iced::theme::Style { + background_color: iced::Color::from_rgba( + palette.background.r, + palette.background.g, + palette.background.b, + 0.95, + ), + text_color: palette.text, } +} + +fn theme(_state: &Launcher) -> iced::Theme { + get_theme().clone() +} + +#[to_layer_message] +#[derive(Debug, Clone)] +enum Message { + InputChanged(String), + Submit, + IcedEvent(Event), + Launch(usize), + FocusInput, +} + +#[derive(Clone)] +enum CachedIcon { + Svg(svg::Handle), + Image(image::Handle), +} + +struct Launcher { + query: String, + entries: Vec, + filtered_indices: Vec, + selected: usize, + matcher: SkimMatcherV2, + history: HashMap, + icon_cache: HashMap, // index -> cached icon handle +} - window.connect_key_press_event(clone!(entry, listbox, entries => move |window, event| { - use constants::*; - #[allow(non_upper_case_globals)] - Inhibit(match event.keyval() { - Escape => { - window.close(); - true +impl Launcher { + fn new() -> (Self, Task) { + let config = get_config(); + let history = get_history(); + + // Use tokio runtime for async parallel loading + let entries = tokio::runtime::Runtime::new() + .expect("Failed to create tokio runtime") + .block_on(app_entry::load_entries_async(config, history)); + + let filtered_indices: Vec = (0..entries.len()).collect(); + + // Pre-cache all icon handles + let mut icon_cache = HashMap::new(); + for (idx, entry) in entries.iter().enumerate() { + if let Some(ref icon_path) = entry.icon_path { + let ext = icon_path.extension().and_then(|e| e.to_str()).unwrap_or(""); + let cached = if ext == "svg" { + CachedIcon::Svg(svg::Handle::from_path(icon_path)) + } else { + CachedIcon::Image(image::Handle::from_path(icon_path)) + }; + icon_cache.insert(idx, cached); + } + } + + ( + Self { + query: String::new(), + entries, + filtered_indices, + selected: 0, + matcher: SkimMatcherV2::default(), + history: history.clone(), + icon_cache, }, - Down | KP_Down | Tab if entry.has_focus() => { - if let Some(r0) = listbox.row_at_index(0) { - let es = entries.borrow(); - if r0.is_selected() { - if let Some(r1) = listbox.row_at_index(1) { - if let Some(app_entry) = es.get(&r1) { - if !app_entry.hidden() { - listbox.select_row(Some(&r1)); - } - } - } - } else if let Some(app_entry) = es.get(&r0) { - if !app_entry.hidden() { - listbox.select_row(Some(&r0)); - } - } + Task::done(Message::FocusInput), + ) + } +} + +fn update(state: &mut Launcher, message: Message) -> Task { + match message { + Message::InputChanged(query) => { + state.query = query.clone(); + + // Check if it's a command + if is_cmd(&state.query, &get_config().command_prefix) { + // In command mode, hide all entries + for entry in &mut state.entries { + entry.hide(); } - false - }, - Up | Down | KP_Up | KP_Down | Page_Up | Page_Down | KP_Page_Up | KP_Page_Down | Tab - | Shift_L | Shift_R | Control_L | Control_R | Alt_L | Alt_R | ISO_Left_Tab | Return - | KP_Enter => false, - _ => { - if !event.is_modifier() && !entry.has_focus() { - entry.grab_focus_without_selecting(); + state.filtered_indices.clear(); + } else { + // Update matches + for entry in &mut state.entries { + entry.update_match(&query, &state.matcher); } - false + + // Sort entries + let mut indexed: Vec<(usize, &AppEntry)> = + state.entries.iter().enumerate().collect(); + indexed.sort_by(|(_, a), (_, b)| a.cmp(b)); + + // Filter visible entries + state.filtered_indices = indexed + .into_iter() + .filter(|(_, e)| !e.hidden()) + .map(|(i, _)| i) + .collect(); } - }) - })); - if config.close_on_unfocus { - window.connect_focus_out_event(|window, _| { - window.close(); - Inhibit(false) - }); - } + state.selected = 0; + Task::none() + } + Message::Submit => { + if is_cmd(&state.query, &get_config().command_prefix) { + let cmd_line = &state.query[get_config().command_prefix.len()..].trim(); + launch_cmd(cmd_line); + return iced::exit(); + } - let matcher = SkimMatcherV2::default(); - let term_command = config.term_command.clone(); - entry.connect_changed(clone!(entries, listbox, cmd_prefix => move |e| { - let text = e.text(); - let is_cmd = is_cmd(&text, &cmd_prefix); - { - let mut entries = entries.borrow_mut(); - for entry in entries.values_mut() { - if is_cmd { - entry.hide(); // hide entries in command mode - } else { - entry.update_match(&text, &matcher, &config); + if let Some(&idx) = state.filtered_indices.get(state.selected) { + let entry = &state.entries[idx]; + launch_app( + &entry.command_line, + entry.is_terminal, + &entry.id, + get_config().term_command.as_deref(), + get_config().cgroups, + ); + + // Update history + update_history(&mut state.history, &entry.id); + save_history(&state.history); + + return iced::exit(); + } + Task::none() + } + Message::IcedEvent(event) => { + if let Event::Keyboard(keyboard::Event::KeyPressed { key, .. }) = event { + match key { + keyboard::Key::Named(keyboard::key::Named::Escape) => { + return iced::exit(); + } + keyboard::Key::Named(keyboard::key::Named::ArrowDown) => { + if !state.filtered_indices.is_empty() { + state.selected = + (state.selected + 1).min(state.filtered_indices.len() - 1); + return scroll_to_selected(state.selected); + } + } + keyboard::Key::Named(keyboard::key::Named::ArrowUp) => { + if state.selected > 0 { + state.selected -= 1; + return scroll_to_selected(state.selected); + } + } + keyboard::Key::Named(keyboard::key::Named::Tab) => { + if !state.filtered_indices.is_empty() { + state.selected = (state.selected + 1) % state.filtered_indices.len(); + return scroll_to_selected(state.selected); + } + } + _ => {} } } + Task::none() } - listbox.invalidate_filter(); - listbox.invalidate_sort(); - listbox.select_row(listbox.row_at_index(0).as_ref()); - })); - - entry.connect_activate(clone!(listbox, window => move |e| { - let text = e.text(); - if is_cmd(&text, &cmd_prefix) { // command execution direct - let cmd_line = &text[cmd_prefix.len()..].trim(); - launch_cmd(cmd_line); - window.close(); - } else if let Some(row) = listbox.row_at_index(0) { - row.activate(); + Message::FocusInput => focus(get_input_id()), + Message::Launch(idx) => { + if let Some(entry) = state.entries.get(idx) { + launch_app( + &entry.command_line, + entry.is_terminal, + &entry.id, + get_config().term_command.as_deref(), + get_config().cgroups, + ); + + // Update history + let id = entry.id.clone(); + update_history(&mut state.history, &id); + save_history(&state.history); + + return iced::exit(); + } + Task::none() } - })); - - listbox.connect_row_activated(clone!(entries, window, history => move |_, r| { - let es = entries.borrow(); - let e = &es[r]; - if !e.hidden() { - launch_app(&e.info, term_command.as_deref(), launch_cgroups); - - let mut history = history.borrow_mut(); - update_history(&mut history, e.info.id().unwrap().as_str()); - save_history(&history); + // Layer shell messages - not used but required by the macro + _ => Task::none(), + } +} - window.close(); +fn view(state: &Launcher) -> Element<'_, Message> { + let search_input = text_input("Search...", &state.query) + .id(get_input_id()) + .on_input(Message::InputChanged) + .on_submit(Message::Submit) + .padding(12) + .size(18) + .style(rounded_text_input_style); + + let entries_list: Element<'_, Message> = if state.filtered_indices.is_empty() { + if is_cmd(&state.query, &get_config().command_prefix) { + container( + text(format!( + "Run: {}", + &state.query[get_config().command_prefix.len()..].trim() + )) + .size(16), + ) + .padding(20) + .into() + } else { + container(text("No matches").size(16)).padding(20).into() } - })); - - listbox.set_filter_func(Some(Box::new(clone!(entries => move |r| { - let e = entries.borrow(); - !e[r].hidden() - })))); - - listbox.set_sort_func(Some(Box::new(clone!(entries => move |a, b| { - let e = entries.borrow(); - e[a].cmp(&e[b]) as i32 - })))); + } else { + let icon_size = get_config().icon_size; + let items: Vec> = state + .filtered_indices + .iter() + .enumerate() + .take(50) // Limit visible items for performance + .map(|(display_idx, &entry_idx)| { + let entry = &state.entries[entry_idx]; + let is_selected = display_idx == state.selected; + + render_entry( + entry, + entry_idx, + is_selected, + icon_size, + state.icon_cache.get(&entry_idx), + ) + }) + .collect(); + + scrollable(Column::with_children(items).spacing(2).width(Length::Fill)) + .id(get_scroll_id()) + .height(Length::Fill) + .style(scrollable_style) + .into() + }; + + let content = column![search_input, entries_list].spacing(8).padding(12); + + container(content) + .width(Length::Fill) + .height(Length::Fill) + .into() +} - listbox.select_row(listbox.row_at_index(0).as_ref()); +fn render_entry<'a>( + entry: &'a AppEntry, + idx: usize, + is_selected: bool, + icon_size: i32, + cached_icon: Option<&'a CachedIcon>, +) -> Element<'a, Message> { + let theme = get_theme(); + let name_text = text(&entry.name).size(16); - window.add(&vbox); - window.show_all() -} + let mut content_col = Column::new().push(name_text); -fn main() { - set_locale(LC_ALL, ""); + if let Some(ref extra) = entry.extra_text { + content_col = content_col.push(text(extra).size(12).color(extra_text_color(theme))); + } - let application = gtk::Application::new(Some(APP_ID), Default::default()); + let mut row_content = row![].spacing(12).padding(8).width(Length::Fill); - application.connect_startup(|app| { - load_css(); - app_startup(app); - }); + // Add icon from cache, or fallback to Font Awesome icon + match cached_icon { + Some(CachedIcon::Svg(handle)) => { + let icon_widget = svg(handle.clone()) + .width(icon_size as f32) + .height(icon_size as f32); + row_content = row_content.push(icon_widget); + } + Some(CachedIcon::Image(handle)) => { + let icon_widget = image(handle.clone()) + .width(icon_size as f32) + .height(icon_size as f32); + row_content = row_content.push(icon_widget); + } + None => { + // Fallback to Font Awesome cube icon + let fallback_icon: iced_font_awesome::Icon<'_, iced::Theme> = + iced_font_awesome::fa_icon_solid("cube").size(icon_size as f32); + row_content = row_content.push(fallback_icon); + } + } - application.connect_activate(|_| { - //do nothing - }); + row_content = row_content.push(content_col); - application.run_with_args(&args().collect::>()); + iced::widget::mouse_area( + container(row_content) + .width(Length::Fill) + .style(move |_| app_row_container(theme, is_selected)), + ) + .on_press(Message::Launch(idx)) + .into() } diff --git a/src/theme.rs b/src/theme.rs new file mode 100644 index 0000000..409c242 --- /dev/null +++ b/src/theme.rs @@ -0,0 +1,93 @@ +use crate::config::{CustomPalette, ThemeName}; +use iced::widget::{container, scrollable, text_input}; +use iced::{Border, Color, Theme}; + +/// Default border radius for UI elements +pub const BORDER_RADIUS: f32 = 12.0; + +/// Convert ThemeName to iced::Theme, with optional custom palette override +pub fn get_theme_with_custom(name: &ThemeName, custom: &CustomPalette) -> Theme { + // If custom palette is fully defined, use it + if let Some(palette) = custom.to_iced_palette() { + return Theme::custom("Custom".to_string(), palette); + } + get_theme(name) +} + +/// Convert ThemeName to iced::Theme +pub fn get_theme(name: &ThemeName) -> Theme { + match name { + ThemeName::Light => Theme::Light, + ThemeName::Dark => Theme::Dark, + ThemeName::Dracula => Theme::Dracula, + ThemeName::Nord => Theme::Nord, + ThemeName::SolarizedLight => Theme::SolarizedLight, + ThemeName::SolarizedDark => Theme::SolarizedDark, + ThemeName::GruvboxLight => Theme::GruvboxLight, + ThemeName::GruvboxDark => Theme::GruvboxDark, + ThemeName::CatppuccinLatte => Theme::CatppuccinLatte, + ThemeName::CatppuccinFrappe => Theme::CatppuccinFrappe, + ThemeName::CatppuccinMacchiato => Theme::CatppuccinMacchiato, + ThemeName::CatppuccinMocha => Theme::CatppuccinMocha, + ThemeName::TokyoNight => Theme::TokyoNight, + ThemeName::TokyoNightStorm => Theme::TokyoNightStorm, + ThemeName::TokyoNightLight => Theme::TokyoNightLight, + ThemeName::KanagawaWave => Theme::KanagawaWave, + ThemeName::KanagawaDragon => Theme::KanagawaDragon, + ThemeName::KanagawaLotus => Theme::KanagawaLotus, + ThemeName::Moonfly => Theme::Moonfly, + ThemeName::Nightfly => Theme::Nightfly, + ThemeName::Oxocarbon => Theme::Oxocarbon, + ThemeName::Ferra => Theme::Ferra, + } +} + +/// Selected item background color (derived from theme) +pub fn selected_bg(theme: &Theme) -> Color { + theme.extended_palette().background.weak.color +} + +/// Extra field text color (dimmer version of text color) +pub fn extra_text_color(theme: &Theme) -> Color { + theme.extended_palette().secondary.weak.color +} + +/// Rounded text input style +pub fn rounded_text_input_style(theme: &Theme, status: text_input::Status) -> text_input::Style { + let palette = theme.extended_palette(); + let mut style = text_input::default(theme, status); + style.border = Border { + radius: BORDER_RADIUS.into(), + width: 1.0, + color: palette.background.strong.color, + }; + style.background = iced::Background::Color(palette.background.weak.color); + style +} + +/// Container style for app rows +pub fn app_row_container(theme: &Theme, is_selected: bool) -> container::Style { + container::Style { + background: Some(iced::Background::Color(if is_selected { + selected_bg(theme) + } else { + Color::TRANSPARENT + })), + border: Border { + radius: (BORDER_RADIUS / 2.0).into(), + ..Default::default() + }, + ..Default::default() + } +} + +/// Scrollable style +pub fn scrollable_style(theme: &Theme, status: scrollable::Status) -> scrollable::Style { + let mut style = scrollable::default(theme, status); + // Make scrollbar semi-transparent + style.container = container::Style { + background: Some(iced::Background::Color(Color::TRANSPARENT)), + ..Default::default() + }; + style +} diff --git a/src/util.rs b/src/util.rs index 714d7db..e55a0fa 100644 --- a/src/util.rs +++ b/src/util.rs @@ -16,16 +16,12 @@ along with sirula. If not, see . */ use crate::consts::*; -use freedesktop_entry_parser::parse_entry; -use gio::{prelude::AppInfoExt, AppInfo}; -use glib::{shell_parse_argv, GString, ObjectExt}; -use gtk::{prelude::CssProviderExt, CssProvider}; +use shlex::Shlex; use std::path::PathBuf; use std::process::{id, Command}; -use shlex::Shlex; pub fn get_xdg_dirs() -> xdg::BaseDirectories { - xdg::BaseDirectories::with_prefix(APP_NAME).unwrap() + xdg::BaseDirectories::with_prefix(APP_NAME) } pub fn get_config_file(file: &str) -> Option { @@ -41,76 +37,63 @@ pub fn get_history_file(place: bool) -> Option { } } -pub fn load_css() { - if let Some(file) = get_config_file(STYLE_FILE) { - let provider = CssProvider::new(); - if let Err(err) = provider.load_from_path(file.to_str().unwrap()) { - eprintln!("Failed to load CSS: {}", err); - } - gtk::StyleContext::add_provider_for_screen( - &gdk::Screen::default().expect("Error initializing gtk css provider."), - &provider, - gtk::STYLE_PROVIDER_PRIORITY_APPLICATION, - ); - } -} - pub fn is_cmd(text: &str, cmd_prefix: &str) -> bool { !cmd_prefix.is_empty() && text.starts_with(cmd_prefix) } +// Spawned child is not awaited. +// The zombie_processes lint warns about resource exhaustion in long-running applications: +// https://github.com/rust-lang/rust-clippy/blob/master/clippy_lints/src/zombie_processes.rs +// I believe, based on the man7 doc, that the process will be reaped by the system on Linux: +// https://man7.org/linux/man-pages/man2/exit.2.html +// I cannot confirm/deny whether this may have unforeseen consequences on Linux nor other systems. +#[allow(clippy::zombie_processes)] pub fn launch_cmd(cmd_line: &str) { - let mut parts = shell_parse_argv(cmd_line).expect("Error parsing command line"); - let mut parts_iter = parts.iter_mut(); - - let cmd = parts_iter.next().expect("Expected command"); + let parts: Vec = Shlex::new(cmd_line).collect(); + if parts.is_empty() { + return; + } - let mut child = Command::new(cmd); - child.args(parts_iter); + let mut child = Command::new(&parts[0]); + child.args(&parts[1..]); child.spawn().expect("Error spawning command"); } -pub fn launch_app(info: &AppInfo, term_command: Option<&str>, launch_cgroups: bool) { - let command_string = info - .commandline() - .unwrap_or_else(|| info.executable()) - .to_str() - .unwrap() - .to_string() +pub fn launch_app( + command_line: &str, + is_terminal: bool, + app_id: &str, + term_command: Option<&str>, + launch_cgroups: bool, +) { + let command_string = command_line .replace("%U", "") .replace("%F", "") .replace("%u", "") .replace("%f", ""); let mut command: Vec = Shlex::new(&command_string).collect(); - if info - .try_property::("filename") - .ok() - .and_then(|s| parse_entry(&s).ok()) - .and_then(|e| { - e.section("Desktop Entry") - .attr("Terminal") - .map(|t| t == "1" || t == "true") - }) - .unwrap_or_default() - { + if is_terminal { if let Some(term) = term_command { let command_string = term.to_string().replace("{}", &command_string); - command = Shlex::new(&command_string).collect(); + command = Shlex::new(&command_string).collect(); } else if let Some(term) = std::env::var_os("TERMINAL") { - let term = term.into_string().expect("couldn't convert to string"); - let mut command_new = vec![term, "-e".into()]; - command_new.extend(command); - command = command_new; + let term = term.into_string().expect("couldn't convert to string"); + let mut command_new = vec![term, "-e".into()]; + command_new.extend(command); + command = command_new; } else { return; }; } + if launch_cgroups { - let mut name = info.id().unwrap().to_string(); - name.truncate(name.len() - 8); // remove .desktop extension + let mut name = app_id.to_string(); + if name.ends_with(".desktop") { + name.truncate(name.len() - 8); + } let parsed = Command::new("systemd-escape") - .arg(name) + .arg(&name) .output() .unwrap() .stdout; @@ -119,31 +102,27 @@ pub fn launch_app(info: &AppInfo, term_command: Option<&str>, launch_cgroups: bo String::from_utf8_lossy(&parsed).trim(), id() ); - let mut command_new: Vec = vec!["systemd-run".into(), "--scope".into(), "--user".into(), unit]; + let mut command_new: Vec = vec![ + "systemd-run".into(), + "--scope".into(), + "--user".into(), + unit, + ]; command_new.extend(command); command = command_new; } - Command::new(&command[0]) - .args(&command[1..]) - .spawn() - .expect("Error launching app"); -} - -#[macro_export] -macro_rules! clone { - (@param _) => ( _ ); - (@param $x:ident) => ( $x ); - ($($n:ident),+ => move || $body:expr) => ( - { - $( let $n = $n.clone(); )+ - move || $body - } - ); - ($($n:ident),+ => move |$($p:tt),+| $body:expr) => ( - { - $( let $n = $n.clone(); )+ - move |$(clone!(@param $p),)+| $body - } - ); + // Spawned child is not awaited. + // The zombie_processes lint warns about resource exhaustion in long-running applications: + // https://github.com/rust-lang/rust-clippy/blob/master/clippy_lints/src/zombie_processes.rs + // I believe, based on the man7 doc, that the process will be reaped by the system on Linux: + // https://man7.org/linux/man-pages/man2/exit.2.html + // I cannot confirm/deny whether this may have unforeseen consequences on Linux nor other systems. + #[allow(clippy::zombie_processes)] + if !command.is_empty() { + Command::new(&command[0]) + .args(&command[1..]) + .spawn() + .expect("Error launching app"); + } }