diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 531c877..a23fb28 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -27,6 +27,6 @@ jobs:
run: cargo check --no-default-features --features=x11
- name: Build wayland
run: cargo check --no-default-features --features=wayland
- - name: Build no-x11-wayland
- run: cargo check --no-default-features --features=no-x11-wayland
+ - name: Build no-backend
+ run: cargo check --no-default-features
diff --git a/.gitignore b/.gitignore
index ea8c4bf..d03f68d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
/target
+/**/target
diff --git a/Cargo.lock b/Cargo.lock
index 8eb7f9b..41c8076 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4,9 +4,14 @@ version = 3
[[package]]
name = "ahash"
-version = "0.3.8"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217"
+checksum = "43bb833f0bf979d8475d38fbf09ed3b8a55e1885fe93ad3f93239fc6a4f17b98"
+dependencies = [
+ "getrandom",
+ "once_cell",
+ "version_check",
+]
[[package]]
name = "aho-corasick"
@@ -37,41 +42,17 @@ dependencies = [
[[package]]
name = "anyhow"
-version = "1.0.40"
+version = "1.0.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b"
+checksum = "28ae2b3dec75a406790005a200b1bd89785afc02517a00ca99ecfe093ee9e6cf"
[[package]]
-name = "anymap"
-version = "0.12.1"
+name = "ascii-canvas"
+version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33954243bd79057c2de7338850b85983a44588021f8a5fee574a8888c6de4344"
-
-[[package]]
-name = "arrayvec"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
-
-[[package]]
-name = "async-stream"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a26cb53174ddd320edfff199a853f93d571f48eeb4dde75e67a9a3dbb7b7e5e"
+checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6"
dependencies = [
- "async-stream-impl",
- "futures-core",
-]
-
-[[package]]
-name = "async-stream-impl"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db134ba52475c060f3329a8ef0f8786d6b872ed01515d4b79c162e5798da1340"
-dependencies = [
- "proc-macro2",
- "quote 1.0.9",
- "syn 1.0.72",
+ "term",
]
[[package]]
@@ -125,9 +106,9 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
[[package]]
name = "beef"
-version = "0.4.4"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "474a626a67200bd107d44179bb3d4fc61891172d11696609264589be6a0e6a43"
+checksum = "bed554bd50246729a1ec158d08aa3235d1b69d94ad120ebe187e28894787e736"
[[package]]
name = "bincode"
@@ -138,24 +119,27 @@ dependencies = [
"serde",
]
+[[package]]
+name = "bit-set"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de"
+dependencies = [
+ "bit-vec",
+]
+
+[[package]]
+name = "bit-vec"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
+
[[package]]
name = "bitflags"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
-[[package]]
-name = "bitvec"
-version = "0.19.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8942c8d352ae1838c9dda0b0ca2ab657696ef2232a20147cf1b30ae1a9cb4321"
-dependencies = [
- "funty",
- "radium",
- "tap",
- "wyz",
-]
-
[[package]]
name = "bytes"
version = "1.0.1"
@@ -190,9 +174,9 @@ dependencies = [
[[package]]
name = "cc"
-version = "1.0.67"
+version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd"
+checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2"
[[package]]
name = "cfg-if"
@@ -221,6 +205,29 @@ version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24"
+[[package]]
+name = "codespan-reporting"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
+dependencies = [
+ "termcolor",
+ "unicode-width",
+]
+
+[[package]]
+name = "console"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3993e6445baa160675931ec041a5e03ca84b9c6e32a056150d3aa2bdda0a1f45"
+dependencies = [
+ "encode_unicode",
+ "lazy_static",
+ "libc",
+ "terminal_size",
+ "winapi",
+]
+
[[package]]
name = "convert_case"
version = "0.4.0"
@@ -245,9 +252,9 @@ dependencies = [
[[package]]
name = "crossbeam-deque"
-version = "0.8.0"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9"
+checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e"
dependencies = [
"cfg-if",
"crossbeam-epoch",
@@ -256,9 +263,9 @@ dependencies = [
[[package]]
name = "crossbeam-epoch"
-version = "0.9.4"
+version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52fb27eab85b17fbb9f6fd667089e07d6a2eb8743d02639ee7f6a7a7729c9c94"
+checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd"
dependencies = [
"cfg-if",
"crossbeam-utils",
@@ -269,15 +276,20 @@ dependencies = [
[[package]]
name = "crossbeam-utils"
-version = "0.8.4"
+version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4feb231f0d4d6af81aed15928e58ecf5816aa62a2393e2c82f46973e92a9a278"
+checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db"
dependencies = [
- "autocfg",
"cfg-if",
"lazy_static",
]
+[[package]]
+name = "crunchy"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
+
[[package]]
name = "ctor"
version = "0.1.20"
@@ -285,7 +297,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e98e2ad1a782e33928b96fc3948e7c355e5af34ba4de7670fe8bac2a3b2006d"
dependencies = [
"quote 1.0.9",
- "syn 1.0.72",
+ "syn 1.0.74",
]
[[package]]
@@ -300,14 +312,15 @@ dependencies = [
[[package]]
name = "derive_more"
-version = "0.99.13"
+version = "0.99.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f82b1b72f1263f214c0f823371768776c4f5841b942c9883aa8e5ec584fd0ba6"
+checksum = "40eebddd2156ce1bb37b20bbe5151340a31828b1f2d22ba4141f3531710e38df"
dependencies = [
"convert_case",
"proc-macro2",
"quote 1.0.9",
- "syn 1.0.72",
+ "rustc_version",
+ "syn 1.0.74",
]
[[package]]
@@ -316,12 +329,39 @@ version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499"
+[[package]]
+name = "dirs-next"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
+dependencies = [
+ "cfg-if",
+ "dirs-sys-next",
+]
+
+[[package]]
+name = "dirs-sys-next"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
+dependencies = [
+ "libc",
+ "redox_users",
+ "winapi",
+]
+
[[package]]
name = "doc-comment"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
+[[package]]
+name = "dtoa"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
+
[[package]]
name = "dyn-clone"
version = "1.0.4"
@@ -334,6 +374,21 @@ version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
+[[package]]
+name = "ena"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7402b94a93c24e742487327a7cd839dc9d36fec9de9fb25b09f2dae459f36c3"
+dependencies = [
+ "log",
+]
+
+[[package]]
+name = "encode_unicode"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
+
[[package]]
name = "env_logger"
version = "0.7.1"
@@ -349,16 +404,17 @@ dependencies = [
[[package]]
name = "eww"
-version = "0.1.0"
+version = "0.2.0"
dependencies = [
"anyhow",
- "async-stream",
"base64",
"bincode",
"cairo-sys-rs",
+ "codespan-reporting",
"debug_stub_derive",
"derive_more",
"dyn-clone",
+ "eww_shared_util",
"extend",
"futures-core",
"futures-util",
@@ -371,52 +427,56 @@ dependencies = [
"gtk",
"gtk-layer-shell",
"gtk-layer-shell-sys",
- "itertools 0.10.0",
- "lazy_static",
+ "itertools 0.10.1",
"libc",
"log",
"maplit",
"nix",
- "nom",
"notify",
- "num",
- "pretty_assertions",
+ "once_cell",
"pretty_env_logger",
"regex",
- "roxmltree",
"serde",
"serde_json",
"simple-signal",
+ "simplexpr",
"smart-default",
"structopt",
- "strum 0.20.0",
- "strum_macros 0.20.1",
"sysinfo",
"tokio",
- "tokio-stream",
"tokio-util",
"unescape",
+ "unindent",
"wait-timeout",
"x11rb",
+ "yuck",
+]
+
+[[package]]
+name = "eww_shared_util"
+version = "0.1.0"
+dependencies = [
+ "derive_more",
+ "serde",
]
[[package]]
name = "extend"
-version = "1.0.1"
+version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2feaa8e332f0db2f08788707dc550075aab8e6d20ffc85958e1174e22887d11"
+checksum = "f5c89e2933a4ec753dc007a4d6a7f9b6dc8e89b8fe89cabc252ccddf39c08bb1"
dependencies = [
"proc-macro-error",
"proc-macro2",
"quote 1.0.9",
- "syn 1.0.72",
+ "syn 1.0.74",
]
[[package]]
name = "filetime"
-version = "0.2.14"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d34cfa13a63ae058bfa601fe9e313bbdb3746427c1459185464ce0fcf62e1e8"
+checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98"
dependencies = [
"cfg-if",
"libc",
@@ -425,35 +485,25 @@ dependencies = [
]
[[package]]
-name = "fsevent"
-version = "2.0.2"
+name = "fixedbitset"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97f347202c95c98805c216f9e1df210e8ebaec9fdb2365700a43c10797a35e63"
-dependencies = [
- "bitflags",
- "fsevent-sys",
-]
+checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d"
[[package]]
name = "fsevent-sys"
-version = "3.0.2"
+version = "4.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a29c77f1ca394c3e73a9a5d24cfcabb734682d9634fc398f2204a63c994120"
+checksum = "5c0e564d24da983c053beff1bb7178e237501206840a3e6bf4e267b9e8ae734a"
dependencies = [
"libc",
]
-[[package]]
-name = "funty"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7"
-
[[package]]
name = "futures"
-version = "0.3.14"
+version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9d5813545e459ad3ca1bff9915e9ad7f1a47dc6a91b627ce321d5863b7dd253"
+checksum = "1adc00f486adfc9ce99f77d717836f0c5aa84965eb0b4f051f4e83f7cab53f8b"
dependencies = [
"futures-channel",
"futures-core",
@@ -466,9 +516,9 @@ dependencies = [
[[package]]
name = "futures-channel"
-version = "0.3.14"
+version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce79c6a52a299137a6013061e0cf0e688fce5d7f1bc60125f520912fdb29ec25"
+checksum = "74ed2411805f6e4e3d9bc904c95d5d423b89b3b25dc0250aa74729de20629ff9"
dependencies = [
"futures-core",
"futures-sink",
@@ -476,15 +526,15 @@ dependencies = [
[[package]]
name = "futures-core"
-version = "0.3.14"
+version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "098cd1c6dda6ca01650f1a37a794245eb73181d0d4d4e955e2f3c37db7af1815"
+checksum = "af51b1b4a7fdff033703db39de8802c673eb91855f2e0d47dcf3bf2c0ef01f99"
[[package]]
name = "futures-executor"
-version = "0.3.14"
+version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10f6cb7042eda00f0049b1d2080aa4b93442997ee507eb3828e8bd7577f94c9d"
+checksum = "4d0d535a57b87e1ae31437b892713aee90cd2d7b0ee48727cd11fc72ef54761c"
dependencies = [
"futures-core",
"futures-task",
@@ -493,40 +543,42 @@ dependencies = [
[[package]]
name = "futures-io"
-version = "0.3.14"
+version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "365a1a1fb30ea1c03a830fdb2158f5236833ac81fa0ad12fe35b29cddc35cb04"
+checksum = "0b0e06c393068f3a6ef246c75cdca793d6a46347e75286933e5e75fd2fd11582"
[[package]]
name = "futures-macro"
-version = "0.3.14"
+version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "668c6733a182cd7deb4f1de7ba3bf2120823835b3bcfbeacf7d2c4a773c1bb8b"
+checksum = "c54913bae956fb8df7f4dc6fc90362aa72e69148e3f39041fbe8742d21e0ac57"
dependencies = [
+ "autocfg",
"proc-macro-hack",
"proc-macro2",
"quote 1.0.9",
- "syn 1.0.72",
+ "syn 1.0.74",
]
[[package]]
name = "futures-sink"
-version = "0.3.14"
+version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c5629433c555de3d82861a7a4e3794a4c40040390907cfbfd7143a92a426c23"
+checksum = "c0f30aaa67363d119812743aa5f33c201a7a66329f97d1a887022971feea4b53"
[[package]]
name = "futures-task"
-version = "0.3.14"
+version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba7aa51095076f3ba6d9a1f702f74bd05ec65f555d70d2033d55ba8d69f581bc"
+checksum = "bbe54a98670017f3be909561f6ad13e810d9a51f3f061b902062ca3da80799f2"
[[package]]
name = "futures-util"
-version = "0.3.14"
+version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c144ad54d60f23927f0a6b6d816e4271278b64f005ad65e4e35291d2de9c025"
+checksum = "67eb846bfd58e44a8481a00049e82c43e0ccb5d61f8dc071057cb19249dd4d78"
dependencies = [
+ "autocfg",
"futures-channel",
"futures-core",
"futures-io",
@@ -657,9 +709,9 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.1.16"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753"
dependencies = [
"cfg-if",
"libc",
@@ -732,7 +784,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote 1.0.9",
- "syn 1.0.72",
+ "syn 1.0.74",
]
[[package]]
@@ -758,20 +810,19 @@ dependencies = [
[[package]]
name = "grass"
-version = "0.10.4"
+version = "0.10.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8209e6832a1f93e15adca845b43af12ead0cb8221fb2ef615ca84c75e54af1a"
+checksum = "82317908bc4204532d098390f8e041693aaeab95cf7351f774bdacf253b1c8ed"
dependencies = [
"beef",
"clap",
"codemap",
"indexmap",
"lasso",
- "num-bigint 0.3.2",
- "num-rational 0.3.2",
+ "num-bigint",
+ "num-rational",
"num-traits",
"once_cell",
- "peekmore",
"phf",
"rand",
]
@@ -852,34 +903,27 @@ dependencies = [
[[package]]
name = "hashbrown"
-version = "0.8.2"
+version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e91b62f79061a0bc2e046024cb7ba44b08419ed238ecbd9adbd787434b9e8c25"
+checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
dependencies = [
"ahash",
- "autocfg",
]
-[[package]]
-name = "hashbrown"
-version = "0.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"
-
[[package]]
name = "heck"
-version = "0.3.2"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac"
+checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
dependencies = [
"unicode-segmentation",
]
[[package]]
name = "hermit-abi"
-version = "0.1.18"
+version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
dependencies = [
"libc",
]
@@ -895,19 +939,19 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "1.6.2"
+version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3"
+checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5"
dependencies = [
"autocfg",
- "hashbrown 0.9.1",
+ "hashbrown",
]
[[package]]
name = "inotify"
-version = "0.9.2"
+version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d19f57db1baad9d09e43a3cd76dcf82ebdafd37d75c9498b87762dba77c93f15"
+checksum = "b031475cb1b103ee221afb806a23d35e0570bf7271d7588762ceba8127ed43b3"
dependencies = [
"bitflags",
"inotify-sys",
@@ -924,10 +968,26 @@ dependencies = [
]
[[package]]
-name = "instant"
-version = "0.1.9"
+name = "insta"
+version = "1.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec"
+checksum = "58019516c1403ac45b106c9fc4e8fcbd77a78e98b014c619d1506338902ccfa4"
+dependencies = [
+ "console",
+ "lazy_static",
+ "ron",
+ "serde",
+ "serde_json",
+ "serde_yaml",
+ "similar",
+ "uuid",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d"
dependencies = [
"cfg-if",
]
@@ -943,9 +1003,9 @@ dependencies = [
[[package]]
name = "itertools"
-version = "0.10.0"
+version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37d572918e350e82412fe766d24b15e6682fb2ed2bbe018280caa810397cb319"
+checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf"
dependencies = [
"either",
]
@@ -957,12 +1017,64 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"
[[package]]
-name = "lasso"
-version = "0.3.1"
+name = "kqueue"
+version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf1a626ea51398f5acf36666c8046ff4bfd048aab88e92db676d2a6eac8805d0"
+checksum = "058a107a784f8be94c7d35c1300f4facced2e93d2fbe5b1452b44e905ddca4a9"
dependencies = [
- "hashbrown 0.8.2",
+ "kqueue-sys",
+ "libc",
+]
+
+[[package]]
+name = "kqueue-sys"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8367585489f01bc55dd27404dcf56b95e6da061a256a666ab23be9ba96a2e587"
+dependencies = [
+ "bitflags",
+ "libc",
+]
+
+[[package]]
+name = "lalrpop"
+version = "0.19.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b15174f1c529af5bf1283c3bc0058266b483a67156f79589fab2a25e23cf8988"
+dependencies = [
+ "ascii-canvas",
+ "atty",
+ "bit-set",
+ "diff",
+ "ena",
+ "itertools 0.10.1",
+ "lalrpop-util",
+ "petgraph",
+ "pico-args",
+ "regex",
+ "regex-syntax",
+ "string_cache",
+ "term",
+ "tiny-keccak",
+ "unicode-xid 0.2.2",
+]
+
+[[package]]
+name = "lalrpop-util"
+version = "0.19.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3e58cce361efcc90ba8a0a5f982c741ff86b603495bb15a998412e957dcd278"
+dependencies = [
+ "regex",
+]
+
+[[package]]
+name = "lasso"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8647c8a01e5f7878eacb2c323c4c949fdb63773110f0686c7810769874b7e0a"
+dependencies = [
+ "hashbrown",
]
[[package]]
@@ -972,23 +1084,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
-name = "lexical-core"
-version = "0.7.6"
+name = "levenshtein"
+version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe"
-dependencies = [
- "arrayvec",
- "bitflags",
- "cfg-if",
- "ryu",
- "static_assertions",
-]
+checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760"
[[package]]
name = "libc"
-version = "0.2.94"
+version = "0.2.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e"
+checksum = "a7f823d141fe0a24df1e23b4af4e3c7ba9e5966ec514ea068c93024aa7deb765"
+
+[[package]]
+name = "linked-hash-map"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
[[package]]
name = "lock_api"
@@ -1022,18 +1133,18 @@ checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc"
[[package]]
name = "memoffset"
-version = "0.6.3"
+version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f83fb6581e8ed1f85fd45c116db8405483899489e38406156c25eb743554361d"
+checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9"
dependencies = [
"autocfg",
]
[[package]]
name = "mio"
-version = "0.7.11"
+version = "0.7.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf80d3e903b34e0bd7282b218398aec54e082c840d9baf8339e0080a0c542956"
+checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16"
dependencies = [
"libc",
"log",
@@ -1052,43 +1163,36 @@ dependencies = [
]
[[package]]
-name = "nix"
-version = "0.20.0"
+name = "new_debug_unreachable"
+version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a"
+checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
+
+[[package]]
+name = "nix"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df8e5e343312e7fbeb2a52139114e9e702991ef9c2aea6817ff2440b35647d56"
dependencies = [
"bitflags",
"cc",
"cfg-if",
"libc",
-]
-
-[[package]]
-name = "nom"
-version = "6.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7413f999671bd4745a7b624bd370a569fb6bc574b23c83a3c5ed2e453f3d5e2"
-dependencies = [
- "bitvec",
- "funty",
- "lexical-core",
- "memchr",
- "version_check",
+ "memoffset",
]
[[package]]
name = "notify"
-version = "5.0.0-pre.7"
+version = "5.0.0-pre.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ebe7699a0f8c5759450716ee03d231685c22b4fe8f406c42c22e0ad94d40ce7"
+checksum = "20a629259bb2c87a884bb76f6086c8637919de6d074754341c12e5dd3aed6326"
dependencies = [
- "anymap",
"bitflags",
"crossbeam-channel",
"filetime",
- "fsevent",
"fsevent-sys",
"inotify",
+ "kqueue",
"libc",
"mio",
"walkdir",
@@ -1104,31 +1208,6 @@ dependencies = [
"winapi",
]
-[[package]]
-name = "num"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606"
-dependencies = [
- "num-bigint 0.4.0",
- "num-complex",
- "num-integer",
- "num-iter",
- "num-rational 0.4.0",
- "num-traits",
-]
-
-[[package]]
-name = "num-bigint"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d0a3d5e207573f948a9e5376662aa743a2ea13f7c50a554d7af443a73fbfeba"
-dependencies = [
- "autocfg",
- "num-integer",
- "num-traits",
-]
-
[[package]]
name = "num-bigint"
version = "0.4.0"
@@ -1140,15 +1219,6 @@ dependencies = [
"num-traits",
]
-[[package]]
-name = "num-complex"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085"
-dependencies = [
- "num-traits",
-]
-
[[package]]
name = "num-integer"
version = "0.1.44"
@@ -1159,29 +1229,6 @@ dependencies = [
"num-traits",
]
-[[package]]
-name = "num-iter"
-version = "0.1.42"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59"
-dependencies = [
- "autocfg",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-rational"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07"
-dependencies = [
- "autocfg",
- "num-bigint 0.3.2",
- "num-integer",
- "num-traits",
-]
-
[[package]]
name = "num-rational"
version = "0.4.0"
@@ -1189,7 +1236,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a"
dependencies = [
"autocfg",
- "num-bigint 0.4.0",
+ "num-bigint",
"num-integer",
"num-traits",
]
@@ -1215,9 +1262,9 @@ dependencies = [
[[package]]
name = "once_cell"
-version = "1.7.2"
+version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3"
+checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56"
[[package]]
name = "output_vt100"
@@ -1281,47 +1328,57 @@ dependencies = [
]
[[package]]
-name = "peekmore"
-version = "0.5.6"
+name = "pest"
+version = "2.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4089f831c514cbf080bd19bfce702f7a2de250492730d419204af6710ba19316"
+checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53"
dependencies = [
- "smallvec",
+ "ucd-trie",
+]
+
+[[package]]
+name = "petgraph"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7"
+dependencies = [
+ "fixedbitset",
+ "indexmap",
]
[[package]]
name = "phf"
-version = "0.8.0"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
+checksum = "b2ac8b67553a7ca9457ce0e526948cad581819238f4a9d1ea74545851fa24f37"
dependencies = [
"phf_macros",
- "phf_shared",
+ "phf_shared 0.9.0",
"proc-macro-hack",
]
[[package]]
name = "phf_generator"
-version = "0.8.0"
+version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
+checksum = "d43f3220d96e0080cc9ea234978ccd80d904eafb17be31bb0f76daaea6493082"
dependencies = [
- "phf_shared",
+ "phf_shared 0.9.0",
"rand",
]
[[package]]
name = "phf_macros"
-version = "0.8.0"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c"
+checksum = "b706f5936eb50ed880ae3009395b43ed19db5bff2ebd459c95e7bf013a89ab86"
dependencies = [
"phf_generator",
- "phf_shared",
+ "phf_shared 0.9.0",
"proc-macro-hack",
"proc-macro2",
"quote 1.0.9",
- "syn 1.0.72",
+ "syn 1.0.74",
]
[[package]]
@@ -1334,10 +1391,25 @@ dependencies = [
]
[[package]]
-name = "pin-project-lite"
-version = "0.2.6"
+name = "phf_shared"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905"
+checksum = "a68318426de33640f02be62b4ae8eb1261be2efbc337b60c54d845bf4484e0d9"
+dependencies = [
+ "siphasher",
+]
+
+[[package]]
+name = "pico-args"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db8bcd96cb740d03149cbad5518db9fd87126a10ab519c011893b1754134c468"
+
+[[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"
@@ -1357,6 +1429,12 @@ version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
+[[package]]
+name = "precomputed-hash"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
+
[[package]]
name = "pretty_assertions"
version = "0.7.2"
@@ -1397,7 +1475,7 @@ dependencies = [
"proc-macro-error-attr",
"proc-macro2",
"quote 1.0.9",
- "syn 1.0.72",
+ "syn 1.0.74",
"version_check",
]
@@ -1426,9 +1504,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086"
[[package]]
name = "proc-macro2"
-version = "1.0.26"
+version = "1.0.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec"
+checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612"
dependencies = [
"unicode-xid 0.2.2",
]
@@ -1454,31 +1532,23 @@ dependencies = [
"proc-macro2",
]
-[[package]]
-name = "radium"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "941ba9d78d8e2f7ce474c015eea4d9c6d25b6a3327f9832ee29a4de27f91bbb8"
-
[[package]]
name = "rand"
-version = "0.7.3"
+version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8"
dependencies = [
- "getrandom",
"libc",
"rand_chacha",
"rand_core",
"rand_hc",
- "rand_pcg",
]
[[package]]
name = "rand_chacha"
-version = "0.2.2"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core",
@@ -1486,36 +1556,27 @@ dependencies = [
[[package]]
name = "rand_core"
-version = "0.5.1"
+version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
dependencies = [
"getrandom",
]
[[package]]
name = "rand_hc"
-version = "0.2.0"
+version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
-dependencies = [
- "rand_core",
-]
-
-[[package]]
-name = "rand_pcg"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
+checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7"
dependencies = [
"rand_core",
]
[[package]]
name = "rayon"
-version = "1.5.0"
+version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674"
+checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90"
dependencies = [
"autocfg",
"crossbeam-deque",
@@ -1525,9 +1586,9 @@ dependencies = [
[[package]]
name = "rayon-core"
-version = "1.9.0"
+version = "1.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a"
+checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e"
dependencies = [
"crossbeam-channel",
"crossbeam-deque",
@@ -1538,13 +1599,23 @@ dependencies = [
[[package]]
name = "redox_syscall"
-version = "0.2.8"
+version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc"
+checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff"
dependencies = [
"bitflags",
]
+[[package]]
+name = "redox_users"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64"
+dependencies = [
+ "getrandom",
+ "redox_syscall",
+]
+
[[package]]
name = "regex"
version = "1.5.4"
@@ -1563,14 +1634,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
[[package]]
-name = "roxmltree"
-version = "0.14.1"
+name = "ron"
+version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b"
+checksum = "064ea8613fb712a19faf920022ec8ddf134984f100090764a4e1d768f3827f1f"
dependencies = [
- "xmlparser",
+ "base64",
+ "bitflags",
+ "serde",
]
+[[package]]
+name = "rustc_version"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088"
+
[[package]]
name = "ryu"
version = "1.0.5"
@@ -1593,30 +1681,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]]
-name = "serde"
-version = "1.0.125"
+name = "semver"
+version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171"
+checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6"
+dependencies = [
+ "semver-parser",
+]
+
+[[package]]
+name = "semver-parser"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7"
+dependencies = [
+ "pest",
+]
+
+[[package]]
+name = "serde"
+version = "1.0.127"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f03b9878abf6d14e6779d3f24f07b2cfa90352cfec4acc5aab8f1ac7f146fae8"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.125"
+version = "1.0.127"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d"
+checksum = "a024926d3432516606328597e0f224a51355a493b49fdd67e9209187cbe55ecc"
dependencies = [
"proc-macro2",
"quote 1.0.9",
- "syn 1.0.72",
+ "syn 1.0.74",
]
[[package]]
name = "serde_json"
-version = "1.0.64"
+version = "1.0.66"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79"
+checksum = "336b10da19a12ad094b59d870ebde26a45402e5b470add4b5fd03c5048a32127"
dependencies = [
"itoa",
"ryu",
@@ -1624,14 +1730,32 @@ dependencies = [
]
[[package]]
-name = "signal-hook-registry"
-version = "1.3.0"
+name = "serde_yaml"
+version = "0.8.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16f1d0fef1604ba8f7a073c7e701f213e056707210e9020af4528e0101ce11a6"
+checksum = "039ba818c784248423789eec090aab9fb566c7b94d6ebbfa1814a9fd52c8afb2"
+dependencies = [
+ "dtoa",
+ "linked-hash-map",
+ "serde",
+ "yaml-rust",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
dependencies = [
"libc",
]
+[[package]]
+name = "similar"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ad1d488a557b235fc46dae55512ffbfc429d2482b08b4d9435ab07384ca8aec"
+
[[package]]
name = "simple-signal"
version = "1.1.1"
@@ -1642,17 +1766,35 @@ dependencies = [
"libc",
]
+[[package]]
+name = "simplexpr"
+version = "0.1.0"
+dependencies = [
+ "eww_shared_util",
+ "insta",
+ "itertools 0.10.1",
+ "lalrpop",
+ "lalrpop-util",
+ "levenshtein",
+ "once_cell",
+ "regex",
+ "serde",
+ "serde_json",
+ "strum 0.21.0",
+ "thiserror",
+]
+
[[package]]
name = "siphasher"
-version = "0.3.5"
+version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cbce6d4507c7e4a3962091436e56e95290cb71fa302d0d270e32130b75fbff27"
+checksum = "729a25c17d72b06c68cb47955d44fda88ad2d3e7d77e025663fdd69b93dd71a1"
[[package]]
name = "slab"
-version = "0.4.3"
+version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527"
+checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590"
[[package]]
name = "smallvec"
@@ -1668,7 +1810,7 @@ checksum = "133659a15339456eeeb07572eb02a91c91e9815e9cbc89566944d2c8d3efdbf6"
dependencies = [
"proc-macro2",
"quote 1.0.9",
- "syn 1.0.72",
+ "syn 1.0.74",
]
[[package]]
@@ -1677,6 +1819,18 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+[[package]]
+name = "string_cache"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ddb1139b5353f96e429e1a5e19fbaf663bddedaa06d1dbd49f82e352601209a"
+dependencies = [
+ "lazy_static",
+ "new_debug_unreachable",
+ "phf_shared 0.8.0",
+ "precomputed-hash",
+]
+
[[package]]
name = "strsim"
version = "0.8.0"
@@ -1685,9 +1839,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
[[package]]
name = "structopt"
-version = "0.3.21"
+version = "0.3.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5277acd7ee46e63e5168a80734c9f6ee81b1367a7d8772a2d765df2a3705d28c"
+checksum = "69b041cdcb67226aca307e6e7be44c8806423d83e018bd662360a93dabce4d71"
dependencies = [
"clap",
"lazy_static",
@@ -1696,15 +1850,15 @@ dependencies = [
[[package]]
name = "structopt-derive"
-version = "0.4.14"
+version = "0.4.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90"
+checksum = "7813934aecf5f51a54775e00068c237de98489463968231a51746bbbc03f9c10"
dependencies = [
"heck",
"proc-macro-error",
"proc-macro2",
"quote 1.0.9",
- "syn 1.0.72",
+ "syn 1.0.74",
]
[[package]]
@@ -1715,9 +1869,12 @@ checksum = "57bd81eb48f4c437cadc685403cad539345bf703d78e63707418431cecd4522b"
[[package]]
name = "strum"
-version = "0.20.0"
+version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7318c509b5ba57f18533982607f24070a55d353e90d4cae30c467cdb2ad5ac5c"
+checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2"
+dependencies = [
+ "strum_macros 0.21.1",
+]
[[package]]
name = "strum_macros"
@@ -1728,19 +1885,19 @@ dependencies = [
"heck",
"proc-macro2",
"quote 1.0.9",
- "syn 1.0.72",
+ "syn 1.0.74",
]
[[package]]
name = "strum_macros"
-version = "0.20.1"
+version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee8bc6b87a5112aeeab1f4a9f7ab634fe6cbefc4850006df31267f4cfb9e3149"
+checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec"
dependencies = [
"heck",
"proc-macro2",
"quote 1.0.9",
- "syn 1.0.72",
+ "syn 1.0.74",
]
[[package]]
@@ -1756,9 +1913,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "1.0.72"
+version = "1.0.74"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1e8cdbefb79a9a5a65e0db8b47b723ee907b7c7f8496c76a1770b5c310bab82"
+checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c"
dependencies = [
"proc-macro2",
"quote 1.0.9",
@@ -1806,10 +1963,15 @@ dependencies = [
]
[[package]]
-name = "tap"
-version = "1.0.1"
+name = "term"
+version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
+checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f"
+dependencies = [
+ "dirs-next",
+ "rustversion",
+ "winapi",
+]
[[package]]
name = "termcolor"
@@ -1820,6 +1982,16 @@ dependencies = [
"winapi-util",
]
+[[package]]
+name = "terminal_size"
+version = "0.1.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
[[package]]
name = "textwrap"
version = "0.11.0"
@@ -1831,29 +2003,38 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "1.0.24"
+version = "1.0.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e"
+checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.24"
+version = "1.0.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0"
+checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745"
dependencies = [
"proc-macro2",
"quote 1.0.9",
- "syn 1.0.72",
+ "syn 1.0.74",
+]
+
+[[package]]
+name = "tiny-keccak"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
+dependencies = [
+ "crunchy",
]
[[package]]
name = "tokio"
-version = "1.5.0"
+version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83f0c8e7c0addab50b663055baf787d0af7f413a46e6e7fb9559a4e4db7137a5"
+checksum = "01cf844b23c6131f624accf65ce0e4e9956a8bb329400ea5bcc26ae3a5c20b0b"
dependencies = [
"autocfg",
"bytes",
@@ -1871,31 +2052,20 @@ dependencies = [
[[package]]
name = "tokio-macros"
-version = "1.1.0"
+version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "caf7b11a536f46a809a8a9f0bb4237020f70ecbf115b842360afb127ea2fda57"
+checksum = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110"
dependencies = [
"proc-macro2",
"quote 1.0.9",
- "syn 1.0.72",
-]
-
-[[package]]
-name = "tokio-stream"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e177a5d8c3bf36de9ebe6d58537d8879e964332f93fb3339e43f618c81361af0"
-dependencies = [
- "futures-core",
- "pin-project-lite",
- "tokio",
+ "syn 1.0.74",
]
[[package]]
name = "tokio-util"
-version = "0.6.6"
+version = "0.6.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "940a12c99365c31ea8dd9ba04ec1be183ffe4920102bb7122c2f515437601e8e"
+checksum = "1caa0b0c8d94a049db56b5acf8cba99dc0623aab1b26d5b5f5e2d945846b3592"
dependencies = [
"bytes",
"futures-core",
@@ -1914,6 +2084,12 @@ dependencies = [
"serde",
]
+[[package]]
+name = "ucd-trie"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c"
+
[[package]]
name = "unescape"
version = "0.1.0"
@@ -1922,9 +2098,9 @@ checksum = "ccb97dac3243214f8d8507998906ca3e2e0b900bf9bf4870477f125b82e68f6e"
[[package]]
name = "unicode-segmentation"
-version = "1.7.1"
+version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796"
+checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b"
[[package]]
name = "unicode-width"
@@ -1944,6 +2120,18 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
+[[package]]
+name = "unindent"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7"
+
+[[package]]
+name = "uuid"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
+
[[package]]
name = "vec_map"
version = "0.8.2"
@@ -1984,9 +2172,9 @@ dependencies = [
[[package]]
name = "wasi"
-version = "0.9.0+wasi-snapshot-preview1"
+version = "0.10.2+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
[[package]]
name = "winapi"
@@ -2028,12 +2216,6 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-[[package]]
-name = "wyz"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214"
-
[[package]]
name = "x11"
version = "2.18.2"
@@ -2057,7 +2239,35 @@ dependencies = [
]
[[package]]
-name = "xmlparser"
-version = "0.13.3"
+name = "yaml-rust"
+version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8"
+checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
+dependencies = [
+ "linked-hash-map",
+]
+
+[[package]]
+name = "yuck"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "codespan-reporting",
+ "derive_more",
+ "eww_shared_util",
+ "insta",
+ "itertools 0.10.1",
+ "lalrpop",
+ "lalrpop-util",
+ "maplit",
+ "once_cell",
+ "pretty_assertions",
+ "regex",
+ "serde",
+ "serde_json",
+ "simplexpr",
+ "smart-default",
+ "static_assertions",
+ "strum 0.21.0",
+ "thiserror",
+]
diff --git a/Cargo.toml b/Cargo.toml
index cbb85b4..66b1ea0 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,73 +1,10 @@
-[package]
-name = "eww"
-version = "0.1.0"
-authors = ["elkowar <5300871+elkowar@users.noreply.github.com>"]
-edition = "2018"
-description= "Widget system for everyone!"
-license = "MIT"
-repository = "https://github.com/elkowar/eww"
-homepage = "https://github.com/elkowar/eww"
+[workspace]
+members = [
+ "crates/eww",
+ "crates/simplexpr",
+ "crates/yuck",
+ "crates/eww_shared_util"
+]
+[profile.dev]
+split-debuginfo = "unpacked"
-
-[features]
-default = ["x11"]
-x11 = ["gdkx11", "x11rb"]
-wayland = ["gtk-layer-shell", "gtk-layer-shell-sys"]
-no-x11-wayland = []
-[dependencies.cairo-sys-rs]
-version = "0.10.0"
-
-[dependencies]
-gtk = { version = "0.9", features = [ "v3_22" ] }
-gdk = { version = "*", features = ["v3_22"] }
-gio = { version = "*", features = ["v2_44"] }
-glib = { version = "*", features = ["v2_44"] }
-
-gdk-pixbuf = "0.9"
-
-gtk-layer-shell = { version="0.2.0", optional=true }
-gtk-layer-shell-sys = { version="0.2.0", optional=true }
-gdkx11 = { version = "0.9", optional = true }
-x11rb = { version = "0.8", features = ["randr"], optional = true }
-
-regex = "1"
-bincode = "1.3"
-anyhow = "1.0"
-derive_more = "0.99"
-maplit = "1"
-structopt = "0.3"
-serde = {version = "1.0", features = ["derive"]}
-serde_json = "1.0"
-extend = "1"
-grass = "0.10"
-num = "0.4"
-roxmltree = "0.14"
-itertools = "0.10"
-debug_stub_derive = "0.3"
-log = "0.4"
-pretty_env_logger = "0.4"
-lazy_static = "1.4.0"
-libc = "0.2"
-nix = "0.20"
-smart-default = "0.6"
-simple-signal = "1.1"
-unescape = "0.1"
-
-tokio = { version = "1.0", features = ["full"] }
-tokio-stream = "0.1"
-async-stream = "0.3"
-futures-core = "0.3"
-futures-util = "0.3"
-tokio-util = "0.6"
-
-sysinfo = "0.16.1"
-
-nom = "6.1"
-dyn-clone = "1.0"
-base64 = "0.13"
-wait-timeout = "0.2"
-
-notify = "5.0.0-pre.7"
-
-[dev-dependencies]
-pretty_assertions = "0.7.1"
diff --git a/README.md b/README.md
index 8c85a78..8cdd81b 100644
--- a/README.md
+++ b/README.md
@@ -4,18 +4,26 @@
-Elkowar’s Wacky Widgets is a standalone widget system made in Rust that allows you to implement
+Elkowars Wacky Widgets is a standalone widget system made in Rust that allows you to implement
your own, custom widgets in any window manager.
Documentation **and instructions on how to install** can be found [here](https://elkowar.github.io/eww).
-## New configuration language is being made!
+## New configuration language!
-A new configuration language for Eww is being made! `yuck` is the new name! (as discussed in the [discussion post](https://github.com/elkowar/eww/discussions/206).)
-You can check out its development in [this PR](https://github.com/elkowar/eww/pull/221) and maybe contribewwte!
+YUCK IS ALIVE! After months of waiting, the new configuration language has now been released!
+This also means that XML is no longer supported from this point onwards.
+If you want to keep using the latest releases of eww, you'll need to migrate your config over to yuck.
+
+The steps to migrate can be found in [the migration guide](YUCK_MIGRATION.md).
+
+Additionally, a couple _amazing_ people have started to work on an
+[automatic converter](https://github.com/undefinedDarkness/ewwxml) that can turn your old eww.xml into the new yuck format!
## Examples
+(note that some of these still make use of the old configuration syntax)
+
* A basic bar, see [examples](./examples/eww-bar)

diff --git a/YUCK_MIGRATION.md b/YUCK_MIGRATION.md
new file mode 100644
index 0000000..8ba66f0
--- /dev/null
+++ b/YUCK_MIGRATION.md
@@ -0,0 +1,29 @@
+# Migrating to yuck
+
+Yuck is the new configuration syntax used by eww.
+While the syntax has changed dramatically, the general structure of the configuration
+has stayed mostly the same.
+
+Most notably, the top-level blocks are now gone.
+This means that `defvar`, `defwidget`, etc blocks no longer need to be in separate
+sections of the file, but instead can be put wherever you need them.
+
+Explaining the exact syntax of yuck would be significantly less effective than just
+looking at an example, as the general syntax is very simple.
+
+Thus, to get a feel for yuck, read through the [example configuration](./examples/eww-bar/eww.yuck).
+
+
+Additionally, a couple smaller things have been changed.
+The fields and structure of the `defwindow` block as been adjusted to better reflect
+the options provided by the displayserver that is being used.
+The major changes are:
+- The `screen` field is now called `monitor`
+- `reserve` and `geometry` are now structured slightly differently (see [here](./docs/src/configuration.md#creating-your-first-window))
+To see how exactly the configuration now looks, check the [respective documentation](./docs/src/configuration.md#creating-your-first-window)
+
+
+## Automatically converting your configuration
+
+A couple _amazing_ people have started to work on an [automatic converter](https://github.com/undefinedDarkness/ewwxml) that can turn your
+old eww.xml into the new yuck format!
diff --git a/crates/eww/Cargo.toml b/crates/eww/Cargo.toml
new file mode 100644
index 0000000..e1329a8
--- /dev/null
+++ b/crates/eww/Cargo.toml
@@ -0,0 +1,71 @@
+[package]
+name = "eww"
+version = "0.2.0"
+authors = ["elkowar <5300871+elkowar@users.noreply.github.com>"]
+edition = "2018"
+description = "Widget system for everyone!"
+license = "MIT"
+repository = "https://github.com/elkowar/eww"
+homepage = "https://github.com/elkowar/eww"
+
+
+[features]
+default = ["x11"]
+x11 = ["gdkx11", "x11rb"]
+wayland = ["gtk-layer-shell", "gtk-layer-shell-sys"]
+[dependencies.cairo-sys-rs]
+version = "0.10.0"
+
+[dependencies]
+gtk = { version = "0.9", features = [ "v3_22" ] }
+gdk = { version = "*", features = ["v3_22"] }
+gio = { version = "*", features = ["v2_44"] }
+glib = { version = "*", features = ["v2_44"] }
+
+gdk-pixbuf = "0.9"
+
+gtk-layer-shell = { version="0.2.0", optional=true }
+gtk-layer-shell-sys = { version="0.2.0", optional=true }
+gdkx11 = { version = "0.9", optional = true }
+x11rb = { version = "0.8", features = ["randr"], optional = true }
+
+regex = "1"
+bincode = "1.3"
+anyhow = "1.0"
+derive_more = "0.99"
+maplit = "1"
+structopt = "0.3"
+serde = {version = "1.0", features = ["derive"]}
+serde_json = "1.0"
+extend = "1"
+grass = "0.10"
+itertools = "0.10"
+debug_stub_derive = "0.3"
+log = "0.4"
+pretty_env_logger = "0.4"
+libc = "0.2"
+once_cell = "1.8"
+nix = "0.20"
+smart-default = "0.6"
+simple-signal = "1.1"
+unescape = "0.1"
+unindent = "0.1"
+
+tokio = { version = "1.0", features = ["full"] }
+futures-core = "0.3"
+futures-util = "0.3"
+tokio-util = "0.6"
+
+sysinfo = "0.16.1"
+
+dyn-clone = "1.0"
+base64 = "0.13"
+wait-timeout = "0.2"
+
+notify = "5.0.0-pre.7"
+
+codespan-reporting = "0.11"
+
+simplexpr = { path = "../simplexpr" }
+eww_shared_util = { path = "../eww_shared_util" }
+yuck = { path = "../yuck", default-features = false}
diff --git a/rustfmt.toml b/crates/eww/rustfmt.toml
similarity index 100%
rename from rustfmt.toml
rename to crates/eww/rustfmt.toml
diff --git a/src/app.rs b/crates/eww/src/app.rs
similarity index 53%
rename from src/app.rs
rename to crates/eww/src/app.rs
index 367d654..05b4f6d 100644
--- a/src/app.rs
+++ b/crates/eww/src/app.rs
@@ -1,61 +1,43 @@
use crate::{
- config,
- config::{window_definition::WindowName, AnchorPoint},
- display_backend, eww_state,
- script_var_handler::*,
- value::{Coords, NumWithUnit, PrimVal, VarName},
+ config, daemon_response::DaemonResponseSender, display_backend, error_handling_ctx, eww_state, script_var_handler::*,
EwwPaths,
};
use anyhow::*;
use debug_stub_derive::*;
+use eww_shared_util::VarName;
use gdk::WindowExt;
use gtk::{ContainerExt, CssProviderExt, GtkWindowExt, StyleContextExt, WidgetExt};
use itertools::Itertools;
-use std::collections::HashMap;
+use simplexpr::dynval::DynVal;
+use std::collections::{HashMap, HashSet};
use tokio::sync::mpsc::UnboundedSender;
-
-/// Response that the app may send as a response to a event.
-/// This is used in `DaemonCommand`s that contain a response sender.
-#[derive(Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, derive_more::Display)]
-pub enum DaemonResponse {
- Success(String),
- Failure(String),
-}
-
-impl DaemonResponse {
- pub fn is_success(&self) -> bool {
- matches!(self, DaemonResponse::Success(_))
- }
-
- pub fn is_failure(&self) -> bool {
- !self.is_success()
- }
-}
-
-pub type DaemonResponseSender = tokio::sync::mpsc::UnboundedSender;
-pub type DaemonResponseReceiver = tokio::sync::mpsc::UnboundedReceiver;
+use yuck::{
+ config::window_geometry::{AnchorPoint, WindowGeometry},
+ value::Coords,
+};
#[derive(Debug)]
pub enum DaemonCommand {
NoOp,
- UpdateVars(Vec<(VarName, PrimVal)>),
+ UpdateVars(Vec<(VarName, DynVal)>),
ReloadConfigAndCss(DaemonResponseSender),
UpdateConfig(config::EwwConfig),
UpdateCss(String),
OpenMany {
- windows: Vec,
+ windows: Vec,
sender: DaemonResponseSender,
},
OpenWindow {
- window_name: WindowName,
+ window_name: String,
pos: Option,
size: Option,
anchor: Option,
- monitor: Option,
+ screen: Option,
+ should_toggle: bool,
sender: DaemonResponseSender,
},
CloseWindow {
- window_name: WindowName,
+ window_name: String,
sender: DaemonResponseSender,
},
KillServer,
@@ -70,7 +52,7 @@ pub enum DaemonCommand {
#[derive(Debug, Clone)]
pub struct EwwWindow {
- pub name: WindowName,
+ pub name: String,
pub definition: config::EwwWindowDefinition,
pub gtk_window: gtk::Window,
}
@@ -85,7 +67,10 @@ impl EwwWindow {
pub struct App {
pub eww_state: eww_state::EwwState,
pub eww_config: config::EwwConfig,
- pub open_windows: HashMap,
+ pub open_windows: HashMap,
+ /// Window names that are supposed to be open, but failed.
+ /// When reloading the config, these should be opened again.
+ pub failed_windows: HashSet,
pub css_provider: gtk::CssProvider,
#[debug_stub = "ScriptVarHandler(...)"]
@@ -111,24 +96,23 @@ impl App {
DaemonCommand::ReloadConfigAndCss(sender) => {
let mut errors = Vec::new();
- let config_result = config::RawEwwConfig::read_from_file(&self.paths.get_eww_xml_path())
- .and_then(config::EwwConfig::generate);
- match config_result {
- Ok(new_config) => self.handle_command(DaemonCommand::UpdateConfig(new_config)),
+ let config_result = config::read_from_file(&self.paths.get_yuck_path());
+ match config_result.and_then(|new_config| self.load_config(new_config)) {
+ Ok(()) => {}
Err(e) => errors.push(e),
}
let css_result = crate::util::parse_scss_from_file(&self.paths.get_eww_scss_path());
- match css_result {
- Ok(new_css) => self.handle_command(DaemonCommand::UpdateCss(new_css)),
+ match css_result.and_then(|css| self.load_css(&css)) {
+ Ok(()) => {}
Err(e) => errors.push(e),
}
- let errors = errors.into_iter().map(|e| format!("{:?}", e)).join("\n");
+ let errors = errors.into_iter().map(|e| error_handling_ctx::format_error(&e)).join("\n");
if errors.is_empty() {
- sender.send(DaemonResponse::Success(String::new()))?;
+ sender.send_success(String::new())?;
} else {
- sender.send(DaemonResponse::Failure(errors))?;
+ sender.send_failure(errors)?;
}
}
DaemonCommand::UpdateConfig(config) => {
@@ -150,15 +134,19 @@ impl App {
}
DaemonCommand::OpenMany { windows, sender } => {
let result = windows.iter().try_for_each(|w| self.open_window(w, None, None, None, None));
- respond_with_error(sender, result)?;
+ respond_with_result(sender, result)?;
}
- DaemonCommand::OpenWindow { window_name, pos, size, anchor, monitor, sender } => {
- let result = self.open_window(&window_name, pos, size, monitor, anchor);
- respond_with_error(sender, result)?;
+ DaemonCommand::OpenWindow { window_name, pos, size, anchor, screen: monitor, should_toggle, sender } => {
+ let result = if should_toggle && self.open_windows.contains_key(&window_name) {
+ self.close_window(&window_name)
+ } else {
+ self.open_window(&window_name, pos, size, monitor, anchor)
+ };
+ respond_with_result(sender, result)?;
}
DaemonCommand::CloseWindow { window_name, sender } => {
let result = self.close_window(&window_name);
- respond_with_error(sender, result)?;
+ respond_with_result(sender, result)?;
}
DaemonCommand::PrintState { all, sender } => {
let vars = self.eww_state.get_variables().iter();
@@ -169,7 +157,7 @@ impl App {
.map(|(key, value)| format!("{}: {}", key, value))
.join("\n")
};
- sender.send(DaemonResponse::Success(output)).context("sending response from main thread")?
+ sender.send_success(output)?
}
DaemonCommand::PrintWindows(sender) => {
let output = self
@@ -181,38 +169,43 @@ impl App {
format!("{}{}", if is_open { "*" } else { "" }, window_name)
})
.join("\n");
- sender.send(DaemonResponse::Success(output)).context("sending response from main thread")?
+ sender.send_success(output)?
}
DaemonCommand::PrintDebug(sender) => {
let output = format!("state: {:#?}\n\nconfig: {:#?}", &self.eww_state, &self.eww_config);
- sender.send(DaemonResponse::Success(output)).context("sending response from main thread")?
+ sender.send_success(output)?
}
}
};
- crate::print_result_err!("while handling event", &result);
+ if let Err(err) = result {
+ error_handling_ctx::print_error(err);
+ }
}
fn stop_application(&mut self) {
self.script_var_handler.stop_all();
- self.open_windows.drain().for_each(|(_, w)| w.close());
+ for (_, window) in self.open_windows.drain() {
+ window.close();
+ }
gtk::main_quit();
}
- fn update_state(&mut self, fieldname: VarName, value: PrimVal) {
+ fn update_state(&mut self, fieldname: VarName, value: DynVal) {
self.eww_state.update_variable(fieldname, value)
}
- fn close_window(&mut self, window_name: &WindowName) -> Result<()> {
+ fn close_window(&mut self, window_name: &String) -> Result<()> {
for unused_var in self.variables_only_used_in(window_name) {
- log::info!("stopping for {}", &unused_var);
+ log::debug!("stopping for {}", &unused_var);
self.script_var_handler.stop_for_variable(unused_var.clone());
}
- let window =
- self.open_windows.remove(window_name).context(format!("No window with name '{}' is running.", window_name))?;
+ self.open_windows
+ .remove(window_name)
+ .with_context(|| format!("Tried to close window named '{}', but no such window was open", window_name))?
+ .close();
- window.close();
self.eww_state.clear_window_state(window_name);
Ok(())
@@ -220,42 +213,55 @@ impl App {
fn open_window(
&mut self,
- window_name: &WindowName,
+ window_name: &String,
pos: Option,
size: Option,
monitor: Option,
- anchor: Option,
+ anchor: Option,
) -> Result<()> {
- // remove and close existing window with the same name
- let _ = self.close_window(window_name);
+ self.failed_windows.remove(window_name);
log::info!("Opening window {}", window_name);
- let mut window_def = self.eww_config.get_window(window_name)?.clone();
- window_def.geometry = window_def.geometry.override_if_given(anchor, pos, size);
+ // if an instance of this is already running, close it
+ let _ = self.close_window(window_name);
- let root_widget =
- window_def.widget.render(&mut self.eww_state, window_name, &self.eww_config.get_widget_definitions())?;
- root_widget.get_style_context().add_class(&window_name.to_string());
+ let open_result: Result<_> = try {
+ let mut window_def = self.eww_config.get_window(window_name)?.clone();
+ window_def.geometry = window_def.geometry.map(|x| x.override_if_given(anchor, pos, size));
- let monitor_geometry =
- get_monitor_geometry(monitor.or(window_def.screen_number).unwrap_or_else(get_default_monitor_index));
- let eww_window = initialize_window(monitor_geometry, root_widget, window_def)?;
+ let root_widget =
+ window_def.widget.render(&mut self.eww_state, window_name, &self.eww_config.get_widget_definitions())?;
- self.open_windows.insert(window_name.clone(), eww_window);
+ root_widget.get_style_context().add_class(&window_name.to_string());
- // initialize script var handlers for variables that where not used before opening this window.
- // TODO somehow make this less shit
- for newly_used_var in
- self.variables_only_used_in(window_name).filter_map(|var| self.eww_config.get_script_var(var).ok())
- {
- self.script_var_handler.add(newly_used_var.clone());
+ let monitor_geometry = get_monitor_geometry(monitor.or(window_def.monitor_number))?;
+
+ let eww_window = initialize_window(monitor_geometry, root_widget, window_def)?;
+
+ self.open_windows.insert(window_name.clone(), eww_window);
+
+ // initialize script var handlers for variables that where not used before opening this window.
+ // TODO somehow make this less shit
+ for newly_used_var in
+ self.variables_only_used_in(window_name).filter_map(|var| self.eww_config.get_script_var(var).ok())
+ {
+ self.script_var_handler.add(newly_used_var.clone());
+ }
+ };
+
+ if let Err(err) = open_result {
+ self.failed_windows.insert(window_name.to_string());
+ Err(err).with_context(|| format!("failed to open window `{}`", window_name))
+ } else {
+ Ok(())
}
-
- Ok(())
}
- /// Load the given configuration, reloading all script-vars and reopening all windows that where opened.
+ /// Load the given configuration, reloading all script-vars and attempting to reopen all windows that where opened.
pub fn load_config(&mut self, config: config::EwwConfig) -> Result<()> {
+ // TODO the reload procedure is kinda bad.
+ // It should probably instead prepare a new eww_state and everything, and then swap the instances once everything has worked.
+
log::info!("Reloading windows");
// refresh script-var poll stuff
self.script_var_handler.stop_all();
@@ -263,9 +269,8 @@ impl App {
self.eww_config = config;
self.eww_state.clear_all_window_states();
- let windows = self.open_windows.clone();
- for (window_name, window) in windows {
- window.close();
+ let window_names: Vec = self.open_windows.keys().cloned().chain(self.failed_windows.iter().cloned()).dedup().collect();
+ for window_name in &window_names {
self.open_window(&window_name, None, None, None, None)?;
}
Ok(())
@@ -282,7 +287,7 @@ impl App {
}
/// Get all variables mapped to a list of windows they are being used in.
- pub fn currently_used_variables<'a>(&'a self) -> HashMap<&'a VarName, Vec<&'a WindowName>> {
+ pub fn currently_used_variables<'a>(&'a self) -> HashMap<&'a VarName, Vec<&'a String>> {
let mut vars: HashMap<&'a VarName, Vec<_>> = HashMap::new();
for window_name in self.open_windows.keys() {
for var in self.eww_state.vars_referenced_in(window_name) {
@@ -293,7 +298,7 @@ impl App {
}
/// Get all variables that are only used in the given window.
- pub fn variables_only_used_in<'a>(&'a self, window: &'a WindowName) -> impl Iterator- {
+ pub fn variables_only_used_in<'a>(&'a self, window: &'a String) -> impl Iterator
- {
self.currently_used_variables()
.into_iter()
.filter(move |(_, wins)| wins.len() == 1 && wins.contains(&window))
@@ -306,55 +311,54 @@ fn initialize_window(
root_widget: gtk::Widget,
window_def: config::EwwWindowDefinition,
) -> Result {
- let actual_window_rect = window_def.geometry.get_window_rectangle(monitor_geometry);
- if let Some(window) = display_backend::initialize_window(&window_def, monitor_geometry) {
- window.set_title(&format!("Eww - {}", window_def.name));
- let wm_class_name = format!("eww-{}", window_def.name);
- window.set_wmclass(&wm_class_name, &wm_class_name);
- window.set_position(gtk::WindowPosition::Center);
+ let window = display_backend::initialize_window(&window_def, monitor_geometry)
+ .with_context(|| format!("monitor {} is unavailable", window_def.monitor_number.unwrap()))?;
+
+ window.set_title(&format!("Eww - {}", window_def.name));
+ window.set_position(gtk::WindowPosition::None);
+ window.set_gravity(gdk::Gravity::Center);
+
+ if let Some(geometry) = window_def.geometry {
+ let actual_window_rect = get_window_rectangle(geometry, monitor_geometry);
window.set_size_request(actual_window_rect.width, actual_window_rect.height);
window.set_default_size(actual_window_rect.width, actual_window_rect.height);
- window.set_decorated(false);
- // run on_screen_changed to set the visual correctly initially.
- on_screen_changed(&window, None);
- window.connect_screen_changed(on_screen_changed);
-
- window.add(&root_widget);
-
- window.show_all();
-
- apply_window_position(window_def.clone(), monitor_geometry, &window)?;
- let gdk_window = window.get_window().context("couldn't get gdk window from gtk window")?;
- gdk_window.set_override_redirect(!window_def.focusable);
-
- #[cfg(feature = "x11")]
- display_backend::set_xprops(&window, monitor_geometry, &window_def)?;
-
- // this should only be required on x11, as waylands layershell should manage the margins properly anways.
- #[cfg(feature = "x11")]
- window.connect_configure_event({
- let window_def = window_def.clone();
- move |window, _evt| {
- let _ = apply_window_position(window_def.clone(), monitor_geometry, &window);
- false
- }
- });
- Ok(EwwWindow { name: window_def.name.clone(), definition: window_def, gtk_window: window })
- } else {
- Err(anyhow!("monitor {} is unavailable", window_def.screen_number.unwrap()))
}
+ window.set_decorated(false);
+ window.set_skip_taskbar_hint(true);
+ window.set_skip_pager_hint(true);
+
+ // run on_screen_changed to set the visual correctly initially.
+ on_screen_changed(&window, None);
+ window.connect_screen_changed(on_screen_changed);
+
+ window.add(&root_widget);
+
+ window.show_all();
+
+ #[cfg(feature = "x11")]
+ {
+ if let Some(geometry) = window_def.geometry {
+ let _ = apply_window_position(geometry, monitor_geometry, &window);
+ window.connect_configure_event(move |window, _| {
+ let _ = apply_window_position(geometry, monitor_geometry, &window);
+ false
+ });
+ }
+ display_backend::set_xprops(&window, monitor_geometry, &window_def)?;
+ }
+ Ok(EwwWindow { name: window_def.name.clone(), definition: window_def, gtk_window: window })
}
/// Apply the provided window-positioning rules to the window.
+#[cfg(feature = "x11")]
fn apply_window_position(
- mut window_def: config::EwwWindowDefinition,
+ mut window_geometry: WindowGeometry,
monitor_geometry: gdk::Rectangle,
window: >k::Window,
) -> Result<()> {
- let (gtk_window_width, gtk_window_height) = window.get_size();
- window_def.geometry.size = Coords { x: NumWithUnit::Pixels(gtk_window_width), y: NumWithUnit::Pixels(gtk_window_height) };
let gdk_window = window.get_window().context("Failed to get gdk window from gtk window")?;
- let actual_window_rect = window_def.geometry.get_window_rectangle(monitor_geometry);
+ window_geometry.size = Coords::from_pixels(window.get_size());
+ let actual_window_rect = get_window_rectangle(window_geometry, monitor_geometry);
gdk_window.move_(actual_window_rect.x, actual_window_rect.y);
Ok(())
}
@@ -366,20 +370,34 @@ fn on_screen_changed(window: >k::Window, _old_screen: Option<&gdk::Screen>) {
window.set_visual(visual.as_ref());
}
-fn get_default_monitor_index() -> i32 {
- gdk::Display::get_default().expect("could not get default display").get_default_screen().get_primary_monitor()
-}
-
-/// Get the monitor geometry of a given monitor number
-fn get_monitor_geometry(n: i32) -> gdk::Rectangle {
- gdk::Display::get_default().expect("could not get default display").get_default_screen().get_monitor_geometry(n)
+/// Get the monitor geometry of a given monitor number, or the default if none is given
+fn get_monitor_geometry(n: Option) -> Result {
+ #[allow(deprecated)]
+ let display = gdk::Display::get_default().expect("could not get default display");
+ let monitor = match n {
+ Some(n) => display.get_monitor(n).with_context(|| format!("Failed to get monitor with index {}", n))?,
+ None => display.get_primary_monitor().context("Failed to get primary monitor from GTK")?,
+ };
+ Ok(monitor.get_geometry())
}
/// In case of an Err, send the error message to a sender.
-fn respond_with_error(sender: DaemonResponseSender, result: Result) -> Result<()> {
+fn respond_with_result(sender: DaemonResponseSender, result: Result) -> Result<()> {
match result {
- Ok(_) => sender.send(DaemonResponse::Success(String::new())),
- Err(e) => sender.send(DaemonResponse::Failure(format!("{:?}", e))),
+ Ok(_) => sender.send_success(String::new()),
+ Err(e) => {
+ let formatted = error_handling_ctx::format_error(&e);
+ println!("Action failed with error: {}", formatted);
+ sender.send_failure(formatted)
+ },
}
.context("sending response from main thread")
}
+
+pub fn get_window_rectangle(geometry: WindowGeometry, screen_rect: gdk::Rectangle) -> gdk::Rectangle {
+ let (offset_x, offset_y) = geometry.offset.relative_to(screen_rect.width, screen_rect.height);
+ let (width, height) = geometry.size.relative_to(screen_rect.width, screen_rect.height);
+ let x = screen_rect.x + offset_x + geometry.anchor_point.x.alignment_to_coordinate(width, screen_rect.width);
+ let y = screen_rect.y + offset_y + geometry.anchor_point.y.alignment_to_coordinate(height, screen_rect.height);
+ gdk::Rectangle { x, y, width, height }
+}
diff --git a/src/application_lifecycle.rs b/crates/eww/src/application_lifecycle.rs
similarity index 90%
rename from src/application_lifecycle.rs
rename to crates/eww/src/application_lifecycle.rs
index a44a050..8a5cd3c 100644
--- a/src/application_lifecycle.rs
+++ b/crates/eww/src/application_lifecycle.rs
@@ -3,11 +3,10 @@
//! `recv_exit()` function which can be awaited to receive an event in case of application termination.
use anyhow::*;
+use once_cell::sync::Lazy;
use tokio::sync::broadcast;
-lazy_static::lazy_static! {
- static ref APPLICATION_EXIT_SENDER: broadcast::Sender<()> = broadcast::channel(2).0;
-}
+pub static APPLICATION_EXIT_SENDER: Lazy> = Lazy::new(|| broadcast::channel(2).0);
/// Notify all listening tasks of the termination of the eww application process.
pub fn send_exit() -> Result<()> {
diff --git a/src/client.rs b/crates/eww/src/client.rs
similarity index 86%
rename from src/client.rs
rename to crates/eww/src/client.rs
index 3001357..e5d98ec 100644
--- a/src/client.rs
+++ b/crates/eww/src/client.rs
@@ -1,7 +1,7 @@
use std::process::Stdio;
use crate::{
- app,
+ daemon_response::DaemonResponse,
opts::{self, ActionClientOnly},
EwwPaths,
};
@@ -24,8 +24,8 @@ pub fn handle_client_only_action(paths: &EwwPaths, action: ActionClientOnly) ->
Ok(())
}
-pub fn do_server_call(mut stream: UnixStream, action: opts::ActionWithServer) -> Result