diff --git a/.gitignore b/.gitignore
index cced044..a4a2c61 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,2 @@
.direnv
-/result
-/result-man
+/result*
diff --git a/ci/woodpecker/gomod2nix.toml b/ci/woodpecker/gomod2nix.toml
index 9e58012..75e9d89 100644
--- a/ci/woodpecker/gomod2nix.toml
+++ b/ci/woodpecker/gomod2nix.toml
@@ -65,14 +65,14 @@ schema = 3
version = "v1.0.2"
hash = "sha256-gfwm6i0ZGQhX2c0lDRe7qVXyHkhoHeemYpaj+O0aYyw="
[mod."github.com/docker/cli"]
- version = "v20.10.25+incompatible"
- hash = "sha256-0UY18siblX3VAXHeRwG38LSdirbRLENTmdgIkmnknYU="
+ version = "v20.10.26+incompatible"
+ hash = "sha256-raz6w//bxBzWhTV4Ocmqkm7QyaWxF/NsKWUCcfa0T3c="
[mod."github.com/docker/distribution"]
version = "v2.8.2+incompatible"
hash = "sha256-ocVWMRt5ErWdVsj3rsNa/QhizG5b/PCu8LoOlUi24/c="
[mod."github.com/docker/docker"]
- version = "v20.10.25+incompatible"
- hash = "sha256-Nw4AAUE8RpmnSRyHckJP7EOtgLknAw/Q/yGzI0tkcUc="
+ version = "v20.10.26+incompatible"
+ hash = "sha256-vECQfJ/AVSTLsXNC4r2VVK1SoIzAiqDlxIWM+lGXqYQ="
[mod."github.com/docker/docker-credential-helpers"]
version = "v0.7.0"
hash = "sha256-Np+esoutU1psMWB0G1ayKwaWVn/XemIXxlVlooXphzg="
@@ -185,8 +185,8 @@ schema = 3
version = "v1.2.0"
hash = "sha256-XGIirpWp3lFLaBK5lHLVnNMwkVGCnnyt7Pqranb4amQ="
[mod."github.com/hashicorp/go-retryablehttp"]
- version = "v0.7.2"
- hash = "sha256-PcLyolWF7G409rs7j3tnwgQK6xhgWYk9/iK2bO13TGQ="
+ version = "v0.7.4"
+ hash = "sha256-/Gz+M2TPdVW+9zL+Oh1oC8kLrla2Uvl1S16SMH4qYRw="
[mod."github.com/hashicorp/go-version"]
version = "v1.5.0"
hash = "sha256-nrV59GgQHrZ0i/pyighGahr0Or/x3jNeyS/TD67HCf4="
@@ -224,8 +224,8 @@ schema = 3
version = "v0.7.7"
hash = "sha256-NVCz8MURpxgOjHXqxOZExqV4bnpHggpeAOyZDArjcy4="
[mod."github.com/mattn/go-colorable"]
- version = "v0.1.12"
- hash = "sha256-Y1vCt0ShrCz4wSmwsppCfeLPLKrWusc2zM2lUFwDMyI="
+ version = "v0.1.13"
+ hash = "sha256-qb3Qbo0CELGRIzvw7NVM1g/aayaz4Tguppk9MD2/OI8="
[mod."github.com/mattn/go-isatty"]
version = "v0.0.19"
hash = "sha256-wYQqGxeqV3Elkmn26Md8mKZ/viw598R4Ych3vtt72YE="
@@ -245,8 +245,8 @@ schema = 3
version = "v1.1.55"
hash = "sha256-Jbii9veDSpqF7yIkdrzb/bEUM3wZG41mNEAYV3VEAJo="
[mod."github.com/moby/moby"]
- version = "v20.10.25+incompatible"
- hash = "sha256-Nw4AAUE8RpmnSRyHckJP7EOtgLknAw/Q/yGzI0tkcUc="
+ version = "v20.10.26+incompatible"
+ hash = "sha256-vECQfJ/AVSTLsXNC4r2VVK1SoIzAiqDlxIWM+lGXqYQ="
[mod."github.com/moby/term"]
version = "v0.5.0"
hash = "sha256-jy0kbkeUsr0KoiE33WLxNAgYXZIERKR2O5+saXBwdD8="
@@ -284,23 +284,23 @@ schema = 3
version = "v1.0.0"
hash = "sha256-/FtmHnaGjdvEIKAJtrUfEhV7EVo5A/eYrtdnUkuxLDA="
[mod."github.com/prometheus/client_golang"]
- version = "v1.16.0"
- hash = "sha256-P/b4/8m1ztF0fCLSJ+eRXN74Bncx2vjOJx7nFl2QEg4="
+ version = "v1.17.0"
+ hash = "sha256-FIIzCuNqHdVzpbyH7yAp7Tcu+1tPxEMS5g6KfsGQBGE="
[mod."github.com/prometheus/client_model"]
- version = "v0.3.0"
- hash = "sha256-vP+miJfsoK5UG9eug8z/bhAMj3bwg66T2vIh8WHoOKU="
+ version = "v0.4.1-0.20230718164431-9a2bf3000d16"
+ hash = "sha256-t9LgImRW4h0XMSxfAazrGHqyDljDyl0YC5r9cYuXcKc="
[mod."github.com/prometheus/common"]
- version = "v0.42.0"
- hash = "sha256-dJqoPZKtY2umWFWwMeRYY9I2JaFlpcMX4atkEcN5+hs="
+ version = "v0.44.0"
+ hash = "sha256-8n3gSWKDSJtGfOQgxsiCGyTnUjb5hvSxJi/hPcrE5Oo="
[mod."github.com/prometheus/procfs"]
- version = "v0.10.1"
- hash = "sha256-EJ8q8wux4964WE4X7UkHb+MXjLhX4TROJaoLIQvD/eQ="
+ version = "v0.11.1"
+ hash = "sha256-yphZ7NZtYC/tb0HVag2T58SuN64Ial9sBo/TdCEQx6Q="
[mod."github.com/robfig/cron"]
version = "v1.2.0"
hash = "sha256-au+MD6DEjpVRAjXWmmJbZRB5IdFfcIqGm6kBkkYNY1s="
[mod."github.com/rs/zerolog"]
- version = "v1.30.0"
- hash = "sha256-fOJEpuiJmsp9ONqvmPGOyoBEDfJHBfUH8liiRCWDe1E="
+ version = "v1.31.0"
+ hash = "sha256-OF4VM+Rv6M5EAaUVD2nOzcbZLQ4b7OAMteyyTqIoU0M="
[mod."github.com/russross/blackfriday/v2"]
version = "v2.1.0"
hash = "sha256-R+84l1si8az5yDqd5CYcFrTyNZ1eSYlpXKq6nFt4OTQ="
@@ -341,8 +341,8 @@ schema = 3
version = "v2.25.7"
hash = "sha256-/OPbU0DE+xsY6Erz0a3kmzjJPRAXH75FuevmvsaQtw8="
[mod."github.com/xanzy/go-gitlab"]
- version = "v0.91.1"
- hash = "sha256-Af7n7/yL5D3XP+G+Z5bVtHoFDTHQLNHR6N35WGVF8iI="
+ version = "v0.92.3"
+ hash = "sha256-egVSH5WCsGFJvq8SrqhzOoUDnMN0UGp3j5uIkp/RT/E="
[mod."github.com/xeipuuv/gojsonpointer"]
version = "v0.0.0-20180127040702-4e3ac2762d5f"
hash = "sha256-OEW9nOR3EeMzvqvqpdAgowpZlbXPLWM0JT+5bwWOxo8="
@@ -404,8 +404,8 @@ schema = 3
version = "v0.13.0"
hash = "sha256-OCgLOwia8fNHxfdogXVApf0/qK6jE2ukegOx7lkOzfo="
[mod."google.golang.org/appengine"]
- version = "v1.6.7"
- hash = "sha256-zIxGRHiq4QBvRqkrhMGMGCaVL4iM4TtlYpAi/hrivS4="
+ version = "v1.6.8"
+ hash = "sha256-decMa0MiWfW/Bzr8QPPzzpeya0YWGHhZAt4Cr/bD1wQ="
[mod."google.golang.org/genproto/googleapis/rpc"]
version = "v0.0.0-20230711160842-782d3b101e98"
hash = "sha256-VtrLmOh1SLOKKLRmKc/NKR6NR/9DSR4RSq+OXnwmgHY="
diff --git a/ci/woodpecker/source.json b/ci/woodpecker/source.json
index b97f172..a0c92eb 100644
--- a/ci/woodpecker/source.json
+++ b/ci/woodpecker/source.json
@@ -1,10 +1,10 @@
{
"url": "https://github.com/woodpecker-ci/woodpecker",
- "rev": "936f1512d02cbae2e7e628cac1dcd8035ad0767b",
- "date": "2023-09-26T00:03:37+02:00",
- "path": "/nix/store/nkyrjj3ps78vq51w9piad5a8kkp6nf74-woodpecker",
- "sha256": "1gn89yz788spkhdi6y8pskxncq25fh070375kp4ddp560x0mxpp9",
- "hash": "sha256-6d5eQQem3NbIneUMcAB0RWBm+9QXeRMbnFcjdL5PyL4=",
+ "rev": "64951d6a9ec82805f686cbfe2b0e978965a67d26",
+ "date": "2023-09-30T09:23:11+02:00",
+ "path": "/nix/store/dj6jm69ilb4qn86h0mk14a8jh1r0zphs-woodpecker",
+ "sha256": "0ngcjj0va64638215n0n2hjhf17f58gblm4asg4qhwb3xmw61vim",
+ "hash": "sha256-Ne5geO1jcYjJ04pUuh4q7gQHJRQW2BIEGoYYtYGU7Fk=",
"fetchLFS": false,
"fetchSubmodules": false,
"deepClone": false,
diff --git a/ci/woodpecker/yarn.lock b/ci/woodpecker/yarn.lock
index 6267709..29c366e 100644
--- a/ci/woodpecker/yarn.lock
+++ b/ci/woodpecker/yarn.lock
@@ -325,9 +325,9 @@
eslint-visitor-keys "^3.3.0"
"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1":
- version "4.8.2"
- resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.2.tgz#26585b7c0ba36362893d3a3c206ee0c57c389616"
- integrity sha512-0MGxAVt1m/ZK+LTJp/j0qF7Hz97D9O/FH9Ms3ltnyIdDD57cbb1ACIQTkbHvNXtWDv5TPq7w5Kq56+cNukbo7g==
+ version "4.9.0"
+ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.0.tgz#7ccb5f58703fa61ffdcbf39e2c604a109e781162"
+ integrity sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==
"@eslint/eslintrc@^2.1.2":
version "2.1.2"
@@ -369,9 +369,9 @@
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
"@iconify/json@^2.2.85":
- version "2.2.120"
- resolved "https://registry.yarnpkg.com/@iconify/json/-/json-2.2.120.tgz#fb2d2bb1b4267236d781cd00d81afcca91fdb0b2"
- integrity sha512-vxE3fNGgQEEu2nvMuR/g4Cu/CxPpQWjc3cwsk/KY3iTN4hLKL0lnBsi1GmQL1ITSsyib2f72h329j+D9S9esbg==
+ version "2.2.122"
+ resolved "https://registry.yarnpkg.com/@iconify/json/-/json-2.2.122.tgz#223771de251ad7e8808fc69eaf0cae84d41955c2"
+ integrity sha512-hVMVyLska1jAhoNSLdL/WVuMPCOYafwIpsNYoyboCHEZ2TNu6qoWbV4wVY1LU6R7anwWJ7kn1gXNklxqS7eb6g==
dependencies:
"@iconify/types" "*"
pathe "^1.1.0"
@@ -382,9 +382,9 @@
integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==
"@iconify/utils@^2.1.9":
- version "2.1.10"
- resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.1.10.tgz#b6a565c61a03cf6c131bef745150046e08d4bac3"
- integrity sha512-0/+5hxjzCZ9RoYpqxnOzbnpQyMdZRuHcMxPJeuX+x/aZkAAD/N4TajDjAPT7LpX+M0bfLExj/p0bbDkUfp0lrg==
+ version "2.1.11"
+ resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.1.11.tgz#15cf9e15dfeb8e6dd79181dc3994dc1115d042e5"
+ integrity sha512-M/w3PkN8zQYXi8N6qK/KhnYMfEbbb6Sk8RZVn8g+Pmmu5ybw177RpsaGwpziyHeUsu4etrexYSWq3rwnIqzYCg==
dependencies:
"@antfu/install-pkg" "^0.1.1"
"@antfu/utils" "^0.7.5"
@@ -393,10 +393,10 @@
kolorist "^1.8.0"
local-pkg "^0.4.3"
-"@intlify/bundle-utils@^7.3.0":
- version "7.3.0"
- resolved "https://registry.yarnpkg.com/@intlify/bundle-utils/-/bundle-utils-7.3.0.tgz#11048e8aeede313f7492cefcf412359bd31eed76"
- integrity sha512-lcnfsLA5Dyd3TbvfoLS0ejLr1vAJYyT6VRYtE4LGNexy1ZD/GEcbXrC33fI9oQp7t2hDlHbCn2o4BBVgXaJFqg==
+"@intlify/bundle-utils@^7.4.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@intlify/bundle-utils/-/bundle-utils-7.4.0.tgz#b4dc41026d2d98d2e8a2bd83851c1883a48f1254"
+ integrity sha512-AQfjBe2HUxzyN8ignIk3WhhSuVcSuirgzOzkd17nb337rCbI4Gv/t1R60UUyIqFoFdviLb/wLcDUzTD/xXjv9w==
dependencies:
"@intlify/message-compiler" "^9.4.0"
"@intlify/shared" "^9.4.0"
@@ -409,33 +409,33 @@
source-map-js "^1.0.1"
yaml-eslint-parser "^1.2.2"
-"@intlify/core-base@9.4.1":
- version "9.4.1"
- resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.4.1.tgz#5ab9b624a34af2299a9b45aa331b6516c169b8b5"
- integrity sha512-WIwx+elsZbxSMxRG5+LC+utRohFvmZMoDevfKOfnYMLbpCjCSavqTfHJAtfsY6ruowzqXeKkeLhRHbYbjoJx5g==
+"@intlify/core-base@9.5.0":
+ version "9.5.0"
+ resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.5.0.tgz#cbb17a27029ccfd0a83a837931baee08b887af60"
+ integrity sha512-y3ufM1RJbI/DSmJf3lYs9ACq3S/iRvaSsE3rPIk0MGH7fp+JxU6rdryv/EYcwfcr3Y1aHFlCBir6S391hRZ57w==
dependencies:
- "@intlify/message-compiler" "9.4.1"
- "@intlify/shared" "9.4.1"
+ "@intlify/message-compiler" "9.5.0"
+ "@intlify/shared" "9.5.0"
-"@intlify/message-compiler@9.4.1", "@intlify/message-compiler@^9.4.0":
- version "9.4.1"
- resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-9.4.1.tgz#aa00629a455e23cece3464293834a02994b4fb04"
- integrity sha512-aN2N+dUx320108QhH51Ycd2LEpZ+NKbzyQ2kjjhqMcxhHdxtOnkgdx+MDBhOy/CObwBmhC3Nygzc6hNlfKvPNw==
+"@intlify/message-compiler@9.5.0", "@intlify/message-compiler@^9.4.0":
+ version "9.5.0"
+ resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-9.5.0.tgz#1b4916bf11ca7024f9c15be0d6b4de7be5317808"
+ integrity sha512-CAhVNfEZcOVFg0/5MNyt+OFjvs4J/ARjCj2b+54/FvFP0EDJI5lIqMTSDBE7k0atMROSP0SvWCkwu/AZ5xkK1g==
dependencies:
- "@intlify/shared" "9.4.1"
+ "@intlify/shared" "9.5.0"
source-map-js "^1.0.2"
-"@intlify/shared@9.4.1", "@intlify/shared@^9.4.0":
- version "9.4.1"
- resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.4.1.tgz#bd0d221aaac476b6778a10ddcd0472f812c64e27"
- integrity sha512-A51elBmZWf1FS80inf/32diO9DeXoqg9GR9aUDHFcfHoNDuT46Q+fpPOdj8jiJnSHSBh8E1E+6qWRhAZXdK3Ng==
+"@intlify/shared@9.5.0", "@intlify/shared@^9.4.0":
+ version "9.5.0"
+ resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.5.0.tgz#185d9ab9f6b4bb4f4d133cfdd51432e9b94c2c44"
+ integrity sha512-tAxV14LMXZDZbu32XzLMTsowNlgJNmLwWHYzvMUl6L8gvQeoYiZONjY7AUsqZW8TOZDX9lfvF6adPkk9FSRdDA==
"@intlify/unplugin-vue-i18n@^1.0.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-1.2.0.tgz#ca4ac742140f1eaf4668c9530db5db23069eb604"
- integrity sha512-AzjlMZKj9DG10ICDR2VWjfJudHJ1XK2GNSHxw+VmOUYpUm4S0L/a7OAdvgnuY7S4plk1VnPdT4YilpZk+uQcqg==
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-1.4.0.tgz#581ac40567240209ed0851e27bfc7c9487cf55ec"
+ integrity sha512-RGDchCRBlDTyVVFgPA1C1XC1uD4xYN81Ma+3EnU6GQ8pBEreraX/PWdPXXzOB6k9GWCQHuqii3atYXhcH3rpSg==
dependencies:
- "@intlify/bundle-utils" "^7.3.0"
+ "@intlify/bundle-utils" "^7.4.0"
"@intlify/shared" "^9.4.0"
"@rollup/pluginutils" "^5.0.2"
"@vue/compiler-sfc" "^3.2.47"
@@ -573,9 +573,9 @@
integrity sha512-PfF1qL/9veo8BSHLV84C9ORNr3lHSlnWJ6yU8OdNufoftajeWHTLVbGHvp2B7e7DPDS9gMs6cfeSsqo5rqSitg==
"@types/node@^18.16.19":
- version "18.18.0"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.0.tgz#bd19d5133a6e5e2d0152ec079ac27c120e7f1763"
- integrity sha512-3xA4X31gHT1F1l38ATDIL9GpRLdwVhnEFC8Uikv5ZLlXATwrCYyPq7ZWHxzxc3J/30SUiwiYT+bQe0/XvKlWbw==
+ version "18.18.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.1.tgz#80b22f3df719f15c9736207980e95f35d01ec1aa"
+ integrity sha512-3G42sxmm0fF2+Vtb9TJQpnjmP+uKlWvFa8KoEGquh4gqRmoUG/N0ufuhikw6HEsdG2G2oIKhog1GCTfz9v5NdQ==
"@types/prismjs@^1.26.0":
version "1.26.1"
@@ -1063,12 +1063,12 @@ braces@^3.0.2, braces@~3.0.2:
fill-range "^7.0.1"
browserslist@^4.21.9:
- version "4.21.11"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.11.tgz#35f74a3e51adc4d193dcd76ea13858de7b8fecb8"
- integrity sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619"
+ integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==
dependencies:
- caniuse-lite "^1.0.30001538"
- electron-to-chromium "^1.4.526"
+ caniuse-lite "^1.0.30001541"
+ electron-to-chromium "^1.4.535"
node-releases "^2.0.13"
update-browserslist-db "^1.0.13"
@@ -1092,10 +1092,10 @@ callsites@^3.0.0:
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
-caniuse-lite@^1.0.30001538:
- version "1.0.30001539"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz#325a387ab1ed236df2c12dc6cd43a4fff9903a44"
- integrity sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==
+caniuse-lite@^1.0.30001541:
+ version "1.0.30001541"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001541.tgz#b1aef0fadd87fb72db4dcb55d220eae17b81cdb1"
+ integrity sha512-bLOsqxDgTqUBkzxbNlSBt8annkDpQB9NdzdTbO2ooJ+eC/IQcvDspDc058g84ejCelF7vHUx57KIOjEecOHXaw==
chalk@^2.4.2:
version "2.4.2"
@@ -1371,10 +1371,10 @@ domutils@^3.0.1:
domelementtype "^2.3.0"
domhandler "^5.0.3"
-electron-to-chromium@^1.4.526:
- version "1.4.529"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.529.tgz#8c3377a05e5737f899770d14524dd8e2e4cb2351"
- integrity sha512-6uyPyXTo8lkv8SWAmjKFbG42U073TXlzD4R8rW3EzuznhFS2olCIAfjjQtV2dV2ar/vRF55KUd3zQYnCB0dd3A==
+electron-to-chromium@^1.4.535:
+ version "1.4.537"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.537.tgz#aac4101db53066be1e49baedd000a26bc754adc9"
+ integrity sha512-W1+g9qs9hviII0HAwOdehGYkr+zt7KKdmCcJcjH0mYg6oL8+ioT3Skjmt7BLoAQqXhjf40AXd+HlR4oAWMlXjA==
emojilib@^2.4.0:
version "2.4.0"
@@ -2379,9 +2379,9 @@ lru-cache@^6.0.0:
yallist "^4.0.0"
magic-string@^0.30.0, magic-string@^0.30.1:
- version "0.30.3"
- resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.3.tgz#403755dfd9d6b398dfa40635d52e96c5ac095b85"
- integrity sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==
+ version "0.30.4"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.4.tgz#c2c683265fc18dda49b56fc7318d33ca0332c98c"
+ integrity sha512-Q/TKtsC5BPm0kGqgBIF9oXAs/xEf2vRKiIB4wCRQTJOQIByZ1d+NnUOotvJOvNpi5RNIgVOMC3pOuaP1ZTDlVg==
dependencies:
"@jridgewell/sourcemap-codec" "^1.4.15"
@@ -2707,9 +2707,9 @@ postcss-safe-parser@^6.0.0:
integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==
postcss-scss@^4.0.3:
- version "4.0.8"
- resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.8.tgz#12a4991a902a782d4e9b86b1f217d5181c6c4f32"
- integrity sha512-Cr0X8Eu7xMhE96PJck6ses/uVVXDtE5ghUTKNUYgm8ozgP2TkgV3LWs3WgLV1xaSSLq8ZFiXaUrj0LVgG1fGEA==
+ version "4.0.9"
+ resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.9.tgz#a03c773cd4c9623cb04ce142a52afcec74806685"
+ integrity sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==
postcss-selector-parser@^6.0.13, postcss-selector-parser@^6.0.9:
version "6.0.13"
@@ -2731,9 +2731,9 @@ postcss-styl@^0.12.0:
stylus "^0.57.0"
"postcss@^7.0.27 || ^8.0.0", postcss@^8.1.10, postcss@^8.4.27, postcss@^8.4.6:
- version "8.4.30"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.30.tgz#0e0648d551a606ef2192a26da4cabafcc09c1aa7"
- integrity sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==
+ version "8.4.31"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d"
+ integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
dependencies:
nanoid "^3.3.6"
picocolors "^1.0.0"
@@ -2819,9 +2819,9 @@ rimraf@^3.0.2:
glob "^7.1.3"
rollup@^3.27.1:
- version "3.29.3"
- resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.3.tgz#97769774ccaa6a3059083d4680fcabd8ead01289"
- integrity sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==
+ version "3.29.4"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981"
+ integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==
optionalDependencies:
fsevents "~2.3.2"
@@ -3159,9 +3159,9 @@ typescript@5.2.2:
integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
ufo@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.3.0.tgz#c92f8ac209daff607c57bbd75029e190930a0019"
- integrity sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.3.1.tgz#e085842f4627c41d4c1b60ebea1f75cdab4ce86b"
+ integrity sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==
unbox-primitive@^1.0.2:
version "1.0.2"
@@ -3298,12 +3298,12 @@ vue-eslint-parser@^9.3.1:
semver "^7.3.6"
vue-i18n@^9.2.2:
- version "9.4.1"
- resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-9.4.1.tgz#c7402662fe9b40b17798afffa9d8bfa4734dd7f5"
- integrity sha512-vnQyYE9LBuNOqPpETIcCaGnAyLEqfeIvDcyZ9T+WBCWFTqWw1J8FuF1jfeDwpHBi5JKgAwgXyq1mt8jp/x/GPA==
+ version "9.5.0"
+ resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-9.5.0.tgz#361a820f591f6d9689435a42763fd1dae224833b"
+ integrity sha512-NiI3Ph1qMstNf7uhYh8trQBOBFLxeJgcOxBq51pCcZ28Vs18Y7BDS58r8HGDKCYgXdLUYqPDXdKatIF4bvBVZg==
dependencies:
- "@intlify/core-base" "9.4.1"
- "@intlify/shared" "9.4.1"
+ "@intlify/core-base" "9.5.0"
+ "@intlify/shared" "9.5.0"
"@vue/devtools-api" "^6.5.0"
vue-router@^4.2.2:
diff --git a/ci/woodpecker/yarn.nix b/ci/woodpecker/yarn.nix
index 617721b..157e634 100644
--- a/ci/woodpecker/yarn.nix
+++ b/ci/woodpecker/yarn.nix
@@ -392,11 +392,11 @@
};
}
{
- name = "_eslint_community_regexpp___regexpp_4.8.2.tgz";
+ name = "_eslint_community_regexpp___regexpp_4.9.0.tgz";
path = fetchurl {
- name = "_eslint_community_regexpp___regexpp_4.8.2.tgz";
- url = "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.2.tgz";
- sha512 = "0MGxAVt1m/ZK+LTJp/j0qF7Hz97D9O/FH9Ms3ltnyIdDD57cbb1ACIQTkbHvNXtWDv5TPq7w5Kq56+cNukbo7g==";
+ name = "_eslint_community_regexpp___regexpp_4.9.0.tgz";
+ url = "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.0.tgz";
+ sha512 = "zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==";
};
}
{
@@ -440,11 +440,11 @@
};
}
{
- name = "_iconify_json___json_2.2.120.tgz";
+ name = "_iconify_json___json_2.2.122.tgz";
path = fetchurl {
- name = "_iconify_json___json_2.2.120.tgz";
- url = "https://registry.yarnpkg.com/@iconify/json/-/json-2.2.120.tgz";
- sha512 = "vxE3fNGgQEEu2nvMuR/g4Cu/CxPpQWjc3cwsk/KY3iTN4hLKL0lnBsi1GmQL1ITSsyib2f72h329j+D9S9esbg==";
+ name = "_iconify_json___json_2.2.122.tgz";
+ url = "https://registry.yarnpkg.com/@iconify/json/-/json-2.2.122.tgz";
+ sha512 = "hVMVyLska1jAhoNSLdL/WVuMPCOYafwIpsNYoyboCHEZ2TNu6qoWbV4wVY1LU6R7anwWJ7kn1gXNklxqS7eb6g==";
};
}
{
@@ -456,51 +456,51 @@
};
}
{
- name = "_iconify_utils___utils_2.1.10.tgz";
+ name = "_iconify_utils___utils_2.1.11.tgz";
path = fetchurl {
- name = "_iconify_utils___utils_2.1.10.tgz";
- url = "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.1.10.tgz";
- sha512 = "0/+5hxjzCZ9RoYpqxnOzbnpQyMdZRuHcMxPJeuX+x/aZkAAD/N4TajDjAPT7LpX+M0bfLExj/p0bbDkUfp0lrg==";
+ name = "_iconify_utils___utils_2.1.11.tgz";
+ url = "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.1.11.tgz";
+ sha512 = "M/w3PkN8zQYXi8N6qK/KhnYMfEbbb6Sk8RZVn8g+Pmmu5ybw177RpsaGwpziyHeUsu4etrexYSWq3rwnIqzYCg==";
};
}
{
- name = "_intlify_bundle_utils___bundle_utils_7.3.0.tgz";
+ name = "_intlify_bundle_utils___bundle_utils_7.4.0.tgz";
path = fetchurl {
- name = "_intlify_bundle_utils___bundle_utils_7.3.0.tgz";
- url = "https://registry.yarnpkg.com/@intlify/bundle-utils/-/bundle-utils-7.3.0.tgz";
- sha512 = "lcnfsLA5Dyd3TbvfoLS0ejLr1vAJYyT6VRYtE4LGNexy1ZD/GEcbXrC33fI9oQp7t2hDlHbCn2o4BBVgXaJFqg==";
+ name = "_intlify_bundle_utils___bundle_utils_7.4.0.tgz";
+ url = "https://registry.yarnpkg.com/@intlify/bundle-utils/-/bundle-utils-7.4.0.tgz";
+ sha512 = "AQfjBe2HUxzyN8ignIk3WhhSuVcSuirgzOzkd17nb337rCbI4Gv/t1R60UUyIqFoFdviLb/wLcDUzTD/xXjv9w==";
};
}
{
- name = "_intlify_core_base___core_base_9.4.1.tgz";
+ name = "_intlify_core_base___core_base_9.5.0.tgz";
path = fetchurl {
- name = "_intlify_core_base___core_base_9.4.1.tgz";
- url = "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.4.1.tgz";
- sha512 = "WIwx+elsZbxSMxRG5+LC+utRohFvmZMoDevfKOfnYMLbpCjCSavqTfHJAtfsY6ruowzqXeKkeLhRHbYbjoJx5g==";
+ name = "_intlify_core_base___core_base_9.5.0.tgz";
+ url = "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.5.0.tgz";
+ sha512 = "y3ufM1RJbI/DSmJf3lYs9ACq3S/iRvaSsE3rPIk0MGH7fp+JxU6rdryv/EYcwfcr3Y1aHFlCBir6S391hRZ57w==";
};
}
{
- name = "_intlify_message_compiler___message_compiler_9.4.1.tgz";
+ name = "_intlify_message_compiler___message_compiler_9.5.0.tgz";
path = fetchurl {
- name = "_intlify_message_compiler___message_compiler_9.4.1.tgz";
- url = "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-9.4.1.tgz";
- sha512 = "aN2N+dUx320108QhH51Ycd2LEpZ+NKbzyQ2kjjhqMcxhHdxtOnkgdx+MDBhOy/CObwBmhC3Nygzc6hNlfKvPNw==";
+ name = "_intlify_message_compiler___message_compiler_9.5.0.tgz";
+ url = "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-9.5.0.tgz";
+ sha512 = "CAhVNfEZcOVFg0/5MNyt+OFjvs4J/ARjCj2b+54/FvFP0EDJI5lIqMTSDBE7k0atMROSP0SvWCkwu/AZ5xkK1g==";
};
}
{
- name = "_intlify_shared___shared_9.4.1.tgz";
+ name = "_intlify_shared___shared_9.5.0.tgz";
path = fetchurl {
- name = "_intlify_shared___shared_9.4.1.tgz";
- url = "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.4.1.tgz";
- sha512 = "A51elBmZWf1FS80inf/32diO9DeXoqg9GR9aUDHFcfHoNDuT46Q+fpPOdj8jiJnSHSBh8E1E+6qWRhAZXdK3Ng==";
+ name = "_intlify_shared___shared_9.5.0.tgz";
+ url = "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.5.0.tgz";
+ sha512 = "tAxV14LMXZDZbu32XzLMTsowNlgJNmLwWHYzvMUl6L8gvQeoYiZONjY7AUsqZW8TOZDX9lfvF6adPkk9FSRdDA==";
};
}
{
- name = "_intlify_unplugin_vue_i18n___unplugin_vue_i18n_1.2.0.tgz";
+ name = "_intlify_unplugin_vue_i18n___unplugin_vue_i18n_1.4.0.tgz";
path = fetchurl {
- name = "_intlify_unplugin_vue_i18n___unplugin_vue_i18n_1.2.0.tgz";
- url = "https://registry.yarnpkg.com/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-1.2.0.tgz";
- sha512 = "AzjlMZKj9DG10ICDR2VWjfJudHJ1XK2GNSHxw+VmOUYpUm4S0L/a7OAdvgnuY7S4plk1VnPdT4YilpZk+uQcqg==";
+ name = "_intlify_unplugin_vue_i18n___unplugin_vue_i18n_1.4.0.tgz";
+ url = "https://registry.yarnpkg.com/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-1.4.0.tgz";
+ sha512 = "RGDchCRBlDTyVVFgPA1C1XC1uD4xYN81Ma+3EnU6GQ8pBEreraX/PWdPXXzOB6k9GWCQHuqii3atYXhcH3rpSg==";
};
}
{
@@ -664,11 +664,11 @@
};
}
{
- name = "_types_node___node_18.18.0.tgz";
+ name = "_types_node___node_18.18.1.tgz";
path = fetchurl {
- name = "_types_node___node_18.18.0.tgz";
- url = "https://registry.yarnpkg.com/@types/node/-/node-18.18.0.tgz";
- sha512 = "3xA4X31gHT1F1l38ATDIL9GpRLdwVhnEFC8Uikv5ZLlXATwrCYyPq7ZWHxzxc3J/30SUiwiYT+bQe0/XvKlWbw==";
+ name = "_types_node___node_18.18.1.tgz";
+ url = "https://registry.yarnpkg.com/@types/node/-/node-18.18.1.tgz";
+ sha512 = "3G42sxmm0fF2+Vtb9TJQpnjmP+uKlWvFa8KoEGquh4gqRmoUG/N0ufuhikw6HEsdG2G2oIKhog1GCTfz9v5NdQ==";
};
}
{
@@ -1160,11 +1160,11 @@
};
}
{
- name = "browserslist___browserslist_4.21.11.tgz";
+ name = "browserslist___browserslist_4.22.1.tgz";
path = fetchurl {
- name = "browserslist___browserslist_4.21.11.tgz";
- url = "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.11.tgz";
- sha512 = "xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==";
+ name = "browserslist___browserslist_4.22.1.tgz";
+ url = "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz";
+ sha512 = "FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==";
};
}
{
@@ -1192,11 +1192,11 @@
};
}
{
- name = "caniuse_lite___caniuse_lite_1.0.30001539.tgz";
+ name = "caniuse_lite___caniuse_lite_1.0.30001541.tgz";
path = fetchurl {
- name = "caniuse_lite___caniuse_lite_1.0.30001539.tgz";
- url = "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz";
- sha512 = "hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==";
+ name = "caniuse_lite___caniuse_lite_1.0.30001541.tgz";
+ url = "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001541.tgz";
+ sha512 = "bLOsqxDgTqUBkzxbNlSBt8annkDpQB9NdzdTbO2ooJ+eC/IQcvDspDc058g84ejCelF7vHUx57KIOjEecOHXaw==";
};
}
{
@@ -1512,11 +1512,11 @@
};
}
{
- name = "electron_to_chromium___electron_to_chromium_1.4.529.tgz";
+ name = "electron_to_chromium___electron_to_chromium_1.4.537.tgz";
path = fetchurl {
- name = "electron_to_chromium___electron_to_chromium_1.4.529.tgz";
- url = "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.529.tgz";
- sha512 = "6uyPyXTo8lkv8SWAmjKFbG42U073TXlzD4R8rW3EzuznhFS2olCIAfjjQtV2dV2ar/vRF55KUd3zQYnCB0dd3A==";
+ name = "electron_to_chromium___electron_to_chromium_1.4.537.tgz";
+ url = "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.537.tgz";
+ sha512 = "W1+g9qs9hviII0HAwOdehGYkr+zt7KKdmCcJcjH0mYg6oL8+ioT3Skjmt7BLoAQqXhjf40AXd+HlR4oAWMlXjA==";
};
}
{
@@ -2592,11 +2592,11 @@
};
}
{
- name = "magic_string___magic_string_0.30.3.tgz";
+ name = "magic_string___magic_string_0.30.4.tgz";
path = fetchurl {
- name = "magic_string___magic_string_0.30.3.tgz";
- url = "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.3.tgz";
- sha512 = "B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==";
+ name = "magic_string___magic_string_0.30.4.tgz";
+ url = "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.4.tgz";
+ sha512 = "Q/TKtsC5BPm0kGqgBIF9oXAs/xEf2vRKiIB4wCRQTJOQIByZ1d+NnUOotvJOvNpi5RNIgVOMC3pOuaP1ZTDlVg==";
};
}
{
@@ -2992,11 +2992,11 @@
};
}
{
- name = "postcss_scss___postcss_scss_4.0.8.tgz";
+ name = "postcss_scss___postcss_scss_4.0.9.tgz";
path = fetchurl {
- name = "postcss_scss___postcss_scss_4.0.8.tgz";
- url = "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.8.tgz";
- sha512 = "Cr0X8Eu7xMhE96PJck6ses/uVVXDtE5ghUTKNUYgm8ozgP2TkgV3LWs3WgLV1xaSSLq8ZFiXaUrj0LVgG1fGEA==";
+ name = "postcss_scss___postcss_scss_4.0.9.tgz";
+ url = "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.9.tgz";
+ sha512 = "AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==";
};
}
{
@@ -3016,11 +3016,11 @@
};
}
{
- name = "postcss___postcss_8.4.30.tgz";
+ name = "postcss___postcss_8.4.31.tgz";
path = fetchurl {
- name = "postcss___postcss_8.4.30.tgz";
- url = "https://registry.yarnpkg.com/postcss/-/postcss-8.4.30.tgz";
- sha512 = "7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==";
+ name = "postcss___postcss_8.4.31.tgz";
+ url = "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz";
+ sha512 = "PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==";
};
}
{
@@ -3128,11 +3128,11 @@
};
}
{
- name = "rollup___rollup_3.29.3.tgz";
+ name = "rollup___rollup_3.29.4.tgz";
path = fetchurl {
- name = "rollup___rollup_3.29.3.tgz";
- url = "https://registry.yarnpkg.com/rollup/-/rollup-3.29.3.tgz";
- sha512 = "T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==";
+ name = "rollup___rollup_3.29.4.tgz";
+ url = "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz";
+ sha512 = "oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==";
};
}
{
@@ -3520,11 +3520,11 @@
};
}
{
- name = "ufo___ufo_1.3.0.tgz";
+ name = "ufo___ufo_1.3.1.tgz";
path = fetchurl {
- name = "ufo___ufo_1.3.0.tgz";
- url = "https://registry.yarnpkg.com/ufo/-/ufo-1.3.0.tgz";
- sha512 = "bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==";
+ name = "ufo___ufo_1.3.1.tgz";
+ url = "https://registry.yarnpkg.com/ufo/-/ufo-1.3.1.tgz";
+ sha512 = "uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==";
};
}
{
@@ -3648,11 +3648,11 @@
};
}
{
- name = "vue_i18n___vue_i18n_9.4.1.tgz";
+ name = "vue_i18n___vue_i18n_9.5.0.tgz";
path = fetchurl {
- name = "vue_i18n___vue_i18n_9.4.1.tgz";
- url = "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-9.4.1.tgz";
- sha512 = "vnQyYE9LBuNOqPpETIcCaGnAyLEqfeIvDcyZ9T+WBCWFTqWw1J8FuF1jfeDwpHBi5JKgAwgXyq1mt8jp/x/GPA==";
+ name = "vue_i18n___vue_i18n_9.5.0.tgz";
+ url = "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-9.5.0.tgz";
+ sha512 = "NiI3Ph1qMstNf7uhYh8trQBOBFLxeJgcOxBq51pCcZ28Vs18Y7BDS58r8HGDKCYgXdLUYqPDXdKatIF4bvBVZg==";
};
}
{
diff --git a/default.nix b/default.nix
index fc89ccd..54e0730 100644
--- a/default.nix
+++ b/default.nix
@@ -75,6 +75,7 @@ in
kubo
plover-plugin-python-dictionary
plover-plugin-stenotype-extended
+ plover-plugin-dotool-output
asar-asm
bsnes-plus
sliding-sync
diff --git a/flake.lock b/flake.lock
index 2813c74..c99872f 100644
--- a/flake.lock
+++ b/flake.lock
@@ -171,11 +171,11 @@
},
"nixpkgs_2": {
"locked": {
- "lastModified": 1695727879,
- "narHash": "sha256-xrB6RTMuO49Y5Xjr++3PAM3JFUToQwj2SK7K8PSyuok=",
+ "lastModified": 1696059936,
+ "narHash": "sha256-qKkEZMnX9QRfEnlg5T9+t0ovKtO0u9cKM+ljvuHMQus=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "a30e43fd3290aabe57db78b097af386a07e88546",
+ "rev": "bf25d8782bc6b488e06636d22dcf2dda6b1d5e3e",
"type": "github"
},
"original": {
diff --git a/flake.nix b/flake.nix
index ebfb740..d984c8a 100644
--- a/flake.nix
+++ b/flake.nix
@@ -96,6 +96,7 @@
plover-plugin-yaml-dictionary
plover-plugin-machine-hid
plover-plugin-rkb1-hid
+ plover-plugin-dotool-output
plover-dict-didoesdigital
miifox-net
old-homepage
diff --git a/matrix/matrix-media-repo/source.json b/matrix/matrix-media-repo/source.json
index 729b2bd..ee1e15b 100644
--- a/matrix/matrix-media-repo/source.json
+++ b/matrix/matrix-media-repo/source.json
@@ -1,10 +1,10 @@
{
"url": "https://github.com/turt2live/matrix-media-repo",
- "rev": "fb52f294f75d8ad64053d1b5ae6ce6d74a8e6ab2",
- "date": "2023-09-15T13:31:22-06:00",
- "path": "/nix/store/cxbn7g9zrxc460gf554vwk8gfmbny1hg-matrix-media-repo",
- "sha256": "0n046cq1drgzbjh57qcgv144jylskvchqs2gkvngykvb88pcj7c8",
- "hash": "sha256-iB3JLkJrT//snk9oDNmemnpJSNiP4VOgXP/lFjAzBFg=",
+ "rev": "07183614a9e4f69af62420a4ee7ca9785f1fae67",
+ "date": "2023-09-29T16:22:39+00:00",
+ "path": "/nix/store/56phspagz29yw81sng6nk3v1m8vb60jq-matrix-media-repo",
+ "sha256": "051jzmkkli2mkw353p3jsajibizsmhynq09isbradmy1kx8l52dr",
+ "hash": "sha256-uYlCUZ/B16by0jEBbD2s+scVpdJy3FEGn1VEOmf9MhQ=",
"fetchLFS": false,
"fetchSubmodules": false,
"deepClone": false,
diff --git a/matrix/mautrix-whatsapp/source.json b/matrix/mautrix-whatsapp/source.json
index fb0943e..505600c 100644
--- a/matrix/mautrix-whatsapp/source.json
+++ b/matrix/mautrix-whatsapp/source.json
@@ -1,10 +1,10 @@
{
"url": "https://github.com/mautrix/whatsapp",
- "rev": "77e30e85dd9bc9134ceb4d99fbc2c64bc9823769",
- "date": "2023-09-19T12:04:27-04:00",
- "path": "/nix/store/py1a4mkfscd4nibx7yhjz9ar66v5kr8i-whatsapp",
- "sha256": "1mra0rcn9xg5icvmix2vb4vsd0ljmxqnpq9w2ya9d2m2yf5mqsqr",
- "hash": "sha256-GWtci/OiipaUFzzha3GvkoKmN1lb9Fg3i+X1ZFkGKtc=",
+ "rev": "d2110f6ee715fc316e945533f7ee494177c6e90d",
+ "date": "2023-09-29T14:27:38+03:00",
+ "path": "/nix/store/jl98ir2kj33q57j7sxla0ygpsbs95pvj-whatsapp",
+ "sha256": "17yznvj14pylysd5k5glanv7vsrahmnmvv4rb65jmcx6m1z2ywrk",
+ "hash": "sha256-M3MvfqimsyqLWZnsXW2FKut9tlX0lVma9tRfEuS2358=",
"fetchLFS": false,
"fetchSubmodules": false,
"deepClone": false,
diff --git a/matrix/sliding-sync/source.json b/matrix/sliding-sync/source.json
index 0cfaf1e..27e9304 100644
--- a/matrix/sliding-sync/source.json
+++ b/matrix/sliding-sync/source.json
@@ -1,10 +1,10 @@
{
"url": "https://github.com/matrix-org/sliding-sync",
- "rev": "6fe9b18f8c357ad4c92fdb5cdf234b21c8b93937",
- "date": "2023-09-21T17:30:51+01:00",
- "path": "/nix/store/rrq1ajanr2rvyai074kilwfr14ilf3w6-sliding-sync",
- "sha256": "13qmgl50c3hq69pyk847qcdrbyzmwy27czxwyks6m0k8r0dxzw9w",
- "hash": "sha256-PPHfG8hogmr09Lx/doTn9fuVG8OHoOlvMhgOBgp9FY8=",
+ "rev": "0d110275a440945706f11e9e580e2e157fe65a2b",
+ "date": "2023-09-28T12:50:08+01:00",
+ "path": "/nix/store/8954irnip3fs5lp1g9gdbk4pr841h83n-sliding-sync",
+ "sha256": "0m866l3wjmbgdgbnwsv3129fm5gsjiw9bjz0dj0p6d961an6vii1",
+ "hash": "sha256-IcZtrAomNXOBbODLlXiU+pXqkghja27Xa29VyQc1BlU=",
"fetchLFS": false,
"fetchSubmodules": false,
"deepClone": false,
diff --git a/overlay.nix b/overlay.nix
index 7cb415a..000e4b9 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -98,6 +98,7 @@ system: self: super: let
plover-plugin-stenotype-extended = self.python3Packages.callPackage ./plover/plover-stenotype-extended.nix {};
plover-plugin-machine-hid = self.python3Packages.callPackage ./plover/plover-machine-hid.nix {};
plover-plugin-rkb1-hid = self.python3Packages.callPackage ./plover/plover-rkb1-hid.nix {};
+ plover-plugin-dotool-output = self.python3Packages.callPackage ./plover/plover-dotool-output.nix {};
plover-dict-didoesdigital = self.callPackage ./plover/didoesdigital-dictionary.nix {};
miifox-net = self.python3Packages.callPackage ./web/miifox-net.nix {};
old-homepage = self.callPackage ./web/old-homepage.nix {};
diff --git a/plover/plover-dotool-output.json b/plover/plover-dotool-output.json
new file mode 100644
index 0000000..c9c6d2c
--- /dev/null
+++ b/plover/plover-dotool-output.json
@@ -0,0 +1,12 @@
+{
+ "url": "https://github.com/darkkirb/plover-dotool-output",
+ "rev": "cb617b9271968b95011af5697dafd216153798e5",
+ "date": "2023-09-30T13:31:02+01:00",
+ "path": "/nix/store/760a20pxkc0rj30cdc1mc9blvkk1b1g5-plover-dotool-output",
+ "sha256": "0az524h9cz6x8qzxx8ybwsaf580zqibdnn6hib863fk9z9kr8nck",
+ "hash": "sha256-k1mUZ/ppumHQitBY21bEH6DilObLo94/Rt18liAR5Ss=",
+ "fetchLFS": false,
+ "fetchSubmodules": false,
+ "deepClone": false,
+ "leaveDotGit": false
+}
diff --git a/plover/plover-dotool-output.nix b/plover/plover-dotool-output.nix
new file mode 100644
index 0000000..6426347
--- /dev/null
+++ b/plover/plover-dotool-output.nix
@@ -0,0 +1,30 @@
+{
+ callPackage,
+ buildPythonPackage,
+ fetchFromGitHub,
+ lib,
+ pythonOlder,
+}: let
+ plover = callPackage ./plover {};
+ source = builtins.fromJSON (builtins.readFile ./plover-dotool-output.json);
+in
+ buildPythonPackage rec {
+ pname = "plover_dotool_output";
+ version = source.date;
+ src = fetchFromGitHub {
+ owner = "darkkirb";
+ repo = "plover-dotool-output";
+ inherit (source) rev sha256;
+ };
+
+ doCheck = false;
+
+ disabled = pythonOlder "3.6";
+ propagatedBuildInputs = [plover];
+
+ meta = with lib; {
+ description = "Plover output plugin for dotool";
+ license = licenses.mit;
+ };
+ passthru.updateScript = [../scripts/update-git.sh "https://github.com/darkkirb/plover-dotool-output" "plover/plover-dotool-output.json"];
+ }
diff --git a/plover/plover/default.nix b/plover/plover/default.nix
index 46afd38..0038d01 100644
--- a/plover/plover/default.nix
+++ b/plover/plover/default.nix
@@ -12,10 +12,9 @@
appdirs,
wcwidth,
setuptools,
- pywayland,
xkbcommon,
- wayland,
pkg-config,
+ fetchFromGitHub
}: let
source = builtins.fromJSON (builtins.readFile ./source.json);
plover-stroke = callPackage ../plover-stroke.nix {};
@@ -24,21 +23,21 @@ in
qt5.mkDerivationWith buildPythonPackage rec {
pname = "plover";
version = source.date;
- src = callPackage ./source.nix {};
+ src = fetchFromGitHub {
+ owner = "openstenoproject";
+ repo = "plover";
+ inherit (source) rev sha256;
+ };
# I'm not sure why we don't find PyQt5 here but there's a similar
# sed on many of the platforms Plover builds for
postPatch = ''
sed -i /PyQt5/d setup.cfg
- sed -i 's/pywayland==0.4.11/pywayland>=0.4.11/' reqs/constraints.txt
- substituteInPlace plover_build_utils/setup.py \
- --replace "/usr/share/wayland/wayland.xml" "${wayland}/share/wayland/wayland.xml"
'';
checkInputs = [pytest mock];
- propagatedBuildInputs = [babel pyqt5 xlib pyserial appdirs wcwidth setuptools plover-stroke rtf-tokenize pywayland xkbcommon];
+ propagatedBuildInputs = [babel pyqt5 xlib pyserial appdirs wcwidth setuptools plover-stroke rtf-tokenize xkbcommon];
nativeBuildInputs = [
- wayland
pkg-config
];
@@ -52,7 +51,7 @@ in
meta = {
homepage = "http://www.openstenoproject.org/";
- description = "Open Source Stenography Software, patched with wayland support";
+ description = "Open Source Stenography Software";
license = lib.licenses.gpl2Plus;
};
passthru.updateScript = [
diff --git a/plover/plover/source.json b/plover/plover/source.json
index 8065fff..5b8d37a 100644
--- a/plover/plover/source.json
+++ b/plover/plover/source.json
@@ -1,10 +1,10 @@
{
"url": "https://github.com/openstenoproject/plover",
- "rev": "0d75d422fade767e4f98aa2fa672f83383f726d0",
- "date": "2023-09-26T01:48:02-07:00",
- "path": "/nix/store/42f84pkbqp5b4g7lnyg27mh87p2ff5vv-plover",
- "sha256": "0cv9d3yzmg1brcbi8k7v2di3i5x0q3aghxaxsqjjbryw4khlyv7h",
- "hash": "sha256-8GxP4STc5yUl1l11+NTAoJc4YhP7TBQXyyu8+v1oaTM=",
+ "rev": "ef931650eb91afa13298c57fe926675968171cee",
+ "date": "2023-09-28T11:37:13-07:00",
+ "path": "/nix/store/gs1cz54ag8xnv9qpv35w1c1y3jzrakkh-plover",
+ "sha256": "0gias8qbbrxhabyg41vi6b7iwrmzrafrl4zgv9yy5g2vy1riwqxf",
+ "hash": "sha256-rmMec/BbvOJ92u8Tmp3Kv2YezzJxB/L8UrDntTDSKj4=",
"fetchLFS": false,
"fetchSubmodules": false,
"deepClone": false,
diff --git a/plover/plover/source.nix b/plover/plover/source.nix
deleted file mode 100644
index 7d13a3d..0000000
--- a/plover/plover/source.nix
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- fetchFromGitHub,
- applyPatches,
-}: let
- source = builtins.fromJSON (builtins.readFile ./source.json);
-in
- applyPatches {
- patches = [./wayland.patch];
- src = fetchFromGitHub {
- owner = "openstenoproject";
- repo = "plover";
- inherit (source) rev sha256;
- };
- }
diff --git a/plover/plover/wayland.patch b/plover/plover/wayland.patch
deleted file mode 100644
index 6426b74..0000000
--- a/plover/plover/wayland.patch
+++ /dev/null
@@ -1,1461 +0,0 @@
-diff --git a/MANIFEST.in b/MANIFEST.in
-index e2095bb7..87539b99 100644
---- a/MANIFEST.in
-+++ b/MANIFEST.in
-@@ -20,6 +20,7 @@ include plover/gui_qt/resources/*.qrc
- include plover/gui_qt/resources/*.svg
- include plover/messages/*/LC_MESSAGES/*.po
- include plover/messages/plover.pot
-+include plover/oslayer/wayland/*.xml
- include plover_build_utils/*.sh
- include pyproject.toml
- include pytest.ini
-@@ -34,4 +35,7 @@ exclude .gitignore
- exclude plover/gui_qt/*_rc.py
- exclude plover/gui_qt/*_ui.py
- exclude plover/gui_qt/.gitignore
-+exclude plover/oslayer/wayland/.gitignore
-+prune plover/oslayer/wayland/input_method_unstable_v2
-+prune plover/oslayer/wayland/virtual_keyboard_unstable_v1
- prune .github
-diff --git a/news.d/feature/1461.linux.md b/news.d/feature/1461.linux.md
-new file mode 100644
-index 00000000..9c04de6b
---- /dev/null
-+++ b/news.d/feature/1461.linux.md
-@@ -0,0 +1 @@
-+Add support for wlroots-based Wayland compositors like Sway, and other compositors that implement the `virtual_keyboard_unstable_v1` and `input_method_unstable_v2` protocols.
-diff --git a/plover/oslayer/linux/keyboardcontrol.py b/plover/oslayer/linux/keyboardcontrol.py
-index bb135614..ee7abd91 100644
---- a/plover/oslayer/linux/keyboardcontrol.py
-+++ b/plover/oslayer/linux/keyboardcontrol.py
-@@ -1 +1,6 @@
--from .keyboardcontrol_x11 import KeyboardCapture, KeyboardEmulation # pylint: disable=unused-import
-+import os
-+
-+if os.environ.get('WAYLAND_DISPLAY', None):
-+ from plover.oslayer.wayland.keyboardcontrol import KeyboardCapture, KeyboardEmulation # pylint: disable=unused-import
-+else:
-+ from .keyboardcontrol_x11 import KeyboardCapture, KeyboardEmulation # pylint: disable=unused-import
-diff --git a/plover/oslayer/wayland/.gitignore b/plover/oslayer/wayland/.gitignore
-new file mode 100644
-index 00000000..3a543112
---- /dev/null
-+++ b/plover/oslayer/wayland/.gitignore
-@@ -0,0 +1,2 @@
-+input_method_unstable_v2
-+virtual_keyboard_unstable_v1
-diff --git a/plover/oslayer/wayland/__init__.py b/plover/oslayer/wayland/__init__.py
-new file mode 100644
-index 00000000..e69de29b
-diff --git a/plover/oslayer/wayland/input-method-unstable-v2.xml b/plover/oslayer/wayland/input-method-unstable-v2.xml
-new file mode 100644
-index 00000000..51bccf28
---- /dev/null
-+++ b/plover/oslayer/wayland/input-method-unstable-v2.xml
-@@ -0,0 +1,494 @@
-+
-+
-+
-+
-+ Copyright © 2008-2011 Kristian Høgsberg
-+ Copyright © 2010-2011 Intel Corporation
-+ Copyright © 2012-2013 Collabora, Ltd.
-+ Copyright © 2012, 2013 Intel Corporation
-+ Copyright © 2015, 2016 Jan Arne Petersen
-+ Copyright © 2017, 2018 Red Hat, Inc.
-+ Copyright © 2018 Purism SPC
-+
-+ Permission is hereby granted, free of charge, to any person obtaining a
-+ copy of this software and associated documentation files (the "Software"),
-+ to deal in the Software without restriction, including without limitation
-+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ and/or sell copies of the Software, and to permit persons to whom the
-+ Software is furnished to do so, subject to the following conditions:
-+
-+ The above copyright notice and this permission notice (including the next
-+ paragraph) shall be included in all copies or substantial portions of the
-+ Software.
-+
-+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ DEALINGS IN THE SOFTWARE.
-+
-+
-+
-+ This protocol allows applications to act as input methods for compositors.
-+
-+ An input method context is used to manage the state of the input method.
-+
-+ Text strings are UTF-8 encoded, their indices and lengths are in bytes.
-+
-+ This document adheres to the RFC 2119 when using words like "must",
-+ "should", "may", etc.
-+
-+ Warning! The protocol described in this file is experimental and
-+ backward incompatible changes may be made. Backward compatible changes
-+ may be added together with the corresponding interface version bump.
-+ Backward incompatible changes are done by bumping the version number in
-+ the protocol and interface names and resetting the interface version.
-+ Once the protocol is to be declared stable, the 'z' prefix and the
-+ version number in the protocol and interface names are removed and the
-+ interface version number is reset.
-+
-+
-+
-+
-+ An input method object allows for clients to compose text.
-+
-+ The objects connects the client to a text input in an application, and
-+ lets the client to serve as an input method for a seat.
-+
-+ The zwp_input_method_v2 object can occupy two distinct states: active and
-+ inactive. In the active state, the object is associated to and
-+ communicates with a text input. In the inactive state, there is no
-+ associated text input, and the only communication is with the compositor.
-+ Initially, the input method is in the inactive state.
-+
-+ Requests issued in the inactive state must be accepted by the compositor.
-+ Because of the serial mechanism, and the state reset on activate event,
-+ they will not have any effect on the state of the next text input.
-+
-+ There must be no more than one input method object per seat.
-+
-+
-+
-+
-+
-+
-+
-+
-+ Notification that a text input focused on this seat requested the input
-+ method to be activated.
-+
-+ This event serves the purpose of providing the compositor with an
-+ active input method.
-+
-+ This event resets all state associated with previous enable, disable,
-+ surrounding_text, text_change_cause, and content_type events, as well
-+ as the state associated with set_preedit_string, commit_string, and
-+ delete_surrounding_text requests. In addition, it marks the
-+ zwp_input_method_v2 object as active, and makes any existing
-+ zwp_input_popup_surface_v2 objects visible.
-+
-+ The surrounding_text, and content_type events must follow before the
-+ next done event if the text input supports the respective
-+ functionality.
-+
-+ State set with this event is double-buffered. It will get applied on
-+ the next zwp_input_method_v2.done event, and stay valid until changed.
-+
-+
-+
-+
-+
-+ Notification that no focused text input currently needs an active
-+ input method on this seat.
-+
-+ This event marks the zwp_input_method_v2 object as inactive. The
-+ compositor must make all existing zwp_input_popup_surface_v2 objects
-+ invisible until the next activate event.
-+
-+ State set with this event is double-buffered. It will get applied on
-+ the next zwp_input_method_v2.done event, and stay valid until changed.
-+
-+
-+
-+
-+
-+ Updates the surrounding plain text around the cursor, excluding the
-+ preedit text.
-+
-+ If any preedit text is present, it is replaced with the cursor for the
-+ purpose of this event.
-+
-+ The argument text is a buffer containing the preedit string, and must
-+ include the cursor position, and the complete selection. It should
-+ contain additional characters before and after these. There is a
-+ maximum length of wayland messages, so text can not be longer than 4000
-+ bytes.
-+
-+ cursor is the byte offset of the cursor within the text buffer.
-+
-+ anchor is the byte offset of the selection anchor within the text
-+ buffer. If there is no selected text, anchor must be the same as
-+ cursor.
-+
-+ If this event does not arrive before the first done event, the input
-+ method may assume that the text input does not support this
-+ functionality and ignore following surrounding_text events.
-+
-+ Values set with this event are double-buffered. They will get applied
-+ and set to initial values on the next zwp_input_method_v2.done
-+ event.
-+
-+ The initial state for affected fields is empty, meaning that the text
-+ input does not support sending surrounding text. If the empty values
-+ get applied, subsequent attempts to change them may have no effect.
-+
-+
-+
-+
-+
-+
-+
-+
-+ Tells the input method why the text surrounding the cursor changed.
-+
-+ Whenever the client detects an external change in text, cursor, or
-+ anchor position, it must issue this request to the compositor. This
-+ request is intended to give the input method a chance to update the
-+ preedit text in an appropriate way, e.g. by removing it when the user
-+ starts typing with a keyboard.
-+
-+ cause describes the source of the change.
-+
-+ The value set with this event is double-buffered. It will get applied
-+ and set to its initial value on the next zwp_input_method_v2.done
-+ event.
-+
-+ The initial value of cause is input_method.
-+
-+
-+
-+
-+
-+
-+ Indicates the content type and hint for the current
-+ zwp_input_method_v2 instance.
-+
-+ Values set with this event are double-buffered. They will get applied
-+ on the next zwp_input_method_v2.done event.
-+
-+ The initial value for hint is none, and the initial value for purpose
-+ is normal.
-+
-+
-+
-+
-+
-+
-+
-+ Atomically applies state changes recently sent to the client.
-+
-+ The done event establishes and updates the state of the client, and
-+ must be issued after any changes to apply them.
-+
-+ Text input state (content purpose, content hint, surrounding text, and
-+ change cause) is conceptually double-buffered within an input method
-+ context.
-+
-+ Events modify the pending state, as opposed to the current state in use
-+ by the input method. A done event atomically applies all pending state,
-+ replacing the current state. After done, the new pending state is as
-+ documented for each related request.
-+
-+ Events must be applied in the order of arrival.
-+
-+ Neither current nor pending state are modified unless noted otherwise.
-+
-+
-+
-+
-+
-+ Send the commit string text for insertion to the application.
-+
-+ Inserts a string at current cursor position (see commit event
-+ sequence). The string to commit could be either just a single character
-+ after a key press or the result of some composing.
-+
-+ The argument text is a buffer containing the string to insert. There is
-+ a maximum length of wayland messages, so text can not be longer than
-+ 4000 bytes.
-+
-+ Values set with this event are double-buffered. They must be applied
-+ and reset to initial on the next zwp_text_input_v3.commit request.
-+
-+ The initial value of text is an empty string.
-+
-+
-+
-+
-+
-+
-+ Send the pre-edit string text to the application text input.
-+
-+ Place a new composing text (pre-edit) at the current cursor position.
-+ Any previously set composing text must be removed. Any previously
-+ existing selected text must be removed. The cursor is moved to a new
-+ position within the preedit string.
-+
-+ The argument text is a buffer containing the preedit string. There is
-+ a maximum length of wayland messages, so text can not be longer than
-+ 4000 bytes.
-+
-+ The arguments cursor_begin and cursor_end are counted in bytes relative
-+ to the beginning of the submitted string buffer. Cursor should be
-+ hidden by the text input when both are equal to -1.
-+
-+ cursor_begin indicates the beginning of the cursor. cursor_end
-+ indicates the end of the cursor. It may be equal or different than
-+ cursor_begin.
-+
-+ Values set with this event are double-buffered. They must be applied on
-+ the next zwp_input_method_v2.commit event.
-+
-+ The initial value of text is an empty string. The initial value of
-+ cursor_begin, and cursor_end are both 0.
-+
-+
-+
-+
-+
-+
-+
-+
-+ Remove the surrounding text.
-+
-+ before_length and after_length are the number of bytes before and after
-+ the current cursor index (excluding the preedit text) to delete.
-+
-+ If any preedit text is present, it is replaced with the cursor for the
-+ purpose of this event. In effect before_length is counted from the
-+ beginning of preedit text, and after_length from its end (see commit
-+ event sequence).
-+
-+ Values set with this event are double-buffered. They must be applied
-+ and reset to initial on the next zwp_input_method_v2.commit request.
-+
-+ The initial values of both before_length and after_length are 0.
-+
-+
-+
-+
-+
-+
-+
-+ Apply state changes from commit_string, set_preedit_string and
-+ delete_surrounding_text requests.
-+
-+ The state relating to these events is double-buffered, and each one
-+ modifies the pending state. This request replaces the current state
-+ with the pending state.
-+
-+ The connected text input is expected to proceed by evaluating the
-+ changes in the following order:
-+
-+ 1. Replace existing preedit string with the cursor.
-+ 2. Delete requested surrounding text.
-+ 3. Insert commit string with the cursor at its end.
-+ 4. Calculate surrounding text to send.
-+ 5. Insert new preedit text in cursor position.
-+ 6. Place cursor inside preedit text.
-+
-+ The serial number reflects the last state of the zwp_input_method_v2
-+ object known to the client. The value of the serial argument must be
-+ equal to the number of done events already issued by that object. When
-+ the compositor receives a commit request with a serial different than
-+ the number of past done events, it must proceed as normal, except it
-+ should not change the current state of the zwp_input_method_v2 object.
-+
-+
-+
-+
-+
-+
-+ Creates a new zwp_input_popup_surface_v2 object wrapping a given
-+ surface.
-+
-+ The surface gets assigned the "input_popup" role. If the surface
-+ already has an assigned role, the compositor must issue a protocol
-+ error.
-+
-+
-+
-+
-+
-+
-+
-+ Allow an input method to receive hardware keyboard input and process
-+ key events to generate text events (with pre-edit) over the wire. This
-+ allows input methods which compose multiple key events for inputting
-+ text like it is done for CJK languages.
-+
-+ The compositor should send all keyboard events on the seat to the grab
-+ holder via the returned wl_keyboard object. Nevertheless, the
-+ compositor may decide not to forward any particular event. The
-+ compositor must not further process any event after it has been
-+ forwarded to the grab holder.
-+
-+ Releasing the resulting wl_keyboard object releases the grab.
-+
-+
-+
-+
-+
-+
-+ The input method ceased to be available.
-+
-+ The compositor must issue this event as the only event on the object if
-+ there was another input_method object associated with the same seat at
-+ the time of its creation.
-+
-+ The compositor must issue this request when the object is no longer
-+ usable, e.g. due to seat removal.
-+
-+ The input method context becomes inert and should be destroyed after
-+ deactivation is handled. Any further requests and events except for the
-+ destroy request must be ignored.
-+
-+
-+
-+
-+
-+ Destroys the zwp_text_input_v2 object and any associated child
-+ objects, i.e. zwp_input_popup_surface_v2 and
-+ zwp_input_method_keyboard_grab_v2.
-+
-+
-+
-+
-+
-+
-+ This interface marks a surface as a popup for interacting with an input
-+ method.
-+
-+ The compositor should place it near the active text input area. It must
-+ be visible if and only if the input method is in the active state.
-+
-+ The client must not destroy the underlying wl_surface while the
-+ zwp_input_popup_surface_v2 object exists.
-+
-+
-+
-+
-+ Notify about the position of the area of the text input expressed as a
-+ rectangle in surface local coordinates.
-+
-+ This is a hint to the input method telling it the relative position of
-+ the text being entered.
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+ The zwp_input_method_keyboard_grab_v2 interface represents an exclusive
-+ grab of the wl_keyboard interface associated with the seat.
-+
-+
-+
-+
-+ This event provides a file descriptor to the client which can be
-+ memory-mapped to provide a keyboard mapping description.
-+
-+
-+
-+
-+
-+
-+
-+
-+ A key was pressed or released.
-+ The time argument is a timestamp with millisecond granularity, with an
-+ undefined base.
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+ Notifies clients that the modifier and/or group state has changed, and
-+ it should update its local state.
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+ Informs the client about the keyboard's repeat rate and delay.
-+
-+ This event is sent as soon as the zwp_input_method_keyboard_grab_v2
-+ object has been created, and is guaranteed to be received by the
-+ client before any key press event.
-+
-+ Negative values for either rate or delay are illegal. A rate of zero
-+ will disable any repeating (regardless of the value of delay).
-+
-+ This event can be sent later on as well with a new value if necessary,
-+ so clients should continue listening for the event past the creation
-+ of zwp_input_method_keyboard_grab_v2.
-+
-+
-+
-+
-+
-+
-+
-+
-+ The input method manager allows the client to become the input method on
-+ a chosen seat.
-+
-+ No more than one input method must be associated with any seat at any
-+ given time.
-+
-+
-+
-+
-+ Request a new input zwp_input_method_v2 object associated with a given
-+ seat.
-+
-+
-+
-+
-+
-+
-+
-+ Destroys the zwp_input_method_manager_v2 object.
-+
-+ The zwp_input_method_v2 objects originating from it remain valid.
-+
-+
-+
-+
-diff --git a/plover/oslayer/wayland/keyboardcontrol.py b/plover/oslayer/wayland/keyboardcontrol.py
-new file mode 100644
-index 00000000..ec1057bb
---- /dev/null
-+++ b/plover/oslayer/wayland/keyboardcontrol.py
-@@ -0,0 +1,389 @@
-+"""Keyboard capture and control on Wayland.
-+
-+This module provides an interface for capturing and emulating keyboard events
-+on Wayland compositors that support the 'virtual_keyboard_unstable_v1' and
-+'input_method_unstable_v2' protocols (that is, wlroots-based compositors
-+like Sway, as of January 2022).
-+"""
-+
-+import os
-+import select
-+import threading
-+import time
-+
-+from pywayland.client.display import Display
-+from pywayland.protocol.wayland.wl_seat import WlSeat
-+
-+from plover.oslayer.linux.keyboardcontrol_x11 import KEYCODE_TO_KEY
-+
-+from .keyboardlayout import PLOVER_TAG, KeyComboLayout, StringOutputLayout
-+# Protocol modules generated from XML description files at build time.
-+from .input_method_unstable_v2 import ZwpInputMethodManagerV2
-+from .virtual_keyboard_unstable_v1 import ZwpVirtualKeyboardManagerV1
-+
-+
-+class KeyboardHandler:
-+
-+ _INTERFACES = {
-+ interface.name: (nick, interface)
-+ for nick, interface in (
-+ ('seat', WlSeat),
-+ ('input_method', ZwpInputMethodManagerV2),
-+ ('virtual_keyboard', ZwpVirtualKeyboardManagerV1),
-+ )}
-+
-+ def __init__(self):
-+ super().__init__()
-+ self._lock = threading.RLock()
-+ self._loop_thread = None
-+ self._pipe = None
-+ # Common for capture and emulation.
-+ self._display = None
-+ self._interface = None
-+ self._keyboard = None
-+ self._keymap = None
-+ self._replay_keyboard = None
-+ self._replay_layout = None
-+ # For capture only.
-+ self._refcount_capture = 0
-+ self._grabbed_keyboard = None
-+ self._input_method = None
-+ self._event_listeners = {
-+ 'grab_key': set(),
-+ 'grab_modifiers': set(),
-+ }
-+ # For emulation only.
-+ self._refcount_emulate = 0
-+ self._output_keyboard = None
-+ self._output_layout = None
-+
-+ def _event_loop(self):
-+ with self._lock:
-+ readfds = (self._pipe[0], self._display.get_fd())
-+ while True:
-+ # Sleep until we get new data on the display connection,
-+ # or on the pipe used to signal the end of the loop.
-+ rlist, wlist, xlist = select.select(readfds, (), ())
-+ assert not wlist
-+ assert not xlist
-+ if self._pipe[0] in rlist:
-+ break
-+ # If we're here, rlist should contains
-+ # the display fd, process pending events.
-+ with self._lock:
-+ self._display.dispatch(block=True)
-+ self._display.flush()
-+
-+ def __enter__(self):
-+ self._lock.__enter__()
-+ return self
-+
-+ def __exit__(self, exc_type, exc_value, traceback):
-+ if exc_type is None and self._display is not None:
-+ self._display.flush()
-+ self._lock.__exit__(exc_type, exc_value, traceback)
-+
-+ def _on_registry_global(self, obj, name, interface_name, interface_version):
-+ if interface_name not in self._INTERFACES:
-+ return
-+ nick, interface = self._INTERFACES[interface_name]
-+ self._interface[nick] = obj.bind(name, interface, interface_version)
-+
-+ def _on_keymap(self, __keyboard, fmt, fd, size):
-+ try:
-+ os.lseek(fd, 0, os.SEEK_SET)
-+ keymap = os.read(fd, size)
-+ is_generated = PLOVER_TAG in keymap
-+ if is_generated or keymap == self._keymap:
-+ return
-+ self._replay_layout = KeyComboLayout(keymap)
-+ self._replay_keyboard.keymap(fmt, fd, size)
-+ self._keymap = keymap
-+ finally:
-+ os.close(fd)
-+
-+ def _on_grab_key(self, __grabbed_keyboard, __serial, origtime, keycode, state):
-+ suppressed = False
-+ try:
-+ for cb in self._event_listeners['grab_key']:
-+ suppressed |= cb(origtime, keycode, state)
-+ finally:
-+ if not suppressed:
-+ self._replay_keyboard.key(origtime, keycode, state)
-+
-+ def _on_grab_modifiers(self, __grabbed_keyboard, __serial, depressed, latched, locked, layout):
-+ suppressed = False
-+ try:
-+ for cb in self._event_listeners['grab_modifiers']:
-+ suppressed |= cb(depressed, latched, locked, layout)
-+ finally:
-+ if not suppressed:
-+ self._replay_keyboard.modifiers(depressed, latched, locked, layout)
-+
-+ def _update_output_keymap(self):
-+ xkb_keymap = self._output_layout.to_xkb_def()
-+ fd = os.memfd_create('emulated_keymap.xkb')
-+ try:
-+ os.lseek(fd, 0, os.SEEK_SET)
-+ os.write(fd, xkb_keymap)
-+ self._output_keyboard.keymap(1, fd, len(xkb_keymap))
-+ finally:
-+ os.close(fd)
-+
-+ def _ensure_interfaces(self, mode, interface_list):
-+ missing_interfaces = [
-+ interface_name
-+ for interface_name in interface_list
-+ if interface_name not in self._interface
-+ ]
-+ if missing_interfaces:
-+ missing_interfaces = ', '.join(f'\'{name}\'' for name in missing_interfaces)
-+ raise RuntimeError(f'Cannot {mode} keyboard events: your '
-+ f'Wayland compositor does not support '
-+ f'the following interfaces: '
-+ f'{missing_interfaces}')
-+
-+ def _setup_base(self):
-+ self._display = Display()
-+ self._display.connect()
-+ self._interface = {}
-+ reg = self._display.get_registry()
-+ reg.dispatcher['global'] = self._on_registry_global
-+ self._display.roundtrip()
-+ self._replay_keyboard = self._interface['virtual_keyboard'].create_virtual_keyboard(self._interface['seat'])
-+ self._keyboard = self._interface['seat'].get_keyboard()
-+ self._keyboard.dispatcher['keymap'] = self._on_keymap
-+ self._display.roundtrip()
-+ self._pipe = os.pipe()
-+ self._loop_thread = threading.Thread(target=self._event_loop)
-+ self._loop_thread.start()
-+
-+ def _teardown_base(self):
-+ if self._loop_thread is not None:
-+ # Wake up the capture thread...
-+ os.write(self._pipe[1], b'quit')
-+ # ...and wait for it to terminate.
-+ self._loop_thread.join()
-+ self._loop_thread = None
-+ for fd in self._pipe:
-+ os.close(fd)
-+ self._pipe = None
-+ self._replay_keyboard = None
-+ self._replay_layout = None
-+ self._keymap = None
-+ if self._keyboard is not None:
-+ self._keyboard.release()
-+ self._keyboard = None
-+ while self._interface:
-+ self._interface.popitem()[1].release()
-+ self._interface = None
-+ if self._display is not None:
-+ self._display.disconnect()
-+ self._display = None
-+
-+ def _setup_capture(self):
-+ self._ensure_interfaces('capture', ('seat', 'input_method', 'virtual_keyboard'))
-+ self._input_method = self._interface['input_method'].get_input_method(self._interface['seat'])
-+ self._grabbed_keyboard = self._input_method.grab_keyboard()
-+ self._grabbed_keyboard.dispatcher['key'] = self._on_grab_key
-+ self._grabbed_keyboard.dispatcher['modifiers'] = self._on_grab_modifiers
-+
-+ def _teardown_capture(self):
-+ self._event_listeners['grab_key'].clear()
-+ self._event_listeners['grab_modifiers'].clear()
-+ if self._grabbed_keyboard is not None:
-+ self._grabbed_keyboard.destroy()
-+ self._grabbed_keyboard = None
-+ if self._input_method is not None:
-+ self._input_method.destroy()
-+ self._input_method = None
-+
-+ def _setup_emulate(self):
-+ self._ensure_interfaces('emulate', ('seat', 'virtual_keyboard'))
-+ self._output_keyboard = self._interface['virtual_keyboard'].create_virtual_keyboard(self._interface['seat'])
-+ self._output_layout = StringOutputLayout()
-+ self._update_output_keymap()
-+
-+ def _teardown_emulate(self):
-+ self._output_keyboard = None
-+ self._output_layout = None
-+
-+ def incref(self, mode):
-+ if mode not in ('capture', 'emulate'):
-+ raise ValueError(mode)
-+ refattr = '_refcount_' + mode
-+ refcount = getattr(self, refattr) + 1
-+ assert refcount >= 1
-+ setattr(self, refattr, refcount)
-+ try:
-+ total_refcount = self._refcount_capture + self._refcount_emulate
-+ if total_refcount == 1:
-+ self._setup_base()
-+ if refcount == 1:
-+ getattr(self, '_setup_' + mode)()
-+ except:
-+ self.decref(mode)
-+ raise
-+
-+ def decref(self, mode):
-+ if mode not in ('capture', 'emulate'):
-+ raise ValueError(mode)
-+ refattr = '_refcount_' + mode
-+ refcount = getattr(self, refattr) - 1
-+ assert refcount >= 0
-+ setattr(self, refattr, refcount)
-+ if refcount == 0:
-+ getattr(self, '_teardown_' + mode)()
-+ if self._refcount_capture + self._refcount_emulate == 0:
-+ self._teardown_base()
-+
-+ def add_event_listener(self, event, callback):
-+ self._event_listeners[event].add(callback)
-+
-+ def remove_event_listener(self, event, callback):
-+ self._event_listeners[event].discard(callback)
-+
-+ def send_string(self, string):
-+ timestamp = time.thread_time_ns() // (10 ** 3)
-+ keymap_updated, combo_list = self._output_layout.string_to_combos(string)
-+ if keymap_updated:
-+ self._update_output_keymap()
-+ mods_state = 0
-+ for keycode, mods in combo_list:
-+ if mods != mods_state:
-+ self._output_keyboard.modifiers(mods_depressed=mods,
-+ mods_latched=0,
-+ mods_locked=0,
-+ group=0)
-+ mods_state = mods
-+ self._output_keyboard.key(timestamp, keycode, 1)
-+ self._output_keyboard.key(timestamp, keycode, 0)
-+ if mods_state:
-+ self._output_keyboard.modifiers(mods_depressed=0,
-+ mods_latched=0,
-+ mods_locked=0,
-+ group=0)
-+
-+ def send_backspaces(self, count):
-+ timestamp = time.thread_time_ns() // (10 ** 3)
-+ for __ in range(count):
-+ self._output_keyboard.key(timestamp, 0, 1)
-+ self._output_keyboard.key(timestamp, 0, 0)
-+
-+ def send_key_combination(self, combo_string):
-+ timestamp = time.thread_time_ns() // (10 ** 3)
-+ mods_state = 0
-+ for (keycode, mods), pressed in self._replay_layout.parse_key_combo(combo_string):
-+ self._replay_keyboard.key(timestamp, keycode, int(pressed))
-+ if mods:
-+ if pressed:
-+ mods_state |= mods
-+ else:
-+ mods_state &= ~mods
-+ self._replay_keyboard.modifiers(mods_depressed=mods_state,
-+ mods_latched=0,
-+ mods_locked=0,
-+ group=0)
-+ assert not mods_state
-+
-+
-+_keyboard = KeyboardHandler()
-+
-+
-+class KeyboardCapture:
-+ """Listen to keyboard press and release events.
-+
-+ This uses the 'input_method_unstable_v2' protocol to grab the Wayland
-+ keyboard. This grab is global and unconditional, therefore a virtual
-+ keyboard input is also created (using the 'virtual_keyboard_unstable_v1'
-+ protocol) to forward events that do not need to be captured by Plover.
-+ Note that this grab will also capture events generated by the
-+ KeyboardEmulation class, those events need to be actively filtered out
-+ to avoid infinite feedback loops.
-+ """
-+ def __init__(self):
-+ self._started = False
-+ self._mod_state = 0
-+ self._grabbed_keyboard = None
-+ self._suppressed_keys = set()
-+ # Callbacks that receive keypresses.
-+ self.key_down = lambda key: None
-+ self.key_up = lambda key: None
-+
-+ def start(self):
-+ """Connect to the Wayland compositor and start the event loop."""
-+ with _keyboard:
-+ _keyboard.add_event_listener('grab_key', self._on_grab_key)
-+ _keyboard.add_event_listener('grab_modifiers', self._on_grab_modifiers)
-+ _keyboard.incref('capture')
-+ self._started = True
-+
-+ def cancel(self):
-+ """Cancel grabbing the keyboard and free resources."""
-+ if not self._started:
-+ return
-+ with _keyboard:
-+ _keyboard.decref('capture')
-+ _keyboard.remove_event_listener('grab_key', self._on_grab_key)
-+ _keyboard.remove_event_listener('grab_modifiers', self._on_grab_modifiers)
-+ self._started = False
-+
-+ def _on_grab_key(self, __origtime, keycode, state):
-+ """Callback for when a new key event arrives."""
-+ key = KEYCODE_TO_KEY.get(keycode + 8)
-+ if key is None:
-+ # Unhandled, ignore and don't suppress.
-+ return False
-+ suppressed = key in self._suppressed_keys
-+ if state == 1:
-+ if self._mod_state:
-+ # Modifier(s) pressed, ignore.
-+ suppressed = False
-+ else:
-+ self.key_down(key)
-+ else:
-+ self.key_up(key)
-+ return suppressed
-+
-+ def _on_grab_modifiers(self, depressed, latched, locked, __layout):
-+ """Callback for when the set of active modifiers changes."""
-+ # Note: ignore numlock state.
-+ self._mod_state = (depressed | latched | locked) & ~0x10
-+ return False
-+
-+ def suppress(self, keys=()):
-+ """Change the set of keys to capture."""
-+ self._suppressed_keys = set(keys)
-+
-+
-+class KeyboardEmulation:
-+ """Emulate keyboard events to send strings on Wayland.
-+
-+ This emulation layer uses the 'virtual_keyboard_unstable_v1' protocol.
-+ Since the protocol allows using any XKB layout, a new layout is generated
-+ each time a string needs to be sent, containing just the needed symbols.
-+ This makes the emulation independent of the user’s current keyboard layout.
-+ To signal emulated events to KeyboardCapture, a special tag is inserted in
-+ generated XKB layouts.
-+ """
-+ def __init__(self):
-+ with _keyboard:
-+ _keyboard.incref('emulate')
-+
-+ @staticmethod
-+ def send_string(string):
-+ """Emulate a complete string."""
-+ with _keyboard:
-+ _keyboard.send_string(string)
-+
-+ @staticmethod
-+ def send_backspaces(count):
-+ """Emulate a sequence of backspaces."""
-+ with _keyboard:
-+ _keyboard.send_backspaces(count)
-+
-+ @staticmethod
-+ def send_key_combination(combo_string):
-+ """Emulate a key combo."""
-+ with _keyboard:
-+ _keyboard.send_key_combination(combo_string)
-diff --git a/plover/oslayer/wayland/keyboardlayout.py b/plover/oslayer/wayland/keyboardlayout.py
-new file mode 100644
-index 00000000..f4006d67
---- /dev/null
-+++ b/plover/oslayer/wayland/keyboardlayout.py
-@@ -0,0 +1,203 @@
-+from xkbcommon import xkb
-+
-+from plover.key_combo import add_modifiers_aliases, parse_key_combo
-+from plover.oslayer.linux.keyboardcontrol_x11 import uchr_to_keysym
-+
-+
-+XKB_KEYCODE_OFFSET = 8
-+XKB_KEYCODE_MAX = 255
-+
-+PLOVER_TAG = b''
-+PLOVER_KEYMAP_TEMPLATE = (
-+b'''
-+xkb_keymap {
-+xkb_keycodes {
-+minimum = %u;
-+maximum = %u;
-+%s
-+};
-+xkb_types { include "complete" };
-+xkb_compatibility { include "complete" };
-+xkb_symbols {
-+%s
-+};
-+};
-+'''
-+)
-+
-+XKB_ALIASES = (
-+ ('apostrophe', 'quoteright'),
-+ ('f11', 'l1'),
-+ ('f12', 'l2'),
-+ ('f13', 'l3'),
-+ ('f14', 'l4'),
-+ ('f15', 'l5'),
-+ ('f16', 'l6'),
-+ ('f17', 'l7'),
-+ ('f18', 'l8'),
-+ ('f19', 'l9'),
-+ ('f20', 'l10'),
-+ ('f21', 'r1'),
-+ ('f22', 'r2'),
-+ ('f23', 'r3'),
-+ ('f24', 'r4'),
-+ ('f25', 'r5'),
-+ ('f26', 'r6'),
-+ ('f27', 'r7'),
-+ ('f28', 'r8'),
-+ ('f29', 'r9'),
-+ ('f30', 'r10'),
-+ ('f31', 'r11'),
-+ ('f32', 'r12'),
-+ ('f33', 'r13'),
-+ ('f34', 'r14'),
-+ ('f35', 'r15'),
-+ ('grave', 'quoteleft'),
-+ ('henkan', 'henkan_mode'),
-+ ('kp_next', 'kp_page_down'),
-+ ('kp_page_up', 'kp_prior'),
-+ ('mae_koho', 'previouscandidate'),
-+ ('mode_switch', 'script_switch'),
-+ ('multiplecandidate', 'zen_koho'),
-+ ('next', 'page_down'),
-+ ('page_up', 'prior'),
-+)
-+
-+
-+class KeyComboLayout:
-+
-+ def __init__(self, xkb_def_bytestring):
-+ '''Create a basic keyboard layout from a XKB keymap definition.'''
-+ # Ignore terminating null character.
-+ if xkb_def_bytestring.endswith(b'\x00'):
-+ xkb_def_bytestring = xkb_def_bytestring[:-1]
-+ keymap = xkb.Context().keymap_new_from_buffer(xkb_def_bytestring)
-+ modifiers = {
-+ keymap.mod_get_name(mod_index).lower(): 1 << mod_index
-+ for mod_index in range(keymap.num_mods())
-+ }
-+ for mod_name in ('alt', 'control', 'shift', 'super'):
-+ mods = modifiers.get(mod_name)
-+ if mods is not None:
-+ modifiers[mod_name + '_l'] = mods
-+ modifiers[mod_name + '_r'] = mods
-+ combo_from_keyname = {}
-+ keysym_level = {}
-+ for keycode in keymap:
-+ for level in range(keymap.num_levels_for_key(keycode, 0)):
-+ keysym = keymap.key_get_syms_by_level(keycode, 0, level)
-+ if len(keysym) != 1:
-+ continue
-+ keysym = keysym[0]
-+ if not keysym:
-+ # Ignore NoSymbol.
-+ continue
-+ try:
-+ keysym_name = xkb.keysym_get_name(keysym)
-+ except xkb.XKBInvalidKeysym:
-+ continue
-+ if keysym_name.startswith('XF86'):
-+ alias = keysym_name[4:].lower()
-+ keysym_name = 'xf86_' + alias
-+ else:
-+ alias = None
-+ keysym_name = keysym_name.lower()
-+ if keysym_name in combo_from_keyname and level >= keysym_level.get(keysym, 0):
-+ # Ignore if already available at a lower level.
-+ continue
-+ assert keycode >= XKB_KEYCODE_OFFSET
-+ combo = (keycode - XKB_KEYCODE_OFFSET, modifiers.get(keysym_name, 0))
-+ combo_from_keyname[keysym_name] = combo
-+ if alias is not None:
-+ combo_from_keyname[alias] = combo
-+ keysym_level[keysym] = level
-+ add_modifiers_aliases(combo_from_keyname)
-+ # Ensure all aliases for the same keysim are available.
-+ for alias_list in XKB_ALIASES:
-+ combo = next(filter(None, map(combo_from_keyname.get, alias_list)), None)
-+ if combo is not None:
-+ for alias in alias_list:
-+ if alias not in combo_from_keyname:
-+ combo_from_keyname[alias] = combo
-+ self._combo_from_keyname = combo_from_keyname
-+
-+ def parse_key_combo(self, combo_string):
-+ return parse_key_combo(combo_string, self._combo_from_keyname.__getitem__)
-+
-+
-+class StringOutputLayout:
-+
-+ def __init__(self):
-+ '''Create a custom layout for output strings.'''
-+ printable = {
-+ c
-+ for c in map(chr, range(XKB_KEYCODE_MAX))
-+ for c in (c.lower(), c.upper())
-+ if len(c) == 1 and c.isprintable()
-+ }
-+ # Note: we reserve the firt keycode for tagging the keymap
-+ # with our key and mapping the BackSpace keysym.
-+ max_mappings = XKB_KEYCODE_MAX - XKB_KEYCODE_OFFSET
-+ levels = 2
-+ char_to_combo = {}
-+ keymap = [[None] * levels for __ in range(max_mappings)]
-+ free_mappings = iter([
-+ (keycode, mod_level)
-+ for mod_level in range(levels)
-+ for keycode in range(1, max_mappings)
-+ ])
-+ for c in sorted(printable):
-+ keycode, mod_level = next(free_mappings)
-+ char_to_combo[c] = (keycode, 1 << mod_level >> 1)
-+ keymap[keycode][mod_level] = uchr_to_keysym(c)
-+ self._keymap = keymap
-+ self._char_to_combo = char_to_combo
-+ self._next_extra_mapping_index = 0
-+ self._extra_mappings = [[keycode, mod_level, None]
-+ for keycode, mod_level in free_mappings]
-+
-+ def string_to_combos(self, string):
-+ '''Return a tuple pair:
-+ - a boolean indicading if the keymap was updated
-+ - a list of `(keycode, modifiers)`
-+ '''
-+ combo_list = []
-+ updated = False
-+ for char in string:
-+ combo = self._char_to_combo.get(char)
-+ if combo is not None:
-+ combo_list.append(combo)
-+ continue
-+ extra_mapping = self._extra_mappings[self._next_extra_mapping_index]
-+ self._next_extra_mapping_index += 1
-+ self._next_extra_mapping_index %= len(self._extra_mappings)
-+ keycode, mod_level, old_char = extra_mapping
-+ if old_char is not None:
-+ del self._char_to_combo[old_char]
-+ extra_mapping[-1] = char
-+ self._keymap[keycode][mod_level] = uchr_to_keysym(char)
-+ self._char_to_combo[char] = combo = (keycode, 1 << mod_level >> 1)
-+ combo_list.append(combo)
-+ updated = True
-+ return updated, combo_list
-+
-+ def to_xkb_def(self):
-+ '''Generate an XKB keymap definition for the layout.'''
-+ # Sway is more permissive than Xwayland on what an XKB keymap must
-+ # or must not include. We need to take care if we want to ensure
-+ # compatibility with both. See
-+ keycodes_list = [b'%s = %u;' % (PLOVER_TAG, XKB_KEYCODE_OFFSET)]
-+ symbols_list = [b'key %s {[BackSpace]};' % PLOVER_TAG]
-+ for keycode, keysym_list in enumerate(self._keymap):
-+ keysym_list = [b'%#x' % keysym
-+ for keysym in keysym_list
-+ if keysym is not None]
-+ if not keysym_list:
-+ continue
-+ keycodes_list.append(b' = %u;' % (keycode, XKB_KEYCODE_OFFSET + keycode))
-+ symbols_list.append(b'key {[%s]};' % (keycode, b', '.join(keysym_list)))
-+ return PLOVER_KEYMAP_TEMPLATE % (
-+ XKB_KEYCODE_OFFSET, XKB_KEYCODE_OFFSET + len(self._keymap),
-+ b'\n'.join(keycodes_list),
-+ b'\n'.join(symbols_list),
-+ )
-diff --git a/plover/oslayer/wayland/virtual-keyboard-unstable-v1.xml b/plover/oslayer/wayland/virtual-keyboard-unstable-v1.xml
-new file mode 100644
-index 00000000..5095c91b
---- /dev/null
-+++ b/plover/oslayer/wayland/virtual-keyboard-unstable-v1.xml
-@@ -0,0 +1,113 @@
-+
-+
-+
-+ Copyright © 2008-2011 Kristian Høgsberg
-+ Copyright © 2010-2013 Intel Corporation
-+ Copyright © 2012-2013 Collabora, Ltd.
-+ Copyright © 2018 Purism SPC
-+
-+ Permission is hereby granted, free of charge, to any person obtaining a
-+ copy of this software and associated documentation files (the "Software"),
-+ to deal in the Software without restriction, including without limitation
-+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ and/or sell copies of the Software, and to permit persons to whom the
-+ Software is furnished to do so, subject to the following conditions:
-+
-+ The above copyright notice and this permission notice (including the next
-+ paragraph) shall be included in all copies or substantial portions of the
-+ Software.
-+
-+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ DEALINGS IN THE SOFTWARE.
-+
-+
-+
-+
-+ The virtual keyboard provides an application with requests which emulate
-+ the behaviour of a physical keyboard.
-+
-+ This interface can be used by clients on its own to provide raw input
-+ events, or it can accompany the input method protocol.
-+
-+
-+
-+
-+ Provide a file descriptor to the compositor which can be
-+ memory-mapped to provide a keyboard mapping description.
-+
-+ Format carries a value from the keymap_format enumeration.
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+ A key was pressed or released.
-+ The time argument is a timestamp with millisecond granularity, with an
-+ undefined base. All requests regarding a single object must share the
-+ same clock.
-+
-+ Keymap must be set before issuing this request.
-+
-+ State carries a value from the key_state enumeration.
-+
-+
-+
-+
-+
-+
-+
-+
-+ Notifies the compositor that the modifier and/or group state has
-+ changed, and it should update state.
-+
-+ The client should use wl_keyboard.modifiers event to synchronize its
-+ internal state with seat state.
-+
-+ Keymap must be set before issuing this request.
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+ A virtual keyboard manager allows an application to provide keyboard
-+ input events as if they came from a physical keyboard.
-+
-+
-+
-+
-+
-+
-+
-+
-+ Creates a new virtual keyboard associated to a seat.
-+
-+ If the compositor enables a keyboard to perform arbitrary actions, it
-+ should present an error when an untrusted client requests a new
-+ keyboard.
-+
-+
-+
-+
-+
-+
-diff --git a/plover_build_utils/setup.py b/plover_build_utils/setup.py
-index 0be32e26..92e3f206 100644
---- a/plover_build_utils/setup.py
-+++ b/plover_build_utils/setup.py
-@@ -1,14 +1,20 @@
-+from pathlib import Path
- import contextlib
-+import glob
- import importlib
- import os
- import subprocess
-+import shutil
- import sys
-+import logging
-
- from setuptools.command.build_py import build_py
- from setuptools.command.develop import develop
- import pkg_resources
- import setuptools
-
-+logging.basicConfig()
-+log = logging.getLogger("plover setup")
-
- class Command(setuptools.Command):
-
-@@ -150,6 +156,38 @@ class BuildUi(Command):
-
- # }}}
-
-+# Wayland protocols generation. {{{
-+
-+class BuildWayland(Command):
-+
-+ description = 'build Wayland protocol modules'
-+
-+ def initialize_options(self):
-+ pass
-+
-+ def finalize_options(self):
-+ pass
-+
-+ def run(self):
-+ log.info('generating Wayland protocol modules')
-+ base = 'plover/oslayer/wayland'
-+ defs = glob.glob(base + '/*.xml') + ['/usr/share/wayland/wayland.xml']
-+ cmd = (
-+ sys.executable, '-m', 'pywayland.scanner',
-+ '-i', *defs, '-o', base,
-+ )
-+ subprocess.check_call(cmd)
-+ shutil.rmtree('plover/oslayer/wayland/wayland')
-+ for py in Path('plover/oslayer/wayland').glob('*/*.py'):
-+ contents = py.read_text()
-+ contents = contents.replace(
-+ '\nfrom ..wayland import ',
-+ '\nfrom pywayland.protocol.wayland import ',
-+ )
-+ py.write_text(contents)
-+
-+# }}}
-+
- # Patched `build_py` command. {{{
-
- class BuildPy(build_py):
-diff --git a/pyproject.toml b/pyproject.toml
-index b6c48999..0b0a8134 100644
---- a/pyproject.toml
-+++ b/pyproject.toml
-@@ -2,6 +2,7 @@
- requires = [
- "Babel",
- "PyQt5>=5.8.2",
-+ "pywayland; ('linux' in sys_platform or 'bsd' in sys_platform)",
- "setuptools>=38.2.4",
- "wheel",
- ]
-diff --git a/reqs/constraints.txt b/reqs/constraints.txt
-index 928d34af..1be0f8af 100644
---- a/reqs/constraints.txt
-+++ b/reqs/constraints.txt
-@@ -52,6 +52,7 @@ pytest==6.2.5
- pytest-qt==4.0.2
- python-xlib==0.31
- pytz==2021.3
-+pywayland==0.4.11
- PyYAML==6.0
- readme-renderer==30.0
- requests==2.26.0
-@@ -73,6 +74,7 @@ urllib3==1.26.7
- wcwidth==0.2.5
- webencodings==0.5.1
- wheel==0.37.0
-+xkbcommon==0.4
- zipp==3.6.0
-
- # vim: ft=cfg commentstring=#\ %s list
-diff --git a/reqs/dist.txt b/reqs/dist.txt
-index 43102086..ceddfefb 100644
---- a/reqs/dist.txt
-+++ b/reqs/dist.txt
-@@ -7,8 +7,10 @@ pyobjc-framework-Quartz>=4.0; "darwin" in sys_platform
- pyserial>=2.7
- python-xlib>=0.16; ("linux" in sys_platform or "bsd" in sys_platform) and python_version < "3.9"
- python-xlib>=0.29; ("linux" in sys_platform or "bsd" in sys_platform) and python_version >= "3.9"
-+pywayland; ("linux" in sys_platform or "bsd" in sys_platform)
- rtf_tokenize
- setuptools
- wcwidth
-+xkbcommon>=0.4; ("linux" in sys_platform or "bsd" in sys_platform)
-
- # vim: ft=cfg commentstring=#\ %s list
-diff --git a/reqs/setup.txt b/reqs/setup.txt
-index ec915a75..4af23620 100644
---- a/reqs/setup.txt
-+++ b/reqs/setup.txt
-@@ -1,5 +1,6 @@
- Babel
- PyQt5>=5.8.2
-+pywayland; ("linux" in sys_platform or "bsd" in sys_platform)
- setuptools>=38.2.4
- wheel
-
-diff --git a/setup.cfg b/setup.cfg
-index 8a1ef9c3..921c1ea0 100644
---- a/setup.cfg
-+++ b/setup.cfg
-@@ -47,6 +47,7 @@ packages =
- plover.oslayer
- plover.oslayer.linux
- plover.oslayer.osx
-+ plover.oslayer.wayland
- plover.oslayer.windows
- plover.output
- plover.scripts
-@@ -107,6 +108,9 @@ plover.system =
- [options.package_data]
- plover =
- messages/*/LC_MESSAGES/*.mo
-+plover.oslayer.wayland =
-+ input_method_unstable_v2/*.py
-+ virtual_keyboard_unstable_v1/*.py
-
- [options.exclude_package_data]
- plover =
-@@ -117,5 +121,7 @@ plover =
- plover.gui_qt =
- *.ui
- resources/*
-+plover.oslayer =
-+ wayland/*.xml
-
- # vim: commentstring=#\ %s list
-diff --git a/setup.py b/setup.py
-index beab2d75..17364dc9 100755
---- a/setup.py
-+++ b/setup.py
-@@ -22,7 +22,7 @@ with open(os.path.join(__software_name__, '__init__.py')) as fp:
- exec(fp.read())
-
- from plover_build_utils.setup import (
-- BuildPy, BuildUi, Command, Develop, babel_options
-+ BuildPy, BuildUi, BuildWayland, Command, Develop, babel_options
- )
-
-
-@@ -35,6 +35,10 @@ cmdclass = {
- }
- options = {}
-
-+if sys.platform.startswith(('linux', 'freebsd', 'openbsd')):
-+ BuildPy.build_dependencies.insert(0, 'build_wayland')
-+ cmdclass['build_wayland'] = BuildWayland
-+
- PACKAGE = '%s-%s' % (
- __software_name__,
- __version__,
-diff --git a/tox.ini b/tox.ini
-index b608544f..634a27cd 100644
---- a/tox.ini
-+++ b/tox.ini
-@@ -86,6 +86,7 @@ description = launch plover
- passenv =
- {[testenv]passenv}
- DISPLAY
-+ WAYLAND_DISPLAY
- XDG_RUNTIME_DIR
- commands =
- {envpython} setup.py launch -- {posargs}
diff --git a/web/wordpress-plugins/webmention.json b/web/wordpress-plugins/webmention.json
index a248218..1fe72c9 100644
--- a/web/wordpress-plugins/webmention.json
+++ b/web/wordpress-plugins/webmention.json
@@ -1,7 +1,7 @@
{
- "version": "5.1.3",
+ "version": "5.1.4",
"pname": "webmention",
"description": "Webmention",
- "url": "https://downloads.wordpress.org/plugin/webmention.5.1.3.zip",
- "sha256": "ebf2bb2c6848a42a4825fe719252a18ef6d1eb40ce086243d19dcaaf1e933981"
+ "url": "https://downloads.wordpress.org/plugin/webmention.5.1.4.zip",
+ "sha256": "a20d590896339946003b74e09270d0986154fd4688d3c8d4ac85d28686d4d076"
}